import { useEffect, useMemo, useState } from "react"; import { useNavigate, useParams } from "react-router-dom"; import { useTranslation } from "react-i18next"; import { Button, Card, Dropdown, Form, Input, message, Modal, notification, Tabs, Typography } from "antd"; import { createSchemaFieldRule } from "antd-zod"; import { PageHeader } from "@ant-design/pro-components"; import { DeleteOutlined as DeleteOutlinedIcon, EllipsisOutlined as EllipsisOutlinedIcon } from "@ant-design/icons"; import { z } from "zod"; import Show from "@/components/Show"; import ModalForm from "@/components/core/ModalForm"; import End from "@/components/workflow/End"; import NodeRender from "@/components/workflow/NodeRender"; import WorkflowRuns from "@/components/workflow/run/WorkflowRuns"; import WorkflowProvider from "@/components/workflow/WorkflowProvider"; import { useAntdForm, useZustandShallowSelector } from "@/hooks"; import { allNodesValidated, type WorkflowModel, type WorkflowNode } from "@/domain/workflow"; import { useWorkflowStore } from "@/stores/workflow"; import { remove as removeWorkflow } from "@/repository/workflow"; import { getErrMsg } from "@/utils/error"; const WorkflowDetail = () => { const navigate = useNavigate(); const { t } = useTranslation(); const [messageApi, MessageContextHolder] = message.useMessage(); const [modalApi, ModalContextHolder] = Modal.useModal(); const [notificationApi, NotificationContextHolder] = notification.useNotification(); const { id: workflowId } = useParams(); const { workflow, init, setBaseInfo, switchEnable } = useWorkflowStore(useZustandShallowSelector(["workflow", "init", "setBaseInfo", "switchEnable"])); useEffect(() => { init(workflowId); }, [workflowId, init]); const [tabValue, setTabValue] = useState<"orchestration" | "runs">("orchestration"); // const [running, setRunning] = useState(false); const elements = useMemo(() => { let current = workflow.draft as WorkflowNode; const elements: JSX.Element[] = []; while (current) { // 处理普通节点 elements.push(); current = current.next as WorkflowNode; } elements.push(); return elements; }, [workflow]); const handleBaseInfoFormFinish = async (values: Pick) => { try { await setBaseInfo(values.name!, values.description!); } catch (err) { console.error(err); notificationApi.error({ message: t("common.text.request_error"), description: getErrMsg(err) }); return false; } }; const handleEnableChange = () => { if (!workflow.enabled && !allNodesValidated(workflow.content!)) { messageApi.warning(t("workflow.detail.action.save.failed.uncompleted")); return; } switchEnable(); }; const handleDeleteClick = () => { modalApi.confirm({ title: t("workflow.action.delete"), content: t("workflow.action.delete.confirm"), onOk: async () => { try { const resp: boolean = await removeWorkflow(workflow); if (resp) { navigate("/workflows"); } } catch (err) { console.error(err); notificationApi.error({ message: t("common.text.request_error"), description: getErrMsg(err) }); } }, }); }; // TODO: 发布更改 撤销更改 立即执行 // const handleWorkflowSaveClick = () => { // if (!allNodesValidated(workflow.draft as WorkflowNode)) { // messageApi.warning(t("workflow.detail.action.save.failed.uncompleted")); // return; // } // save(); // }; // const handleRunClick = async () => { // if (running) return; // setRunning(true); // try { // await runWorkflow(workflow.id as string); // messageApi.success(t("workflow.detail.action.run.success")); // } catch (err) { // console.error(err); // messageApi.warning(t("workflow.detail.action.run.failed")); // } finally { // setRunning(false); // } // }; return (
{MessageContextHolder} {ModalContextHolder} {NotificationContextHolder} {t("common.button.edit")}} onFinish={handleBaseInfoFormFinish} /> , onClick: () => { handleDeleteClick(); }, }, ], }} trigger={["click"]} >
); }; const WorkflowBaseInfoModalForm = ({ data, trigger, onFinish, }: { data: Pick; trigger?: React.ReactNode; onFinish?: (values: Pick) => Promise; }) => { const { t } = useTranslation(); const formSchema = z.object({ name: z .string({ message: t("workflow.baseinfo.form.name.placeholder") }) .trim() .min(1, t("workflow.baseinfo.form.name.placeholder")) .max(64, t("common.errmsg.string_max", { max: 64 })), description: z .string({ message: t("workflow.baseinfo.form.description.placeholder") }) .trim() .min(0, t("workflow.baseinfo.form.description.placeholder")) .max(256, t("common.errmsg.string_max", { max: 256 })) .nullish(), }); const formRule = createSchemaFieldRule(formSchema); const { form: formInst, formPending, formProps, ...formApi } = useAntdForm>({ initialValues: data, onSubmit: async () => { const ret = await onFinish?.(formInst.getFieldsValue(true)); if (ret != null && !ret) return false; return true; }, }); const handleFinish = async () => { return formApi.submit(); }; return ( ); }; export default WorkflowDetail;