ProjectClone.tsx 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. import { ModalForm, ProForm, ProFormText } from "@ant-design/pro-components";
  2. import { Alert, Form } from "antd";
  3. import type {
  4. IProjectData,
  5. IProjectResponse,
  6. IProjectUpdateRequest,
  7. ITaskData,
  8. ITaskGroupInsertData,
  9. ITaskGroupInsertRequest,
  10. ITaskGroupResponse,
  11. ITaskListResponse,
  12. } from "../../api/task";
  13. import { get, post } from "../../request";
  14. import { useState } from "react";
  15. interface IWidget {
  16. trigger?: JSX.Element;
  17. studioName?: string;
  18. projectId?: string;
  19. }
  20. const ProjectClone = ({ trigger, studioName, projectId }: IWidget) => {
  21. const [form] = Form.useForm<IProjectData>();
  22. const [project, setProject] = useState<IProjectData>();
  23. const [tasks, setTasks] = useState<ITaskData[]>();
  24. const [message, setMessage] = useState<string>();
  25. return (
  26. <ModalForm<IProjectData>
  27. title="Clone"
  28. trigger={trigger}
  29. form={form}
  30. autoFocusFirstInput
  31. modalProps={{
  32. destroyOnClose: true,
  33. onCancel: () => console.log("run"),
  34. }}
  35. submitTimeout={2000}
  36. onFinish={async (values) => {
  37. if (!studioName || !project || !tasks) {
  38. return false;
  39. }
  40. const data: IProjectUpdateRequest = {
  41. studio_name: studioName,
  42. title: values.title,
  43. type: project.type,
  44. privacy: "private",
  45. description: project.description,
  46. };
  47. const url = `/v2/project`;
  48. console.info("save api request", url, data);
  49. const res = await post<IProjectUpdateRequest, IProjectResponse>(
  50. url,
  51. data
  52. );
  53. console.info("save api response", res);
  54. if (!res.ok) {
  55. setMessage("Project 建立错误 " + res.message);
  56. return false;
  57. }
  58. const taskData: ITaskGroupInsertData = {
  59. project_id: res.data.id,
  60. tasks: tasks,
  61. };
  62. const taskUrl = "/v2/task-group";
  63. const taskRes = await post<ITaskGroupInsertRequest, ITaskGroupResponse>(
  64. taskUrl,
  65. { data: [taskData] }
  66. );
  67. if (!taskRes.ok) {
  68. setMessage("task 建立错误 " + taskRes.message);
  69. return false;
  70. }
  71. return true;
  72. }}
  73. request={async (_params: Record<string, any>, _props: any) => {
  74. const url = `/v2/project/${projectId}`;
  75. console.info("api request", url);
  76. const project = await get<IProjectResponse>(url);
  77. setProject(project.data);
  78. console.info("api response", project.ok);
  79. //获取tasks
  80. const taskUrl = `/v2/task?view=project&project_id=${projectId}`;
  81. const res = await get<ITaskListResponse>(taskUrl);
  82. setTasks(res.data.rows);
  83. return project.data;
  84. }}
  85. >
  86. <Alert
  87. key={1}
  88. message={message}
  89. type="error"
  90. style={{ display: message ? "unset" : "none" }}
  91. />
  92. <ProForm.Group key={2}>
  93. <ProFormText
  94. width="md"
  95. name="title"
  96. label="标题"
  97. tooltip="最长为 24 位"
  98. rules={[
  99. {
  100. required: true,
  101. },
  102. ]}
  103. />
  104. </ProForm.Group>
  105. </ModalForm>
  106. );
  107. };
  108. export default ProjectClone;