"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, Row } from "@tanstack/react-table" import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow, } from "@/components/ui/table" import { EyeIcon, Trash2 } from "lucide-react" import { usePathname, useSearchParams } from "next/navigation" import FormContextMenu from "./contextMenu" import { deleteRecord, 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 { updateField } from "app/lib/update" import { tableNameToItemName } from "app/lib/nameMaps" import { Genre, Pub, Response, Story } from "@prisma/client" import EditSubmissionDialog from "app/submission/edit" import { DialogTitle } from "@radix-ui/react-dialog" import { toast } from "@/components/ui/use-toast" import { useRouter } from "next/navigation" export interface DataTableProps { columns: ColumnDef[] data: TData[] } export function DataTable({ columns, data, children, tableName, stories, pubs, responses, genres }: DataTableProps & ComponentProps<"div"> & { tableName: string, stories?: Story[], pubs?: Pub[], responses?: Response[], genres?: Genre[] }) { //STATE const [isEditDialogVisible, setIsEditDialogVisible] = useState(false) const [isDeleteDialogVisible, setIsDeleteDialogVisible] = useState(false) const [dialogRow, SetDialogRow] = useState | null>(null) 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: updateField, tableName, pathname, stories, pubs, responses, genres } }) function openEditDialog(row) { setIsEditDialogVisible(true) SetDialogRow(row) } function openDeleteDialog(row) { setIsDeleteDialogVisible(true) SetDialogRow(row) } const router = useRouter() 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} Are you sure? Deleting a {tableNameToItemName(tableName)} cannot be undone! {`Delete ${Object.keys(table.getState().rowSelection).length} ${pluralize(pathname.slice(1))}?`} {`Deleting ${pluralize(tableNameToItemName(table.options.meta.tableName))} 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) => ( { if (tableName === "sub") { openEditDialog(row) } } } > {row.getVisibleCells().map((cell) => ( {flexRender(cell.column.columnDef.cell, cell.getContext())} ))} )) ) : ( No results. )}
) }