'use client' import React, { useState, useCallback, useEffect } from 'react' import { useRouter } from 'next/navigation' import { useSDK } from '@/lib/sdk' import { StepHeader, STEP_EXPLANATIONS } from '@/components/sdk/StepHeader' import { DocumentUploadSection, type UploadedDocument } from '@/components/sdk' // ============================================================================= // TYPES // ============================================================================= interface DSFA { id: string title: string description: string status: 'draft' | 'in-review' | 'approved' | 'needs-update' createdAt: string updatedAt: string approvedBy: string | null riskLevel: 'low' | 'medium' | 'high' | 'critical' processingActivity: string dataCategories: string[] recipients: string[] measures: string[] } // ============================================================================= // COMPONENTS // ============================================================================= function DSFACard({ dsfa, onStatusChange, onDelete, }: { dsfa: DSFA onStatusChange: (id: string, status: string) => void onDelete: (id: string) => void }) { const statusColors = { draft: 'bg-gray-100 text-gray-600 border-gray-200', 'in-review': 'bg-yellow-100 text-yellow-700 border-yellow-200', approved: 'bg-green-100 text-green-700 border-green-200', 'needs-update': 'bg-orange-100 text-orange-700 border-orange-200', } const statusLabels = { draft: 'Entwurf', 'in-review': 'In Pruefung', approved: 'Genehmigt', 'needs-update': 'Aktualisierung erforderlich', } const riskColors = { low: 'bg-green-100 text-green-700', medium: 'bg-yellow-100 text-yellow-700', high: 'bg-orange-100 text-orange-700', critical: 'bg-red-100 text-red-700', } const createdDate = dsfa.createdAt ? new Date(dsfa.createdAt).toLocaleDateString('de-DE') : '—' return (
{statusLabels[dsfa.status]} Risiko: {dsfa.riskLevel === 'low' ? 'Niedrig' : dsfa.riskLevel === 'medium' ? 'Mittel' : dsfa.riskLevel === 'high' ? 'Hoch' : 'Kritisch'}

{dsfa.title}

{dsfa.description}

Verarbeitungstaetigkeit: {dsfa.processingActivity}

{dsfa.dataCategories.map(cat => ( {cat} ))}
{dsfa.measures.length > 0 && (
Massnahmen:
{dsfa.measures.map(m => ( {m} ))}
)}
Erstellt: {createdDate} {dsfa.approvedBy && ( Genehmigt von: {dsfa.approvedBy} )}
{dsfa.status === 'draft' && ( )} {dsfa.status === 'in-review' && ( )}
) } function GeneratorWizard({ onClose, onSubmit }: { onClose: () => void; onSubmit: (data: Partial) => Promise }) { const [step, setStep] = useState(1) const [saving, setSaving] = useState(false) const [title, setTitle] = useState('') const [description, setDescription] = useState('') const [processingActivity, setProcessingActivity] = useState('') const [selectedCategories, setSelectedCategories] = useState([]) const [riskLevel, setRiskLevel] = useState<'low' | 'medium' | 'high' | 'critical'>('low') const [selectedMeasures, setSelectedMeasures] = useState([]) const riskMap: Record = { Niedrig: 'low', Mittel: 'medium', Hoch: 'high', Kritisch: 'critical', } const handleSubmit = async () => { setSaving(true) try { await onSubmit({ title, description, processingActivity, dataCategories: selectedCategories, riskLevel, measures: selectedMeasures, status: 'draft', }) onClose() } finally { setSaving(false) } } return (

Neue DSFA erstellen

{/* Progress Steps */}
{[1, 2, 3, 4].map(s => (
{s < step ? ( ) : s}
{s < 4 &&
} ))}
{/* Step Content */}
{step === 1 && (
setTitle(e.target.value)} placeholder="z.B. DSFA - Mitarbeiter-Monitoring" className="w-full px-4 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-purple-500" />