import { useEffect, useMemo, useState } from "react"; import { Button, Form, Input, InputNumber, Select, Tree, Checkbox, App as AntApp, Popconfirm, } from "antd"; import { PlusOutlined, EditOutlined, SaveOutlined, CloseOutlined, DeleteOutlined, ReloadOutlined, } from "@ant-design/icons"; import type { DataNode } from "antd/es/tree"; import { listModules, createModule, updateModule, deleteModule, type ModuleTreeVO, type ModuleDTO, } from "@/api/module"; import { MODULE_DISPLAY_TYPES } from "@/utils/data"; type Mode = "view" | "edit" | "new"; interface FormShape { sDisplayType: string; sModuleNameZh: string; sManageDeptEn: string; sModuleType: string; sProcedureName: string; iSortOrder: number; iParentId: number | null; bShowPermission: boolean; } export default function ModuleConfig() { const { message } = AntApp.useApp(); const [form] = Form.useForm(); const [tree, setTree] = useState([]); const [loading, setLoading] = useState(false); const [selectedId, setSelectedId] = useState(null); const [mode, setMode] = useState("view"); const [submitting, setSubmitting] = useState(false); const reload = async () => { setLoading(true); try { const data = await listModules(); setTree(data); } catch { // interceptor } finally { setLoading(false); } }; useEffect(() => { void reload(); }, []); const flat = useMemo(() => flatten(tree), [tree]); const treeData = useMemo(() => toTreeData(tree), [tree]); const selected = flat.find((m) => m.iIncrement === selectedId) ?? null; useEffect(() => { if (selected && mode === "view") { form.setFieldsValue({ sDisplayType: selected.sDisplayType, sModuleNameZh: selected.sModuleNameZh, sManageDeptEn: selected.sManageDeptEn, sModuleType: "", sProcedureName: "", iSortOrder: selected.iSortOrder, iParentId: selected.iParentId ?? null, bShowPermission: false, }); } }, [selected, mode, form]); const startEdit = () => { if (!selected) return; setMode("edit"); }; const startNew = () => { form.setFieldsValue({ sDisplayType: "前端业务", sModuleNameZh: "", sManageDeptEn: "", sModuleType: "", sProcedureName: "", iSortOrder: 1, iParentId: selectedId, bShowPermission: false, }); setMode("new"); }; const cancel = () => { setMode("view"); }; const save = async () => { try { const values = await form.validateFields(); const dto: ModuleDTO = { sDisplayType: values.sDisplayType, sModuleNameZh: values.sModuleNameZh, sManageDeptEn: values.sManageDeptEn, sModuleType: values.sModuleType, sProcedureName: values.sProcedureName, iSortOrder: values.iSortOrder, iParentId: values.iParentId, bShowPermission: values.bShowPermission, }; setSubmitting(true); if (mode === "new") { const res = await createModule(dto); message.success("新增成功"); await reload(); setSelectedId(res.iIncrement); setMode("view"); } else if (selectedId) { await updateModule(selectedId, dto); message.success("保存成功"); await reload(); setMode("view"); } } catch { // validation or interceptor } finally { setSubmitting(false); } }; const onDelete = async () => { if (!selectedId) return; try { await deleteModule(selectedId); message.success("删除成功"); setSelectedId(null); await reload(); } catch { // interceptor } }; const disabled = mode === "view"; return (
状态:{mode === "view" ? "只读" : mode === "new" ? "新增中" : "编辑中"}
{ if (keys.length) setSelectedId(Number(keys[0])); }} blockNode defaultExpandAll disabled={loading || mode !== "view"} style={{ padding: 6, fontSize: 12 }} /> {tree.length === 0 && !loading && (
暂无模块数据
)}