'use client' import { useMemo, useState } from 'react' import { DataPoint, DataPointCategory, CATEGORY_METADATA, RISK_LEVEL_STYLING, RiskLevel, } from '@/lib/sdk/einwilligungen/types' interface DataPointsPreviewProps { dataPoints: DataPoint[] onInsertPlaceholder: (placeholder: string) => void language?: 'de' | 'en' } /** * Platzhalter-Definitionen mit Beschreibungen */ const PLACEHOLDERS = [ { placeholder: '[DATENPUNKTE_TABLE]', label: { de: 'Tabelle', en: 'Table' }, description: { de: 'Markdown-Tabelle mit allen Datenpunkten', en: 'Markdown table with all data points' }, }, { placeholder: '[DATENPUNKTE_LIST]', label: { de: 'Liste', en: 'List' }, description: { de: 'Kommaseparierte Liste der Namen', en: 'Comma-separated list of names' }, }, { placeholder: '[VERARBEITUNGSZWECKE]', label: { de: 'Zwecke', en: 'Purposes' }, description: { de: 'Alle Verarbeitungszwecke', en: 'All processing purposes' }, }, { placeholder: '[RECHTSGRUNDLAGEN]', label: { de: 'Rechtsgrundlagen', en: 'Legal Bases' }, description: { de: 'DSGVO-Artikel', en: 'GDPR articles' }, }, { placeholder: '[SPEICHERFRISTEN]', label: { de: 'Speicherfristen', en: 'Retention' }, description: { de: 'Fristen nach Kategorie', en: 'Periods by category' }, }, { placeholder: '[EMPFAENGER]', label: { de: 'Empfänger', en: 'Recipients' }, description: { de: 'Liste aller Drittparteien', en: 'List of third parties' }, }, { placeholder: '[BESONDERE_KATEGORIEN]', label: { de: 'Art. 9', en: 'Art. 9' }, description: { de: 'Abschnitt für sensible Daten', en: 'Section for sensitive data' }, }, { placeholder: '[DRITTLAND_TRANSFERS]', label: { de: 'Drittländer', en: 'Third Countries' }, description: { de: 'Datenübermittlung außerhalb EU', en: 'Data transfers outside EU' }, }, ] /** * Risiko-Badge Farben */ function getRiskBadgeColor(riskLevel: RiskLevel): string { switch (riskLevel) { case 'HIGH': return 'bg-red-100 text-red-700 border-red-200' case 'MEDIUM': return 'bg-yellow-100 text-yellow-700 border-yellow-200' case 'LOW': default: return 'bg-green-100 text-green-700 border-green-200' } } /** * DataPointsPreview Komponente */ export function DataPointsPreview({ dataPoints, onInsertPlaceholder, language = 'de', }: DataPointsPreviewProps) { const [expandedCategories, setExpandedCategories] = useState([]) // Gruppiere Datenpunkte nach Kategorie const byCategory = useMemo(() => { return dataPoints.reduce((acc, dp) => { if (!acc[dp.category]) { acc[dp.category] = [] } acc[dp.category].push(dp) return acc }, {} as Record) }, [dataPoints]) // Statistiken berechnen const stats = useMemo(() => { const riskCounts: Record = { LOW: 0, MEDIUM: 0, HIGH: 0 } let specialCategoryCount = 0 dataPoints.forEach(dp => { riskCounts[dp.riskLevel]++ if (dp.isSpecialCategory) specialCategoryCount++ }) return { riskCounts, specialCategoryCount, categoryCount: Object.keys(byCategory).length, } }, [dataPoints, byCategory]) // Sortierte Kategorien (nach Code) const sortedCategories = useMemo(() => { return Object.entries(byCategory).sort((a, b) => { const codeA = CATEGORY_METADATA[a[0] as DataPointCategory]?.code || 'Z' const codeB = CATEGORY_METADATA[b[0] as DataPointCategory]?.code || 'Z' return codeA.localeCompare(codeB) }) }, [byCategory]) const toggleCategory = (category: string) => { setExpandedCategories(prev => prev.includes(category) ? prev.filter(c => c !== category) : [...prev, category] ) } if (dataPoints.length === 0) { return (

{language === 'de' ? 'Einwilligungen' : 'Consents'}

{language === 'de' ? 'Keine Datenpunkte ausgewählt. Wählen Sie Datenpunkte im Einwilligungs-Schritt aus.' : 'No data points selected. Select data points in the consent step.'}

) } return (
{/* Header */}

{language === 'de' ? 'Einwilligungen' : 'Consents'}

{dataPoints.length} {language === 'de' ? 'Datenpunkte aus' : 'data points from'}{' '} {stats.categoryCount} {language === 'de' ? 'Kategorien' : 'categories'}

{/* Statistik-Badges */}
{stats.riskCounts.HIGH > 0 && ( {stats.riskCounts.HIGH} {language === 'de' ? 'Hoch' : 'High'} )} {stats.riskCounts.MEDIUM > 0 && ( {stats.riskCounts.MEDIUM} {language === 'de' ? 'Mittel' : 'Medium'} )} {stats.riskCounts.LOW > 0 && ( {stats.riskCounts.LOW} {language === 'de' ? 'Niedrig' : 'Low'} )} {stats.specialCategoryCount > 0 && ( {stats.specialCategoryCount} Art. 9 )}
{/* Datenpunkte nach Kategorie */}
{sortedCategories.map(([category, points]) => { const metadata = CATEGORY_METADATA[category as DataPointCategory] if (!metadata) return null const isExpanded = expandedCategories.includes(category) return (
{isExpanded && (
    {points.map(dp => (
  • {language === 'de' ? dp.name.de : dp.name.en}
    {dp.isSpecialCategory && ( )} {RISK_LEVEL_STYLING[dp.riskLevel].label[language]}
  • ))}
)}
) })}
{/* Schnell-Einfügen Buttons */}

{language === 'de' ? 'Platzhalter einfügen:' : 'Insert placeholder:'}

{PLACEHOLDERS.slice(0, 4).map(({ placeholder, label }) => ( ))}
{PLACEHOLDERS.slice(4).map(({ placeholder, label }) => ( ))}
) } export default DataPointsPreview