'use client' import React, { useState, useEffect, useRef, useCallback } from 'react' import { useRouter } from 'next/navigation' import { useSDK, ChecklistItem as SDKChecklistItem } from '@/lib/sdk' import { StepHeader, STEP_EXPLANATIONS } from '@/components/sdk/StepHeader' // ============================================================================= // TYPES // ============================================================================= type DisplayStatus = 'compliant' | 'non-compliant' | 'partial' | 'not-reviewed' type DisplayPriority = 'critical' | 'high' | 'medium' | 'low' interface DisplayChecklistItem { id: string requirementId: string question: string category: string status: DisplayStatus notes: string evidence: string[] priority: DisplayPriority verifiedBy: string | null verifiedAt: Date | null } // ============================================================================= // HELPER FUNCTIONS // ============================================================================= function mapSDKStatusToDisplay(status: SDKChecklistItem['status']): DisplayStatus { switch (status) { case 'PASSED': return 'compliant' case 'FAILED': return 'non-compliant' case 'NOT_APPLICABLE': return 'partial' case 'PENDING': default: return 'not-reviewed' } } function mapDisplayStatusToSDK(status: DisplayStatus): SDKChecklistItem['status'] { switch (status) { case 'compliant': return 'PASSED' case 'non-compliant': return 'FAILED' case 'partial': return 'NOT_APPLICABLE' case 'not-reviewed': default: return 'PENDING' } } // ============================================================================= // FALLBACK TEMPLATES // ============================================================================= interface ChecklistTemplate { id: string requirementId: string question: string category: string priority: DisplayPriority } const checklistTemplates: ChecklistTemplate[] = [ { id: 'chk-vvt-001', requirementId: 'req-gdpr-30', question: 'Ist ein Verzeichnis von Verarbeitungstaetigkeiten (VVT) vorhanden und aktuell?', category: 'Dokumentation', priority: 'critical', }, { id: 'chk-dse-001', requirementId: 'req-gdpr-13', question: 'Sind Datenschutzhinweise fuer alle Verarbeitungen verfuegbar?', category: 'Transparenz', priority: 'high', }, { id: 'chk-consent-001', requirementId: 'req-gdpr-6', question: 'Werden Einwilligungen ordnungsgemaess eingeholt und dokumentiert?', category: 'Einwilligung', priority: 'high', }, { id: 'chk-dsr-001', requirementId: 'req-gdpr-15', question: 'Ist ein Prozess fuer Betroffenenrechte implementiert?', category: 'Betroffenenrechte', priority: 'critical', }, { id: 'chk-avv-001', requirementId: 'req-gdpr-28', question: 'Sind Auftragsverarbeitungsvertraege (AVV) mit allen Dienstleistern abgeschlossen?', category: 'Auftragsverarbeitung', priority: 'critical', }, { id: 'chk-dsfa-001', requirementId: 'req-gdpr-35', question: 'Wird eine DSFA fuer Hochrisiko-Verarbeitungen durchgefuehrt?', category: 'Risikobewertung', priority: 'high', }, { id: 'chk-tom-001', requirementId: 'req-gdpr-32', question: 'Sind technische und organisatorische Massnahmen dokumentiert?', category: 'TOMs', priority: 'high', }, { id: 'chk-incident-001', requirementId: 'req-gdpr-33', question: 'Gibt es einen Incident-Response-Prozess fuer Datenpannen?', category: 'Incident Response', priority: 'critical', }, { id: 'chk-ai-001', requirementId: 'req-ai-act-9', question: 'Ist das KI-System nach EU AI Act klassifiziert?', category: 'AI Act', priority: 'high', }, { id: 'chk-ai-002', requirementId: 'req-ai-act-13', question: 'Sind Transparenzanforderungen fuer KI-Systeme erfuellt?', category: 'AI Act', priority: 'high', }, ] // ============================================================================= // COMPONENTS // ============================================================================= function ChecklistItemCard({ item, onStatusChange, onNotesChange, onAddEvidence, }: { item: DisplayChecklistItem onStatusChange: (status: DisplayStatus) => void onNotesChange: (notes: string) => void onAddEvidence: () => void }) { const [showNotes, setShowNotes] = useState(false) const statusColors = { compliant: 'bg-green-100 text-green-700 border-green-300', 'non-compliant': 'bg-red-100 text-red-700 border-red-300', partial: 'bg-yellow-100 text-yellow-700 border-yellow-300', 'not-reviewed': 'bg-gray-100 text-gray-500 border-gray-300', } const priorityColors = { critical: 'bg-red-100 text-red-700', high: 'bg-orange-100 text-orange-700', medium: 'bg-yellow-100 text-yellow-700', low: 'bg-green-100 text-green-700', } return (
{item.category} {item.priority === 'critical' ? 'Kritisch' : item.priority === 'high' ? 'Hoch' : item.priority === 'medium' ? 'Mittel' : 'Niedrig'} {item.requirementId}

{item.question}

{item.notes && (
{item.notes}
)} {item.evidence.length > 0 && (
Nachweise: {item.evidence.map(ev => ( {ev} ))}
)} {item.verifiedBy && item.verifiedAt && (
Geprueft von {item.verifiedBy} am {item.verifiedAt.toLocaleDateString('de-DE')}
)}
{showNotes && (