'use client' import { useState, useEffect } from 'react' export function AuditTrailPanel({ evidenceId, onClose }: { evidenceId: string; onClose: () => void }) { const [entries, setEntries] = useState<{ id: string; action: string; actor: string; timestamp: string; details: Record | null }[]>([]) const [loading, setLoading] = useState(true) useEffect(() => { fetch(`/api/sdk/v1/compliance/audit-trail?entity_type=evidence&entity_id=${evidenceId}`) .then(res => res.json()) .then(data => { const mapped = (data.entries || []).map((e: Record) => ({ id: e.id as string, action: e.action as string, actor: (e.performed_by || 'System') as string, timestamp: (e.performed_at || '') as string, details: { ...(e.field_changed ? { field: e.field_changed } : {}), ...(e.old_value ? { old: e.old_value } : {}), ...(e.new_value ? { new: e.new_value } : {}), ...(e.change_summary ? { summary: e.change_summary } : {}), } as Record, })) setEntries(mapped) }) .catch(() => {}) .finally(() => setLoading(false)) }, [evidenceId]) const actionLabels: Record = { created: { label: 'Erstellt', color: 'bg-blue-100 text-blue-700' }, uploaded: { label: 'Hochgeladen', color: 'bg-purple-100 text-purple-700' }, reviewed: { label: 'Reviewed', color: 'bg-green-100 text-green-700' }, rejected: { label: 'Abgelehnt', color: 'bg-red-100 text-red-700' }, updated: { label: 'Aktualisiert', color: 'bg-yellow-100 text-yellow-700' }, deleted: { label: 'Geloescht', color: 'bg-gray-100 text-gray-700' }, approved: { label: 'Genehmigt', color: 'bg-emerald-100 text-emerald-700' }, four_eyes_first: { label: '1. Review (4-Augen)', color: 'bg-blue-100 text-blue-700' }, four_eyes_final: { label: 'Finale Freigabe (4-Augen)', color: 'bg-emerald-100 text-emerald-700' }, } return (
e.stopPropagation()}>

Audit-Trail

{loading ? (
) : entries.length === 0 ? (

Keine Audit-Trail-Eintraege vorhanden.

) : (
{entries.map((entry, idx) => { const meta = actionLabels[entry.action] || { label: entry.action, color: 'bg-gray-100 text-gray-700' } return (
{meta.label} {entry.timestamp ? new Date(entry.timestamp).toLocaleString('de-DE') : '—'}
{entry.actor || 'System'}
{entry.details && Object.keys(entry.details).length > 0 && (
{Object.entries(entry.details).map(([k, v]) => (
{k}: {String(v)}
))}
)}
) })}
)}
) }