'use client' import React from 'react' import { useCompliance } from '../provider' import { ComplianceScore } from './ComplianceScore' import { RiskMatrix } from './RiskMatrix' export interface ComplianceDashboardProps { showScore?: boolean showRisks?: boolean showProgress?: boolean showObligations?: boolean className?: string style?: React.CSSProperties } export function ComplianceDashboard({ showScore = true, showRisks = true, showProgress = true, showObligations = true, className, style, }: ComplianceDashboardProps) { const { state, compliance, completionPercentage, phase1Completion, phase2Completion } = useCompliance() const score = compliance.calculateComplianceScore() const criticalRisks = compliance.getCriticalRisks() const upcomingObligations = compliance.getUpcomingObligations() const overdueObligations = compliance.getOverdueObligations() const containerStyle: React.CSSProperties = { fontFamily: 'system-ui, -apple-system, sans-serif', ...style, } const cardStyle: React.CSSProperties = { backgroundColor: '#fff', borderRadius: '8px', padding: '20px', boxShadow: '0 1px 3px rgba(0, 0, 0, 0.1)', marginBottom: '20px', } const gridStyle: React.CSSProperties = { display: 'grid', gridTemplateColumns: 'repeat(auto-fit, minmax(250px, 1fr))', gap: '20px', marginBottom: '20px', } const statStyle: React.CSSProperties = { ...cardStyle, textAlign: 'center', } const statValueStyle: React.CSSProperties = { fontSize: '36px', fontWeight: 700, margin: '10px 0', } const statLabelStyle: React.CSSProperties = { fontSize: '14px', color: '#666', } return (

Compliance Dashboard

{/* Stats Grid */}
{showScore && (
Compliance Score
= 70 ? '#16a34a' : '#dc2626' }}> {score.overall}%
Trend:{' '} {score.trend === 'UP' ? '↑ Steigend' : score.trend === 'DOWN' ? '↓ Fallend' : '→ Stabil'}
)} {showProgress && ( <>
Gesamtfortschritt
{completionPercentage}%
{state.completedSteps.length} von 19 Schritten abgeschlossen
Phase 1: Assessment
{phase1Completion}%
Phase 2: Dokumentation
{phase2Completion}%
)}
{/* Main Content Grid */}
{/* Score Breakdown */} {showScore && (

Score nach Regulierung

{Object.entries(score.byRegulation).map(([reg, value]) => (
{reg} = 70 ? '#16a34a' : '#dc2626' }}> {value}%
))}
)} {/* Obligations */} {showObligations && (

Anstehende Pflichten

{overdueObligations.length > 0 && (
{overdueObligations.length} überfällige Pflichten!
)} {upcomingObligations.length === 0 && overdueObligations.length === 0 ? (

Keine anstehenden Pflichten in den nächsten 30 Tagen.

) : (
{[...overdueObligations, ...upcomingObligations].slice(0, 5).map(o => (
{o.title}
{o.regulationCode} Art. {o.article}
{o.deadline && (
Frist: {new Date(o.deadline).toLocaleDateString('de-DE')}
)}
))}
)}
)}
{/* Risk Matrix */} {showRisks && state.risks.length > 0 && (

Risikomatrix

{criticalRisks.length > 0 && (
{criticalRisks.length} kritische/hohe Risiken ohne Mitigation
)}
)} {/* Controls Summary */}

Controls Übersicht

{state.controls.length}
Gesamt
{state.controls.filter(c => c.implementationStatus === 'IMPLEMENTED').length}
Implementiert
{state.controls.filter(c => c.implementationStatus === 'PARTIAL').length}
Teilweise
{state.controls.filter(c => c.implementationStatus === 'NOT_IMPLEMENTED').length}
Offen
) }