diff --git a/apps/web/src/components/analytics/network-overview-analytics-card.tsx b/apps/web/src/components/analytics/network-overview-analytics-card.tsx index 868074d..389a288 100644 --- a/apps/web/src/components/analytics/network-overview-analytics-card.tsx +++ b/apps/web/src/components/analytics/network-overview-analytics-card.tsx @@ -51,7 +51,7 @@ export function NetworkOverviewAnalyticsCard({ label: 'Offline', percent: 100 - speakersPct, }} - footer={`Пиры Established: ${net.peersEstablished}/${net.peersEnabled}`} + footer={`Пиры установлены: ${net.peersEstablished}/${net.peersEnabled}`} /> ) diff --git a/apps/web/src/components/dashboard/dashboard-kpi-grid.tsx b/apps/web/src/components/dashboard/dashboard-kpi-grid.tsx index 39ea5b1..97de9a6 100644 --- a/apps/web/src/components/dashboard/dashboard-kpi-grid.tsx +++ b/apps/web/src/components/dashboard/dashboard-kpi-grid.tsx @@ -82,7 +82,7 @@ function buildKpis({ icon: , iconClassName: 'text-success', value: loading ? '—' : `${network.peersEstablished}/${peersEnabled}`, - label: 'Пиры Established', + label: 'Пиры установлены', footer: ( {loading ? '…' : `${network.peersTotal} в каталоге`} @@ -94,13 +94,13 @@ function buildKpis({ icon: , iconClassName: 'text-warning', value: loading ? '—' : `${network.speakersOnline}/${network.speakersTotal}`, - label: 'Спикеры online', + label: 'Спикеры в сети', footer: ( - {loading ? '…' : 'live-снимок'} + {loading ? '…' : 'онлайн'} ), }, diff --git a/apps/web/src/components/dashboard/dashboard-modules-grid.tsx b/apps/web/src/components/dashboard/dashboard-modules-grid.tsx index 11f6fc5..d779e4e 100644 --- a/apps/web/src/components/dashboard/dashboard-modules-grid.tsx +++ b/apps/web/src/components/dashboard/dashboard-modules-grid.tsx @@ -11,8 +11,8 @@ import { } from 'lucide-react' import { useCallback, useMemo, useState } from 'react' -import { CategoryBadge, ModeBadge } from '@/components/category-badge' -import { DataGridMutedCell, DataGridPrimaryCell } from '@/components/data-grid-cell' +import { CategoryBadge } from '@/components/category-badge' +import { DataGridPrimaryCell } from '@/components/data-grid-cell' import { DashboardFramePanel } from '@/components/dashboard/dashboard-frame-panel' import { Badge } from '@/components/reui/badge' import { DataGrid } from '@/components/reui/data-grid/data-grid' @@ -40,6 +40,7 @@ import { InputGroupButton, InputGroupInput, } from '@evobgp/ui/components/input-group' +import { DATA_GRID_PAGINATION_RU } from '@/lib/data-grid-defaults' import { moduleTypeRu } from '@/lib/ui-labels' import type { ModuleRow } from '@/types/api' import { @@ -51,20 +52,19 @@ import { type SortingState, } from '@tanstack/react-table' -type ModuleSort = 'name' | 'type' | 'priority' | 'last_refreshed_at' +type ModuleSort = 'name' | 'type' | 'priority' type EnabledFilter = 'all' | 'enabled' | 'disabled' const sortLabels: Record = { name: 'Название', type: 'Тип', priority: 'Приоритет', - last_refreshed_at: 'Обновлено', } const EMPTY_MESSAGE = 'Нет модулей по выбранным фильтрам.' function buildSorting(sortBy: ModuleSort): SortingState { - return [{ id: sortBy, desc: sortBy === 'last_refreshed_at' }] + return [{ id: sortBy, desc: false }] } export function DashboardModulesGrid({ @@ -138,30 +138,9 @@ export function DashboardModulesGrid({ cell: ({ row }) => ( {row.original.priority} ), + size: 88, meta: { headerTitle: 'Приоритет' }, }, - { - id: 'enabled', - accessorFn: (row) => (row.enabled !== false ? 'enabled' : 'disabled'), - header: ({ column }) => , - cell: ({ row }) => , - meta: { headerTitle: 'Состояние' }, - }, - { - id: 'last_refreshed_at', - accessorFn: (row) => row.last_refreshed_at ?? '', - header: ({ column }) => , - cell: ({ row }) => ( - - {row.original.last_refreshed_at - ? new Date(row.original.last_refreshed_at).toLocaleString('ru-RU') - : '—'} - - ), - sortingFn: (a, b) => - (a.original.last_refreshed_at ?? '').localeCompare(b.original.last_refreshed_at ?? ''), - meta: { headerTitle: 'Обновлено' }, - }, ], [], ) @@ -337,8 +316,8 @@ export function DashboardModulesGrid({
{filteredModules.length > 0 ? ( ) : ( diff --git a/apps/web/src/components/dashboard/dashboard-network-health.tsx b/apps/web/src/components/dashboard/dashboard-network-health.tsx index 3efadc9..aa5a4dd 100644 --- a/apps/web/src/components/dashboard/dashboard-network-health.tsx +++ b/apps/web/src/components/dashboard/dashboard-network-health.tsx @@ -57,7 +57,7 @@ export function DashboardNetworkHealth({ } primary={{ value: loading ? '—' : `${utilization}%`, - label: mode === 'peers' ? 'Утилизация пиров' : 'Спикеры online', + label: mode === 'peers' ? 'Утилизация пиров' : 'Спикеры в сети', percent: loading ? 0 : utilization, badge: ( @@ -67,7 +67,7 @@ export function DashboardNetworkHealth({ }} secondary={{ value: loading ? '—' : offline, - label: mode === 'peers' ? 'Не Established' : 'Offline', + label: mode === 'peers' ? 'Не установлены' : 'Не в сети', percent: total > 0 ? Math.round((offline / total) * 100) : 0, }} footer={ diff --git a/apps/web/src/components/dashboard/dashboard-quick-links.tsx b/apps/web/src/components/dashboard/dashboard-quick-links.tsx index b073733..7a6c6a9 100644 --- a/apps/web/src/components/dashboard/dashboard-quick-links.tsx +++ b/apps/web/src/components/dashboard/dashboard-quick-links.tsx @@ -7,7 +7,7 @@ const ACTIONS: QuickActionItem[] = [ { id: 'lookup', title: 'Проверка IP/домена', - description: 'Membership в списках и community (entry + snapshot).', + description: 'Проверка IP в списках и BGP-сообществах.', to: '/lookup', icon: , iconClassName: 'text-primary', @@ -23,7 +23,7 @@ const ACTIONS: QuickActionItem[] = [ { id: 'communities', title: 'BGP-сообщества', - description: 'Справочник communities для политик экспорта.', + description: 'Справочник BGP-сообществ для политик экспорта.', to: '/directories', icon: , iconClassName: 'text-info', @@ -31,7 +31,7 @@ const ACTIONS: QuickActionItem[] = [ { id: 'network', title: 'Сеть', - description: 'Обзор пиров, спикеров и live-сессий BGP.', + description: 'Обзор пиров, спикеров и живых BGP-сессий.', to: '/network', search: { tab: 'overview' }, icon: , diff --git a/apps/web/src/components/network/network-kpi.tsx b/apps/web/src/components/network/network-kpi.tsx index 0568034..75e493e 100644 --- a/apps/web/src/components/network/network-kpi.tsx +++ b/apps/web/src/components/network/network-kpi.tsx @@ -30,7 +30,7 @@ export function NetworkKpi({ id: 'peers-established', icon: , iconClassName: 'text-success', - label: 'Пиры Established', + label: 'Пиры установлены', value: loading ? '—' : `${net.peersEstablished}/${net.peersEnabled}`, footer: ( @@ -44,7 +44,7 @@ export function NetworkKpi({ id: 'speakers-online', icon: , iconClassName: 'text-info', - label: 'Спикеры online', + label: 'Спикеры в сети', value: loading ? '—' : `${net.speakersOnline}/${net.speakersTotal}`, footer: ( - {loading ? '…' : 'live'} + {loading ? '…' : 'онлайн'} ), to: '/network', diff --git a/apps/web/src/components/network/network-peers-card.tsx b/apps/web/src/components/network/network-peers-card.tsx index e2f7d96..60bf245 100644 --- a/apps/web/src/components/network/network-peers-card.tsx +++ b/apps/web/src/components/network/network-peers-card.tsx @@ -32,13 +32,13 @@ function peerDeleteLabel(p: PeerRow): string { const PEER_TABS = [ { id: 'all', label: 'Все' }, - { id: 'established', label: 'Established' }, + { id: 'established', label: 'Установлены' }, { id: 'pending', label: 'Ожидание' }, { id: 'disabled', label: 'Выключены' }, ] const SESSION_STATE_OPTIONS = [ - { value: 'Established', label: 'Established' }, + { value: 'Established', label: 'Установлена' }, { value: 'Idle', label: 'Idle' }, { value: 'Active', label: 'Active' }, { value: 'Connect', label: 'Connect' }, diff --git a/apps/web/src/components/network/peer-form-dialog.tsx b/apps/web/src/components/network/peer-form-dialog.tsx index 09786b1..62ab2cc 100644 --- a/apps/web/src/components/network/peer-form-dialog.tsx +++ b/apps/web/src/components/network/peer-form-dialog.tsx @@ -72,7 +72,7 @@ export function PeerFormDialog({ } const asn = Number(remoteAsn) if (!asn || asn <= 0) { - toast.error('Remote ASN должен быть больше 0') + toast.error('ASN соседа должен быть больше 0') return } const body: BgpPeerCreate = { @@ -132,7 +132,7 @@ export function PeerFormDialog({ />
- + ({ fields={filterFields} onChange={handleFiltersChange} size="default" + i18n={FILTERS_I18N_RU} trigger={