|
|
@@ -0,0 +1,67 @@
|
|
|
+import { fetchDeptTree } from '@/services/dept';
|
|
|
+import { fetchCreateProduct, fetchUpdateProduct } from '@/services/product';
|
|
|
+import { DrawerForm, ProFormItem, ProFormText } from '@ant-design/pro-components';
|
|
|
+import { TreeSelect } from 'antd';
|
|
|
+import { useEffect, useState } from 'react';
|
|
|
+
|
|
|
+interface ProductFormProps {
|
|
|
+ mode: EditorFormMode;
|
|
|
+ initialValues?: Partial<API.ProductItem>;
|
|
|
+ trigger: React.ReactElement;
|
|
|
+ onSuccess: (credentialsTicket?: string) => void;
|
|
|
+}
|
|
|
+
|
|
|
+const buildDeptTreeData = (items: API.DeptItem[]): any[] =>
|
|
|
+ items.map((d) => ({
|
|
|
+ value: d.id,
|
|
|
+ title: d.name,
|
|
|
+ children: d.children ? buildDeptTreeData(d.children) : undefined,
|
|
|
+ }));
|
|
|
+
|
|
|
+export const ProductForm = ({ mode, initialValues, trigger, onSuccess }: ProductFormProps) => {
|
|
|
+ const [deptTree, setDeptTree] = useState<any[]>([]);
|
|
|
+ const title = mode === 'edit' ? '编辑产品' : '新建产品';
|
|
|
+
|
|
|
+ useEffect(() => {
|
|
|
+ fetchDeptTree().then((res) => setDeptTree(buildDeptTreeData(res.data ?? [])));
|
|
|
+ }, []);
|
|
|
+
|
|
|
+ const handleFinish = async (values: any) => {
|
|
|
+ if (mode === 'edit' && initialValues?.id) {
|
|
|
+ await fetchUpdateProduct({ id: initialValues.id, name: values.name, remark: values.remark });
|
|
|
+ onSuccess();
|
|
|
+ } else {
|
|
|
+ const res = await fetchCreateProduct(values);
|
|
|
+ onSuccess(res.data?.credentialsTicket);
|
|
|
+ }
|
|
|
+ return true;
|
|
|
+ };
|
|
|
+
|
|
|
+ return (
|
|
|
+ <DrawerForm
|
|
|
+ title={title}
|
|
|
+ trigger={trigger}
|
|
|
+ initialValues={mode === 'edit' ? initialValues : undefined}
|
|
|
+ onFinish={handleFinish}
|
|
|
+ drawerProps={{ destroyOnClose: true }}
|
|
|
+ >
|
|
|
+ <ProFormText name="name" label="产品名称" rules={[{ required: true }]} />
|
|
|
+ {mode !== 'edit' && (
|
|
|
+ <ProFormText
|
|
|
+ name="code"
|
|
|
+ label="产品 Code"
|
|
|
+ rules={[
|
|
|
+ { required: true },
|
|
|
+ { pattern: /^[a-z0-9-]+$/, message: '只允许小写字母、数字和连字符' },
|
|
|
+ ]}
|
|
|
+ />
|
|
|
+ )}
|
|
|
+ {mode !== 'edit' && (
|
|
|
+ <ProFormItem name="adminDeptId" label="管理员所属部门" rules={[{ required: true }]}>
|
|
|
+ <TreeSelect treeData={deptTree} placeholder="请选择部门" />
|
|
|
+ </ProFormItem>
|
|
|
+ )}
|
|
|
+ <ProFormText name="remark" label="备注" />
|
|
|
+ </DrawerForm>
|
|
|
+ );
|
|
|
+};
|