import { CellContext, ColumnDef, ColumnFiltersState, getFilteredRowModel, SortingState, getSortedRowModel, flexRender, getCoreRowModel, useReactTable, Column, } from '@tanstack/react-table' import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow, } from '@/components/ui/table' import { Button, buttonVariants } from '@/components/ui/button' import { Input } from '@/components/ui/input' import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuSeparator, DropdownMenuTrigger, } from '@/components/ui/dropdown-menu' import { AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogTitle, AlertDialogTrigger, } from '@/components/ui/alert-dialog' import { SystemRecord } from '@/types' import { MoreHorizontal, ArrowUpDown, Server, Cpu, MemoryStick, HardDrive, CopyIcon, PauseCircleIcon, PlayCircleIcon, Trash2Icon, } from 'lucide-react' import { useMemo, useState } from 'react' import { $systems, pb } from '@/lib/stores' import { useStore } from '@nanostores/react' import { AddSystemButton } from '../add-system' import { cn, copyToClipboard, isReadOnlyUser } from '@/lib/utils' import AlertsButton from '../table-alerts' import { navigate } from '../router' function CellFormatter(info: CellContext) { const val = info.getValue() as number return (
{val.toFixed(1)}%
) } function sortableHeader(column: Column, name: string, Icon: any) { return ( ) } export default function SystemsTable() { const data = useStore($systems) const [sorting, setSorting] = useState([]) const [columnFilters, setColumnFilters] = useState([]) const columns: ColumnDef[] = useMemo(() => { return [ { // size: 200, size: 200, minSize: 0, accessorKey: 'name', cell: (info) => { const { status } = info.row.original return ( ) }, header: ({ column }) => sortableHeader(column, 'System', Server), }, { accessorKey: 'info.cpu', cell: CellFormatter, header: ({ column }) => sortableHeader(column, 'CPU', Cpu), }, { accessorKey: 'info.mp', cell: CellFormatter, header: ({ column }) => sortableHeader(column, 'Memory', MemoryStick), }, { accessorKey: 'info.dp', cell: CellFormatter, header: ({ column }) => sortableHeader(column, 'Disk', HardDrive), }, { id: 'actions', size: 120, // minSize: 0, cell: ({ row }) => { const { id, name, status, host } = row.original return (
{ pb.collection('systems').update(id, { status: status === 'paused' ? 'pending' : 'paused', }) }} > {status === 'paused' ? ( <> Resume ) : ( <> Pause )} copyToClipboard(host)}> Copy host Delete Are you sure you want to delete {name}? This action cannot be undone. This will permanently delete all current records for {name} from the database. Cancel pb.collection('systems').delete(id)} > Continue
) }, }, ] }, []) const table = useReactTable({ data, columns, getCoreRowModel: getCoreRowModel(), onSortingChange: setSorting, getSortedRowModel: getSortedRowModel(), onColumnFiltersChange: setColumnFilters, getFilteredRowModel: getFilteredRowModel(), state: { sorting, columnFilters, }, defaultColumn: { minSize: 0, size: Number.MAX_SAFE_INTEGER, maxSize: Number.MAX_SAFE_INTEGER, }, }) return ( <>
table.getColumn('name')?.setFilterValue(event.target.value)} className="max-w-sm" />
{table.getHeaderGroups().map((headerGroup) => ( {headerGroup.headers.map((header) => { return ( {header.isPlaceholder ? null : flexRender(header.column.columnDef.header, header.getContext())} ) })} ))} {table.getRowModel().rows?.length ? ( table.getRowModel().rows.map((row) => ( { const target = e.target as HTMLElement if (!target.closest('[data-nolink]') && e.currentTarget.contains(target)) { navigate(`/system/${row.original.name}`) } }} > {row.getVisibleCells().map((cell) => ( {flexRender(cell.column.columnDef.cell, cell.getContext())} ))} )) ) : ( No systems found )}
) }