import { Button, Card, Col, Drawer, Form, Input, InputNumber, message, Popconfirm, Row, Select, Space, Table, Tag, Typography, Empty } from "antd"; import { useEffect, useState } from "react"; import { useTranslation } from "react-i18next"; import { createDictItem, createDictType, deleteDictItem, deleteDictType, fetchDictItems, fetchDictTypes, updateDictItem, updateDictType } from "../api"; import { usePermission } from "../hooks/usePermission"; import { PlusOutlined, EditOutlined, DeleteOutlined, BookOutlined, ProfileOutlined } from "@ant-design/icons"; import type { SysDictItem, SysDictType } from "../types"; import "./Dictionaries.css"; const { Title, Text } = Typography; export default function Dictionaries() { const { t } = useTranslation(); 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(t('common.success')); loadTypes(); }; const handleTypeSubmit = async () => { const values = await typeForm.validateFields(); if (editingType) { await updateDictType(editingType.dictTypeId, values); } else { await createDictType(values); } message.success(t('common.success')); setTypeDrawerVisible(false); loadTypes(); }; // Item Actions const handleAddItem = () => { if (!selectedType) { message.warning(t('dicts.selectType')); 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(t('common.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(t('common.success')); setItemDrawerVisible(false); if (selectedType) loadItems(selectedType.typeCode); }; return (
{t('dicts.title')} {t('dicts.subtitle')}