quality / commitlint (push) Skipped
quality / changes (push) Successful in 7s
quality / go (push) Skipped
quality / bird2 (push) Skipped
quality / docker-check (push) Skipped
quality / openapi (push) Successful in 24s
quality / web (push) Successful in 1m1s
CD / quality (push) Successful in 1m37s
CD / publish (push) Successful in 2m53s
- Introduced new properties for status toggle items, including `icon` and `tone`, to improve visual representation. - Updated the `StatusToggleGroup` component to utilize these new properties for better user feedback. - Enhanced filter utilities with additional functions for managing filter queries, including `getPrimaryTextField`, `getExtraFilterFields`, and `setFilterTextValue`. - Improved the `ResourcePageFiltered` component to integrate search functionality and manage filter states more effectively. This update aims to streamline the user experience in managing statuses and filters across the application.
77 lines
2.7 KiB
TypeScript
77 lines
2.7 KiB
TypeScript
import { Share2 } from 'lucide-react'
|
|
|
|
import { CategoryBadge } from '@/components/category-badge'
|
|
import { DataGridMonoCell, DataGridNameCell } from '@/components/data-grid-cell'
|
|
import { StatusBadge } from '@/components/status-badge'
|
|
import { DataGridColumnHeader } from '@/components/reui/data-grid/data-grid-column-header'
|
|
import type { DataGridColumnDef } from '@/components/reui-kit'
|
|
import { bgpSessionStateRu } from '@/lib/ui-labels'
|
|
import type { PeerRow } from '@/types/api'
|
|
|
|
export const peerColumns: DataGridColumnDef<PeerRow>[] = [
|
|
{
|
|
id: 'name',
|
|
accessorFn: (row) => row.name ?? row.neighbor,
|
|
header: ({ column }) => <DataGridColumnHeader column={column} title="Имя" />,
|
|
cell: ({ row }) => (
|
|
<DataGridNameCell
|
|
icon={Share2}
|
|
title={row.original.name ?? row.original.neighbor}
|
|
subtitle={row.original.name ? row.original.neighbor : undefined}
|
|
/>
|
|
),
|
|
meta: { headerTitle: 'Имя' },
|
|
},
|
|
{
|
|
accessorKey: 'neighbor',
|
|
header: ({ column }) => <DataGridColumnHeader column={column} title="Адрес соседа" />,
|
|
cell: ({ row }) => <DataGridMonoCell>{row.original.neighbor}</DataGridMonoCell>,
|
|
meta: { headerTitle: 'Адрес соседа' },
|
|
},
|
|
{
|
|
accessorKey: 'remote_asn',
|
|
header: ({ column }) => <DataGridColumnHeader column={column} title="ASN" />,
|
|
cell: ({ row }) => (
|
|
<DataGridMonoCell className="text-xs">{row.original.remote_asn ?? '—'}</DataGridMonoCell>
|
|
),
|
|
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} ${item.remote_asn ?? ''}`
|
|
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
|
|
}
|