worklist.tsx 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. import React, { useState, useEffect } from 'react';
  2. import { Row, Col, Button, Drawer, Grid } from 'antd';
  3. import { SettingOutlined } from '@ant-design/icons';
  4. import { FormattedMessage } from 'react-intl';
  5. import { useSelector, useDispatch } from 'react-redux';
  6. import {
  7. fetchWorkThunk,
  8. workSelectionSlice,
  9. } from '../../states/patient/worklist/slices/workSlice';
  10. import WorklistTable from './components/WorklistTable';
  11. import OperationPanel from './components/OperationPanel';
  12. import { RootState, AppDispatch } from '../../states/store';
  13. import { Task } from '@/domain/work';
  14. import worklistToExam from '../../domain/patient/worklistToExam';
  15. const { useBreakpoint } = Grid;
  16. const WorklistPage: React.FC = () => {
  17. const screens = useBreakpoint();
  18. const [drawerVisible, setDrawerVisible] = useState(false);
  19. const dispatch: AppDispatch = useDispatch();
  20. const filters = useSelector((state: RootState) => state.workFilters);
  21. const page = useSelector((state: RootState) => state.workPagination.page);
  22. const pageSize = useSelector(
  23. (state: RootState) => state.workPagination.pageSize
  24. );
  25. const selectedIds = useSelector(
  26. (state: RootState) => state.workSelection.selectedIds
  27. );
  28. const worklistData = useSelector(
  29. (state: RootState) => state.workEntities.data
  30. );
  31. useEffect(() => {
  32. console.log(
  33. '[worklist] Fetching worklist data with filters:',
  34. filters,
  35. 'page:',
  36. page,
  37. 'pageSize:',
  38. pageSize
  39. );
  40. dispatch(fetchWorkThunk({ page, pageSize, filters }));
  41. }, [dispatch, page, pageSize]);
  42. const handleRowClick = (record: Task) => {
  43. console.log('Row clicked:', JSON.stringify(record, null, 2));
  44. console.log('Selected IDs before:', record.StudyID);
  45. dispatch(workSelectionSlice.actions.setSelectedIds([record.StudyID]));
  46. };
  47. const handleRowDoubleClick = (record: Task) => {
  48. console.log(
  49. '[WorklistTable] Row double-clicked:',
  50. JSON.stringify(record, null, 2)
  51. );
  52. worklistToExam(record);
  53. };
  54. return (
  55. <div className="h-full">
  56. {screens.xs ? (
  57. <>
  58. <WorklistTable
  59. worklistData={worklistData}
  60. filters={filters}
  61. page={page}
  62. pageSize={pageSize}
  63. selectedIds={selectedIds}
  64. handleRowClick={handleRowClick}
  65. handleRowDoubleClick={handleRowDoubleClick}
  66. />
  67. <Button
  68. type="primary"
  69. shape="circle"
  70. icon={<SettingOutlined />}
  71. className="fixed bottom-6 right-6 z-50"
  72. onClick={() => setDrawerVisible(true)}
  73. />
  74. <Drawer
  75. title={
  76. <FormattedMessage
  77. id="worklist.operationPanel"
  78. defaultMessage="worklist.operationPanel"
  79. />
  80. }
  81. placement="left"
  82. onClose={() => setDrawerVisible(false)}
  83. open={drawerVisible}
  84. width={300}
  85. >
  86. <OperationPanel />
  87. </Drawer>
  88. </>
  89. ) : (
  90. <Row className="h-full">
  91. <Col
  92. span={screens.lg ? 18 : screens.md ? 20 : 24}
  93. className="overflow-auto"
  94. >
  95. <WorklistTable
  96. worklistData={worklistData}
  97. filters={filters}
  98. page={page}
  99. pageSize={pageSize}
  100. selectedIds={selectedIds}
  101. handleRowClick={handleRowClick}
  102. handleRowDoubleClick={handleRowDoubleClick}
  103. />
  104. </Col>
  105. <Col
  106. span={screens.lg ? 6 : screens.md ? 4 : 0}
  107. className="h-full overflow-auto"
  108. >
  109. <OperationPanel />
  110. </Col>
  111. </Row>
  112. )}
  113. </div>
  114. );
  115. };
  116. export default WorklistPage;