import { useState } from 'react'; import { Table, Button, Space, Form, Input, InputNumber, Popconfirm, Typography, Tag, } from 'antd'; import { PlusOutlined } from '@ant-design/icons'; import { listDictionaries, createDictionary, updateDictionary, deleteDictionary, createDictionaryItem, updateDictionaryItem, deleteDictionaryItem, type DictionaryInfo, type DictionaryItemInfo, type CreateDictionaryRequest, type CreateDictionaryItemRequest, type UpdateDictionaryItemRequest, } from '../../api/dictionaries'; import { useListData } from '../../hooks/useListData'; import { useCrudDrawer } from '../../hooks/useCrudDrawer'; import { DrawerForm } from '../../components/DrawerForm'; import { useApiRequest } from '../../hooks/useApiRequest'; type DictItem = DictionaryItemInfo; type Dictionary = DictionaryInfo; export default function DictionaryManager() { const { data: dictionaries, loading, refresh } = useListData(async () => { const result = await listDictionaries(); return Array.isArray(result) ? result : result.data ?? []; }); const { execute } = useApiRequest(); // 字典 CRUD Drawer const dictDrawer = useCrudDrawer({ getId: (r) => r.id, onCreate: async (values) => { await createDictionary(values as unknown as CreateDictionaryRequest); }, onUpdate: async (id, values) => { await updateDictionary(id, values as unknown as CreateDictionaryRequest & { version: number }); }, onSuccess: refresh, }); // 字典项 Drawer — 因需要 activeDictId,手写状态管理 const [itemDrawerOpen, setItemDrawerOpen] = useState(false); const [activeDictId, setActiveDictId] = useState(null); const [editItem, setEditItem] = useState(null); const [itemForm] = Form.useForm(); const openAddItem = (dictId: string) => { setActiveDictId(dictId); setEditItem(null); itemForm.resetFields(); itemForm.setFieldsValue({ sort_order: 0 }); setItemDrawerOpen(true); }; const openEditItem = (dictId: string, item: DictItem) => { setActiveDictId(dictId); setEditItem(item); itemForm.setFieldsValue({ label: item.label, value: item.value, sort_order: item.sort_order, color: item.color, }); setItemDrawerOpen(true); }; const closeItemDrawer = () => { setItemDrawerOpen(false); setActiveDictId(null); setEditItem(null); itemForm.resetFields(); }; const handleItemSubmit = async (values: Record) => { if (!activeDictId) return; const itemValues = values as unknown as CreateDictionaryItemRequest & { sort_order: number }; if (editItem) { await execute( () => updateDictionaryItem(activeDictId, editItem.id, { ...itemValues, version: editItem.version } as UpdateDictionaryItemRequest), '字典项更新成功', ); } else { await execute(() => createDictionaryItem(activeDictId, itemValues), '字典项添加成功'); } closeItemDrawer(); refresh(); }; const handleDeleteDict = async (id: string, version: number) => { await execute(() => deleteDictionary(id, version), '字典已删除'); refresh(); }; const handleDeleteItem = async (dictId: string, itemId: string, version: number) => { await execute(() => deleteDictionaryItem(dictId, itemId, version), '字典项已删除'); refresh(); }; const columns = [ { title: '名称', dataIndex: 'name', key: 'name' }, { title: '编码', dataIndex: 'code', key: 'code' }, { title: '说明', dataIndex: 'description', key: 'description', ellipsis: true }, { title: '操作', key: 'actions', render: (_: unknown, record: Dictionary) => ( handleDeleteDict(record.id, record.version)}> ), }, ]; const itemColumns = (dictId: string) => [ { title: '标签', dataIndex: 'label', key: 'label' }, { title: '值', dataIndex: 'value', key: 'value' }, { title: '排序', dataIndex: 'sort_order', key: 'sort_order', width: 80 }, { title: '颜色', dataIndex: 'color', key: 'color', width: 80, render: (color?: string) => color ? {color} : '-', }, { title: '操作', key: 'actions', render: (_: unknown, record: DictItem) => ( handleDeleteItem(dictId, record.id, record.version)}> ), }, ]; return (
数据字典管理
(
), }} /> {/* 字典 Drawer */} {/* 字典项 Drawer */} ); }