import { Button, Drawer, Form, Input, message, Popconfirm, Select, Space, Table, Tag, Typography, Card, Switch, Tooltip, Row, Col } from "antd"; import { useEffect, useState, useCallback } from "react"; import { useTranslation } from "react-i18next"; import { pageParams, createParam, updateParam, deleteParam } from "../api"; import { usePermission } from "../hooks/usePermission"; import { useDict } from "../hooks/useDict"; import { PlusOutlined, EditOutlined, DeleteOutlined, SearchOutlined, ReloadOutlined, SettingOutlined, InfoCircleOutlined } from "@ant-design/icons"; import type { SysParamVO, SysParamQuery } from "../types"; import PageHeader from "../components/shared/PageHeader"; import "./SysParams.css"; const { Title, Text } = Typography; export default function SysParams() { const { t } = useTranslation(); const { can } = usePermission(); // Dictionaries 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 }); // Drawer state const [drawerOpen, setDrawerOpen] = useState(false); const [editing, setEditing] = useState(null); const [form] = Form.useForm(); const loadData = useCallback(async (query = queryParams) => { setLoading(true); try { const res = await pageParams(query); setData(res.records || []); setTotal(res.total || 0); } finally { setLoading(false); } }, [queryParams]); useEffect(() => { loadData(); }, [loadData]); const handleSearch = (values: any) => { const newQuery = { ...queryParams, ...values, pageNum: 1 }; setQueryParams(newQuery); }; const handleReset = () => { form.resetFields(); const newQuery = { pageNum: 1, pageSize: 10 }; setQueryParams(newQuery); }; 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 (e) { // Handled by global interceptor } }; 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(); } catch (e) { // Form validation errors or API errors } 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 || 'DEFAULT'} }, { 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(i => i.itemValue === String(status)); return ( {item ? item.itemLabel : (status === 1 ? "正常" : "禁用")} ); }, }, { title: t('common.action'), key: "action", width: 110, fixed: "right" as const, render: (_: any, record: SysParamVO) => ( {can("sys_param:update") && ( )} />
} allowClear style={{ width: 200 }} /> ({ label: i.itemLabel, value: Number(i.itemValue) }))} /> {t('sysParams.isSystem')} } name="isSystem" valuePropName="checked" getValueProps={(value) => ({ checked: value === 1 })} getValueFromEvent={(checked) => (checked ? 1 : 0)} >
); }