ProjectTask.tsx 2.9 KB

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