'use client' /** * Consent Admin Panel * * Admin interface for managing: * - Documents (AGB, Privacy, etc.) * - Document Versions * - Email Templates * - Statistics */ import { useState, useEffect } from 'react' import AdminLayout from '@/components/admin/AdminLayout' // API Proxy URL (avoids CORS issues) const API_BASE = '/api/admin/consent' type Tab = 'documents' | 'versions' | 'emails' | 'gdpr' | 'stats' interface Document { id: string type: string name: string description: string mandatory: boolean created_at: string updated_at: string } interface Version { id: string document_id: string version: string language: string title: string content: string status: string created_at: string } export default function ConsentAdminPage() { const [activeTab, setActiveTab] = useState('documents') const [documents, setDocuments] = useState([]) const [versions, setVersions] = useState([]) const [loading, setLoading] = useState(true) const [error, setError] = useState(null) const [selectedDocument, setSelectedDocument] = useState('') // Auth token (in production, get from auth context) const [authToken, setAuthToken] = useState('') useEffect(() => { // Get token from localStorage const token = localStorage.getItem('bp_admin_token') if (token) { setAuthToken(token) } }, []) useEffect(() => { if (activeTab === 'documents') { loadDocuments() } else if (activeTab === 'versions' && selectedDocument) { loadVersions(selectedDocument) } }, [activeTab, selectedDocument, authToken]) async function loadDocuments() { setLoading(true) setError(null) try { const res = await fetch(`${API_BASE}/documents`, { headers: authToken ? { 'Authorization': `Bearer ${authToken}` } : {} }) if (res.ok) { const data = await res.json() setDocuments(data.documents || []) } else { const errorData = await res.json().catch(() => ({})) setError(errorData.error || 'Fehler beim Laden der Dokumente') } } catch (err) { setError('Verbindungsfehler zum Server') } finally { setLoading(false) } } async function loadVersions(docId: string) { setLoading(true) setError(null) try { const res = await fetch(`${API_BASE}/documents/${docId}/versions`, { headers: authToken ? { 'Authorization': `Bearer ${authToken}` } : {} }) if (res.ok) { const data = await res.json() setVersions(data.versions || []) } else { const errorData = await res.json().catch(() => ({})) setError(errorData.error || 'Fehler beim Laden der Versionen') } } catch (err) { setError('Verbindungsfehler zum Server') } finally { setLoading(false) } } const tabs: { id: Tab; label: string }[] = [ { id: 'documents', label: 'Dokumente' }, { id: 'versions', label: 'Versionen' }, { id: 'emails', label: 'E-Mail Vorlagen' }, { id: 'gdpr', label: 'DSGVO Prozesse' }, { id: 'stats', label: 'Statistiken' }, ] // 16 Lifecycle Email Templates const emailTemplates = [ // Onboarding { name: 'Willkommens-E-Mail', key: 'welcome', category: 'onboarding', description: 'Wird bei Registrierung versendet' }, { name: 'E-Mail Bestätigung', key: 'email_verification', category: 'onboarding', description: 'Bestätigungslink für E-Mail-Adresse' }, { name: 'Konto aktiviert', key: 'account_activated', category: 'onboarding', description: 'Bestätigung der Kontoaktivierung' }, // Security { name: 'Passwort zurücksetzen', key: 'password_reset', category: 'security', description: 'Link zum Zurücksetzen des Passworts' }, { name: 'Passwort geändert', key: 'password_changed', category: 'security', description: 'Bestätigung der Passwortänderung' }, { name: 'Neue Anmeldung', key: 'new_login', category: 'security', description: 'Benachrichtigung über Anmeldung von neuem Gerät' }, { name: '2FA aktiviert', key: '2fa_enabled', category: 'security', description: 'Bestätigung der 2FA-Aktivierung' }, // Consent & Legal { name: 'Neue Dokumentversion', key: 'new_document_version', category: 'consent', description: 'Info über neue Dokumentversion zur Zustimmung' }, { name: 'Zustimmung erteilt', key: 'consent_given', category: 'consent', description: 'Bestätigung der erteilten Zustimmung' }, { name: 'Zustimmung widerrufen', key: 'consent_withdrawn', category: 'consent', description: 'Bestätigung des Widerrufs' }, // Data Subject Rights (GDPR) { name: 'DSR Anfrage erhalten', key: 'dsr_received', category: 'gdpr', description: 'Bestätigung des Eingangs einer DSGVO-Anfrage' }, { name: 'Datenexport bereit', key: 'export_ready', category: 'gdpr', description: 'Benachrichtigung über fertigen Datenexport' }, { name: 'Daten gelöscht', key: 'data_deleted', category: 'gdpr', description: 'Bestätigung der Datenlöschung' }, { name: 'Daten berichtigt', key: 'data_rectified', category: 'gdpr', description: 'Bestätigung der Datenberichtigung' }, // Account Lifecycle { name: 'Konto deaktiviert', key: 'account_deactivated', category: 'lifecycle', description: 'Konto wurde deaktiviert' }, { name: 'Konto gelöscht', key: 'account_deleted', category: 'lifecycle', description: 'Bestätigung der Kontolöschung' }, ] // GDPR Article 15-21 Processes const gdprProcesses = [ { article: '15', title: 'Auskunftsrecht', description: 'Recht auf Bestätigung und Auskunft über verarbeitete personenbezogene Daten', actions: ['Datenexport generieren', 'Verarbeitungszwecke auflisten', 'Empfänger auflisten'], sla: '30 Tage', status: 'active' }, { article: '16', title: 'Recht auf Berichtigung', description: 'Recht auf Berichtigung unrichtiger personenbezogener Daten', actions: ['Daten bearbeiten', 'Änderungshistorie führen', 'Benachrichtigung senden'], sla: '30 Tage', status: 'active' }, { article: '17', title: 'Recht auf Löschung ("Vergessenwerden")', description: 'Recht auf Löschung personenbezogener Daten unter bestimmten Voraussetzungen', actions: ['Löschantrag prüfen', 'Daten löschen', 'Aufbewahrungsfristen prüfen', 'Löschbestätigung senden'], sla: '30 Tage', status: 'active' }, { article: '18', title: 'Recht auf Einschränkung der Verarbeitung', description: 'Recht auf Markierung von Daten zur eingeschränkten Verarbeitung', actions: ['Daten markieren', 'Verarbeitung einschränken', 'Benachrichtigung bei Aufhebung'], sla: '30 Tage', status: 'active' }, { article: '19', title: 'Mitteilungspflicht', description: 'Pflicht zur Mitteilung von Berichtigung, Löschung oder Einschränkung an Empfänger', actions: ['Empfänger ermitteln', 'Mitteilungen versenden', 'Protokollierung'], sla: 'Unverzüglich', status: 'active' }, { article: '20', title: 'Recht auf Datenübertragbarkeit', description: 'Recht auf Erhalt der Daten in strukturiertem, maschinenlesbarem Format', actions: ['JSON/CSV Export', 'API-Schnittstelle', 'Direkte Übertragung'], sla: '30 Tage', status: 'active' }, { article: '21', title: 'Widerspruchsrecht', description: 'Recht auf Widerspruch gegen Verarbeitung aus berechtigtem Interesse oder Direktwerbung', actions: ['Widerspruch erfassen', 'Verarbeitung stoppen', 'Marketing-Opt-out'], sla: 'Unverzüglich', status: 'active' }, ] const emailCategories = [ { key: 'onboarding', label: 'Onboarding', color: 'bg-blue-100 text-blue-700' }, { key: 'security', label: 'Sicherheit', color: 'bg-red-100 text-red-700' }, { key: 'consent', label: 'Zustimmung', color: 'bg-green-100 text-green-700' }, { key: 'gdpr', label: 'DSGVO', color: 'bg-purple-100 text-purple-700' }, { key: 'lifecycle', label: 'Lifecycle', color: 'bg-orange-100 text-orange-700' }, ] return ( {/* Token Input */} {!authToken && (
{ setAuthToken(e.target.value) localStorage.setItem('bp_admin_token', e.target.value) }} />
)} {/* Tabs */}
{tabs.map((tab) => ( ))}
{/* Content */}
{error && (
{error}
)}
{/* Documents Tab */} {activeTab === 'documents' && (

Dokumente verwalten

{loading ? (
Lade Dokumente...
) : documents.length === 0 ? (
Keine Dokumente vorhanden
) : (
{documents.map((doc) => ( ))}
Typ Name Beschreibung Pflicht Erstellt Aktionen
{doc.type} {doc.name} {doc.description} {doc.mandatory ? ( Ja ) : ( Nein )} {new Date(doc.created_at).toLocaleDateString('de-DE')}
)}
)} {/* Versions Tab */} {activeTab === 'versions' && (

Versionen

{selectedDocument && ( )}
{!selectedDocument ? (
Bitte wählen Sie ein Dokument aus
) : loading ? (
Lade Versionen...
) : versions.length === 0 ? (
Keine Versionen vorhanden
) : (
{versions.map((version) => (
v{version.version} {version.language.toUpperCase()} {version.status}

{version.title}

Erstellt: {new Date(version.created_at).toLocaleDateString('de-DE')}

{version.status === 'draft' && ( )}
))}
)}
)} {/* Emails Tab - 16 Lifecycle Templates */} {activeTab === 'emails' && (

E-Mail Vorlagen

16 Lifecycle-Vorlagen für automatisierte Kommunikation

{/* Category Filter */}
Filter: {emailCategories.map((cat) => ( {cat.label} ))}
{/* Templates grouped by category */} {emailCategories.map((category) => (

{category.label}

{emailTemplates .filter((t) => t.category === category.key) .map((template) => (
{category.key === 'onboarding' && '👋'} {category.key === 'security' && '🔒'} {category.key === 'consent' && '✓'} {category.key === 'gdpr' && '📋'} {category.key === 'lifecycle' && '🔄'}

{template.name}

{template.description}

Aktiv
))}
))}
)} {/* GDPR Processes Tab - Articles 15-21 */} {activeTab === 'gdpr' && (

DSGVO Betroffenenrechte

Artikel 15-21 Prozesse und Vorlagen

{/* Info Banner */}
⚖️

Data Subject Rights (DSR)

Hier verwalten Sie alle DSGVO-Anfragen. Jeder Artikel hat definierte Prozesse, SLAs und automatisierte Workflows.

{/* GDPR Process Cards */}
{gdprProcesses.map((process) => (
{process.article}

{process.title}

Aktiv

{process.description}

{/* Actions */}
{process.actions.map((action, idx) => ( {action} ))}
{/* SLA */}
SLA: {process.sla} | Offene Anfragen: 0
))}
{/* DSR Request Statistics */}

DSR Übersicht

0
Offen
0
Erledigt
0
In Bearbeitung
0
Überfällig
)} {/* Stats Tab */} {activeTab === 'stats' && (

Statistiken

0
Aktive Zustimmungen
0
Dokumente
0
Offene DSR-Anfragen

Zustimmungsrate nach Dokument

Noch keine Daten verfügbar
)}
) }