MyTasks.tsx 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  1. import { Tabs } from "antd";
  2. import React, { useRef, useState } from "react";
  3. import TaskList from "./TaskList";
  4. import { useAppSelector } from "../../hooks";
  5. import { currentUser } from "../../reducers/current-user";
  6. type TargetKey = React.MouseEvent | React.KeyboardEvent | string;
  7. const TaskRunning = ({ studioName }: { studioName?: string }) => {
  8. const currUser = useAppSelector(currentUser);
  9. return currUser ? (
  10. <TaskList
  11. studioName={studioName}
  12. status={["running", "restarted"]}
  13. filters={[
  14. { field: "executor_id", operator: "includes", value: [currUser?.id] },
  15. ]}
  16. />
  17. ) : (
  18. <>未登录</>
  19. );
  20. };
  21. const TaskAssignee = ({ studioName }: { studioName?: string }) => {
  22. const currUser = useAppSelector(currentUser);
  23. return currUser ? (
  24. <TaskList
  25. studioName={studioName}
  26. status={["published"]}
  27. filters={[
  28. { field: "assignees_id", operator: "includes", value: [currUser?.id] },
  29. ]}
  30. />
  31. ) : (
  32. <>未登录</>
  33. );
  34. };
  35. const TaskDone = ({ studioName }: { studioName?: string }) => {
  36. const currUser = useAppSelector(currentUser);
  37. return currUser ? (
  38. <TaskList
  39. studioName={studioName}
  40. status={["done"]}
  41. filters={[
  42. { field: "executor_id", operator: "includes", value: [currUser?.id] },
  43. ]}
  44. />
  45. ) : (
  46. <>未登录</>
  47. );
  48. };
  49. const TaskNew = ({ studioName }: { studioName?: string }) => {
  50. const currUser = useAppSelector(currentUser);
  51. return currUser ? (
  52. <TaskList
  53. studioName={studioName}
  54. filters={[
  55. { field: "executor_id", operator: "includes", value: [currUser?.id] },
  56. ]}
  57. />
  58. ) : (
  59. <>未登录</>
  60. );
  61. };
  62. interface IWidget {
  63. studioName?: string;
  64. }
  65. const MyTasks = ({ studioName }: IWidget) => {
  66. const currUser = useAppSelector(currentUser);
  67. console.info("currUser", currUser);
  68. const initialItems = [
  69. {
  70. label: "进行中",
  71. closable: false,
  72. key: "running",
  73. children: <TaskRunning studioName={studioName} />,
  74. },
  75. {
  76. label: "待领取",
  77. closable: false,
  78. key: "2",
  79. children: <TaskAssignee studioName={studioName} />,
  80. },
  81. {
  82. label: "已完成",
  83. key: "done",
  84. closable: false,
  85. children: <TaskDone studioName={studioName} />,
  86. },
  87. ];
  88. const [activeKey, setActiveKey] = useState(initialItems[0].key);
  89. const [items, setItems] = useState(initialItems);
  90. const newTabIndex = useRef(0);
  91. const onChange = (newActiveKey: string) => {
  92. setActiveKey(newActiveKey);
  93. };
  94. const add = () => {
  95. const newActiveKey = `newTab${newTabIndex.current++}`;
  96. const newPanes = [...items];
  97. newPanes.push({
  98. label: "New Tab",
  99. key: newActiveKey,
  100. closable: true,
  101. children: <TaskNew studioName={studioName} />,
  102. });
  103. setItems(newPanes);
  104. setActiveKey(newActiveKey);
  105. };
  106. const remove = (targetKey: TargetKey) => {
  107. let newActiveKey = activeKey;
  108. let lastIndex = -1;
  109. items.forEach((item, i) => {
  110. if (item.key === targetKey) {
  111. lastIndex = i - 1;
  112. }
  113. });
  114. const newPanes = items.filter((item) => item.key !== targetKey);
  115. if (newPanes.length && newActiveKey === targetKey) {
  116. if (lastIndex >= 0) {
  117. newActiveKey = newPanes[lastIndex].key;
  118. } else {
  119. newActiveKey = newPanes[0].key;
  120. }
  121. }
  122. setItems(newPanes);
  123. setActiveKey(newActiveKey);
  124. };
  125. const onEdit = (
  126. targetKey: React.MouseEvent | React.KeyboardEvent | string,
  127. action: "add" | "remove"
  128. ) => {
  129. if (action === "add") {
  130. add();
  131. } else {
  132. remove(targetKey);
  133. }
  134. };
  135. return (
  136. <Tabs
  137. type="editable-card"
  138. onChange={onChange}
  139. activeKey={activeKey}
  140. onEdit={onEdit}
  141. items={items}
  142. />
  143. );
  144. };
  145. export default MyTasks;