import { type ColumnDef, type SortingState, flexRender, getCoreRowModel, getSortedRowModel, useReactTable } from '@tanstack/react-table' import { Loader2 } from 'lucide-react' import { useMemo, useState } from 'react' import { Card } from '@/components/ui/card' import { Skeleton } from '@/components/ui/skeleton' import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from '@/components/ui/table' interface DataTableProps { columns: ColumnDef[] data: TData[] isLoading?: boolean renderToolbar?: React.ReactNode emptyState?: React.ReactNode skeletonRows?: number } export const DataTable = ({ columns, data, isLoading = false, renderToolbar, emptyState, skeletonRows = 5 }: DataTableProps) => { const [sorting, setSorting] = useState([]) const memoizedData = useMemo(() => data, [data]) const table = useReactTable({ data: memoizedData, columns, state: { sorting }, onSortingChange: setSorting, getCoreRowModel: getCoreRowModel(), getSortedRowModel: getSortedRowModel(), }) const leafColumns = table.getAllLeafColumns() return ( {renderToolbar}
{table.getHeaderGroups().map((headerGroup) => ( {headerGroup.headers.map((header) => ( {header.isPlaceholder ? null : flexRender(header.column.columnDef.header, header.getContext())} ))} ))} {isLoading ? ( [...Array(skeletonRows)].map((_, index) => ( {leafColumns.map((column) => ( ))} )) ) : table.getRowModel().rows.length ? ( table.getRowModel().rows.map((row) => ( {row.getVisibleCells().map((cell) => ( {flexRender(cell.column.columnDef.cell, cell.getContext())} ))} )) ) : ( {emptyState ?? (

Нет данных для отображения

)}
)}
) }