/** * Page Registry * * Maps uiComponent codes from the Navigation API to React components and icons. * This is the single source of truth for component mapping in the frontend. * * The backend provides uiComponent values like: * - "page.system.home" * - "page.admin.users" * - "page.feature.trustee.dashboard" * * This registry maps them to: * - Icon components for navigation * - Page components for routing (lazy loaded) */ import React from 'react'; import { FaHome, FaCog, FaBriefcase, FaPlay, FaBuilding, FaUsers, FaUserTag, FaCubes, FaEnvelopeOpenText, FaKey, FaUsersCog, FaCube, FaShieldAlt, FaLightbulb, FaRegFileAlt, FaLink, FaComments, FaListAlt, FaCogs, FaChartLine, FaFileAlt, FaUserShield, FaDatabase, FaProjectDiagram, FaMapMarkedAlt, FaWallet, FaMoneyBillAlt, FaClock, FaHeadset, FaVideo, FaHatWizard, } from 'react-icons/fa'; // ============================================================================= // ICON MAP // ============================================================================= /** * Maps uiComponent codes to icon components. * Used by navigation to display icons next to menu items. */ export const PAGE_ICONS: Record = { // System pages 'page.system.home': , 'page.system.settings': , 'page.system.gdpr': , // Basedata pages (system-level) 'page.system.prompts': , 'page.system.files': , 'page.system.connections': , // Billing pages 'page.billing.dashboard': , 'page.billing.transactions': , // Admin pages (kebab-case + camelCase variants for backend compatibility) 'page.admin.access': , 'page.admin.users': , 'page.admin.invitations': , 'page.admin.mandates': , 'page.admin.roles': , 'page.admin.role-permissions': , 'page.admin.mandateRolePermissions': , 'page.admin.user-mandates': , 'page.admin.userMandates': , 'page.admin.feature-roles': , 'page.admin.featureRoles': , 'page.admin.feature-instances': , 'page.admin.featureInstances': , 'page.admin.feature-users': , 'page.admin.user-access-overview': , 'page.admin.userAccessOverview': , 'page.admin.billing': , 'page.admin.automationEvents': , 'page.admin.automation-events': , 'page.admin.logs': , 'page.admin.mandate-wizard': , 'page.admin.mandateWizard': , 'page.admin.invitation-wizard': , 'page.admin.invitationWizard': , // Feature pages - Trustee 'page.feature.trustee.dashboard': , 'page.feature.trustee.positions': , 'page.feature.trustee.documents': , 'page.feature.trustee.expense-import': , 'page.feature.trustee.scan-upload': , 'page.feature.trustee.instance-roles': , 'page.feature.trustee.settings': , // Feature pages - Real Estate 'page.feature.realestate.projects': , 'page.feature.realestate.parcels': , // Feature pages - Teams Bot 'page.feature.teamsbot.dashboard': , 'page.feature.teamsbot.sessions': , 'page.feature.teamsbot.settings': , // Feature icons (for feature grouping in navigation) 'feature.trustee': , 'feature.realestate': , 'feature.chatworkflow': , 'feature.chatplayground': , 'feature.automation': , 'feature.chatbot': , 'feature.teamsbot': , }; // ============================================================================= // HELPER FUNCTIONS // ============================================================================= /** * Get icon for a uiComponent code. * Returns null if not found -- missing icons should be added to PAGE_ICONS. */ export function getPageIcon(uiComponent: string): React.ReactNode { if (!PAGE_ICONS[uiComponent]) { console.warn(`[pageRegistry] Missing icon for uiComponent: "${uiComponent}"`); } return PAGE_ICONS[uiComponent] || null; } /** * Check if a uiComponent is a feature page (requires instance context). */ export function isFeaturePage(uiComponent: string): boolean { return uiComponent.startsWith('page.feature.'); } /** * Check if a uiComponent is an admin page. */ export function isAdminPage(uiComponent: string): boolean { return uiComponent.startsWith('page.admin.'); } /** * Extract feature code from uiComponent. * e.g., "page.feature.trustee.dashboard" -> "trustee" */ export function extractFeatureCode(uiComponent: string): string | null { if (!uiComponent.startsWith('page.feature.')) { return null; } const parts = uiComponent.split('.'); return parts.length >= 3 ? parts[2] : null; } /** * Extract view code from uiComponent. * e.g., "page.feature.trustee.dashboard" -> "dashboard" */ export function extractViewCode(uiComponent: string): string | null { const parts = uiComponent.split('.'); return parts.length >= 4 ? parts[3] : null; } /** * Build uiComponent from parts. */ export function buildUiComponent(type: 'system' | 'admin' | 'feature', ...parts: string[]): string { return `page.${type}.${parts.join('.')}`; } // ============================================================================= // EXPORTS // ============================================================================= export default PAGE_ICONS;