'use client' import { 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' import { DSFACard, type DSFA } from './_components/DSFACard' import { GeneratorWizard } from './_components/GeneratorWizard' export default function DSFAPage() { const router = useRouter() const { state } = useSDK() const [dsfas, setDsfas] = useState([]) const [isLoading, setIsLoading] = useState(true) const [error, setError] = useState(null) const [showGenerator, setShowGenerator] = useState(false) const [filter, setFilter] = useState('all') const loadDSFAs = useCallback(async () => { setIsLoading(true) setError(null) try { const res = await fetch('/api/sdk/v1/dsfa?tenant_id=default') if (!res.ok) throw new Error(`Fehler: ${res.status}`) const data = await res.json() const mapped: DSFA[] = (Array.isArray(data) ? data : []).map((d: Record) => ({ id: d.id as string, title: d.title as string, description: (d.description as string) || '', status: (d.status as DSFA['status']) || 'draft', createdAt: d.created_at as string, updatedAt: d.updated_at as string, approvedBy: (d.approved_by as string) || null, riskLevel: (d.risk_level as DSFA['riskLevel']) || 'low', processingActivity: (d.processing_activity as string) || '', dataCategories: (d.data_categories as string[]) || [], recipients: (d.recipients as string[]) || [], measures: (d.measures as string[]) || [], })) setDsfas(mapped) } catch (err) { setError(err instanceof Error ? err.message : 'Unbekannter Fehler') } finally { setIsLoading(false) } }, []) useEffect(() => { loadDSFAs() }, [loadDSFAs]) const handleCreateDSFA = useCallback(async (data: Partial) => { const res = await fetch('/api/sdk/v1/dsfa?tenant_id=default', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ title: data.title, description: data.description || '', processing_activity: data.processingActivity || '', data_categories: data.dataCategories || [], recipients: data.recipients || [], measures: data.measures || [], risk_level: data.riskLevel || 'low', status: data.status || 'draft', }), }) if (!res.ok) throw new Error(`Fehler beim Erstellen: ${res.status}`) await loadDSFAs() }, [loadDSFAs]) const handleStatusChange = useCallback(async (id: string, status: string) => { const res = await fetch(`/api/sdk/v1/dsfa/${id}/status?tenant_id=default`, { method: 'PATCH', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ status }), }) if (!res.ok) throw new Error(`Statuswechsel fehlgeschlagen: ${res.status}`) await loadDSFAs() }, [loadDSFAs]) const handleDeleteDSFA = useCallback(async (id: string) => { if (!confirm('DSFA wirklich loeschen?')) return const res = await fetch(`/api/sdk/v1/dsfa/${id}?tenant_id=default`, { method: 'DELETE' }) if (!res.ok) throw new Error(`Loeschen fehlgeschlagen: ${res.status}`) await loadDSFAs() }, [loadDSFAs]) const handleDocumentProcessed = useCallback((doc: UploadedDocument) => { console.log('[DSFA Page] Document processed:', doc) }, []) const handleOpenInEditor = useCallback((doc: UploadedDocument) => { router.push(`/sdk/workflow?documentType=dsfa&documentId=${doc.id}&mode=change`) }, [router]) const filteredDSFAs = filter === 'all' ? dsfas : dsfas.filter(d => d.status === filter) const draftCount = dsfas.filter(d => d.status === 'draft').length const inReviewCount = dsfas.filter(d => d.status === 'in-review').length const approvedCount = dsfas.filter(d => d.status === 'approved').length const stepInfo = STEP_EXPLANATIONS['dsfa'] return (
{!showGenerator && ( )} {showGenerator && ( setShowGenerator(false)} onSubmit={handleCreateDSFA} /> )}
Gesamt
{dsfas.length}
Entwuerfe
{draftCount}
In Pruefung
{inReviewCount}
Genehmigt
{approvedCount}
{error && (
Fehler beim Laden: {error}
)}
Filter: {['all', 'draft', 'in-review', 'approved', 'needs-update'].map(f => ( ))}
{isLoading && (
Lade DSFAs...
)} {!isLoading && (
{filteredDSFAs.map(dsfa => ( ))}
)} {!isLoading && filteredDSFAs.length === 0 && !showGenerator && (

Keine DSFAs gefunden

Erstellen Sie eine neue Datenschutz-Folgenabschaetzung.

)}
) }