import React, { ReactElement, useMemo, useState } from "react"; import PropTypes from "prop-types"; import SearchBar from "../Library/SearchBar"; import { Link } from "react-router-dom"; import { ColumnDef, flexRender, getCoreRowModel, getFilteredRowModel, useReactTable, PaginationState, } from "@tanstack/react-table"; export const T2Table = (tableOptions): ReactElement => { const { sourceData, columns, paginationHandlers: { nextPage, previousPage }, totalPages, rowClickHandler } = tableOptions; const [{ pageIndex, pageSize }, setPagination] = useState({ pageIndex: 1, pageSize: 15, }); const pagination = useMemo( () => ({ pageIndex, pageSize, }), [pageIndex, pageSize] ); /** * Pagination control to move forward one page * @returns void */ const goToNextPage = () => { setPagination({ pageIndex: pageIndex + 1, pageSize, }); nextPage(pageIndex, pageSize); } /** * Pagination control to move backward one page * @returns void **/ const goToPreviousPage = () => { setPagination({ pageIndex: pageIndex - 1, pageSize, }); previousPage(pageIndex, pageSize); } const table = useReactTable({ data: sourceData, columns, manualPagination: true, getCoreRowModel: getCoreRowModel(), pageCount: sourceData.length ?? -1, state: { pagination, }, onPaginationChange: setPagination, }); return ( <>
{/* Search bar */}
{/* pagination controls */}
{table.getHeaderGroups().map((headerGroup, idx) => ( {headerGroup.headers.map((header, idx) => ( ))} ))} {table.getRowModel().rows.map((row, idx) => { return ( rowClickHandler(row)} > {row.getVisibleCells().map(cell => ( ))} ); })}
{header.isPlaceholder ? null : flexRender( header.column.columnDef.header, header.getContext() )}
{flexRender(cell.column.columnDef.cell, cell.getContext())}
); }; T2Table.propTypes = { sourceData: PropTypes.array, totalPages: PropTypes.number, columns: PropTypes.array, paginationHandlers: PropTypes.shape({ nextPage: PropTypes.func, previousPage: PropTypes.func, }), rowClickHandler: PropTypes.func, }; export default T2Table;