"use client" import { useReactTable, getCoreRowModel, flexRender, type ColumnDef, } from "@tanstack/react-table" import { Table, TableHeader, TableBody, TableFooter, TableHead, TableRow, TableCell, } from "@/shared/components/ui/table" import { DataViewProvider } from "./data-view-context" import type { DataViewProps } from "./types" import { DataViewPagination } from "./data-view-pagination" import { Skeleton } from "@/shared/components/ui/skeleton" export function DataTable({ columns, data, pagination, sorting = [], onChange, isLoading = false, onRowClick, slots, }: DataViewProps) { const table = useReactTable({ data, columns: columns as ColumnDef[], getCoreRowModel: getCoreRowModel(), manualPagination: true, manualSorting: true, pageCount: pagination.pageCount, state: { sorting, pagination: { pageIndex: pagination.page - 1, pageSize: pagination.pageSize, }, }, onSortingChange: (updater) => { const next = typeof updater === "function" ? updater(sorting) : updater onChange?.({ type: "sorting", sorting: next }) }, onPaginationChange: (updater) => { const current = { pageIndex: pagination.page - 1, pageSize: pagination.pageSize } const next = typeof updater === "function" ? updater(current) : updater onChange?.({ type: "pagination", pagination: { page: next.pageIndex + 1, pageSize: next.pageSize, pageCount: pagination.pageCount, total: pagination.total, }, }) }, }) return (
{slots?.actions && (
{slots.actions}
)}
{table.getHeaderGroups().map((headerGroup) => ( {headerGroup.headers.map((header) => ( {header.isPlaceholder ? null : flexRender( header.column.columnDef.header, header.getContext(), )} ))} ))} {slots?.extraHeader} {isLoading ? ( Array.from({ length: pagination.pageSize }).map((_, i) => ( {columns.map((_, j) => ( ))} )) ) : table.getRowModel().rows.length ? ( table.getRowModel().rows.map((row) => ( onRowClick?.(row.original)} > {row.getVisibleCells().map((cell) => ( {flexRender(cell.column.columnDef.cell, cell.getContext())} ))} )) ) : ( No results. )} {slots?.extraBody} {slots?.footer && ( {slots.footer} )}
) }