diff --git a/src/components/ItemTable/ItemTable.js b/src/components/ItemTable/ItemTable.js index 424d55e..970fa0a 100644 --- a/src/components/ItemTable/ItemTable.js +++ b/src/components/ItemTable/ItemTable.js @@ -1,4 +1,4 @@ -import React, { useState } from "react"; +import React, { memo, useState } from "react"; import PropTypes from "prop-types"; import { useTable, useFilters, useFlexLayout, useSortBy } from "react-table"; import { Table, TableBody, TableCell, TableHead, TableRow, TableContainer, Box, Grid, ButtonGroup, IconButton, makeStyles, useTheme } from "@material-ui/core"; @@ -9,6 +9,7 @@ import { ArrowDownward, ArrowUpward } from "@material-ui/icons"; import ItemTableCell from "../ItemTableCell"; import LastUpdatedCell from "../LastUpdatedCell/"; import jester from "./loading-annimation.gif"; +import { FixedSizeList, areEqual } from 'react-window'; export default function ItemTable({ data, rowCanBeSelected, loading }) { const [selectedRow, setSelectedRow] = useState({ queue: null, number: null }); @@ -22,7 +23,7 @@ export default function ItemTable({ data, rowCanBeSelected, loading }) { }, hoverBackgroundColor: { "&:hover": { - // The !important is placed here to enforce CSS specificity. + // The !important is placed here to enforce CSS specificity. // See: https://material-ui.com/styles/advanced/#css-injection-order backgroundColor: `${theme.palette.primary[200]} !important`, }, @@ -89,28 +90,75 @@ export default function ItemTable({ data, rowCanBeSelected, loading }) { ); const { getTableProps, getTableBodyProps, headerGroups, rows, prepareRow, } = tableInstance; - return ( - loading - ? ( - - Items are loading. - + const RenderRow = memo(({ index, style }) => { + const row = rows[index] + prepareRow(row) + let isSelected = selectedRow.queue === row.original.queue && selectedRow.number === row.original.number + return ( + { + history.push(`/${row.original.queue}/${row.original.number}`); + setSelectedRow({ queue: row.original.queue, number: row.original.number }); + }} + // This functionality should be achieved by using the selected prop and + // overriding the selected class but this applied the secondary color at 0.08% opacity. + // Overridding the root class is a workaround. + classes={{ + root: (isSelected && rowCanBeSelected) ? classes.rowSelected : classes.bandedRows, + hover: classes.hoverBackgroundColor + }} + {...row.getRowProps({ style, })} + > + {row.cells.map(cell => ( + cell.render(_ => { + switch (cell.column.id) { + case "dateReceived": + return ( + + + + ); + case "lastUpdated": + return ( + + ); + default: + return ( + + {cell.value} + + ); + } + }) + ))} + ) - : ( - - - - {headerGroups.map(headerGroup => ( - - {headerGroup.headers.map(column => ( - + }, areEqual, + [prepareRow, rows] + ) + return ( + loading + ? ( + + Items are loading. + + ) + : ( + +
+ + {headerGroups.map(headerGroup => ( + + {headerGroup.headers.map(column => ( + - - {column.render("Filter")} + + {column.render('Filter')} @@ -142,12 +190,21 @@ export default function ItemTable({ data, rowCanBeSelected, loading }) { - ))} - - ))} - - - {rows.map((row) => { + ))} + + ))} + + + + + {RenderRow} + + {/* {rows.map((row) => { prepareRow(row); let isSelected = selectedRow.queue === row.original.queue && selectedRow.number === row.original.number return ( @@ -157,7 +214,7 @@ export default function ItemTable({ data, rowCanBeSelected, loading }) { history.push(`/${row.original.queue}/${row.original.number}`); setSelectedRow({ queue: row.original.queue, number: row.original.number }); }} - // This functionality should be achieved by using the selected prop and + // This functionality should be achieved by using the selected prop and // overriding the selected class but this applied the secondary color at 0.08% opacity. // Overridding the root class is a workaround. classes={{ @@ -193,11 +250,11 @@ export default function ItemTable({ data, rowCanBeSelected, loading }) { ))} ); - })} - -
-
- ) + })} */} + + + + ) ); };