TaskRelation.tsx 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. import { ITaskData } from "../api/task";
  2. import "../article/article.css";
  3. import Mermaid from "../general/Mermaid";
  4. interface IWidget {
  5. projectId?: string;
  6. tasks?: ITaskData[];
  7. }
  8. const TaskRelation = ({ tasks }: IWidget) => {
  9. let mermaidText = "flowchart LR\n";
  10. //节点样式
  11. const color = [
  12. {
  13. status: "pending",
  14. fill: "#fafafa",
  15. stroke: "#d9d9d9",
  16. color: "#000000d9",
  17. },
  18. {
  19. status: "published",
  20. fill: "#fff7e6",
  21. stroke: "#ffd591",
  22. color: "#d46b08",
  23. },
  24. { status: "running", fill: "#e6f7ff", stroke: "#91d5ff", color: "#1890ff" },
  25. { status: "done", fill: "#f6ffed", stroke: "#b7eb8f", color: "#52c41a" },
  26. {
  27. status: "restarted",
  28. fill: "r#fff2f0",
  29. stroke: "#ffccc7",
  30. color: "#ff4d4f",
  31. },
  32. {
  33. status: "requested_restart",
  34. fill: "#fffbe6",
  35. stroke: "#ffe58f",
  36. color: "#faad14",
  37. },
  38. { status: "closed", fill: "yellow", stroke: "#333", color: "#333" },
  39. { status: "canceled", fill: "gray", stroke: "#333", color: "#333" },
  40. { status: "expired", fill: "brown", stroke: "#333", color: "#333" },
  41. ];
  42. color.forEach((value) => {
  43. mermaidText += `classDef ${value.status} fill:${value.fill},stroke:${value.stroke},color:${value.color},stroke-width:1px;\n`;
  44. });
  45. let relationLine = new Map<string, number>();
  46. tasks?.forEach((task: ITaskData, index: number, array: ITaskData[]) => {
  47. //输出节点
  48. mermaidText += `${task.id}[${task.title}]:::${task.status};\n`;
  49. //输出带有子任务的节点
  50. const children = array.filter(
  51. (value: ITaskData, index: number, array: ITaskData[]) => {
  52. return value.parent_id === task.id;
  53. }
  54. );
  55. if (children.length > 0) {
  56. mermaidText += `subgraph ${task.id} ["${task.title}"]\n`;
  57. mermaidText += `${children.map((task) => task.id).join(`;\n`)}`;
  58. mermaidText += ";\nend\n";
  59. }
  60. //关系线
  61. task.pre_task?.map((item) =>
  62. relationLine.set(`${item.id} --> ${task.id};\n`, 0)
  63. );
  64. task.next_task?.map((item) =>
  65. relationLine.set(`${task.id} --> ${item.id};\n`, 0)
  66. );
  67. });
  68. Array.from(relationLine.keys()).forEach((value) => {
  69. mermaidText += value;
  70. });
  71. console.debug(mermaidText);
  72. return (
  73. <div>
  74. <Mermaid text={mermaidText} />
  75. </div>
  76. );
  77. };
  78. export default TaskRelation;