'use client'; import React, { useMemo } from 'react'; import { Trans } from '@lingui/macro'; import type { ColumnDef, PaginationState, Table as TTable, Updater, VisibilityState, } from '@tanstack/react-table'; import { flexRender, getCoreRowModel, useReactTable } from '@tanstack/react-table'; import { Skeleton } from './skeleton'; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from './table'; export type DataTableChildren = (_table: TTable) => React.ReactNode; export type { ColumnDef as DataTableColumnDef } from '@tanstack/react-table'; export interface DataTableProps { columns: ColumnDef[]; columnVisibility?: VisibilityState; data: TData[]; perPage?: number; currentPage?: number; totalPages?: number; onPaginationChange?: (_page: number, _perPage: number) => void; onClearFilters?: () => void; hasFilters?: boolean; children?: DataTableChildren; skeleton?: { enable: boolean; rows: number; component?: React.ReactNode; }; error?: { enable: boolean; component?: React.ReactNode; }; } export function DataTable({ columns, columnVisibility, data, error, perPage, currentPage, totalPages, skeleton, hasFilters, onClearFilters, onPaginationChange, children, }: DataTableProps) { const pagination = useMemo(() => { if (currentPage !== undefined && perPage !== undefined) { return { pageIndex: currentPage - 1, pageSize: perPage, }; } return { pageIndex: 0, pageSize: 0, }; }, [currentPage, perPage]); const manualPagination = Boolean(currentPage !== undefined && totalPages !== undefined); const onTablePaginationChange = (updater: Updater) => { if (typeof updater === 'function') { const newState = updater(pagination); onPaginationChange?.(newState.pageIndex + 1, newState.pageSize); } else { onPaginationChange?.(updater.pageIndex + 1, updater.pageSize); } }; const table = useReactTable({ data, columns, getCoreRowModel: getCoreRowModel(), state: { pagination: manualPagination ? pagination : undefined, columnVisibility, }, manualPagination, pageCount: totalPages, onPaginationChange: onTablePaginationChange, }); return ( <>
{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())} ))} )) ) : error?.enable ? ( {error.component ?? ( Something went wrong. )} ) : skeleton?.enable ? ( Array.from({ length: skeleton.rows }).map((_, i) => ( {skeleton.component ?? } )) ) : (

No results found

{hasFilters && onClearFilters !== undefined && ( )}
)}
{children &&
{children(table)}
} ); }