/** * FeatureView Page * * Generische Feature-View-Komponente. * Rendert den entsprechenden Content basierend auf Feature-Code und View. */ import React from 'react'; import { useCurrentInstance } from '../hooks/useCurrentInstance'; import { useCanViewFeatureView } from '../hooks/useInstancePermissions'; import { useLanguage } from '../providers/language/LanguageContext'; import { getLabel, FEATURE_REGISTRY } from '../types/mandate'; // Trustee Views // Note: TrusteeOrganisationsView and TrusteeContractsView removed - Feature-Instanz = Organisation import { TrusteeDocumentsView } from './views/trustee/TrusteeDocumentsView'; import { TrusteePositionsView } from './views/trustee/TrusteePositionsView'; import { TrusteeDashboardView } from './views/trustee/TrusteeDashboardView'; import { TrusteeInstanceRolesView } from './views/trustee/TrusteeInstanceRolesView'; import { TrusteeExpenseImportView } from './views/trustee/TrusteeExpenseImportView'; import { TrusteeScanUploadView } from './views/trustee/TrusteeScanUploadView'; import { TrusteeAccountingSettingsView } from './views/trustee/TrusteeAccountingSettingsView'; // Chatbot Views import { ChatbotConversationsView } from './views/chatbot/ChatbotConversationsView'; // RealEstate Views import { RealEstatePekView, RealEstateInstanceRolesPlaceholder } from './views/realestate'; // Automation Views import { AutomationDefinitionsView, AutomationTemplatesView, AutomationLogsView } from './views/automation'; // Workspace Views import { WorkspacePage } from './views/workspace/WorkspacePage'; import { WorkspaceEditorPage } from './views/workspace/WorkspaceEditorPage'; import { WorkspaceSettingsPage } from './views/workspace/WorkspaceSettingsPage'; // Teamsbot Views import { TeamsbotDashboardView } from './views/teamsbot/TeamsbotDashboardView'; import { TeamsbotSessionView } from './views/teamsbot/TeamsbotSessionView'; import { TeamsbotSettingsView } from './views/teamsbot/TeamsbotSettingsView'; // Neutralization Views import { NeutralizationView } from './views/neutralization'; // CommCoach Views import { CommcoachDashboardView, CommcoachDossierView, CommcoachSettingsView } from './views/commcoach'; import styles from './FeatureView.module.css'; // ============================================================================= // PLACEHOLDER VIEWS (für nicht implementierte Features) // ============================================================================= const PlaceholderView: React.FC<{ title: string; description: string }> = ({ title, description }) => (

{title}

{description}

); // Chatworkflow Views const ChatworkflowDashboard: React.FC = () => ( ); const ChatworkflowRuns: React.FC = () => ( ); const ChatworkflowFiles: React.FC = () => ( ); // Chatbot Views // ChatbotConversationsView is imported above const ChatbotSettings: React.FC = () => ( ); // Generic/Fallback const NotFound: React.FC = () => (

Seite nicht gefunden

Diese View existiert nicht oder wurde noch nicht implementiert.

); const AccessDenied: React.FC = () => (

Zugriff verweigert

Du hast keine Berechtigung für diese Ansicht.

); // ============================================================================= // VIEW REGISTRY // ============================================================================= type ViewComponent = React.FC; const VIEW_COMPONENTS: Record> = { trustee: { dashboard: TrusteeDashboardView, documents: TrusteeDocumentsView, positions: TrusteePositionsView, 'instance-roles': TrusteeInstanceRolesView, 'expense-import': TrusteeExpenseImportView, 'scan-upload': TrusteeScanUploadView, settings: TrusteeAccountingSettingsView, }, chatworkflow: { dashboard: ChatworkflowDashboard, runs: ChatworkflowRuns, files: ChatworkflowFiles, }, chatbot: { conversations: ChatbotConversationsView, settings: ChatbotSettings, }, realestate: { dashboard: RealEstatePekView, 'instance-roles': RealEstateInstanceRolesPlaceholder, }, automation: { definitions: AutomationDefinitionsView, templates: AutomationTemplatesView, logs: AutomationLogsView, }, workspace: { dashboard: WorkspacePage, editor: WorkspaceEditorPage, settings: WorkspaceSettingsPage, }, teamsbot: { dashboard: TeamsbotDashboardView, sessions: TeamsbotSessionView, settings: TeamsbotSettingsView, }, neutralization: { dashboard: NeutralizationView, playground: NeutralizationView, }, commcoach: { dashboard: CommcoachDashboardView, coaching: CommcoachDossierView, dossier: CommcoachDossierView, settings: CommcoachSettingsView, }, }; // ============================================================================= // FEATURE VIEW PAGE // ============================================================================= interface FeatureViewPageProps { view: string; } export const FeatureViewPage: React.FC = ({ view }) => { const { instance, featureCode, isValid } = useCurrentInstance(); const { currentLanguage } = useLanguage(); // Berechtigungs-Check const viewCode = `${featureCode}-${view}`; const canView = useCanViewFeatureView(viewCode); // DEBUG: Log permission check for chatbot if (featureCode === 'chatbot') { console.log('🔍 [DEBUG] FeatureView Permission Check:', { featureCode, view, viewCode, instanceId: instance?.id, instanceLabel: instance?.instanceLabel, isValid, canView, permissions: instance?.permissions, views: instance?.permissions?.views, viewKeys: instance?.permissions?.views ? Object.keys(instance.permissions.views) : [], hasLegacyView: instance?.permissions?.views?.[viewCode], hasFullObjectKey: instance?.permissions?.views?.[`ui.feature.${featureCode}.${view}`], hasWildcard: instance?.permissions?.views?.['_all'], }); } // Nicht valider Kontext if (!isValid || !featureCode || !instance) { return ; } // Keine Berechtigung if (!canView && view !== 'not-found') { return ; } // Workspace dashboard is rendered persistently by WorkspaceKeepAlive at MainLayout level; // other workspace views (e.g. settings, editor) use the standard FeatureViewPage rendering. if (featureCode === 'workspace' && view !== 'settings' && view !== 'editor') { return null; } // View-Komponente finden const featureViews = VIEW_COMPONENTS[featureCode]; if (!featureViews) { return ; } const ViewComponent = featureViews[view]; if (!ViewComponent) { return ; } // View-Info aus Registry const featureConfig = FEATURE_REGISTRY[featureCode]; const viewConfig = featureConfig?.views?.find(v => v.code === view); const lang = (currentLanguage?.slice(0, 2) || 'de') as 'de' | 'en' | 'fr'; const viewLabel = viewConfig ? getLabel(viewConfig.label, lang) : view; return (

{viewLabel}

); }; export default FeatureViewPage;