import { Button, Card, Col, Drawer, Empty, Form, Input, InputNumber, Popconfirm, Row, Select, Space, Table, Tag, Typography, message } from "antd"; import { useCallback, useEffect, useState } from "react"; import { useTranslation } from "react-i18next"; import { BookOutlined, DeleteOutlined, EditOutlined, PlusOutlined, ProfileOutlined, SearchOutlined } from "@ant-design/icons"; import { createDictItem, createDictType, deleteDictItem, deleteDictType, fetchDictItems, fetchDictTypes, updateDictItem, updateDictType } from "@/api"; import { useDict } from "@/hooks/useDict"; import { usePermission } from "@/hooks/usePermission"; import PageHeader from "@/components/shared/PageHeader"; import PageContainer from "@/components/shared/PageContainer"; import { getStandardPagination } from "@/utils/pagination"; import type { SysDictItem, SysDictType } from "@/types"; import "./index.less"; const { Text } = Typography; export default function Dictionaries() { const { t } = useTranslation(); const { can } = usePermission(); const { items: statusDict } = useDict("sys_common_status"); 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: "" }); const [typeKeyword, setTypeKeyword] = useState(""); const [typeDrawerVisible, setTypeDrawerVisible] = useState(false); const [editingType, setEditingType] = useState(null); const [typeForm] = Form.useForm(); 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 (data.records?.length && !selectedType) { setSelectedType(data.records[0]); } else if (selectedType) { const updatedSelected = data.records.find((type: SysDictType) => type.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]); 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 = (value: string) => { const next = { ...typeParams, current: 1, typeName: value }; setTypeParams(next); loadTypes(next); }; const handleTypeReset = () => { setTypeKeyword(""); const next = { ...typeParams, current: 1, typeName: "" }; setTypeParams(next); loadTypes(next); }; 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 (