"use client"; import * as React from "react"; import { flexRender, getCoreRowModel, getFilteredRowModel, getSortedRowModel, useReactTable, } from "@tanstack/react-table"; import { useVirtualizer } from "@tanstack/react-virtual"; import type { ArrayPath, FieldValues } from "react-hook-form"; import type { ColumnDef } from "@tanstack/react-table"; export const FormDataTable = < TData, TValue, // @ts-expect-error - types TForm extends FieldValues = TData, ArrPath = ArrayPath, >(props: { columns: ColumnDef[]; field: ArrPath; // @ts-expect-error - types fields: TForm[ArrPath]; }) => { const [rowSelection, setRowSelection] = React.useState({}); const table = useReactTable({ data: props.fields, columns: props.columns, getCoreRowModel: getCoreRowModel(), getSortedRowModel: getSortedRowModel(), getFilteredRowModel: getFilteredRowModel(), onRowSelectionChange: setRowSelection, manualPagination: true, manualSorting: true, manualFiltering: true, state: { rowSelection }, }); const { rows } = table.getRowModel(); const parentRef = React.useRef(null); const virtualizer = useVirtualizer({ count: rows.length, getScrollElement: () => parentRef.current, estimateSize: () => 32, overscan: 5, }); console.log("virtual rows:", virtualizer.getVirtualItems().length); return (

{table.getRowModel().rows.length} items

{table.getHeaderGroups().map((headerGroup) => ( {headerGroup.headers.map((header) => { return ( ); })} ))} {virtualizer.getVirtualItems().map((virtualRow, index) => { const row = rows[virtualRow.index]; return ( {row?.getVisibleCells().map((cell) => ( ))} ); })}
{header.isPlaceholder ? null : flexRender( header.column.columnDef.header, header.getContext() )}
{flexRender( cell.column.columnDef.cell, cell.getContext() )}

End of table

); };