/** * Maps backend (Iconify-style) icon names to Ant Design 6 icon component names. * * Backend menu `icon` field uses Element Plus / FontAwesome / Tabler / Simple-Icons * naming. Each entry below is the closest Ant Design 6 outlined equivalent — for * icons without a 1:1 antd version we pick the semantically nearest variant. * * If a backend value is already an antd component name (ends with * `Outlined` / `Filled` / `TwoTone`), it is passed through unchanged. */ export const ICON_MAP: Record = { // ── Element Plus ────────────────────────────────────────────── 'ep:aim': 'AimOutlined', 'ep:avatar': 'UserOutlined', 'ep:box': 'InboxOutlined', 'ep:calendar': 'CalendarOutlined', 'ep:chat-dot-round': 'CommentOutlined', 'ep:chat-square': 'MessageOutlined', 'ep:coffee-cup': 'CoffeeOutlined', 'ep:collection': 'BookOutlined', 'ep:collection-tag': 'TagsOutlined', 'ep:connection': 'ApiOutlined', 'ep:copy-document': 'CopyOutlined', 'ep:data-analysis': 'BarChartOutlined', 'ep:document': 'FileOutlined', 'ep:document-copy': 'FileTextOutlined', 'ep:files': 'FolderOutlined', 'ep:flag': 'FlagOutlined', 'ep:goods': 'ShoppingOutlined', 'ep:grid': 'AppstoreOutlined', 'ep:house': 'HomeOutlined', 'ep:key': 'KeyOutlined', 'ep:list': 'UnorderedListOutlined', 'ep:location': 'EnvironmentOutlined', 'ep:map-location': 'EnvironmentOutlined', 'ep:menu': 'MenuOutlined', 'ep:message': 'MessageOutlined', 'ep:message-box': 'MailOutlined', 'ep:monitor': 'DesktopOutlined', 'ep:notebook': 'ReadOutlined', 'ep:office-building': 'BankOutlined', 'ep:operation': 'ControlOutlined', 'ep:picture-rounded': 'PictureOutlined', 'ep:place': 'EnvironmentOutlined', 'ep:position': 'AuditOutlined', 'ep:promotion': 'LoginOutlined', 'ep:set-up': 'ToolOutlined', 'ep:setting': 'SettingOutlined', 'ep:sort': 'SortAscendingOutlined', 'ep:takeaway-box': 'NotificationOutlined', 'ep:tickets': 'ProfileOutlined', 'ep:tools': 'SettingOutlined', 'ep:upload-filled': 'UploadOutlined', 'ep:user': 'TeamOutlined', 'ep:warning-filled': 'WarningOutlined', // ── FontAwesome (regular) ───────────────────────────────────── 'fa:address-book-o': 'IdcardOutlined', 'fa:address-card': 'ApartmentOutlined', 'fa:archive': 'InboxOutlined', 'fa:bars': 'UnorderedListOutlined', 'fa:bookmark-o': 'BookOutlined', 'fa:connectdevelop': 'ShareAltOutlined', 'fa:dashcube': 'SafetyCertificateOutlined', 'fa:dedent': 'MenuFoldOutlined', 'fa:delicious': 'CheckSquareOutlined', 'fa:edit': 'EditOutlined', 'fa:eye': 'EyeOutlined', 'fa:file-image-o': 'FileImageOutlined', 'fa:hdd-o': 'AppstoreOutlined', 'fa:key': 'KeyOutlined', 'fa:leanpub': 'FormOutlined', 'fa:map': 'CompassOutlined', 'fa:map-marker': 'EnvironmentOutlined', 'fa:medium': 'BranchesOutlined', 'fa:music': 'CustomerServiceOutlined', 'fa:object-ungroup': 'FolderOpenOutlined', 'fa:power-off': 'PoweroffOutlined', 'fa:reddit-square': 'DatabaseOutlined', 'fa:road': 'NodeExpandOutlined', 'fa:rocket': 'RocketOutlined', 'fa:sitemap': 'ApartmentOutlined', 'fa:slack': 'ScheduleOutlined', 'fa:square': 'BorderOutlined', 'fa:stack-exchange': 'SwapOutlined', 'fa:tag': 'TagOutlined', 'fa:tasks': 'OrderedListOutlined', 'fa:tree': 'BranchesOutlined', 'fa:universal-access': 'GlobalOutlined', 'fa:user-secret': 'TeamOutlined', 'fa:wpexplorer': 'FunctionOutlined', 'fa:wpforms': 'FormOutlined', // ── FontAwesome (solid) ─────────────────────────────────────── 'fa-solid:book': 'BookOutlined', 'fa-solid:book-reader': 'ReadOutlined', 'fa-solid:box': 'DatabaseOutlined', 'fa-solid:file-signature': 'FileTextOutlined', 'fa-solid:grin-stars': 'StarOutlined', 'fa-solid:house-user': 'ClusterOutlined', 'fa-solid:mail-bulk': 'MailOutlined', 'fa-solid:project-diagram': 'DeploymentUnitOutlined', 'fa-solid:tasks': 'ScheduleOutlined', 'fa-solid:tools': 'ToolOutlined', // ── Simple Icons ────────────────────────────────────────────── 'simple-icons:civicrm': 'TeamOutlined', 'simple-icons:erpnext': 'ShopOutlined', // ── Tabler ──────────────────────────────────────────────────── 'tabler:ai': 'OpenAIOutlined', // ── MDM-specific icons ──────────────────────────────────────── 'ep:barcode': 'BarcodeOutlined', 'fa:barcode': 'BarcodeOutlined', 'fa:database': 'DatabaseOutlined', }; /** * Resolve an arbitrary icon name (backend Iconify-style or already an antd * component name) to the matching Ant Design icon component name. * Returns `undefined` when nothing matches. */ export function resolveAntdIconName(icon: string | null | undefined): string | undefined { if (!icon) return undefined; if (ICON_MAP[icon]) return ICON_MAP[icon]; if (icon.endsWith('Outlined') || icon.endsWith('Filled') || icon.endsWith('TwoTone')) { return icon; } return undefined; }