import React, { useMemo, useEffect, useCallback } from "react"; import PropTypes from "prop-types"; import { useTable, useSortBy, useRowSelect } from "react-table"; import Spinner from "components/loaders/Spinner"; import Button from "../../buttons/Button"; const baseClass = "data-table-container"; // This data table uses react-table for implementation. The relevant documentation of the library // can be found here https://react-table.tanstack.com/docs/api/useTable const DataTable = (props) => { const { columns: tableColumns, data: tableData, isLoading, sortHeader, sortDirection, onSort, onSelectActionClick, } = props; const columns = useMemo(() => { return tableColumns; }, [tableColumns]); // The table data needs to be ordered by the order we received from the API. const data = useMemo(() => { return tableData; }, [tableData]); const { headerGroups, rows, prepareRow, selectedFlatRows, toggleAllRowsSelected, state: tableState, } = useTable( { columns, data, initialState: { sortBy: useMemo(() => { return [{ id: sortHeader, desc: sortDirection === "desc" }]; }, [sortHeader, sortDirection]), }, disableMultiSort: true, }, useSortBy, useRowSelect ); const { sortBy, selectedRowIds } = tableState; // This is used to listen for changes to sort. If there is a change // Then the sortHandler change is fired. useEffect(() => { const column = sortBy[0]; if (column !== undefined) { if ( column.id !== sortHeader || column.desc !== (sortDirection === "desc") ) { onSort(column.id, column.desc); } } else { onSort(undefined); } }, [sortBy, sortHeader, onSort, sortDirection]); const onSelectActionButtonClick = useCallback(() => { const entityIds = selectedFlatRows.map((row) => row.original.id); onSelectActionClick(entityIds); }, [onSelectActionClick, selectedFlatRows]); const onClearSelectionClick = useCallback(() => { toggleAllRowsSelected(false); }, [toggleAllRowsSelected]); return (
{isLoading && (
)} {Object.keys(selectedRowIds).length !== 0 && ( )} {headerGroups.map((headerGroup) => ( {headerGroup.headers.map((column) => ( ))} ))} {rows.map((row) => { prepareRow(row); return ( {row.cells.map((cell) => { return ( ); })} ); })}
{headerGroups[0].headers[0].render("Header")}

{selectedFlatRows.length} selected

{column.render("Header")}
{cell.render("Cell")}
); }; DataTable.propTypes = { columns: PropTypes.arrayOf(PropTypes.object), // TODO: create proper interface for this data: PropTypes.arrayOf(PropTypes.object), // TODO: create proper interface for this isLoading: PropTypes.bool, sortHeader: PropTypes.string, sortDirection: PropTypes.string, onSort: PropTypes.func, onSelectActionClick: PropTypes.func, }; export default DataTable;