worklist.tsx 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  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. 'Fetching worklist data with filters:',
  34. filters,
  35. 'page:',
  36. page,
  37. 'pageSize:',
  38. pageSize
  39. );
  40. dispatch(fetchWorkThunk({ page, pageSize, filters }));
  41. }, [dispatch, filters, page, pageSize]);
  42. const handleRowClick = (record: Task) => {
  43. console.log('Row clicked:', JSON.stringify(record, null, 2));
  44. console.log('Selected IDs before:', record.StudyInstanceUID);
  45. dispatch(
  46. workSelectionSlice.actions.setSelectedIds([record.StudyInstanceUID])
  47. );
  48. };
  49. const handleRowDoubleClick = (record: Task) => {
  50. console.log(
  51. '[WorklistTable] Row double-clicked:',
  52. JSON.stringify(record, null, 2)
  53. );
  54. worklistToExam(record);
  55. };
  56. return (
  57. <div className="h-full">
  58. {screens.xs ? (
  59. <>
  60. <WorklistTable
  61. worklistData={worklistData}
  62. filters={filters}
  63. page={page}
  64. pageSize={pageSize}
  65. selectedIds={selectedIds}
  66. handleRowClick={handleRowClick}
  67. handleRowDoubleClick={handleRowDoubleClick}
  68. />
  69. <Button
  70. type="primary"
  71. shape="circle"
  72. icon={<SettingOutlined />}
  73. className="fixed bottom-6 right-6 z-50"
  74. onClick={() => setDrawerVisible(true)}
  75. />
  76. <Drawer
  77. title={
  78. <FormattedMessage
  79. id="worklist.operationPanel"
  80. defaultMessage="worklist.operationPanel"
  81. />
  82. }
  83. placement="left"
  84. onClose={() => setDrawerVisible(false)}
  85. open={drawerVisible}
  86. width={300}
  87. >
  88. <OperationPanel />
  89. </Drawer>
  90. </>
  91. ) : (
  92. <Row className="h-full">
  93. <Col
  94. span={screens.lg ? 18 : screens.md ? 20 : 24}
  95. className="overflow-auto"
  96. >
  97. <WorklistTable
  98. worklistData={worklistData}
  99. filters={filters}
  100. page={page}
  101. pageSize={pageSize}
  102. selectedIds={selectedIds}
  103. handleRowClick={handleRowClick}
  104. handleRowDoubleClick={handleRowDoubleClick}
  105. />
  106. </Col>
  107. <Col
  108. span={screens.lg ? 6 : screens.md ? 4 : 0}
  109. className="h-full overflow-auto"
  110. >
  111. <OperationPanel />
  112. </Col>
  113. </Row>
  114. )}
  115. </div>
  116. );
  117. };
  118. export default WorklistPage;