import React from "react"; import { useTable, usePagination, useFlexLayout, useResizeColumns, useRowSelect, } from "react-table"; import { Icon, InputGroup } from "@blueprintjs/core"; import { TableWrapper, PaginationWrapper, PaginationItemWrapper, } from "./TableStyledWrappers"; import { ReactTableColumnProps, ColumnMenuOptionProps, } from "./ReactTableComponent"; import { TableColumnMenuPopup } from "./TableColumnMenu"; interface TableProps { width: number; height: number; pageSize: number; widgetId: string; 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: () => void; handleResizeColumn: Function; selectTableRow: ( row: { original: object; index: number }, isSelected: boolean, ) => void; pageNo: number; updatePageNo: Function; nextPageClick: () => void; prevPageClick: () => void; onKeyPress: (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(event.key)} type="text" defaultValue={ props.columnNameMap && props.columnNameMap[column.id] ? props.columnNameMap[column.id] : column.id } className="input-group" onBlur={() => props.handleColumnNameUpdate()} /> )} {(props.columnIndex !== columnIndex || (props.columnIndex === columnIndex && "rename_column" !== props.columnAction)) && (
{column.render("Header")}
)} {props.displayColumnActions && (
)}
); })}
))}
{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.serverSidePaginationEnabled && ( { props.prevPageClick(); }} > {props.pageNo + 1} { props.nextPageClick(); }} > )} {!props.serverSidePaginationEnabled && ( { const pageNo = currentPageIndex > 0 ? currentPageIndex - 1 : 0; props.updatePageNo(pageNo + 1); }} > {pageOptions.map((pageNumber: number, index: number) => { return ( { props.updatePageNo(pageNumber + 1); }} className="page-item" > {index + 1} ); })} { const pageNo = currentPageIndex < pageCount - 1 ? currentPageIndex + 1 : 0; props.updatePageNo(pageNo + 1); }} > )} ); }; export default Table;