import { Button, Card, Col, Drawer, Form, Input, InputNumber, message, Popconfirm, Row, Select, Space, Table, Tag, Typography } from "antd"; import { useEffect, useState } from "react"; import { createDictItem, createDictType, deleteDictItem, deleteDictType, fetchDictItems, fetchDictTypes, updateDictItem, updateDictType } from "../api"; import { usePermission } from "../hooks/usePermission"; import { PlusOutlined, EditOutlined, DeleteOutlined } from "@ant-design/icons"; import type { SysDictItem, SysDictType } from "../types"; const { Title } = Typography; export default function Dictionaries() { const { can } = usePermission(); const [types, setTypes] = useState([]); const [items, setItems] = useState([]); const [selectedType, setSelectedType] = useState(null); const [loadingTypes, setLoadingTypes] = useState(false); const [loadingItems, setLoadingItems] = useState(false); // Type Drawer const [typeDrawerVisible, setTypeDrawerVisible] = useState(false); const [editingType, setEditingType] = useState(null); const [typeForm] = Form.useForm(); // Item Drawer const [itemDrawerVisible, setItemDrawerVisible] = useState(false); const [editingItem, setEditingItem] = useState(null); const [itemForm] = Form.useForm(); const loadTypes = async () => { setLoadingTypes(true); try { const data = await fetchDictTypes(); setTypes(data || []); if (data && data.length > 0 && !selectedType) { setSelectedType(data[0]); } } finally { setLoadingTypes(false); } }; const loadItems = async (typeCode: string) => { setLoadingItems(true); try { const data = await fetchDictItems(typeCode); setItems(data || []); } finally { setLoadingItems(false); } }; useEffect(() => { loadTypes(); }, []); useEffect(() => { if (selectedType) { loadItems(selectedType.typeCode); } else { setItems([]); } }, [selectedType]); // Type Actions const handleAddType = () => { setEditingType(null); typeForm.resetFields(); setTypeDrawerVisible(true); }; const handleEditType = (record: SysDictType) => { setEditingType(record); typeForm.setFieldsValue(record); setTypeDrawerVisible(true); }; const handleDeleteType = async (id: number) => { await deleteDictType(id); message.success("删除成功"); loadTypes(); }; const handleTypeSubmit = async () => { const values = await typeForm.validateFields(); if (editingType) { await updateDictType(editingType.dictTypeId, values); } else { await createDictType(values); } message.success(editingType ? "更新成功" : "创建成功"); setTypeDrawerVisible(false); loadTypes(); }; // Item Actions const handleAddItem = () => { if (!selectedType) { message.warning("请先选择一个字典类型"); return; } setEditingItem(null); itemForm.resetFields(); itemForm.setFieldsValue({ typeCode: selectedType.typeCode, sortOrder: 0, status: 1 }); setItemDrawerVisible(true); }; const handleEditItem = (record: SysDictItem) => { setEditingItem(record); itemForm.setFieldsValue(record); setItemDrawerVisible(true); }; const handleDeleteItem = async (id: number) => { await deleteDictItem(id); message.success("删除成功"); if (selectedType) loadItems(selectedType.typeCode); }; const handleItemSubmit = async () => { const values = await itemForm.validateFields(); if (editingItem) { await updateDictItem(editingItem.dictItemId, values); } else { await createDictItem(values); } message.success(editingItem ? "更新成功" : "创建成功"); setItemDrawerVisible(false); if (selectedType) loadItems(selectedType.typeCode); }; return (
字典管理 } onClick={handleAddType}> 新增 ) } > ({ onClick: () => setSelectedType(record), className: `cursor-pointer ${selectedType?.dictTypeId === record.dictTypeId ? "ant-table-row-selected" : ""}` })} columns={[ { title: "类型名称", dataIndex: "typeName" }, { title: "编码", dataIndex: "typeCode" }, { title: "操作", width: 100, render: (_, record) => ( {can("sys_dict:type:update") && ( } onClick={handleAddItem} disabled={!selectedType}> 新增 ) } >
(v === 1 ? 启用 : 禁用) }, { title: "操作", width: 120, render: (_, record) => ( {can("sys_dict:item:update") && ( } >
{/* Item Drawer */} setItemDrawerVisible(false)} width={400} destroyOnClose footer={
} >