"use client" import { useMemo } from "react" import { type ColumnDef, getCoreRowModel, getExpandedRowModel, getSortedRowModel, useReactTable, } from "@tanstack/react-table" import { Button } from "@/components/ui/button" import { Badge } from "@/components/reui/badge" import { cn } from "@/lib/utils" import { DataGridShell } from "@/components/data-grids/shared/data-grid-shell" import { DATA_GRID_CELL_PAD, DATA_GRID_CELL_PAD_FIRST, DATA_GRID_CELL_PAD_LAST, } from "@/components/data-grids/shared/data-grid-layout" import { DataGridSortHeader } from "@/components/data-grids/shared/data-grid-sort-header" import { UsersExpandedDetail } from "@/components/data-grids/users-expanded-detail" import { EmptyState } from "@/components/empty-state" import { ALL_SECTIONS, ROLE_LABEL, type AppUser } from "@/lib/users" import { CableIcon, ChevronDownIcon, ChevronRightIcon, PencilIcon, TrashIcon, UsersIcon, } from "lucide-react" function AvatarCircle({ avatar, active }: { avatar: string; active: boolean }) { return (
{avatar}
) } interface UsersDataGridProps { users: AppUser[] serversCount: number allSectionsCount?: number isLoading?: boolean onEdit: (user: AppUser) => void onDelete: (user: AppUser) => void } function UsersDataGrid({ users, serversCount, allSectionsCount = ALL_SECTIONS.length, isLoading, onEdit, onDelete, }: UsersDataGridProps) { const columns = useMemo[]>( () => [ { id: "name", accessorKey: "name", header: ({ column }) => ( ), cell: ({ row }) => { const u = row.original const expanded = row.getIsExpanded() return (
{expanded ? ( ) : ( )}

{u.name}

{u.email || u.login}

) }, meta: { headerTitle: "Пользователь", headerClassName: DATA_GRID_CELL_PAD_FIRST, cellClassName: DATA_GRID_CELL_PAD_FIRST, expandedContent: (row: AppUser) => ( ), }, }, { id: "role", accessorKey: "role", header: ({ column }) => , cell: ({ row }) => ( {ROLE_LABEL[row.original.role]} ), meta: { headerTitle: "Роль", headerClassName: DATA_GRID_CELL_PAD, cellClassName: DATA_GRID_CELL_PAD, }, }, { id: "last", accessorKey: "last", header: ({ column }) => , cell: ({ row }) => ( {row.original.last} ), meta: { headerTitle: "Последний вход", headerClassName: DATA_GRID_CELL_PAD, cellClassName: DATA_GRID_CELL_PAD, }, }, { id: "ifaces", accessorFn: (u) => u.bindings.length, header: ({ column }) => , cell: ({ row }) => ( {row.original.bindings.length} ), meta: { headerTitle: "Интерфейсы", headerClassName: DATA_GRID_CELL_PAD, cellClassName: DATA_GRID_CELL_PAD, }, }, { id: "status", accessorKey: "active", header: ({ column }) => , cell: ({ row }) => ( {row.original.active ? "Активен" : "Заблокирован"} ), meta: { headerTitle: "Статус", headerClassName: DATA_GRID_CELL_PAD, cellClassName: DATA_GRID_CELL_PAD, }, }, { id: "actions", enableSorting: false, header: () => Действия, cell: ({ row }) => { const u = row.original return (
e.stopPropagation()} onKeyDown={(e) => e.stopPropagation()} >
) }, meta: { headerTitle: "Действия", headerClassName: DATA_GRID_CELL_PAD_LAST, cellClassName: DATA_GRID_CELL_PAD_LAST, }, }, ], [allSectionsCount, onDelete, onEdit, serversCount], ) const table = useReactTable({ data: users, columns, getCoreRowModel: getCoreRowModel(), getSortedRowModel: getSortedRowModel(), getExpandedRowModel: getExpandedRowModel(), getRowId: (row) => row.id, getRowCanExpand: () => true, }) if (!isLoading && users.length === 0) { return ( } title="Нет пользователей" description="Добавьте пользователя, чтобы привязать интерфейсы и учитывать трафик" className="border-0 py-12" /> ) } return ( table.getRow(row.id).toggleExpanded()} /> ) } export { UsersDataGrid, type UsersDataGridProps }