import { useMemo } from "react"; import { type ColumnDef, getCoreRowModel, useReactTable, } from "@tanstack/react-table"; import { type BoardRead } from "@/api/generated/model"; import { linkifyCell } from "@/components/tables/cell-formatters"; import { DataTable } from "@/components/tables/DataTable"; type BoardAccessState = Record; type BoardAccessTableProps = { boards: BoardRead[]; access: BoardAccessState; onToggleRead: (boardId: string) => void; onToggleWrite: (boardId: string) => void; disabled?: boolean; }; export function BoardAccessTable({ boards, access, onToggleRead, onToggleWrite, disabled = false, }: BoardAccessTableProps) { const columns = useMemo[]>( () => [ { accessorKey: "name", header: "Board", cell: ({ row }) => linkifyCell({ href: `/boards/${row.original.id}`, label: row.original.name, subtitle: row.original.slug, subtitleClassName: "mt-1 text-xs text-slate-500", }), }, { id: "read", header: "Read", cell: ({ row }) => { const entry = access[row.original.id] ?? { read: false, write: false, }; return (
onToggleRead(row.original.id)} disabled={disabled} />
); }, }, { id: "write", header: "Write", cell: ({ row }) => { const entry = access[row.original.id] ?? { read: false, write: false, }; return (
onToggleWrite(row.original.id)} disabled={disabled} />
); }, }, ], [access, disabled, onToggleRead, onToggleWrite], ); // eslint-disable-next-line react-hooks/incompatible-library const table = useReactTable({ data: boards, columns, enableSorting: false, getCoreRowModel: getCoreRowModel(), }); return ( ); }