/** * 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 { 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'; // Chat Playground Views (reusing existing workflow pages) import { PlaygroundPage, WorkflowsPage } from './workflows'; // Automation Views (reusing existing workflow pages) import { AutomationsPage, AutomationTemplatesPage } from './workflows'; // CodeEditor Views import { CodeEditorPage, CodeEditorWorkflowsPage } from './views/codeeditor'; // 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'; 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, }, chatplayground: { playground: PlaygroundPage, workflows: WorkflowsPage, }, automation: { definitions: AutomationsPage, templates: AutomationTemplatesPage, logs: () => , }, codeeditor: { editor: CodeEditorPage, workflows: CodeEditorWorkflowsPage, }, teamsbot: { dashboard: TeamsbotDashboardView, sessions: TeamsbotSessionView, settings: TeamsbotSettingsView, }, neutralization: { dashboard: NeutralizationView, playground: NeutralizationView, }, }; // ============================================================================= // FEATURE VIEW PAGE // ============================================================================= interface FeatureViewPageProps { view: string; } export const FeatureViewPage: React.FC = ({ view }) => { const { instance, featureCode, isValid } = useCurrentInstance(); // 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 ; } // 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 viewLabel = viewConfig ? getLabel(viewConfig.label) : view; return (

{viewLabel}

); }; export default FeatureViewPage;