visuddhinanda пре 11 месеци
родитељ
комит
94faa5a4bf
1 измењених фајлова са 111 додато и 0 уклоњено
  1. 111 0
      dashboard-v4/dashboard/src/components/task/ProjectClone.tsx

+ 111 - 0
dashboard-v4/dashboard/src/components/task/ProjectClone.tsx

@@ -0,0 +1,111 @@
+import { ModalForm, ProForm, ProFormText } from "@ant-design/pro-components";
+import { Alert, Form } from "antd";
+import {
+  IProjectData,
+  IProjectResponse,
+  IProjectUpdateRequest,
+  ITaskData,
+  ITaskGroupInsertData,
+  ITaskGroupInsertRequest,
+  ITaskGroupResponse,
+  ITaskListResponse,
+} from "../api/task";
+import { get, post } from "../../request";
+import { useState } from "react";
+
+interface IWidget {
+  trigger?: JSX.Element;
+  studioName?: string;
+  projectId?: string;
+}
+const ProjectClone = ({ trigger, studioName, projectId }: IWidget) => {
+  const [form] = Form.useForm<IProjectData>();
+  const [project, setProject] = useState<IProjectData>();
+  const [tasks, setTasks] = useState<ITaskData[]>();
+  const [message, setMessage] = useState<string>();
+  return (
+    <ModalForm<IProjectData>
+      title="Clone"
+      trigger={trigger}
+      form={form}
+      autoFocusFirstInput
+      modalProps={{
+        destroyOnClose: true,
+        onCancel: () => console.log("run"),
+      }}
+      submitTimeout={2000}
+      onFinish={async (values) => {
+        if (!studioName || !project || !tasks) {
+          return false;
+        }
+        const data: IProjectUpdateRequest = {
+          studio_name: studioName,
+          title: values.title,
+          type: project.type,
+          privacy: "private",
+          description: project.description,
+        };
+        const url = `/v2/project`;
+        console.info("save api request", url, data);
+        const res = await post<IProjectUpdateRequest, IProjectResponse>(
+          url,
+          data
+        );
+        console.info("save api response", res);
+        if (!res.ok) {
+          setMessage("Project 建立错误 " + res.message);
+          return false;
+        }
+
+        const taskData: ITaskGroupInsertData = {
+          project_id: res.data.id,
+          tasks: tasks,
+        };
+        const taskUrl = "/v2/task-group";
+        const taskRes = await post<ITaskGroupInsertRequest, ITaskGroupResponse>(
+          taskUrl,
+          { data: [taskData] }
+        );
+        if (!taskRes.ok) {
+          setMessage("task 建立错误 " + taskRes.message);
+          return false;
+        }
+        return true;
+      }}
+      request={async (params: Record<string, any>, props: any) => {
+        const url = `/v2/project/${projectId}`;
+        console.info("api request", url);
+        const project = await get<IProjectResponse>(url);
+        setProject(project.data);
+        console.info("api response", project.ok);
+
+        //获取tasks
+        const taskUrl = `/v2/task?view=project&project_id=${projectId}`;
+        const res = await get<ITaskListResponse>(taskUrl);
+        setTasks(res.data.rows);
+        return project.data;
+      }}
+    >
+      <Alert
+        message={message}
+        type="error"
+        style={{ display: message ? "unset" : "none" }}
+      />
+      <ProForm.Group>
+        <ProFormText
+          width="md"
+          name="title"
+          label="标题"
+          tooltip="最长为 24 位"
+          rules={[
+            {
+              required: true,
+            },
+          ]}
+        />
+      </ProForm.Group>
+    </ModalForm>
+  );
+};
+
+export default ProjectClone;