'use client' import React, { useState, useEffect, useCallback } from 'react' import { API, ISMSOverview, ISMSScope, ReadinessCheck } from '../_types' import { LoadingSpinner, StatCard, StatusBadge } from './shared' // ============================================================================= // TAB: OVERVIEW // ============================================================================= export function OverviewTab() { const [overview, setOverview] = useState(null) const [readiness, setReadiness] = useState(null) const [scope, setScope] = useState(null) const [loading, setLoading] = useState(true) const [running, setRunning] = useState(false) const load = useCallback(async () => { setLoading(true) try { const [ovRes, rdRes, scRes] = await Promise.allSettled([ fetch(`${API}/overview`), fetch(`${API}/readiness-check/latest`), fetch(`${API}/scope`), ]) if (ovRes.status === 'fulfilled' && ovRes.value.ok) setOverview(await ovRes.value.json()) if (rdRes.status === 'fulfilled' && rdRes.value.ok) setReadiness(await rdRes.value.json()) if (scRes.status === 'fulfilled' && scRes.value.ok) setScope(await scRes.value.json()) } catch { /* ignore */ } setLoading(false) }, []) useEffect(() => { load() }, [load]) const runCheck = async () => { setRunning(true) try { const res = await fetch(`${API}/readiness-check`, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ triggered_by: 'admin-ui' }), }) if (res.ok) { setReadiness(await res.json()) load() } } catch { /* ignore */ } setRunning(false) } if (loading) return return (
{/* Readiness Score */}

ISO 27001 Zertifizierungsbereitschaft

{overview && (
= 80 ? 'green' : overview.certification_readiness >= 50 ? 'yellow' : 'red'} /> 0 ? 'red' : 'green'} /> 0 ? 'yellow' : 'green'} />
)} {/* Chapter Overview */} {overview?.chapters && (

ISO 27001 Kapitel-Status

{overview.chapters.map(ch => (
Kap.{ch.chapter} {ch.title}
= 80 ? 'bg-green-500' : ch.completion_percentage >= 50 ? 'bg-yellow-500' : 'bg-red-500'}`} style={{ width: `${ch.completion_percentage}%` }} />
{Math.round(ch.completion_percentage)}%
))}
)}
{/* Readiness Findings */} {readiness && (

Readiness-Check Ergebnis

Score: {Math.round(readiness.readiness_score)}%
{readiness.potential_majors.length > 0 && (

Potenzielle Major-Findings ({readiness.potential_majors.length})

{readiness.potential_majors.map((f, i) => (
{f.check}
{f.recommendation}
ISO Referenz: {f.iso_reference}
))}
)} {readiness.potential_minors.length > 0 && (

Potenzielle Minor-Findings ({readiness.potential_minors.length})

{readiness.potential_minors.map((f, i) => (
{f.check}
{f.recommendation}
))}
)} {readiness.priority_actions.length > 0 && (

Prioritaere Massnahmen

    {readiness.priority_actions.map((a, i) =>
  1. {a}
  2. )}
)}
)} {/* Scope Summary */} {scope && (

ISMS Scope (Kap. 4.3)

{scope.scope_statement}

Standorte:
    {scope.included_locations?.map((l, i) =>
  • {l}
  • )}
Prozesse:
    {scope.included_processes?.map((p, i) =>
  • {p}
  • )}
{scope.approved_by && (
Genehmigt von {scope.approved_by} am {new Date(scope.approved_at!).toLocaleDateString('de-DE')}
)}
)}
) }