import { useEffect, useRef, useState } from 'react'; import { Drawer, Button, Space, Tag, Popconfirm, Modal, Form, Input, InputNumber, Radio } from 'antd'; import { PlusOutlined } from '@ant-design/icons'; import { ProTable } from '@ant-design/pro-components'; import type { ActionType, ProColumns } from '@ant-design/pro-components'; import { useTranslation } from 'react-i18next'; import { App } from 'antd'; import { Access } from '@/components/Access'; import { getDictDataPage, getDictData, createDictData, updateDictData, deleteDictData, } from '@/api/system/dict-data'; import type { DictData } from '@/api/system/dict-data'; const DEFAULT_FORM = { sort: 0, status: 0 }; interface DictDataDrawerProps { open: boolean; dictType: string; onClose: () => void; } const DictDataDrawer: React.FC = ({ open, dictType, onClose }) => { const { t } = useTranslation('system/dict'); const { t: tc } = useTranslation('common'); const { message } = App.useApp(); const actionRef = useRef(null); const [modalOpen, setModalOpen] = useState(false); const [editId, setEditId] = useState(null); const [form] = Form.useForm(); const [confirmLoading, setConfirmLoading] = useState(false); // 保留服务端原始字段,避免编辑时丢掉未在表单里出现的字段 const originData = useRef>({}); // Reset form when modal opens useEffect(() => { if (modalOpen) { form.resetFields(); originData.current = {}; if (editId) { getDictData(editId).then(({ data }) => { originData.current = { ...data }; form.setFieldsValue(data); }).catch(() => { }); } else { form.setFieldsValue(DEFAULT_FORM); } } }, [modalOpen, editId, form]); const handleDelete = (id: number) => async () => { try { await deleteDictData(id); message.success(tc('success')); actionRef.current?.reload(); } catch { /* request 拦截器已弹出错误提示 */ } }; const handleFormOk = async () => { let values: DictData; try { values = await form.validateFields(); } catch { return; } setConfirmLoading(true); try { const payload = { ...originData.current, ...values, dictType }; if (editId) { await updateDictData({ ...payload, id: editId } as DictData); message.success(tc('success')); } else { await createDictData(payload as DictData); message.success(tc('success')); } setModalOpen(false); actionRef.current?.reload(); } finally { setConfirmLoading(false); } }; const columns: ProColumns[] = [ { title: t('dataLabel'), dataIndex: 'label', ellipsis: true, width: 150, }, { title: t('dataValue'), dataIndex: 'value', search: false, width: 120, }, { title: t('dataSort'), dataIndex: 'sort', search: false, width: 80, }, { title: t('colorType'), dataIndex: 'colorType', search: false, width: 100, }, { title: t('dataStatus'), dataIndex: 'status', search: false, width: 100, render: (_, record) => ( {record.status === 0 ? tc('enable') : tc('disable')} ), }, { title: tc('operation'), key: 'action', fixed: 'right', search: false, width: 150, render: (_, record) => ( { setEditId(record.id!); setModalOpen(true); }} > {tc('edit')} {tc('delete')} ), }, ]; return ( columns={columns} actionRef={actionRef} rowKey="id" search={false} params={{ dictType }} request={async (params) => { const { current, pageSize, ...rest } = params; const { data } = await getDictDataPage({ pageNo: current!, pageSize: pageSize!, ...rest, }); return { data: data.list, total: data.total, success: true }; }} pagination={{ defaultPageSize: 10, showSizeChanger: true }} scroll={{ x: 700 }} toolBarRender={() => [ , ]} /> {/* Dict Data Form Modal */} setModalOpen(false)} destroyOnHidden >
{tc('enable')} {tc('disable')}
); }; export default DictDataDrawer;