'use client' import React from 'react' import { LoeschfristPolicy, PolicyStatus, DeletionTriggerLevel, STATUS_COLORS, STATUS_LABELS, TRIGGER_COLORS, TRIGGER_LABELS, RETENTION_DRIVER_META, formatRetentionDuration, isPolicyOverdue, getActiveLegalHolds, getEffectiveDeletionTrigger, } from '@/lib/sdk/loeschfristen-types' // --------------------------------------------------------------------------- // Badge helpers // --------------------------------------------------------------------------- export function renderStatusBadge(status: PolicyStatus) { const colors = STATUS_COLORS[status] ?? 'bg-gray-100 text-gray-800' const label = STATUS_LABELS[status] ?? status return ( {label} ) } export function renderTriggerBadge(trigger: DeletionTriggerLevel) { const colors = TRIGGER_COLORS[trigger] ?? 'bg-gray-100 text-gray-800' const label = TRIGGER_LABELS[trigger] ?? trigger return ( {label} ) } // --------------------------------------------------------------------------- // Types // --------------------------------------------------------------------------- interface UebersichtTabProps { policies: LoeschfristPolicy[] filteredPolicies: LoeschfristPolicy[] stats: { total: number; active: number; draft: number; overdue: number; legalHolds: number } searchQuery: string setSearchQuery: (q: string) => void filter: string setFilter: (f: string) => void driverFilter: string setDriverFilter: (f: string) => void setTab: (tab: 'uebersicht' | 'editor' | 'generator' | 'export') => void setEditingId: (id: string | null) => void createNewPolicy: () => void } // --------------------------------------------------------------------------- // Component // --------------------------------------------------------------------------- export function UebersichtTab({ policies, filteredPolicies, stats, searchQuery, setSearchQuery, filter, setFilter, driverFilter, setDriverFilter, setTab, setEditingId, createNewPolicy, }: UebersichtTabProps) { return (
{/* Stats bar */}
{[ { label: 'Gesamt', value: stats.total, color: 'text-gray-900' }, { label: 'Aktiv', value: stats.active, color: 'text-green-600' }, { label: 'Entwurf', value: stats.draft, color: 'text-yellow-600' }, { label: 'Pruefung faellig', value: stats.overdue, color: 'text-red-600' }, { label: 'Legal Holds aktiv', value: stats.legalHolds, color: 'text-orange-600' }, ].map((s) => (
{s.value}
{s.label}
))}
{/* Search & filters */}
setSearchQuery(e.target.value)} placeholder="Suche nach Name, ID oder Beschreibung..." className="w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-purple-500 focus:border-purple-500" />
Status: {[ { key: 'all', label: 'Alle' }, { key: 'active', label: 'Aktiv' }, { key: 'draft', label: 'Entwurf' }, { key: 'review', label: 'Pruefung noetig' }, ].map((f) => ( ))} Aufbewahrungstreiber:
{/* Policy cards or empty state */} {filteredPolicies.length === 0 && policies.length === 0 ? (
📋

Noch keine Loeschfristen angelegt

Starten Sie den Generator, um auf Basis Ihres Unternehmensprofils automatisch passende Loeschfristen zu erstellen, oder legen Sie manuell eine neue Loeschfrist an.

) : filteredPolicies.length === 0 ? (

Keine Loeschfristen entsprechen den aktuellen Filtern.

) : (
{filteredPolicies.map((p) => { const trigger = getEffectiveDeletionTrigger(p) const activeHolds = getActiveLegalHolds(p) const overdue = isPolicyOverdue(p) return (
{activeHolds.length > 0 && ( )}
{p.policyId}

{p.dataObjectName || 'Ohne Bezeichnung'}

{renderTriggerBadge(trigger)} {formatRetentionDuration(p)} {renderStatusBadge(p.status)} {overdue && ( Pruefung faellig )}
{p.description && (

{p.description}

)}
) })}
)} {/* Floating action button */} {policies.length > 0 && (
)}
) }