ProjectTask.tsx 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. import { Tabs } from "antd";
  2. import TaskList, { treeToList } from "../../components/task/TaskList";
  3. import TaskTable from "../../components/task/TaskTable";
  4. import TaskRelation from "../../components/task/TaskRelation";
  5. import { useState } from "react";
  6. import { ITaskData } from "../../components/api/task";
  7. import { useIntl } from "react-intl";
  8. interface IWidget {
  9. studioName?: string;
  10. projectId?: string;
  11. readonly?: boolean;
  12. onChange?: (data: ITaskData[]) => void;
  13. }
  14. const ProjectTask = ({
  15. studioName,
  16. projectId,
  17. readonly = false,
  18. onChange,
  19. }: IWidget) => {
  20. const [tasks, setTasks] = useState<ITaskData[]>([]);
  21. const [taskTree, setTaskTree] = useState<ITaskData[]>();
  22. const intl = useIntl();
  23. const onDataChange = (treeData: ITaskData[]) => {
  24. setTaskTree(treeData);
  25. const listData = treeToList(treeData);
  26. setTasks(listData);
  27. onChange && onChange(listData);
  28. };
  29. // 更新 origin 中的函数
  30. function update(input: ITaskData[], target: ITaskData[]): void {
  31. for (const newItem of input) {
  32. const match = target.findIndex((item) => item.id === newItem.id);
  33. if (match >= 0) {
  34. // 更新当前项的属性
  35. target[match] = newItem;
  36. } else {
  37. // 如果没有找到,递归检查子项
  38. for (const item of target) {
  39. if (item.children) {
  40. update([newItem], item.children);
  41. }
  42. }
  43. }
  44. }
  45. }
  46. return (
  47. <>
  48. <Tabs
  49. type="card"
  50. items={[
  51. {
  52. label: intl.formatMessage({ id: "labels.list" }),
  53. key: "list",
  54. children: (
  55. <TaskList
  56. editable={!readonly}
  57. studioName={studioName}
  58. projectId={projectId}
  59. taskTree={taskTree}
  60. onChange={onDataChange}
  61. />
  62. ),
  63. },
  64. {
  65. label: intl.formatMessage({ id: "labels.table" }),
  66. key: "table",
  67. children: (
  68. <TaskTable
  69. tasks={tasks}
  70. onChange={(data: ITaskData[]) => {
  71. if (origin) {
  72. let origin = JSON.parse(JSON.stringify(taskTree));
  73. update(data, origin);
  74. onDataChange(origin);
  75. }
  76. }}
  77. />
  78. ),
  79. },
  80. {
  81. label: intl.formatMessage({ id: "labels.flowchart" }),
  82. key: "flowchart",
  83. children: <TaskRelation tasks={tasks} />,
  84. },
  85. ]}
  86. ></Tabs>
  87. </>
  88. );
  89. };
  90. export default ProjectTask;