"use client" import { Button } from "@/components/ui/button" import { ContextMenu, ContextMenuContent, ContextMenuItem, ContextMenuTrigger, } from "@/components/ui/context-menu" import { DropdownMenu, DropdownMenuCheckboxItem, DropdownMenuContent, DropdownMenuTrigger, DropdownMenuRadioItem, DropdownMenuRadioGroup } from "@/components/ui/dropdown-menu" import { Input } from "@/components/ui/input" import { Component, ComponentProps, use, useState } from "react" import { ColumnDef, flexRender, SortingState, getSortedRowModel, ColumnFiltersState, VisibilityState, getFilteredRowModel, getCoreRowModel, getPaginationRowModel, useReactTable } from "@tanstack/react-table" import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow, } from "@/components/ui/table" import { EyeIcon, Trash2 } from "lucide-react" import { usePathname } from "next/navigation" import FormContextMenu from "./contextMenu" import { deleteRecords } from "app/lib/del" import { Pathname } from "app/types" import { Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTrigger } from "@/components/ui/dialog" import pluralize from "app/lib/pluralize" import { updateTextField } from "app/lib/update" export interface DataTableProps { columns: ColumnDef[] data: TData[] } export function DataTable({ columns, data, children, tableName }: DataTableProps & ComponentProps<"div"> & { tableName: string }) { //STATE const [sorting, setSorting] = useState([]) const [columnFilters, setColumnFilters] = useState( [] ) const [columnVisibility, setColumnVisibility] = useState({}) // const pathname: Pathname = usePathname() const table = useReactTable({ data, columns, enableRowSelection: true, enableMultiRowSelection: true, getCoreRowModel: getCoreRowModel(), getPaginationRowModel: getPaginationRowModel(), onSortingChange: setSorting, getSortedRowModel: getSortedRowModel(), onColumnFiltersChange: setColumnFilters, getFilteredRowModel: getFilteredRowModel(), onColumnVisibilityChange: setColumnVisibility, state: { sorting, columnFilters, columnVisibility, }, //this is where you put arbitrary functions etc to make them accessible via the table api meta: { updateTextField, tableName, pathname } }) const [filterBy, setFilterBy] = useState(table.getAllColumns()[0]) const [isContextMenuOpen, setIsContextMenuOpen] = useState(false) return (<>
{table .getAllColumns() .filter((column) => column.getCanFilter()) .map((column) => { return ( {column.id} ) })} table.getColumn(filterBy.id)?.setFilterValue(event.target.value) } className="max-w-sm" />
{children} {`Delete ${Object.keys(table.getState().rowSelection).length} ${pluralize(pathname.slice(1))}?`} {`Deleting ${pluralize(pathname.slice(1))} cannot be undone!`} {table .getAllColumns() .filter( (column) => column.getCanHide() ) .map((column) => { return ( column.toggleVisibility(!!value) } > {column.id} ) })}
{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) => ( setIsContextMenuOpen(open)}> {row.getVisibleCells().map((cell) => ( {flexRender(cell.column.columnDef.cell, cell.getContext())} ))} )) ) : ( No results. )}
) }