Browse Source

refactor(patient:worklist, history): refactor WorklistTable component and related usages

Refactor WorklistTable to receive props for controlling selection, filtering and data
Adjust usage of WorklistTable in history and worklist to adapt to the refactored component
Maintain original functionality while improving reusability and maintainability
dengdx 3 days ago
parent
commit
609b256d95

+ 68 - 3
src/pages/patient/HistoryList.tsx

@@ -1,9 +1,17 @@
-import React, { useState } from 'react';
+import React, { useState, useEffect } from 'react';
 import { Row, Col, Button, Drawer, Grid } from 'antd';
 import { Row, Col, Button, Drawer, Grid } from 'antd';
 import { SettingOutlined } from '@ant-design/icons';
 import { SettingOutlined } from '@ant-design/icons';
 import { FormattedMessage } from 'react-intl';
 import { FormattedMessage } from 'react-intl';
+import { useSelector, useDispatch } from 'react-redux';
+import {
+  fetchWorkThunk,
+  workSelectionSlice,
+} from '../../states/patient/worklist/slices/workSlice';
 import WorklistTable from './components/WorklistTable';
 import WorklistTable from './components/WorklistTable';
 import OperationPanel from './components/OperationPanel';
 import OperationPanel from './components/OperationPanel';
+import { RootState, AppDispatch } from '../../states/store';
+import { Task } from '@/domain/work';
+import worklistToExam from '../../domain/patient/worklistToExam';
 
 
 const { useBreakpoint } = Grid;
 const { useBreakpoint } = Grid;
 
 
@@ -11,11 +19,60 @@ const HistorylistPage: React.FC = () => {
   const screens = useBreakpoint();
   const screens = useBreakpoint();
   const [drawerVisible, setDrawerVisible] = useState(false);
   const [drawerVisible, setDrawerVisible] = useState(false);
 
 
+  const dispatch: AppDispatch = useDispatch();
+  const filters = useSelector((state: RootState) => state.workFilters);
+  const page = useSelector((state: RootState) => state.workPagination.page);
+  const pageSize = useSelector(
+    (state: RootState) => state.workPagination.pageSize
+  );
+  const selectedIds = useSelector(
+    (state: RootState) => state.workSelection.selectedIds
+  );
+  const worklistData = useSelector(
+    (state: RootState) => state.workEntities.data
+  );
+
+  useEffect(() => {
+    console.log(
+      'Fetching worklist data with filters:',
+      filters,
+      'page:',
+      page,
+      'pageSize:',
+      pageSize
+    );
+    dispatch(fetchWorkThunk({ page, pageSize, filters }));
+  }, [dispatch, filters, page, pageSize]);
+
+  const handleRowClick = (record: Task) => {
+    console.log('Row clicked:', JSON.stringify(record, null, 2));
+    console.log('Selected IDs before:', record.StudyInstanceUID);
+    dispatch(
+      workSelectionSlice.actions.setSelectedIds([record.StudyInstanceUID])
+    );
+  };
+
+  const handleRowDoubleClick = (record: Task) => {
+    console.log(
+      '[WorklistTable] Row double-clicked:',
+      JSON.stringify(record, null, 2)
+    );
+    worklistToExam(record);
+  };
+
   return (
   return (
     <div className="h-full">
     <div className="h-full">
       {screens.xs ? (
       {screens.xs ? (
         <>
         <>
-          <WorklistTable />
+          <WorklistTable
+            worklistData={worklistData}
+            filters={filters}
+            page={page}
+            pageSize={pageSize}
+            selectedIds={selectedIds}
+            handleRowClick={handleRowClick}
+            handleRowDoubleClick={handleRowDoubleClick}
+          />
           <Button
           <Button
             type="primary"
             type="primary"
             shape="circle"
             shape="circle"
@@ -44,7 +101,15 @@ const HistorylistPage: React.FC = () => {
             span={screens.lg ? 18 : screens.md ? 20 : 24}
             span={screens.lg ? 18 : screens.md ? 20 : 24}
             className="overflow-auto"
             className="overflow-auto"
           >
           >
-            <WorklistTable />
+            <WorklistTable
+              worklistData={worklistData}
+              filters={filters}
+              page={page}
+              pageSize={pageSize}
+              selectedIds={selectedIds}
+              handleRowClick={handleRowClick}
+              handleRowDoubleClick={handleRowDoubleClick}
+            />
           </Col>
           </Col>
           <Col
           <Col
             span={screens.lg ? 6 : screens.md ? 4 : 0}
             span={screens.lg ? 6 : screens.md ? 4 : 0}

+ 19 - 49
src/pages/patient/components/WorklistTable.tsx

@@ -1,17 +1,10 @@
 import React, { useState } from 'react';
 import React, { useState } from 'react';
-import { useSelector, useDispatch } from 'react-redux';
-import { useEffect } from 'react';
-import {
-  fetchWorkThunk,
-  workSelectionSlice,
-} from '../../../states/patient/worklist/slices/workSlice';
 import { Table, TableColumnsType } from 'antd';
 import { Table, TableColumnsType } from 'antd';
 import { FormattedMessage } from 'react-intl';
 import { FormattedMessage } from 'react-intl';
-import { RootState, AppDispatch } from '../../../states/store';
 import { Task, Task as DataType } from '@/domain/work';
 import { Task, Task as DataType } from '@/domain/work';
-import worklistToExam from '../../../domain/patient/worklistToExam';
 import type { ResizeCallbackData } from 'react-resizable';
 import type { ResizeCallbackData } from 'react-resizable';
 import { Resizable } from 'react-resizable';
 import { Resizable } from 'react-resizable';
+import { WorkFilter } from '@/states/patient/worklist/types/workfilter';
 
 
 const columnsDef = [
 const columnsDef = [
   {
   {
@@ -378,48 +371,25 @@ const ResizableTitle: React.FC<
   );
   );
 };
 };
 
 
-const WorklistTable: React.FC = () => {
-  const dispatch: AppDispatch = useDispatch();
-  const worklistData = useSelector(
-    (state: RootState) => state.workEntities.data
-  );
-  const filters = useSelector((state: RootState) => state.workFilters);
-  const page = useSelector((state: RootState) => state.workPagination.page);
-  const pageSize = useSelector(
-    (state: RootState) => state.workPagination.pageSize
-  );
-  const selectedIds = useSelector(
-    (state: RootState) => state.workSelection.selectedIds
-  );
-
-  useEffect(() => {
-    console.log(
-      'Fetching worklist data with filters:',
-      filters,
-      'page:',
-      page,
-      'pageSize:',
-      pageSize
-    );
-    dispatch(fetchWorkThunk({ page, pageSize, filters }));
-  }, [dispatch, filters, page, pageSize]);
-
-  const handleRowClick = (record: Task) => {
-    console.log('Row clicked:', JSON.stringify(record, null, 2));
-    console.log('Selected IDs before:', record.StudyInstanceUID);
-    dispatch(
-      workSelectionSlice.actions.setSelectedIds([record.StudyInstanceUID])
-    );
-  };
-
-  const handleRowDoubleClick = (record: Task) => {
-    console.log(
-      '[WorklistTable] Row double-clicked:',
-      JSON.stringify(record, null, 2)
-    );
-    worklistToExam(record);
-  };
+interface WorklistTableProps {
+  worklistData: Task[];
+  filters?: WorkFilter;
+  page?: number;
+  pageSize?: number;
+  selectedIds: string[];
+  handleRowClick: (record: Task) => void;
+  handleRowDoubleClick: (record: Task) => void;
+}
 
 
+const WorklistTable: React.FC<WorklistTableProps> = ({
+  worklistData,
+  // filters,
+  // page,
+  // pageSize,
+  selectedIds,
+  handleRowClick,
+  handleRowDoubleClick,
+}) => {
   const [columns, setColumns] = useState<TableColumnsType<DataType>>(
   const [columns, setColumns] = useState<TableColumnsType<DataType>>(
     columnsDef.map((col) => ({
     columnsDef.map((col) => ({
       ...col,
       ...col,

+ 68 - 3
src/pages/patient/worklist.tsx

@@ -1,9 +1,17 @@
-import React, { useState } from 'react';
+import React, { useState, useEffect } from 'react';
 import { Row, Col, Button, Drawer, Grid } from 'antd';
 import { Row, Col, Button, Drawer, Grid } from 'antd';
 import { SettingOutlined } from '@ant-design/icons';
 import { SettingOutlined } from '@ant-design/icons';
 import { FormattedMessage } from 'react-intl';
 import { FormattedMessage } from 'react-intl';
+import { useSelector, useDispatch } from 'react-redux';
+import {
+  fetchWorkThunk,
+  workSelectionSlice,
+} from '../../states/patient/worklist/slices/workSlice';
 import WorklistTable from './components/WorklistTable';
 import WorklistTable from './components/WorklistTable';
 import OperationPanel from './components/OperationPanel';
 import OperationPanel from './components/OperationPanel';
+import { RootState, AppDispatch } from '../../states/store';
+import { Task } from '@/domain/work';
+import worklistToExam from '../../domain/patient/worklistToExam';
 
 
 const { useBreakpoint } = Grid;
 const { useBreakpoint } = Grid;
 
 
@@ -11,11 +19,60 @@ const WorklistPage: React.FC = () => {
   const screens = useBreakpoint();
   const screens = useBreakpoint();
   const [drawerVisible, setDrawerVisible] = useState(false);
   const [drawerVisible, setDrawerVisible] = useState(false);
 
 
+  const dispatch: AppDispatch = useDispatch();
+  const filters = useSelector((state: RootState) => state.workFilters);
+  const page = useSelector((state: RootState) => state.workPagination.page);
+  const pageSize = useSelector(
+    (state: RootState) => state.workPagination.pageSize
+  );
+  const selectedIds = useSelector(
+    (state: RootState) => state.workSelection.selectedIds
+  );
+  const worklistData = useSelector(
+    (state: RootState) => state.workEntities.data
+  );
+
+  useEffect(() => {
+    console.log(
+      'Fetching worklist data with filters:',
+      filters,
+      'page:',
+      page,
+      'pageSize:',
+      pageSize
+    );
+    dispatch(fetchWorkThunk({ page, pageSize, filters }));
+  }, [dispatch, filters, page, pageSize]);
+
+  const handleRowClick = (record: Task) => {
+    console.log('Row clicked:', JSON.stringify(record, null, 2));
+    console.log('Selected IDs before:', record.StudyInstanceUID);
+    dispatch(
+      workSelectionSlice.actions.setSelectedIds([record.StudyInstanceUID])
+    );
+  };
+
+  const handleRowDoubleClick = (record: Task) => {
+    console.log(
+      '[WorklistTable] Row double-clicked:',
+      JSON.stringify(record, null, 2)
+    );
+    worklistToExam(record);
+  };
+
   return (
   return (
     <div className="h-full">
     <div className="h-full">
       {screens.xs ? (
       {screens.xs ? (
         <>
         <>
-          <WorklistTable />
+          <WorklistTable
+            worklistData={worklistData}
+            filters={filters}
+            page={page}
+            pageSize={pageSize}
+            selectedIds={selectedIds}
+            handleRowClick={handleRowClick}
+            handleRowDoubleClick={handleRowDoubleClick}
+          />
           <Button
           <Button
             type="primary"
             type="primary"
             shape="circle"
             shape="circle"
@@ -44,7 +101,15 @@ const WorklistPage: React.FC = () => {
             span={screens.lg ? 18 : screens.md ? 20 : 24}
             span={screens.lg ? 18 : screens.md ? 20 : 24}
             className="overflow-auto"
             className="overflow-auto"
           >
           >
-            <WorklistTable />
+            <WorklistTable
+              worklistData={worklistData}
+              filters={filters}
+              page={page}
+              pageSize={pageSize}
+              selectedIds={selectedIds}
+              handleRowClick={handleRowClick}
+              handleRowDoubleClick={handleRowDoubleClick}
+            />
           </Col>
           </Col>
           <Col
           <Col
             span={screens.lg ? 6 : screens.md ? 4 : 0}
             span={screens.lg ? 6 : screens.md ? 4 : 0}