'use client' import { useMemo, useState } from 'react' import { DerivedTOM, TOMGeneratorState } from '@/lib/sdk/tom-generator/types' import { getControlById, getControlsByCategory, getAllCategories } from '@/lib/sdk/tom-generator/controls/loader' import { SDM_GOAL_LABELS, getSDMCoverageStats, SDMGewaehrleistungsziel } from '@/lib/sdk/tom-generator/sdm-mapping' interface TOMOverviewTabProps { state: TOMGeneratorState onSelectTOM: (tomId: string) => void onStartGenerator: () => void } const STATUS_BADGES: Record = { IMPLEMENTED: { label: 'Implementiert', className: 'bg-green-100 text-green-700' }, PARTIAL: { label: 'Teilweise', className: 'bg-yellow-100 text-yellow-700' }, NOT_IMPLEMENTED: { label: 'Fehlend', className: 'bg-red-100 text-red-700' }, } const TYPE_BADGES: Record = { TECHNICAL: { label: 'Technisch', className: 'bg-blue-100 text-blue-700' }, ORGANIZATIONAL: { label: 'Organisatorisch', className: 'bg-indigo-100 text-indigo-700' }, } const SCHUTZZIELE: { key: SDMGewaehrleistungsziel; label: string }[] = [ { key: 'Vertraulichkeit', label: 'Vertraulichkeit' }, { key: 'Integritaet', label: 'Integritaet' }, { key: 'Verfuegbarkeit', label: 'Verfuegbarkeit' }, { key: 'Nichtverkettung', label: 'Nichtverkettung' }, ] export function TOMOverviewTab({ state, onSelectTOM, onStartGenerator }: TOMOverviewTabProps) { const [categoryFilter, setCategoryFilter] = useState('ALL') const [typeFilter, setTypeFilter] = useState('ALL') const [statusFilter, setStatusFilter] = useState('ALL') const [applicabilityFilter, setApplicabilityFilter] = useState('ALL') const categories = useMemo(() => getAllCategories(), []) const stats = useMemo(() => { const toms = state.derivedTOMs return { total: toms.length, implemented: toms.filter(t => t.implementationStatus === 'IMPLEMENTED').length, partial: toms.filter(t => t.implementationStatus === 'PARTIAL').length, missing: toms.filter(t => t.implementationStatus === 'NOT_IMPLEMENTED').length, } }, [state.derivedTOMs]) const sdmStats = useMemo(() => { const allStats = getSDMCoverageStats(state.derivedTOMs) return SCHUTZZIELE.map(sz => ({ ...sz, stats: allStats[sz.key] || { total: 0, implemented: 0, partial: 0, missing: 0 }, })) }, [state.derivedTOMs]) const filteredTOMs = useMemo(() => { let toms = state.derivedTOMs if (categoryFilter !== 'ALL') { const categoryControlIds = getControlsByCategory(categoryFilter).map(c => c.id) toms = toms.filter(t => categoryControlIds.includes(t.controlId)) } if (typeFilter !== 'ALL') { toms = toms.filter(t => { const ctrl = getControlById(t.controlId) return ctrl?.type === typeFilter }) } if (statusFilter !== 'ALL') { toms = toms.filter(t => t.implementationStatus === statusFilter) } if (applicabilityFilter !== 'ALL') { toms = toms.filter(t => t.applicability === applicabilityFilter) } return toms }, [state.derivedTOMs, categoryFilter, typeFilter, statusFilter, applicabilityFilter]) if (state.derivedTOMs.length === 0) { return (

Keine TOMs vorhanden

Starten Sie den TOM Generator, um technische und organisatorische Massnahmen basierend auf Ihrem Verarbeitungsverzeichnis abzuleiten.

) } return (
{/* Stats Row */}
{stats.total}
Gesamt TOMs
{stats.implemented}
Implementiert
{stats.partial}
Teilweise
{stats.missing}
Fehlend
{/* Art. 32 Schutzziele */}

Art. 32 DSGVO Schutzziele

{sdmStats.map(sz => { const total = sz.stats.total || 1 const implPercent = Math.round((sz.stats.implemented / total) * 100) const partialPercent = Math.round((sz.stats.partial / total) * 100) return (
{sz.label}
{sz.stats.implemented}/{sz.stats.total} implementiert
) })}
{/* Filter Controls */}
{/* TOM Card Grid */}
{filteredTOMs.map(tom => { const control = getControlById(tom.controlId) const statusBadge = STATUS_BADGES[tom.implementationStatus] || STATUS_BADGES.NOT_IMPLEMENTED const typeBadge = TYPE_BADGES[control?.type || 'TECHNICAL'] || TYPE_BADGES.TECHNICAL const evidenceCount = tom.linkedEvidence?.length || 0 return ( ) })}
{filteredTOMs.length === 0 && state.derivedTOMs.length > 0 && (

Keine TOMs entsprechen den aktuellen Filterkriterien.

)}
) }