'use client'; import { ColumnDef, SortingState, flexRender, getCoreRowModel, getPaginationRowModel, getSortedRowModel, useReactTable, filterFns, FilterFnOption } from "@tanstack/react-table"; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow, } from "@/components/ui/table"; import { Pagination, PaginationNext, PaginationPrevious, PaginationItem, PaginationLink, PaginationContent, PaginationEllipsis, } from "@/components/ui/pagination"; import { Button } from "./button"; import { ChangeEvent, useEffect, useState } from "react"; import React from "react"; import moment from "moment"; import { Account } from "@prisma/client"; import { formatMoney } from "@/lib/clientUtils"; import { GetInvoicePayload } from "@/lib/types"; interface DataTableProps { columns: ColumnDef[]; data: TData[]; } function DebouncedInput({ value: initialValue, onChange, debounce = 500, ...props }: { value: string | number onChange: (value: string | number) => void debounce?: number } & Omit, 'onChange'>) { const [value, setValue] = React.useState(initialValue) React.useEffect(() => { setValue(initialValue) }, [initialValue]) React.useEffect(() => { const timeout = setTimeout(() => { onChange(value) }, debounce) return () => clearTimeout(timeout) }, [value]) return ( setValue(e.target.value)} /> ) } export function DataTable({ columns, data, }: DataTableProps) { const [pageSize, setStatePageSize] = useState(50); const [sorting, setSorting] = useState([]) const [globalFilter, setGlobalFilter] = useState('') const newCols = React.useMemo[]>( () => [ { accessorKey: 'invoiceAmount', cell: (info) => { return
{info.getValue()}
; }, } ], [] ); const table = useReactTable({ initialState: { pagination: { pageSize }, globalFilter }, state: { sorting, globalFilter, }, data, columns, getCoreRowModel: getCoreRowModel(), getPaginationRowModel: getPaginationRowModel(), onGlobalFilterChange: setGlobalFilter, globalFilterFn: filterFns.includesString, onSortingChange: setSorting, getSortedRowModel: getSortedRowModel(), debugTable: true, debugHeaders: true, debugColumns: true }); const handlePageSizeChange = (e: ChangeEvent) => { const newSize = Number(e.target.value); table.setPageSize(newSize); // Update the table pagination size setStatePageSize(newSize); // Update local state for select value }; return (
{JSON.stringify( { globalFilter: table.getState().globalFilter }, null, 2 )} setGlobalFilter(String(value))} className="p-2 font-lg shadow border border-block" placeholder="Search all columns..." />
{table.getHeaderGroups().map((headerGroup) => ( {headerGroup.headers.map((header) => ( {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. )}
Page {table.getState().pagination.pageIndex + 1} of {table.getPageCount()}
{/* Previous Page Button */} { table.previousPage()} /> } {/* Next Page Button */} { table.nextPage()} /> }
); }