import React, { useEffect, useMemo, useRef, useState } from "react"; import { useTranslation } from "react-i18next"; import { Button, Card, Col, Drawer, Form, Input, InputNumber, Popconfirm, Row, Select, Space, Table, Tag, Tooltip, Typography, App } from 'antd'; import * as AntIcons from "@ant-design/icons"; import { CheckSquareOutlined, ClusterOutlined, DeleteOutlined, EditOutlined, FolderOutlined, InfoCircleOutlined, MenuOutlined, PlusOutlined, ReloadOutlined, SearchOutlined } from "@ant-design/icons"; import { createPermission, deletePermission, listMyPermissions, updatePermission } from "@/api"; import { useDict } from "@/hooks/useDict"; import { usePermission } from "@/hooks/usePermission"; import PageHeader from "@/components/shared/PageHeader"; import type { SysPermission } from "@/types"; import "./index.less"; const { Text } = Typography; type TreePermission = SysPermission & { key: number; children?: TreePermission[] }; const legacyIconAliases: Record = { dashboard: "DashboardOutlined", meeting: "VideoCameraOutlined", user: "UserOutlined", role: "TeamOutlined", permission: "SafetyCertificateOutlined", device: "DesktopOutlined", tenant: "ShopOutlined", org: "ApartmentOutlined", dict: "BookOutlined", setting: "SettingOutlined" }; const menuIconOptions = Object.keys(AntIcons) .filter((key) => /(?:Outlined|Filled|TwoTone)$/.test(key)) .sort((left, right) => left.localeCompare(right)); function renderSelectableIcon(iconName?: string) { const resolvedName = iconName ? (legacyIconAliases[iconName] || iconName) : undefined; if (!resolvedName) return null; const iconsMap = AntIcons as unknown as Record>; const IconComponent = iconsMap[resolvedName]; return IconComponent ?