diff --git a/apps/web/src/design-preview/pages/audit-page.tsx b/apps/web/src/design-preview/pages/audit-page.tsx index 3e2b1bc..6632502 100644 --- a/apps/web/src/design-preview/pages/audit-page.tsx +++ b/apps/web/src/design-preview/pages/audit-page.tsx @@ -1,4 +1,4 @@ -import { useMemo, useState } from 'react' +import { useState } from 'react' import { DownloadIcon, Trash2Icon, HistoryIcon, UserCogIcon, ShieldAlertIcon, NetworkIcon } from 'lucide-react' import { toast } from 'sonner' import type { AuditLogEntry, AuditSeverity } from '@authportal/shared' @@ -7,7 +7,7 @@ import { AuditRetentionPanel } from '@/components/reui-kit/audit-retention-panel import { KpiStatGrid } from '@/components/reui-kit/kpi-stat-grid' import { Button } from '@authportal/ui/components/button' import { Tabs, TabsContent, TabsList, TabsTrigger } from '@authportal/ui/components/tabs' -import { Segmented, CodeBlock, KvList, PageHead, PreviewSheet, StatusBadge, TypedConfirm } from '../bits' +import { CodeBlock, KvList, PageHead, PreviewSheet, StatusBadge, TypedConfirm } from '../bits' import { kpi } from '../kpi' import { MOCK_AUDIT, APP_SHORT, type Tone } from '../mock' import { PreviewSectionGrid, TwoLineCell, type GridColumn } from '../section-grid' @@ -34,38 +34,16 @@ const columns: GridColumn[] = [ const VIEWS = [ { label: 'Все', match: () => true }, - { label: 'Warning и выше', match: (r: AuditLogEntry) => r.severity !== 'info' }, - { label: 'Critical', match: (r: AuditLogEntry) => r.severity === 'critical' }, + { label: 'Auth', match: (r: AuditLogEntry) => r.action.startsWith('auth.') }, + { label: 'Пользователи', match: (r: AuditLogEntry) => r.action.startsWith('user.') }, + { label: 'Настройки', match: (r: AuditLogEntry) => /^(oidc|app_switcher|audit)\./.test(r.action) }, + { label: 'Критичные', match: (r: AuditLogEntry) => r.severity === 'critical' }, ] export function AuditPage() { const [entry, setEntry] = useState(null) const [purgeOpen, setPurgeOpen] = useState(false) const [retention, setRetention] = useState(90) - const [period, setPeriod] = useState(1) - - const auth = useMemo(() => MOCK_AUDIT.filter((e) => e.action.startsWith('auth.')), []) - const users = useMemo(() => MOCK_AUDIT.filter((e) => e.action.startsWith('user.')), []) - const settings = useMemo( - () => MOCK_AUDIT.filter((e) => e.action.startsWith('oidc.') || e.action.startsWith('app_switcher.') || e.action.startsWith('audit.')), - [], - ) - - function grid(title: string, description: string, rows: AuditLogEntry[]) { - return ( - r.id} - searchText={(r) => `${r.action} ${r.summary} ${r.actor_email ?? ''} ${r.ip ?? ''}`} - searchPlaceholder="Событие, пользователь, IP" - views={VIEWS} - onRowClick={setEntry} - /> - ) - } return ( <> @@ -73,19 +51,12 @@ export function AuditPage() { title="Изменения" sub="Журнал действий администраторов и приложений · портал, EvoFirewall, EvoBGP, MikrotikManager и другие через ingest" actions={ - <> - - - + } /> - - - - Все · 148 - Auth · 31 - Пользователи · 74 - Настройки · 43 + + + Лента + Таблица · {MOCK_AUDIT.length} Ротация - + - {grid('Журнал изменений', 'Поиск по событию, пользователю и IP · фильтры: источник, важность, объект', MOCK_AUDIT)} - {grid('События аутентификации', 'Входы, выходы и SSO · подробности — в разделе «Входы»', auth)} - {grid('Изменения пользователей', 'Создание, правки, права и passkeys', users)} - {grid('Изменения настроек', 'Переключатель приложений, OIDC, ротация журнала', settings)} + + r.id} + searchText={(r) => `${r.action} ${r.summary} ${r.actor_email ?? ''} ${r.ip ?? ''}`} + searchPlaceholder="Событие, пользователь, IP" + views={VIEWS} + onRowClick={setEntry} + toolbar={ + + } + /> +