import { useEffect, useRef, useState } from 'react'; import { Drawer, Form, Input, Select, Radio, TreeSelect, Button, Space, Card } from 'antd'; import type { DefaultOptionType } from 'antd/es/select'; import { getUser, createUser, updateUser } from '@/api/system/user'; import { getDeptList } from '@/api/system/dept'; import type { SystemDept } from '@/api/system/dept'; import { getSimplePostList } from '@/api/system/post'; import type { SystemPost } from '@/api/system/post'; import type { SystemUser } from '@/api/system/user'; import { useTranslation } from 'react-i18next'; import { App } from 'antd'; const DEFAULT_FORM = { status: 0 }; /** Build tree-select data from flat dept list */ function buildDeptTreeSelect(list: SystemDept[]): DefaultOptionType[] { const map = new Map(); const roots: DefaultOptionType[] = []; for (const item of list) { map.set(item.id!, { value: item.id, title: item.name, children: [], }); } for (const item of list) { const node = map.get(item.id!)!; if (item.parentId === 0 || !map.has(item.parentId)) { roots.push(node); } else { map.get(item.parentId)!.children.push(node); } } return roots; } interface UserDrawerProps { open: boolean; id: number | null; onSuccess: () => void; onClose: () => void; } const UserDrawer: React.FC = ({ open, id, onSuccess, onClose }) => { const { t } = useTranslation('system/user'); const { t: tc } = useTranslation('common'); const { message } = App.useApp(); const [form] = Form.useForm(); const [confirmLoading, setConfirmLoading] = useState(false); const [deptTree, setDeptTree] = useState([]); const [postList, setPostList] = useState([]); // 保留服务端原始字段,避免编辑时丢掉未在表单里出现的字段 const originData = useRef>({}); const isEdit = id != null; useEffect(() => { if (open) { form.resetFields(); originData.current = {}; // Load dept tree and post list getDeptList().then(({ data }) => setDeptTree(buildDeptTreeSelect(data))).catch(() => { }); getSimplePostList().then(({ data }) => setPostList(data)).catch(() => { }); // Load user data in edit mode if (id) { getUser(id).then(({ data }) => { originData.current = { ...data }; form.setFieldsValue(data); }).catch(() => { }); } else { form.setFieldsValue(DEFAULT_FORM); } } }, [open, id, form]); const handleOk = async () => { let values: SystemUser; try { values = await form.validateFields(); } catch { return; } setConfirmLoading(true); try { const payload = { ...originData.current, ...values, ...(id != null ? { id } : {}) } as SystemUser; if (isEdit) { await updateUser(payload); message.success(tc('success')); } else { await createUser(payload); message.success(tc('success')); } onSuccess(); } finally { setConfirmLoading(false); } }; return ( } >
{!id && ( )} {!id && ( )} ({ value: p.id, label: p.name }))} /> {tc('enable')} {tc('disable')}
); }; export default UserDrawer;