import React, { useState, useMemo } from 'react'; import { useTranslation } from 'react-i18next'; import { ColumnDef } from '@tanstack/react-table'; import { useAuditLog, AuditLogEntry } from '@/api/hooks'; import { DataGrid } from '@/components/shared/DataGrid'; import { Card } from '@/components/ui/Card'; import { Input } from '@/components/ui/Input'; import { Button } from '@/components/ui/Button'; import { EmptyState } from '@/components/ui/EmptyState'; import { Badge } from '@/components/ui/Badge'; export function AuditLogPage() { const { t } = useTranslation(); const [page, setPage] = useState(1); const [pageSize] = useState(25); const [filterUser, setFilterUser] = useState(''); const [filterAction, setFilterAction] = useState(''); const [filterEntity, setFilterEntity] = useState(''); const [filterDateFrom, setFilterDateFrom] = useState(''); const [filterDateTo, setFilterDateTo] = useState(''); const filters = useMemo( () => ({ user: filterUser || undefined, action: filterAction || undefined, entity: filterEntity || undefined, dateFrom: filterDateFrom || undefined, dateTo: filterDateTo || undefined, }), [filterUser, filterAction, filterEntity, filterDateFrom, filterDateTo] ); const { data, isLoading, isError } = useAuditLog(page, pageSize, filters); const columns = useMemo[]>( () => [ { accessorKey: 'timestamp', header: t('auditLog.timestamp'), cell: (info) => { const val = info.getValue(); if (!val) return '—'; const date = new Date(val); return date.toLocaleString('de-DE'); }, }, { accessorKey: 'user', header: t('auditLog.user'), cell: (info) => info.getValue() || '—', }, { accessorKey: 'action', header: t('auditLog.action'), cell: (info) => info.getValue() ? {info.getValue()} : '—', }, { accessorKey: 'entity', header: t('auditLog.entity'), cell: (info) => info.getValue() || '—', }, { accessorKey: 'entity_id', header: t('auditLog.entityId'), cell: (info) => info.getValue() || '—', }, { accessorKey: 'details', header: t('auditLog.details'), cell: (info) => { const val = info.getValue(); if (!val) return '—'; return {val}; }, }, ], [t] ); const handleResetFilters = () => { setFilterUser(''); setFilterAction(''); setFilterEntity(''); setFilterDateFrom(''); setFilterDateTo(''); setPage(1); }; const hasFilters = filterUser || filterAction || filterEntity || filterDateFrom || filterDateTo; if (isError) { return (

{t('auditLog.title')}

); } const entries = data?.items ?? []; const total = data?.total ?? 0; return (

{t('auditLog.title')}

setFilterUser(e.target.value)} placeholder="anna.schmidt" /> setFilterAction(e.target.value)} placeholder="create, update, delete" /> setFilterEntity(e.target.value)} placeholder="company, contact" /> setFilterDateFrom(e.target.value)} /> setFilterDateTo(e.target.value)} />
{hasFilters && (
)}
); }