2
0

TaskEditButton.tsx 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. import { Dropdown, Space, message } from "antd";
  2. import {
  3. ArrowLeftOutlined,
  4. CodeSandboxOutlined,
  5. DeleteOutlined,
  6. FieldTimeOutlined,
  7. ArrowRightOutlined,
  8. } from "@ant-design/icons";
  9. import { useIntl } from "react-intl";
  10. import type { MenuProps } from "antd";
  11. import type {
  12. ITaskData,
  13. ITaskResponse,
  14. ITaskUpdateRequest,
  15. } from "../../api/task";
  16. import { patch } from "../../request";
  17. import TaskStatusButton from "./TaskStatusButton";
  18. export type TRelation = "pre" | "next";
  19. interface IWidget {
  20. task?: ITaskData;
  21. studioName?: string;
  22. onChange?: (task: ITaskData[]) => void;
  23. onPreTask?: (type: TRelation) => void;
  24. }
  25. const TaskEditButton = ({ task, onChange, onPreTask }: IWidget) => {
  26. const intl = useIntl();
  27. const setValue = (setting: ITaskUpdateRequest) => {
  28. const url = `/v2/task/${setting.id}`;
  29. patch<ITaskUpdateRequest, ITaskResponse>(url, setting).then((json) => {
  30. if (json.ok) {
  31. message.success("Success");
  32. onChange && onChange([json.data]);
  33. } else {
  34. message.error(json.message);
  35. }
  36. });
  37. };
  38. const mainMenuItems: MenuProps["items"] = [
  39. {
  40. key: "milestone",
  41. label: task?.is_milestone
  42. ? intl.formatMessage({ id: "buttons.remove.milestone" })
  43. : intl.formatMessage({ id: "buttons.set.milestone" }),
  44. icon: <CodeSandboxOutlined />,
  45. },
  46. {
  47. key: "pre-task",
  48. label: intl.formatMessage({ id: "buttons.task.add.pre-task" }),
  49. icon: <ArrowLeftOutlined />,
  50. },
  51. {
  52. key: "next-task",
  53. label: intl.formatMessage({ id: "buttons.task.add.next-task" }),
  54. icon: <ArrowRightOutlined />,
  55. },
  56. {
  57. type: "divider",
  58. },
  59. {
  60. label: intl.formatMessage({ id: "buttons.timeline" }),
  61. key: "timeline",
  62. icon: <FieldTimeOutlined />,
  63. },
  64. {
  65. label: intl.formatMessage({ id: "buttons.delete" }),
  66. key: "delete",
  67. icon: <DeleteOutlined />,
  68. danger: true,
  69. },
  70. ];
  71. const mainMenuClick: MenuProps["onClick"] = (e) => {
  72. switch (e.key) {
  73. case "milestone":
  74. if (task) {
  75. if (task.id) {
  76. setValue({
  77. id: task.id,
  78. is_milestone: !task.is_milestone,
  79. studio_name: task.owner?.realName ?? "",
  80. });
  81. }
  82. }
  83. break;
  84. case "pre-task":
  85. onPreTask && onPreTask("pre");
  86. break;
  87. case "next-task":
  88. onPreTask && onPreTask("next");
  89. break;
  90. default:
  91. break;
  92. }
  93. };
  94. return (
  95. <Space>
  96. <TaskStatusButton task={task} onChange={onChange} />
  97. <Dropdown.Button
  98. key={1}
  99. type="link"
  100. trigger={["click", "contextMenu"]}
  101. menu={{
  102. items: mainMenuItems,
  103. onClick: mainMenuClick,
  104. }}
  105. ></Dropdown.Button>
  106. </Space>
  107. );
  108. };
  109. export default TaskEditButton;