'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' export function TabVerzeichnis({ activities, allActivities, activeCount, draftCount, thirdCountryCount, art9Count, filter, setFilter, searchQuery, setSearchQuery, sortBy, setSortBy, scopeAnswers, onEdit, onNew, onDelete, onAdoptGenerated, }: { 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 }) { const [scopePreview, setScopePreview] = useState(null) const [isGenerating, setIsGenerating] = 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.

)}
) } 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.name || '(Ohne Namen)'}

{activity.description && (

{activity.description}

)}
{BUSINESS_FUNCTION_LABELS[activity.businessFunction]} {activity.responsible || 'Kein Verantwortlicher'} Aktualisiert: {new Date(activity.updatedAt).toLocaleDateString('de-DE')}
) }