import { Button, Card, Col, Drawer, Form, Input, InputNumber, message, Popconfirm, Row, Select, Space, Table, Tag, Typography, Empty } from "antd"; import { useEffect, useState, useCallback } 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, SearchOutlined } from "@ant-design/icons"; import { useDict } from "../hooks/useDict"; import type { SysDictItem, SysDictType } from "../types"; import PageHeader from "../components/shared/PageHeader"; import { getStandardPagination } from "../utils/pagination"; 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); const [typeTotal, setTypeTotal] = useState(0); const [typeParams, setTypeParams] = useState({ current: 1, size: 10, typeCode: "", typeName: "" }); // Dictionaries const { items: statusDict } = useDict("sys_common_status"); // 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 = useCallback(async (params = typeParams) => { setLoadingTypes(true); try { const data = await fetchDictTypes(params); setTypes(data.records || []); setTypeTotal(data.total || 0); // If we have data and nothing is selected, select the first one if (data.records && data.records.length > 0 && !selectedType) { setSelectedType(data.records[0]); } else if (selectedType) { // Refresh selected type info if it still exists in the new list const updatedSelected = data.records.find((t: SysDictType) => t.dictTypeId === selectedType.dictTypeId); if (updatedSelected) setSelectedType(updatedSelected); } } finally { setLoadingTypes(false); } }, [selectedType, typeParams]); const loadItems = async (typeCode: string) => { setLoadingItems(true); try { const data = await fetchDictItems(typeCode); setItems(data || []); } finally { setLoadingItems(false); } }; useEffect(() => { loadTypes(); }, [typeParams.current, typeParams.size]); 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(); }; const handleTypeSearch = (val: string) => { setTypeParams({ ...typeParams, current: 1, typeName: val }); loadTypes({ ...typeParams, current: 1, typeName: val }); }; // 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 (