refactor(ui): clean code

This commit is contained in:
Fu Diwei 2024-12-27 17:02:21 +08:00
parent fb2d292cbf
commit 047479426a
3 changed files with 82 additions and 110 deletions

View File

@ -1,4 +1,5 @@
import { useControllableValue } from "ahooks"; import { useTranslation } from "react-i18next";
import { useControllableValue } from "ahooks";
import { Button, Drawer, Form, Space, type DrawerProps, type FormProps, type ModalProps } from "antd"; import { Button, Drawer, Form, Space, type DrawerProps, type FormProps, type ModalProps } from "antd";
import { useAntdForm, useTriggerElement } from "@/hooks"; import { useAntdForm, useTriggerElement } from "@/hooks";
@ -25,14 +26,20 @@ const DrawerForm = <T extends NonNullable<unknown> = any>({
className, className,
style, style,
children, children,
cancelText,
cancelButtonProps,
form, form,
drawerProps, drawerProps,
okText,
okButtonProps,
title, title,
trigger, trigger,
width, width,
onFinish, onFinish,
...props ...props
}: DrawerFormProps<T>) => { }: DrawerFormProps<T>) => {
const { t } = useTranslation();
const [open, setOpen] = useControllableValue<boolean>(props, { const [open, setOpen] = useControllableValue<boolean>(props, {
valuePropName: "open", valuePropName: "open",
defaultValuePropName: "defaultOpen", defaultValuePropName: "defaultOpen",
@ -76,9 +83,11 @@ const DrawerForm = <T extends NonNullable<unknown> = any>({
<Drawer <Drawer
footer={ footer={
<Space> <Space>
<Button onClick={handleCancelClick}>1</Button> <Button {...cancelButtonProps} onClick={handleCancelClick}>
<Button type="primary" loading={formPending} onClick={handleOkClick}> {cancelText || t("common.button.cancel")}
2 </Button>
<Button type="primary" loading={formPending} {...okButtonProps} onClick={handleOkClick}>
{okText || t("common.button.ok")}
</Button> </Button>
</Space> </Space>
} }

View File

@ -119,9 +119,8 @@ const ApplyNodeForm = ({ data }: ApplyNodeFormProps) => {
/> />
<FormFieldDomainsModalForm <FormFieldDomainsModalForm
data={fieldDomains} data={fieldDomains}
disabled={formPending}
trigger={ trigger={
<Button> <Button disabled={formPending}>
<FormOutlinedIcon /> <FormOutlinedIcon />
</Button> </Button>
} }
@ -215,9 +214,8 @@ const ApplyNodeForm = ({ data }: ApplyNodeFormProps) => {
/> />
<FormFieldNameserversModalForm <FormFieldNameserversModalForm
data={fieldNameservers} data={fieldNameservers}
disabled={formPending}
trigger={ trigger={
<Button> <Button disabled={formPending}>
<FormOutlinedIcon /> <FormOutlinedIcon />
</Button> </Button>
} }
@ -330,7 +328,6 @@ const FormFieldEmailSelect = ({
const FormFieldDomainsModalForm = ({ const FormFieldDomainsModalForm = ({
data, data,
disabled,
trigger, trigger,
onFinish, onFinish,
}: { }: {
@ -371,7 +368,6 @@ const FormFieldDomainsModalForm = ({
return ( return (
<ModalForm <ModalForm
disabled={disabled}
layout="vertical" layout="vertical"
form={formInst} form={formInst}
initialValues={model} initialValues={model}
@ -389,17 +385,7 @@ const FormFieldDomainsModalForm = ({
); );
}; };
const FormFieldNameserversModalForm = ({ const FormFieldNameserversModalForm = ({ data, trigger, onFinish }: { data: string; trigger?: React.ReactNode; onFinish?: (data: string) => void }) => {
data,
disabled,
trigger,
onFinish,
}: {
data: string;
disabled?: boolean;
trigger?: React.ReactNode;
onFinish?: (data: string) => void;
}) => {
const { t } = useTranslation(); const { t } = useTranslation();
const formSchema = z.object({ const formSchema = z.object({
@ -432,7 +418,6 @@ const FormFieldNameserversModalForm = ({
return ( return (
<ModalForm <ModalForm
disabled={disabled}
layout="vertical" layout="vertical"
form={formInst} form={formInst}
initialValues={model} initialValues={model}

View File

@ -1,4 +1,4 @@
import { memo, useEffect, useMemo, useState } from "react"; import { useEffect, useMemo, useState } from "react";
import { useNavigate, useParams } from "react-router-dom"; import { useNavigate, useParams } from "react-router-dom";
import { useTranslation } from "react-i18next"; import { useTranslation } from "react-i18next";
import { Button, Card, Dropdown, Form, Input, message, Modal, notification, Tabs, Typography } from "antd"; import { Button, Card, Dropdown, Form, Input, message, Modal, notification, Tabs, Typography } from "antd";
@ -8,11 +8,12 @@ import { DeleteOutlined as DeleteOutlinedIcon, EllipsisOutlined as EllipsisOutli
import { z } from "zod"; import { z } from "zod";
import Show from "@/components/Show"; import Show from "@/components/Show";
import ModalForm from "@/components/core/ModalForm";
import End from "@/components/workflow/End"; import End from "@/components/workflow/End";
import NodeRender from "@/components/workflow/NodeRender"; import NodeRender from "@/components/workflow/NodeRender";
import WorkflowRuns from "@/components/workflow/run/WorkflowRuns"; import WorkflowRuns from "@/components/workflow/run/WorkflowRuns";
import WorkflowProvider from "@/components/workflow/WorkflowProvider"; import WorkflowProvider from "@/components/workflow/WorkflowProvider";
import { useAntdForm, useTriggerElement, useZustandShallowSelector } from "@/hooks"; import { useAntdForm, useZustandShallowSelector } from "@/hooks";
import { allNodesValidated, type WorkflowModel, type WorkflowNode } from "@/domain/workflow"; import { allNodesValidated, type WorkflowModel, type WorkflowNode } from "@/domain/workflow";
import { useWorkflowStore } from "@/stores/workflow"; import { useWorkflowStore } from "@/stores/workflow";
import { remove as removeWorkflow } from "@/repository/workflow"; import { remove as removeWorkflow } from "@/repository/workflow";
@ -125,7 +126,7 @@ const WorkflowDetail = () => {
title={workflow.name} title={workflow.name}
extra={[ extra={[
<Button.Group key="actions"> <Button.Group key="actions">
<WorkflowBaseInfoModalForm initialValues={workflow} trigger={<Button>{t("common.button.edit")}</Button>} onFinish={handleBaseInfoFormFinish} /> <WorkflowBaseInfoModalForm data={workflow} trigger={<Button>{t("common.button.edit")}</Button>} onFinish={handleBaseInfoFormFinish} />
<Button onClick={handleEnableChange}>{workflow.enabled ? t("common.button.disable") : t("common.button.enable")}</Button> <Button onClick={handleEnableChange}>{workflow.enabled ? t("common.button.disable") : t("common.button.enable")}</Button>
@ -182,22 +183,17 @@ const WorkflowDetail = () => {
); );
}; };
const WorkflowBaseInfoModalForm = memo( const WorkflowBaseInfoModalForm = ({
({ data,
initialValues,
trigger, trigger,
onFinish, onFinish,
}: { }: {
initialValues: Pick<WorkflowModel, "name" | "description">; data: Pick<WorkflowModel, "name" | "description">;
trigger?: React.ReactNode; trigger?: React.ReactNode;
onFinish?: (values: Pick<WorkflowModel, "name" | "description">) => Promise<void | boolean>; onFinish?: (values: Pick<WorkflowModel, "name" | "description">) => Promise<void | boolean>;
}) => { }) => {
const { t } = useTranslation(); const { t } = useTranslation();
const [open, setOpen] = useState(false);
const triggerDom = useTriggerElement(trigger, { onClick: () => setOpen(true) });
const formSchema = z.object({ const formSchema = z.object({
name: z name: z
.string({ message: t("workflow.baseinfo.form.name.placeholder") }) .string({ message: t("workflow.baseinfo.form.name.placeholder") })
@ -218,44 +214,31 @@ const WorkflowBaseInfoModalForm = memo(
formProps, formProps,
...formApi ...formApi
} = useAntdForm<z.infer<typeof formSchema>>({ } = useAntdForm<z.infer<typeof formSchema>>({
initialValues: initialValues, initialValues: data,
onSubmit: async () => { onSubmit: async () => {
const ret = await onFinish?.(formInst.getFieldsValue(true)); const ret = await onFinish?.(formInst.getFieldsValue(true));
if (ret != null && !ret) return; if (ret != null && !ret) return false;
return true;
setOpen(false);
}, },
}); });
const handleClickOk = async () => { const handleFinish = async () => {
formApi.submit(); return formApi.submit();
};
const handleClickCancel = () => {
if (formPending) return Promise.reject();
setOpen(false);
}; };
return ( return (
<> <ModalForm
{triggerDom} disabled={formPending}
layout="vertical"
<Modal form={formInst}
afterClose={() => setOpen(false)} modalProps={{ destroyOnClose: true }}
cancelButtonProps={{ disabled: formPending }}
closable
confirmLoading={formPending}
destroyOnClose
okText={t("common.button.save")} okText={t("common.button.save")}
open={open}
title={t(`workflow.baseinfo.modal.title`)} title={t(`workflow.baseinfo.modal.title`)}
trigger={trigger}
width={480} width={480}
onOk={handleClickOk} {...formProps}
onCancel={handleClickCancel} onFinish={handleFinish}
> >
<div className="pt-4 pb-2">
<Form {...formProps} form={formInst} layout="vertical">
<Form.Item name="name" label={t("workflow.baseinfo.form.name.label")} rules={[formRule]}> <Form.Item name="name" label={t("workflow.baseinfo.form.name.label")} rules={[formRule]}>
<Input placeholder={t("workflow.baseinfo.form.name.placeholder")} /> <Input placeholder={t("workflow.baseinfo.form.name.placeholder")} />
</Form.Item> </Form.Item>
@ -263,12 +246,7 @@ const WorkflowBaseInfoModalForm = memo(
<Form.Item name="description" label={t("workflow.baseinfo.form.description.label")} rules={[formRule]}> <Form.Item name="description" label={t("workflow.baseinfo.form.description.label")} rules={[formRule]}>
<Input placeholder={t("workflow.baseinfo.form.description.placeholder")} /> <Input placeholder={t("workflow.baseinfo.form.description.placeholder")} />
</Form.Item> </Form.Item>
</Form> </ModalForm>
</div>
</Modal>
</>
); );
} };
);
export default WorkflowDetail; export default WorkflowDetail;