'use client' import { useState, useCallback } from 'react' import { ART9_CATEGORIES, BUSINESS_FUNCTION_LABELS, STATUS_LABELS, STATUS_COLORS, } from '@/lib/sdk/vvt-types' import type { VVTActivity } from '@/lib/sdk/vvt-types' import { generateActivities, prefillFromScopeAnswers, } from '@/lib/sdk/vvt-profiling' import { apiListTemplates, type ProcessTemplate } from './api' const PROTECTION_LEVEL_LABELS: Record = { LOW: 'Niedrig', MEDIUM: 'Mittel', HIGH: 'Hoch', VERY_HIGH: 'Sehr hoch' } export function TabVerzeichnis({ activities, allActivities, activeCount, draftCount, thirdCountryCount, art9Count, filter, setFilter, searchQuery, setSearchQuery, sortBy, setSortBy, scopeAnswers, onEdit, onNew, onDelete, onAdoptGenerated, onNewFromTemplate, }: { activities: VVTActivity[] allActivities: VVTActivity[] activeCount: number draftCount: number thirdCountryCount: number art9Count: number filter: string setFilter: (f: string) => void searchQuery: string setSearchQuery: (q: string) => void sortBy: string setSortBy: (s: 'name' | 'date' | 'status') => void scopeAnswers?: import('@/lib/sdk/compliance-scope-types').ScopeProfilingAnswer[] onEdit: (id: string) => void onNew: () => void onDelete: (id: string) => void onAdoptGenerated: (activities: VVTActivity[]) => void onNewFromTemplate: (templateId: string) => void }) { const [scopePreview, setScopePreview] = useState(null) const [isGenerating, setIsGenerating] = useState(false) const [showTemplatePicker, setShowTemplatePicker] = useState(false) const [templates, setTemplates] = useState([]) const [templateFilter, setTemplateFilter] = useState('all') const [templatesLoading, setTemplatesLoading] = useState(false) const handleGenerateFromScope = useCallback(() => { if (!scopeAnswers) return setIsGenerating(true) try { const profilingAnswers = prefillFromScopeAnswers(scopeAnswers) const result = generateActivities(profilingAnswers) setScopePreview(result.generatedActivities) } finally { setIsGenerating(false) } }, [scopeAnswers]) const handleAdoptPreview = useCallback(() => { if (!scopePreview) return onAdoptGenerated(scopePreview) setScopePreview(null) }, [scopePreview, onAdoptGenerated]) // Preview mode for generated activities if (scopePreview) { return (

Generierte Verarbeitungen

Basierend auf Ihrer Scope-Analyse wurden {scopePreview.length} Verarbeitungstaetigkeiten generiert. Sie koennen einzelne Eintraege abwaehlen, bevor Sie diese uebernehmen.

{scopePreview.map((a, i) => (
{ if (!e.target.checked) { setScopePreview(scopePreview.filter((_, j) => j !== i)) } }} />
{a.vvtId} {a.name} {BUSINESS_FUNCTION_LABELS[a.businessFunction]}

{a.description}

))}
) } return (
{/* Scope Generate Button */} {scopeAnswers && scopeAnswers.length > 0 && (

Aus Scope-Analyse generieren

Erstellen Sie automatisch Verarbeitungstaetigkeiten basierend auf Ihren Scope-Profiling-Antworten.

)} {/* Stats */}
{/* Search + Filter + New */}
setSearchQuery(e.target.value)} placeholder="VVT-ID, Name oder Beschreibung suchen..." className="w-full pl-10 pr-4 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-purple-500 focus:border-transparent" />
{[ { key: 'all', label: 'Alle' }, { key: 'DRAFT', label: 'Entwurf' }, { key: 'REVIEW', label: 'Pruefung' }, { key: 'APPROVED', label: 'Genehmigt' }, { key: 'thirdcountry', label: 'Drittland' }, { key: 'art9', label: 'Art. 9' }, ].map(f => ( ))}
{/* Activity Cards */}
{activities.map(activity => ( ))}
{activities.length === 0 && (

Keine Verarbeitungen gefunden

Erstellen Sie eine neue Verarbeitung manuell oder generieren Sie Eintraege automatisch aus Ihrer Scope-Analyse.

)} {/* Template Picker Modal */} {showTemplatePicker && (

Vorlage auswaehlen

{['all', 'hr', 'it', 'marketing', 'finance', 'legal', 'operations'].map(f => ( ))}
{templatesLoading ? (
) : (
{templates .filter(t => templateFilter === 'all' || t.business_function === templateFilter) .map(t => ( ))} {templates.filter(t => templateFilter === 'all' || t.business_function === templateFilter).length === 0 && (

Keine Vorlagen fuer diesen Bereich gefunden.

)}
)}
)}
) } function StatCard({ label, value, color }: { label: string; value: number; color: string }) { const borderColors: Record = { gray: 'border-gray-200', green: 'border-green-200', yellow: 'border-yellow-200', orange: 'border-orange-200', red: 'border-red-200', } const textColors: Record = { gray: 'text-gray-600', green: 'text-green-600', yellow: 'text-yellow-600', orange: 'text-orange-600', red: 'text-red-600', } return (
{label}
{value}
) } function ActivityCard({ activity, onEdit, onDelete }: { activity: VVTActivity; onEdit: (id: string) => void; onDelete: (id: string) => void }) { const hasArt9 = activity.personalDataCategories.some(c => ART9_CATEGORIES.includes(c)) const hasThirdCountry = activity.thirdCountryTransfers.length > 0 return (
{activity.vvtId} {STATUS_LABELS[activity.status] || activity.status} {hasArt9 && ( Art. 9 )} {hasThirdCountry && ( Drittland )} {activity.dpiaRequired && ( DSFA )} {(activity as any).sourceTemplateId && ( Vorlage )}

{activity.name || '(Ohne Namen)'}

{activity.description && (

{activity.description}

)}
{BUSINESS_FUNCTION_LABELS[activity.businessFunction]} {activity.responsible || 'Kein Verantwortlicher'} Aktualisiert: {new Date(activity.updatedAt).toLocaleDateString('de-DE')} {(activity as any).art30Completeness !== undefined && ( = 80 ? 'text-green-600' : (activity as any).art30Completeness >= 50 ? 'text-yellow-600' : 'text-red-500' }`}>Art.30: {(activity as any).art30Completeness}% )}
) }