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 } from '@/components/ui/button' import { Input } from '@/components/ui/input' import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuLabel, DropdownMenuSeparator, DropdownMenuTrigger, } from '@/components/ui/dropdown-menu' import { AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogTitle, } from '@/components/ui/alert-dialog' import { SystemRecord } from '@/types' import { MoreHorizontal, ArrowUpDown, Copy, RefreshCcw, Eye } from 'lucide-react' import { useMemo, useState } from 'preact/hooks' import { navigate } from 'wouter-preact/use-browser-location' import { $servers, pb } from '@/lib/stores' import { useStore } from '@nanostores/preact' function CellFormatter(info: CellContext) { const val = info.getValue() as number let background = '#42b768' if (val > 80) { // red background = '#da2a49' } else if (val > 50) { // yellow background = '#daa42a' } return (
{val.toFixed(2)}%
) } function sortableHeader(column: Column, name: string) { return ( ) } export function DataTable() { const data = useStore($servers) const [liveUpdates, setLiveUpdates] = useState(true) const [deleteServer, setDeleteServer] = useState({} as SystemRecord) const columns: ColumnDef[] = useMemo( () => [ { // size: 70, accessorKey: 'name', cell: (info) => ( {info.getValue() as string}{' '} {/* */} ), header: ({ column }) => sortableHeader(column, 'Server'), }, { accessorKey: 'stats.cpu', cell: CellFormatter, header: ({ column }) => sortableHeader(column, 'CPU'), }, { accessorKey: 'stats.memPct', cell: CellFormatter, header: ({ column }) => sortableHeader(column, 'Memory'), }, { accessorKey: 'stats.diskPct', cell: CellFormatter, header: ({ column }) => sortableHeader(column, 'Disk'), }, { id: 'actions', size: 32, maxSize: 32, cell: ({ row }) => { const system = row.original return (
Actions { navigate(`/server/${system.name}`) }} > View details navigator.clipboard.writeText(system.id)}> Copy IP address { setDeleteServer(system) }} > Delete server
) }, }, ], [] ) const [sorting, setSorting] = useState([]) const [columnFilters, setColumnFilters] = useState([]) const table = useReactTable({ data, columns, getCoreRowModel: getCoreRowModel(), onSortingChange: setSorting, getSortedRowModel: getSortedRowModel(), onColumnFiltersChange: setColumnFilters, getFilteredRowModel: getFilteredRowModel(), state: { sorting, columnFilters, }, }) return (
table.getColumn('name')?.setFilterValue(event.target.value)} className="max-w-sm" />
{liveUpdates || ( )}
{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) => ( {row.getVisibleCells().map((cell) => ( {flexRender(cell.column.columnDef.cell, cell.getContext())} ))} )) ) : ( No results. )}
Are you sure you want to delete {deleteServer.name}? This action cannot be undone. This will permanently delete all current records for{' '} {deleteServer.name} from the database. setDeleteServer({} as SystemRecord)}> Cancel { setDeleteServer({} as SystemRecord) pb.collection('systems').delete(deleteServer.id) }} > Continue
) }