'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) => (
))}
{/* 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) => (
setFilter(f.key)}
className={`px-3 py-1 rounded-lg text-sm font-medium transition ${
filter === f.key
? 'bg-purple-600 text-white'
: 'bg-gray-100 text-gray-600 hover:bg-gray-200'
}`}
>
{f.label}
))}
Aufbewahrungstreiber:
setDriverFilter(e.target.value)}
className="px-3 py-1.5 border border-gray-300 rounded-lg text-sm focus:ring-2 focus:ring-purple-500 focus:border-purple-500"
>
Alle
{Object.entries(RETENTION_DRIVER_META).map(([key, meta]) => (
{meta.label}
))}
{/* 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.
setTab('generator')}
className="bg-purple-600 text-white hover:bg-purple-700 rounded-lg px-4 py-2 font-medium transition"
>
Generator starten
Neue Loeschfrist
) : 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}
)}
{
setEditingId(p.policyId)
setTab('editor')
}}
className="text-sm text-purple-600 hover:text-purple-800 font-medium"
>
Bearbeiten →
)
})}
)}
{/* Floating action button */}
{policies.length > 0 && (
+ Neue Loeschfrist
)}
)
}