From 1a46aaa6a52a3629a317a1b041abbad500e55b58 Mon Sep 17 00:00:00 2001 From: Denozordec Date: Sun, 18 Oct 2026 01:39:44 +0700 Subject: [PATCH] =?UTF-8?q?feat(design-preview):=20=D0=B6=D1=83=D1=80?= =?UTF-8?q?=D0=BD=D0=B0=D0=BB=20=D0=B8=D0=B7=D0=BC=D0=B5=D0=BD=D0=B5=D0=BD?= =?UTF-8?q?=D0=B8=D0=B9=20=E2=80=94=20=D0=BB=D0=B5=D0=BD=D1=82=D0=B0,=20?= =?UTF-8?q?=D1=82=D0=B0=D0=B1=D0=BB=D0=B8=D1=86=D0=B0=20=D0=B8=20=D1=80?= =?UTF-8?q?=D0=BE=D1=82=D0=B0=D1=86=D0=B8=D1=8F=20=D0=B1=D0=B5=D0=B7=20?= =?UTF-8?q?=D0=B4=D1=83=D0=B1=D0=BB=D0=B8=D1=80=D1=83=D1=8E=D1=89=D0=B8?= =?UTF-8?q?=D1=85=20=D1=84=D0=B8=D0=BB=D1=8C=D1=82=D1=80=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Sonnet 5.5 --- .../src/design-preview/pages/audit-page.tsx | 84 ++++++++----------- 1 file changed, 34 insertions(+), 50 deletions(-) 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={ + + } + /> +