frontend_nyla/src/config/pageRegistry.tsx
2026-02-12 00:34:25 +01:00

152 lines
5.1 KiB
TypeScript

/**
* 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
} 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<string, React.ReactNode> = {
// System pages
'page.system.home': <FaHome />,
'page.system.settings': <FaCog />,
'page.system.gdpr': <FaShieldAlt />,
// Basedata pages (system-level)
'page.system.prompts': <FaLightbulb />,
'page.system.files': <FaRegFileAlt />,
'page.system.connections': <FaLink />,
// Billing pages
'page.billing.dashboard': <FaWallet />,
'page.billing.transactions': <FaListAlt />,
// Admin pages (kebab-case + camelCase variants for backend compatibility)
'page.admin.access': <FaBuilding />,
'page.admin.users': <FaUsers />,
'page.admin.invitations': <FaEnvelopeOpenText />,
'page.admin.mandates': <FaBuilding />,
'page.admin.roles': <FaKey />,
'page.admin.role-permissions': <FaShieldAlt />,
'page.admin.mandateRolePermissions': <FaShieldAlt />,
'page.admin.user-mandates': <FaUserTag />,
'page.admin.userMandates': <FaUserTag />,
'page.admin.feature-roles': <FaCube />,
'page.admin.featureRoles': <FaCube />,
'page.admin.feature-instances': <FaCubes />,
'page.admin.featureInstances': <FaCubes />,
'page.admin.feature-users': <FaUsersCog />,
'page.admin.user-access-overview': <FaUserShield />,
'page.admin.userAccessOverview': <FaUserShield />,
'page.admin.billing': <FaMoneyBillAlt />,
'page.admin.automationEvents': <FaClock />,
'page.admin.automation-events': <FaClock />,
// Feature pages - Trustee
'page.feature.trustee.dashboard': <FaChartLine />,
'page.feature.trustee.positions': <FaDatabase />,
'page.feature.trustee.documents': <FaFileAlt />,
'page.feature.trustee.position-documents': <FaLink />,
'page.feature.trustee.expense-import': <FaFileAlt />,
'page.feature.trustee.instance-roles': <FaUserShield />,
// Feature pages - Real Estate
'page.feature.realestate.projects': <FaProjectDiagram />,
'page.feature.realestate.parcels': <FaMapMarkedAlt />,
// Feature icons (for feature grouping in navigation)
'feature.trustee': <FaBriefcase />,
'feature.realestate': <FaBuilding />,
'feature.chatworkflow': <FaPlay />,
'feature.chatplayground': <FaPlay />,
'feature.automation': <FaCogs />,
'feature.chatbot': <FaComments />,
};
// =============================================================================
// 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;