Сжать экран «Сеть»: KPI (stats-12) и вкладки Пиры/Спикеры через ResourcePage; убраны дубли charts и заглушка control-plane. Co-authored-by: Cursor <[email protected]>
78 lines
2.7 KiB
TypeScript
78 lines
2.7 KiB
TypeScript
import type { ColumnDef } from '@tanstack/react-table'
|
|
|
|
import { CategoryBadge } from '@/components/category-badge'
|
|
import { DataGridPrimaryCell } from '@/components/data-grid-cell'
|
|
import { StatusBadge } from '@/components/status-badge'
|
|
import { DataGridColumnHeader } from '@/components/reui/data-grid/data-grid-column-header'
|
|
import { bgpSessionStateRu } from '@/lib/ui-labels'
|
|
import type { PeerRow } from '@/types/api'
|
|
|
|
export const peerColumns: ColumnDef<PeerRow, unknown>[] = [
|
|
{
|
|
id: 'name',
|
|
accessorFn: (row) => row.name ?? row.neighbor,
|
|
header: ({ column }) => <DataGridColumnHeader column={column} title="Имя" />,
|
|
cell: ({ row }) => (
|
|
<DataGridPrimaryCell
|
|
title={row.original.name ?? row.original.neighbor}
|
|
subtitle={row.original.name ? row.original.neighbor : undefined}
|
|
accent="primary"
|
|
/>
|
|
),
|
|
meta: { headerTitle: 'Имя' },
|
|
},
|
|
{
|
|
accessorKey: 'neighbor',
|
|
header: ({ column }) => <DataGridColumnHeader column={column} title="Адрес соседа" />,
|
|
cell: ({ row }) => (
|
|
<DataGridPrimaryCell title={row.original.neighbor} accent="mono" />
|
|
),
|
|
meta: { headerTitle: 'Адрес соседа' },
|
|
},
|
|
{
|
|
accessorKey: 'remote_asn',
|
|
header: ({ column }) => <DataGridColumnHeader column={column} title="ASN" />,
|
|
cell: ({ row }) => (
|
|
<span className="font-mono text-xs">{row.original.remote_asn ?? '—'}</span>
|
|
),
|
|
meta: { headerTitle: 'ASN' },
|
|
},
|
|
{
|
|
accessorKey: 'session_state',
|
|
header: ({ column }) => <DataGridColumnHeader column={column} title="Состояние" />,
|
|
cell: ({ row }) => (
|
|
<div className="flex items-center gap-1">
|
|
<StatusBadge
|
|
status={row.original.session_state ?? '—'}
|
|
label={bgpSessionStateRu(row.original.session_state)}
|
|
/>
|
|
{row.original.session_mismatch ? (
|
|
<CategoryBadge tone="warning">расхождение</CategoryBadge>
|
|
) : null}
|
|
</div>
|
|
),
|
|
meta: { headerTitle: 'Состояние' },
|
|
},
|
|
]
|
|
|
|
export function getPeerFilterFieldValue(item: PeerRow, field: string): unknown {
|
|
switch (field) {
|
|
case 'name':
|
|
return item.name ?? item.neighbor
|
|
case 'neighbor':
|
|
return item.neighbor
|
|
case 'session_state':
|
|
return item.session_state
|
|
default:
|
|
return undefined
|
|
}
|
|
}
|
|
|
|
export function peerTabFilter(item: PeerRow, tabId: string): boolean {
|
|
if (tabId === 'disabled') return item.enabled === false
|
|
const enabled = item.enabled !== false
|
|
if (tabId === 'established') return enabled && item.session_state === 'Established'
|
|
if (tabId === 'pending') return enabled && item.session_state !== 'Established'
|
|
return true
|
|
}
|