'use client' import Link from 'next/link' import { DashboardData, Regulation, AIStatus, DOMAIN_LABELS } from '../types' interface UebersichtTabProps { dashboard: DashboardData | null regulations: Regulation[] aiStatus: AIStatus | null loading: boolean onRefresh: () => void } export default function UebersichtTab({ dashboard, regulations, aiStatus, loading, onRefresh, }: UebersichtTabProps) { if (loading) { return (
) } const score = dashboard?.compliance_score || 0 const scoreColor = score >= 80 ? 'text-green-600' : score >= 60 ? 'text-yellow-600' : 'text-red-600' return (
{/* AI Status Banner */} {/* Score and Stats Row */}
{/* Domain Chart and Quick Actions */}
{/* Regulations Table */}
) } // ============================================================================ // Sub-components // ============================================================================ function AIStatusBanner({ aiStatus }: { aiStatus: AIStatus | null }) { if (!aiStatus) return null return (
🤖
AI-Compliance-Assistent {aiStatus.is_available ? 'aktiv' : 'nicht verfuegbar'}
{aiStatus.is_mock ? ( Mock-Modus (kein API-Key konfiguriert) ) : ( <>Provider: {aiStatus.provider} | Modell: {aiStatus.model} )}
{aiStatus.is_available && !aiStatus.is_mock ? 'Online' : aiStatus.is_mock ? 'Mock' : 'Offline'}
) } function ScoreCard({ score, scoreColor, dashboard }: { score: number; scoreColor: string; dashboard: DashboardData | null }) { return (

Compliance Score

{score.toFixed(0)}%
= 80 ? 'bg-green-500' : score >= 60 ? 'bg-yellow-500' : 'bg-red-500'}`} style={{ width: `${score}%` }} />

{dashboard?.controls_by_status?.pass || 0} von {dashboard?.total_controls || 0} Controls bestanden

) } function StatCard({ label, value, detail, iconBg, iconColor, iconPath }: { label: string value: number detail: string iconBg: string iconColor: string iconPath: string }) { return (

{label}

{value}

{detail}

) } function DomainChart({ dashboard }: { dashboard: DashboardData | null }) { return (

Controls nach Domain

{Object.entries(dashboard?.controls_by_domain || {}).map(([domain, stats]) => { const total = stats.total || 0 const pass = stats.pass || 0 const partial = stats.partial || 0 const passPercent = total > 0 ? ((pass + partial * 0.5) / total) * 100 : 0 return (
{DOMAIN_LABELS[domain] || domain.toUpperCase()} {pass}/{total} ({passPercent.toFixed(0)}%)
) })}
) } function QuickActions() { const actions = [ { href: '/admin/compliance/controls', label: 'Controls', color: 'primary', hoverBorder: 'hover:border-primary-500', hoverBg: 'hover:bg-primary-50', iconColor: 'text-primary-600', iconPath: 'M9 12l2 2 4-4m6 2a9 9 0 11-18 0 9 9 0 0118 0z' }, { href: '/admin/compliance/evidence', label: 'Evidence', color: 'purple', hoverBorder: 'hover:border-primary-500', hoverBg: 'hover:bg-primary-50', iconColor: 'text-purple-600', iconPath: 'M7 21h10a2 2 0 002-2V9.414a1 1 0 00-.293-.707l-5.414-5.414A1 1 0 0012.586 3H7a2 2 0 00-2 2v14a2 2 0 002 2z' }, { href: '/admin/compliance/risks', label: 'Risiken', color: 'red', hoverBorder: 'hover:border-primary-500', hoverBg: 'hover:bg-primary-50', iconColor: 'text-red-600', iconPath: 'M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z' }, { href: '/admin/compliance/scraper', label: 'Scraper', color: 'orange', hoverBorder: 'hover:border-orange-500', hoverBg: 'hover:bg-orange-50', iconColor: 'text-orange-600', iconPath: 'M4 4v5h.582m15.356 2A8.001 8.001 0 004.582 9m0 0H9m11 11v-5h-.581m0 0a8.003 8.003 0 01-15.357-2m15.357 2H15' }, { href: '/admin/compliance/export', label: 'Export', color: 'green', hoverBorder: 'hover:border-primary-500', hoverBg: 'hover:bg-primary-50', iconColor: 'text-green-600', iconPath: 'M4 16v1a3 3 0 003 3h10a3 3 0 003-3v-1m-4-4l-4 4m0 0l-4-4m4 4V4' }, { href: '/admin/compliance/audit-workspace', label: 'Audit Workspace', color: 'blue', hoverBorder: 'hover:border-blue-500', hoverBg: 'hover:bg-blue-50', iconColor: 'text-blue-600', iconPath: 'M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-3 7h3m-3 4h3m-6-4h.01M9 16h.01' }, { href: '/admin/compliance/modules', label: 'Service Module Registry', color: 'pink', hoverBorder: 'hover:border-pink-500', hoverBg: 'hover:bg-pink-50', iconColor: 'text-pink-600', iconPath: 'M19 11H5m14 0a2 2 0 012 2v6a2 2 0 01-2 2H5a2 2 0 01-2-2v-6a2 2 0 012-2m14 0V9a2 2 0 00-2-2M5 11V9a2 2 0 012-2m0 0V5a2 2 0 012-2h6a2 2 0 012 2v2M7 7h10' }, ] return (

Schnellaktionen

{actions.map((action) => (

{action.label}

))}
) } function RegulationsTable({ regulations, onRefresh }: { regulations: Regulation[]; onRefresh: () => void }) { return (

Verordnungen & Standards

{regulations.slice(0, 10).map((reg) => ( ))}
Code Name Typ Anforderungen
{reg.code}

{reg.name}

{reg.regulation_type === 'eu_regulation' ? 'EU-VO' : reg.regulation_type === 'eu_directive' ? 'EU-RL' : reg.regulation_type === 'bsi_standard' ? 'BSI' : reg.regulation_type === 'de_law' ? 'DE' : reg.regulation_type} {reg.requirement_count}
) }