import { Button, Card, Col, Drawer, Form, Input, Popconfirm, Row, Select, Space, Switch, Table, Tag, Tooltip, Typography, App } from 'antd'; import { useCallback, useEffect, useState } from "react"; import { useTranslation } from "react-i18next"; import { DeleteOutlined, EditOutlined, InfoCircleOutlined, PlusOutlined, SearchOutlined, SettingOutlined } from "@ant-design/icons"; import { createParam, deleteParam, pageParams, updateParam } from "@/api"; import { useDict } from "@/hooks/useDict"; import { usePermission } from "@/hooks/usePermission"; import PageHeader from "@/components/shared/PageHeader"; import { getStandardPagination } from "@/utils/pagination"; import type { SysParamQuery, SysParamVO } from "@/types"; import "./index.less"; const { Text } = Typography; export default function SysParams() { const { message } = App.useApp(); const { t } = useTranslation(); const { can } = usePermission(); const { items: statusDict } = useDict("sys_common_status"); const { items: paramTypeDict } = useDict("sys_param_type"); const [loading, setLoading] = useState(false); const [saving, setSaving] = useState(false); const [data, setData] = useState([]); const [total, setTotal] = useState(0); const [queryParams, setQueryParams] = useState({ pageNum: 1, pageSize: 10 }); const [drawerOpen, setDrawerOpen] = useState(false); const [editing, setEditing] = useState(null); const [form] = Form.useForm(); const loadData = useCallback(async (query = queryParams) => { setLoading(true); try { const response = await pageParams(query); setData(response.records || []); setTotal(response.total || 0); } finally { setLoading(false); } }, [queryParams]); useEffect(() => { loadData(); }, [loadData]); const handleSearch = (values: any) => { setQueryParams({ ...queryParams, ...values, pageNum: 1 }); }; const handleReset = () => { form.resetFields(); setQueryParams({ pageNum: 1, pageSize: 10 }); }; const handlePageChange = (page: number, pageSize: number) => { setQueryParams((prev) => ({ ...prev, pageNum: page, pageSize })); }; const openCreate = () => { setEditing(null); form.resetFields(); form.setFieldsValue({ isSystem: false, status: 1 }); setDrawerOpen(true); }; const openEdit = (record: SysParamVO) => { setEditing(record); form.setFieldsValue(record); setDrawerOpen(true); }; const handleDelete = async (id: number) => { try { await deleteParam(id); message.success(t("common.success")); loadData(); } catch { } }; const submit = async () => { try { const values = await form.validateFields(); setSaving(true); if (editing) { await updateParam(editing.paramId, values); } else { await createParam(values); } message.success(t("common.success")); setDrawerOpen(false); loadData(); } finally { setSaving(false); } }; const columns = [ { title: t("sysParams.paramKey"), dataIndex: "paramKey", key: "paramKey", render: (text: string, record: SysParamVO) => ( {text} {record.isSystem === 1 && {t("sysParams.isSystem")}} ) }, { title: t("sysParams.paramValue"), dataIndex: "paramValue", key: "paramValue", ellipsis: true, render: (text: string) => {text} }, { title: t("sysParams.paramType"), dataIndex: "paramType", key: "paramType", width: 120, render: (type: string) => {type || t("sysParamsExt.defaultType")} }, { title: t("sysParams.description"), dataIndex: "description", key: "description", ellipsis: true }, { title: t("common.status"), dataIndex: "status", width: 80, render: (status: number) => { const item = statusDict.find((dictItem) => dictItem.itemValue === String(status)); return {item ? item.itemLabel : status === 1 ? t("sysParamsExt.enabled") : t("sysParamsExt.disabled")}; } }, { title: t("common.action"), key: "action", width: 110, fixed: "right" as const, render: (_: any, record: SysParamVO) => ( {can("sys_param:update") &&