'use client' /** * Compliance & Audit Framework Dashboard * * Tabs: * - Executive: KPI Dashboard mit Ampel-Status * - Uebersicht: Dashboard mit Score, Stats, Quick Actions * - Architektur: Systemarchitektur und Datenfluss * - Roadmap: Implementierungsfortschritt und Backlog * - Technisch: API-Dokumentation und Datenmodell * - Audit: Export und Audit-Historie * - Dokumentation: Handbuecher und Guides */ import { useState, useEffect } from 'react' import Link from 'next/link' import AdminLayout from '@/components/admin/AdminLayout' import LanguageSwitch from '@/components/compliance/LanguageSwitch' import LLMProviderToggle from '@/components/compliance/LLMProviderToggle' import { Language } from '@/lib/compliance-i18n' import { DashboardData, Regulation, AIStatus, TabId, tabs } from './types' import UebersichtTab from './_components/UebersichtTab' import ExecutiveTab from './_components/ExecutiveTab' import ArchitekturTab from './_components/ArchitekturTab' import RoadmapTab from './_components/RoadmapTab' import TechnischTab from './_components/TechnischTab' import AuditTab from './_components/AuditTab' import DokumentationTab from './_components/DokumentationTab' export default function CompliancePage() { const [activeTab, setActiveTab] = useState('executive') const [dashboard, setDashboard] = useState(null) const [regulations, setRegulations] = useState([]) const [aiStatus, setAiStatus] = useState(null) const [loading, setLoading] = useState(true) const [seeding, setSeeding] = useState(false) const [error, setError] = useState(null) const [language, setLanguage] = useState('de') const BACKEND_URL = process.env.NEXT_PUBLIC_BACKEND_URL || 'http://localhost:8000' useEffect(() => { loadData() }, []) const loadData = async () => { setLoading(true) setError(null) try { const [dashboardRes, regulationsRes, aiStatusRes] = await Promise.all([ fetch(`${BACKEND_URL}/api/v1/compliance/dashboard`), fetch(`${BACKEND_URL}/api/v1/compliance/regulations`), fetch(`${BACKEND_URL}/api/v1/compliance/ai/status`), ]) if (dashboardRes.ok) { setDashboard(await dashboardRes.json()) } if (regulationsRes.ok) { const data = await regulationsRes.json() setRegulations(data.regulations || []) } if (aiStatusRes.ok) { setAiStatus(await aiStatusRes.json()) } } catch (err) { console.error('Failed to load compliance data:', err) setError('Verbindung zum Backend fehlgeschlagen') } finally { setLoading(false) } } const seedDatabase = async () => { setSeeding(true) try { const res = await fetch(`${BACKEND_URL}/api/v1/compliance/seed`, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ force: false }), }) if (res.ok) { const result = await res.json() alert(`Datenbank erfolgreich initialisiert!\n\nRegulations: ${result.counts.regulations}\nControls: ${result.counts.controls}\nRequirements: ${result.counts.requirements}\nMappings: ${result.counts.mappings}`) loadData() } else { const errorText = await res.text() alert(`Fehler beim Seeding: ${errorText}`) } } catch (err) { console.error('Seeding failed:', err) alert('Fehler beim Initialisieren der Datenbank') } finally { setSeeding(false) } } return ( {/* Error Banner */} {error && (
{error}
)} {/* Action Bar */} {/* Seed Button if no data */} {!loading && (dashboard?.total_controls || 0) === 0 && ( )} {/* Tab Navigation */}
{/* Tab Content */} {activeTab === 'executive' && ( )} {activeTab === 'uebersicht' && ( )} {activeTab === 'architektur' && } {activeTab === 'roadmap' && } {activeTab === 'technisch' && } {activeTab === 'audit' && } {activeTab === 'dokumentation' && }
) } // ============================================================================ // Page-level sub-components // ============================================================================ function ActionBar({ aiStatus, language, onRefresh, onLanguageChange, }: { aiStatus: AIStatus | null language: Language onRefresh: () => void onLanguageChange: (lang: Language) => void }) { return (
Scraper oeffnen Audit Workspace
) } function SeedBanner({ seeding, onSeed }: { seeding: boolean; onSeed: () => void }) { return (

Keine Compliance-Daten vorhanden

Initialisieren Sie die Datenbank mit den Seed-Daten.

) }