import { ColumnDef, flexRender, getCoreRowModel, useReactTable } from '@tanstack/react-table'; import { ChevronLeft, ChevronRight, ChevronsLeft, ChevronsRight } from 'lucide-react'; import { router } from '@inertiajs/react'; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from '@/components/ui/table'; import { Button } from '@/components/ui/button'; import { cn } from '@/lib/utils'; import { PaginatedData } from '@/types'; interface DataTableProps { columns: ColumnDef[]; paginatedData?: PaginatedData; data?: TData[]; className?: string; modal?: boolean; onPageChange?: (page: number) => void; isFetching?: boolean; isLoading?: boolean; } export function DataTable({ columns, paginatedData, data, className, modal, onPageChange, isFetching, isLoading, }: DataTableProps) { // Use paginatedData.data if available, otherwise fall back to data prop const tableData = paginatedData?.data || data || []; const table = useReactTable({ data: tableData, columns, getCoreRowModel: getCoreRowModel(), }); const extraClasses = modal && 'border-none shadow-none'; const handlePageChange = (url: string) => { if (onPageChange) { // Use custom page change handler (for axios/API calls) const urlObj = new URL(url); const page = urlObj.searchParams.get('page'); if (page) { onPageChange(parseInt(page)); return; } onPageChange(1); } else { // Use Inertia router for server-side rendered pages router.get(url, {}, { preserveState: true }); } }; return (
{isLoading && (
)} {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())} ))} )) ) : ( No results. )}
{paginatedData && (
{paginatedData.meta.from && paginatedData.meta.to && ( Showing {paginatedData.meta.from} to {paginatedData.meta.to} {paginatedData.meta.total && ` of ${paginatedData.meta.total}`} results )}
Page {paginatedData.meta.current_page} {paginatedData.meta.last_page && ` of ${paginatedData.meta.last_page}`}
)}
); }