import React from "react"; import { useTable, usePagination, useFlexLayout, useResizeColumns, useRowSelect, } from "react-table"; import { InputGroup } from "@blueprintjs/core"; import { TableWrapper } from "./TableStyledWrappers"; import { ReactTableColumnProps, ColumnMenuOptionProps, } from "./ReactTableComponent"; import { TableColumnMenuPopup } from "./TableColumnMenu"; import TableHeader from "./TableHeader"; import { Classes } from "@blueprintjs/core"; interface TableProps { width: number; height: number; pageSize: number; widgetId: string; isLoading: boolean; columns: ReactTableColumnProps[]; data: object[]; showMenu: (columnIndex: number) => void; displayColumnActions: boolean; columnNameMap?: { [key: string]: string }; columnMenuOptions: ColumnMenuOptionProps[]; columnIndex: number; columnAction: string; onColumnNameChange: (event: React.ChangeEvent) => void; handleColumnNameUpdate: (columnIndex: number) => void; handleResizeColumn: Function; selectTableRow: ( row: { original: object; index: number }, isSelected: boolean, ) => void; pageNo: number; updatePageNo: Function; nextPageClick: () => void; prevPageClick: () => void; onKeyPress: (columnIndex: number, key: string) => void; serverSidePaginationEnabled: boolean; selectedRowIndex: number; disableDrag: () => void; enableDrag: () => void; } export const Table = (props: TableProps) => { const { data, columns } = props; const defaultColumn = React.useMemo( () => ({ minWidth: 30, width: 150, maxWidth: 400, }), [], ); const pageCount = Math.ceil(data.length / props.pageSize); const currentPageIndex = props.pageNo < pageCount ? props.pageNo : 0; const { getTableProps, getTableBodyProps, headerGroups, prepareRow, page, pageOptions, } = useTable( { columns, data, defaultColumn, initialState: { pageIndex: currentPageIndex, pageSize: props.pageSize, }, manualPagination: true, pageCount, }, useFlexLayout, useResizeColumns, usePagination, useRowSelect, ); let startIndex = currentPageIndex * props.pageSize; let endIndex = startIndex + props.pageSize; if (props.serverSidePaginationEnabled) { startIndex = 0; endIndex = data.length; } const subPage = page.slice(startIndex, endIndex); const selectedRowIndex = props.selectedRowIndex; return (
{headerGroups.map((headerGroup: any, index: number) => (
{headerGroup.headers.map((column: any, columnIndex: number) => { if (column.isResizing) { props.handleResizeColumn( columnIndex, column.getHeaderProps().style.width, ); } return (
{props.columnIndex === columnIndex && props.columnAction === "rename_column" && ( props.onKeyPress(columnIndex, event.key) } type="text" defaultValue={ props.columnNameMap && props.columnNameMap[column.id] ? props.columnNameMap[column.id] : column.id } className="input-group" onBlur={() => props.handleColumnNameUpdate(columnIndex) } /> )} {(props.columnIndex !== columnIndex || (props.columnIndex === columnIndex && "rename_column" !== props.columnAction)) && (
{column.render("Header")}
)} {props.displayColumnActions && (
)}
); })}
))} {headerGroups.length === 0 && renderEmptyRows(1, props.columns, props.width)}
{subPage.map((row, index) => { prepareRow(row); return (
{ row.toggleRowSelected(); props.selectTableRow(row, row.index === selectedRowIndex); }} > {row.cells.map((cell, cellIndex) => { return (
{cell.render("Cell")}
); })}
); })} {props.pageSize > subPage.length && renderEmptyRows( props.pageSize - subPage.length, props.columns, props.width, )}
); }; export default Table; const renderEmptyRows = ( rowCount: number, columns: any, tableWidth: number, ) => { const rows: string[] = new Array(rowCount).fill(""); const tableColumns = columns.length ? columns : new Array(3).fill({ width: tableWidth / 3 }); return ( {rows.map((row: string, index: number) => { return (
{tableColumns.map((column: any, colIndex: number) => { return (
); })}
); })} ); };