import { useMemo } from 'react' import { Link } from '@tanstack/react-router' import type { ColumnDef } from '@tanstack/react-table' import { MoreHorizontalIcon, SearchIcon } from 'lucide-react' import { Badge } from '@/components/reui/badge' import { DataGridColumnHeader } from '@/components/reui/data-grid/data-grid-column-header' import { createFilter, type FilterFieldConfig } from '@/components/reui/filters' import { StatusBadge } from '@/components/status-badge' import type { DomainListItem } from '@/lib/schemas' import { renderSingleSelectedLabel } from '@/components/reui-kit/filter-utils' import { Button } from '@cfdm/ui/components/button' import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger, } from '@cfdm/ui/components/dropdown-menu' export const DOMAIN_TABS = [ { id: 'all', label: 'Все' }, { id: 'with_group', label: 'С группой' }, { id: 'without_group', label: 'Без группы' }, ] as const export function domainTabFilter(item: DomainListItem, tabId: string) { if (tabId === 'with_group') return item.group_id != null if (tabId === 'without_group') return item.group_id == null return true } export function createDefaultDomainFilters() { return [createFilter('zone_name', 'contains', [''])] } export function useDomainFilterFields( groupOptions: { value: string; label: string }[], ) { return useMemo( () => [ { key: 'zone_name', label: 'Зона', icon: , type: 'text', className: 'w-52', placeholder: 'Поиск…', }, { key: 'group_id', label: 'Группа', type: 'select', searchable: true, className: 'w-[168px]', options: groupOptions, customValueRenderer: (values) => renderSingleSelectedLabel(values, groupOptions), }, ], [groupOptions], ) } export function domainFilterFieldValue(item: DomainListItem, field: string) { switch (field) { case 'zone_name': return `${item.zone_name} ${item.group_name ?? ''}`.toLowerCase() case 'group_id': return item.group_id != null ? String(item.group_id) : 'none' default: return '' } } export function useDomainColumns({ onRequestDelete, isDeleting, }: { onRequestDelete: (domain: DomainListItem) => void isDeleting?: boolean }) { const columns = useMemo[]>( () => [ { id: 'zone_name', accessorKey: 'zone_name', header: ({ column }) => ( ), cell: ({ row }) => ( ), }, { id: 'group', header: ({ column }) => ( ), cell: ({ row }) => { const domain = row.original if (domain.group_id && domain.group_name) { return ( ) } return Без группы }, }, { id: 'service_count', accessorKey: 'service_count', header: ({ column }) => ( ), cell: ({ row }) => ( ), }, { id: 'status', header: 'Статус', cell: ({ row }) => , }, { id: 'last_synced_at', accessorKey: 'last_synced_at', header: ({ column }) => ( ), cell: ({ row }) => ( {row.original.last_synced_at ?? '—'} ), }, { id: 'actions', header: '', enableHiding: false, cell: ({ row }) => (
} > Действия } > Обзор } > DNS onRequestDelete(row.original)} > Удалить
), }, ], [isDeleting, onRequestDelete], ) return { columns } }