菜单管理页面删除交互改为统一确认并开放删除入口

Co-authored-by: multica-agent <github@multica.ai>
This commit is contained in:
2026-05-03 20:34:27 +08:00
parent 4b0dd896e3
commit bce0cfece7
2 changed files with 44 additions and 50 deletions
+22 -50
View File
@@ -14,7 +14,6 @@ import {
Input,
InputNumber,
Modal,
Popconfirm,
Row,
Select,
Space,
@@ -56,39 +55,6 @@ const SORT_OPTIONS: Array<{ value: SortKey; label: string }> = [
{ value: "name", label: "按名称" },
];
const PROTECTED_MENU_CODES = new Set([
"admin.users",
"admin.roles",
"admin.menus",
"admin.system_params",
"admin.tower_models",
"admin.files",
"admin.elevation",
"admin.wxapp",
"admin.filedetector",
"admin.baidu_pan",
"admin.power_lines",
"admin.lightning_currents",
"admin.lightning_distribution",
"admin.workers",
"admin.data_query",
"admin.hot_search",
"admin.task_monitor",
"admin.atp_models",
"admin.cron_task_mgr",
"admin.queue_mgr",
"admin.todos",
"admin.knowledge_mastery",
"admin.mdresolve",
"admin.tag",
"admin.knowledge_point_mgr",
"admin.question_bank",
"admin.job_mgr",
"admin.syslog",
"admin.jwt_generator",
"admin.wine_runner",
]);
const DEFAULT_FORM_VALUES: MenuFormValues = {
code: "",
name: "",
@@ -118,7 +84,7 @@ function compareMenuIds(a: string, b: string): number {
export default function AdminMenusPage() {
const { user, initializing, fetchWithAuth, hasPermission } = useAuth();
const { message: messageApi } = App.useApp();
const { message: messageApi, modal } = App.useApp();
const [menus, setMenus] = useState<MenuItem[]>([]);
const [loading, setLoading] = useState(false);
const [saving, setSaving] = useState(false);
@@ -338,6 +304,17 @@ export default function AdminMenusPage() {
}
}, [closeDialog, editingMenuId, fetchWithAuth, loadMenus, messageApi]);
const requestDeleteMenu = useCallback((menu: MenuItem) => {
modal.confirm({
title: "删除菜单",
content: `确认删除菜单 ${menu.name} (${menu.code}) 吗?`,
okText: "删除",
cancelText: "取消",
okButtonProps: { danger: true },
onOk: () => removeMenu(menu),
});
}, [modal, removeMenu]);
const columns = useMemo<TableColumnsType<MenuItem>>(() => {
const base: TableColumnsType<MenuItem> = [
{ title: "ID", dataIndex: "id", width: 110 },
@@ -392,26 +369,21 @@ export default function AdminMenusPage() {
<Button size="small" onClick={() => startEdit(record)}>
</Button>
{!PROTECTED_MENU_CODES.has(record.code) && (
<Popconfirm
title="删除菜单"
description={`确认删除菜单 ${record.name} (${record.code}) 吗?`}
okText="删除"
cancelText="取消"
okButtonProps={{ danger: true, loading: deletingMenuId === record.id }}
onConfirm={() => removeMenu(record)}
>
<Button size="small" danger loading={deletingMenuId === record.id}>
</Button>
</Popconfirm>
)}
<Button
size="small"
danger
loading={deletingMenuId === record.id}
disabled={Boolean(deletingMenuId && deletingMenuId !== record.id)}
onClick={() => requestDeleteMenu(record)}
>
</Button>
</Space>
),
});
return base;
}, [canManage, deletingMenuId, menuNameById, removeMenu, startEdit]);
}, [canManage, deletingMenuId, menuNameById, requestDeleteMenu, startEdit]);
const updateTableScrollY = useCallback(() => {
if (typeof window === "undefined") {