'use client' import { flexRender, getCoreRowModel, useReactTable, type ColumnDef, type Table as TTable, type VisibilityState } from '@tanstack/react-table' import { ChevronDownIcon, ChevronLeftIcon, ChevronRightIcon, Columns2Icon } from 'lucide-react' import { createContext, useContext, useState, type ReactNode } from 'react' import { useSearchParams } from 'react-router' import { Button } from '@repo/ui/components/ui/button' import { Card, CardContent } from '@repo/ui/components/ui/card' import { DropdownMenu, DropdownMenuCheckboxItem, DropdownMenuContent, DropdownMenuTrigger } from '@repo/ui/components/ui/dropdown-menu' import { Label } from '@repo/ui/components/ui/label' import { Pagination, PaginationContent, PaginationItem } from '@repo/ui/components/ui/pagination' import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@repo/ui/components/ui/select' import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from '@repo/ui/components/ui/table' import { cn } from '@repo/ui/lib/utils' interface DataTableProps { children?: ReactNode columns: ColumnDef[] data: TData[] pageIndex: number pageSize: number rowCount: number hiddenColumn?: string[] } const TableContext = createContext<{ table: TTable } | null>(null) export function DataTable({ children, columns, data, pageIndex, pageSize, rowCount, hiddenColumn = [] }: DataTableProps) { const [, setSearchParams] = useSearchParams() const hiddenColumn_ = Object.fromEntries( hiddenColumn.map((column) => [column, false]) ) const [columnVisibility, setColumnVisibility] = useState(hiddenColumn_) const table = useReactTable({ data, columns, getCoreRowModel: getCoreRowModel(), state: { columnVisibility, pagination: { pageIndex, pageSize } }, onColumnVisibilityChange: setColumnVisibility, onPaginationChange: (updater) => { const newState = typeof updater === 'function' ? updater({ pageIndex, pageSize }) : updater setSearchParams((searchParams) => { searchParams.set('p', newState?.pageIndex.toString()) searchParams.set('perPage', newState?.pageSize.toString()) return searchParams }) }, manualPagination: true, rowCount }) return (
{children} {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() )} ))} )) ) : ( Nenhum resultado. )}
{(pageIndex + 1) * pageSize - pageSize + 1}- {Math.min((pageIndex + 1) * pageSize, rowCount)}
) } export function CustomizeColumns({ className }: { className?: string }) { const { table } = useContext(TableContext) return ( {table .getAllColumns() .filter( (column) => typeof column.accessorFn !== 'undefined' && column.getCanHide() ) .map((column) => { return ( column.toggleVisibility(!!value)} > {column.columnDef.header} ) })} ) }