Form.tsx 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. import { fetchDeptTree } from '@/services/dept';
  2. import { fetchCreateUser, fetchUpdateUser } from '@/services/user';
  3. import { DrawerForm, ProFormItem, ProFormText } from '@ant-design/pro-components';
  4. import { TreeSelect } from 'antd';
  5. import { useEffect, useState } from 'react';
  6. interface UserFormProps {
  7. mode: EditorFormMode;
  8. initialValues?: Partial<API.UserItem>;
  9. trigger: React.ReactElement;
  10. onSuccess: (credentialsTicket?: string) => void;
  11. }
  12. const buildDeptOptions = (items: API.DeptItem[]): any[] =>
  13. items.map((d) => ({
  14. value: d.id,
  15. title: d.name,
  16. children: d.children ? buildDeptOptions(d.children) : undefined,
  17. }));
  18. export const UserForm = ({ mode, initialValues, trigger, onSuccess }: UserFormProps) => {
  19. const [deptTree, setDeptTree] = useState<any[]>([]);
  20. const [open, setOpen] = useState(false);
  21. useEffect(() => {
  22. if (!open || deptTree.length > 0) return;
  23. fetchDeptTree().then((res) => setDeptTree(buildDeptOptions(res.data ?? [])));
  24. }, [open]);
  25. const title = { add: '新建用户', edit: '编辑用户', copy: '复制用户' }[mode];
  26. const formValues =
  27. mode === 'copy'
  28. ? {
  29. ...initialValues,
  30. id: undefined,
  31. username: undefined,
  32. deptId: initialValues?.deptId || undefined,
  33. }
  34. : mode === 'edit'
  35. ? { ...initialValues, deptId: initialValues?.deptId || undefined }
  36. : undefined;
  37. const handleFinish = async (values: any) => {
  38. if (mode === 'edit' && initialValues?.id) {
  39. const res = await fetchUpdateUser({
  40. id: initialValues.id,
  41. nickname: values.nickname,
  42. email: values.email,
  43. phone: values.phone,
  44. remark: values.remark,
  45. deptId: values.deptId ?? 0,
  46. });
  47. if (!res.success) return false;
  48. onSuccess();
  49. } else {
  50. const res = await fetchCreateUser(values);
  51. if (!res.success) return false;
  52. onSuccess(res.data?.credentialsTicket);
  53. }
  54. return true;
  55. };
  56. return (
  57. <DrawerForm
  58. title={title}
  59. trigger={trigger}
  60. initialValues={formValues}
  61. onFinish={handleFinish}
  62. onOpenChange={setOpen}
  63. drawerProps={{ destroyOnClose: true }}
  64. >
  65. <ProFormText
  66. name="username"
  67. label="用户名"
  68. rules={[{ required: true }]}
  69. disabled={mode === 'edit'}
  70. readonly={mode === 'edit'}
  71. />
  72. <ProFormText name="nickname" label="昵称" />
  73. <ProFormText name="email" label="邮箱" rules={[{ type: 'email' }]} />
  74. <ProFormText name="phone" label="手机号" />
  75. <ProFormText name="remark" label="备注" />
  76. <ProFormItem name="deptId" label="所属部门">
  77. <TreeSelect treeData={deptTree} allowClear placeholder="请选择部门" />
  78. </ProFormItem>
  79. </DrawerForm>
  80. );
  81. };