material-react-table 1.4.2 → 1.5.0-beta.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (43) hide show
  1. package/dist/cjs/index.js +178 -73
  2. package/dist/cjs/index.js.map +1 -1
  3. package/dist/cjs/types/MaterialReactTable.d.ts +18 -5
  4. package/dist/cjs/types/body/MRT_TableBody.d.ts +5 -0
  5. package/dist/cjs/types/body/MRT_TableBodyCell.d.ts +3 -0
  6. package/dist/cjs/types/body/MRT_TableBodyRow.d.ts +5 -1
  7. package/dist/cjs/types/footer/MRT_TableFooter.d.ts +4 -0
  8. package/dist/cjs/types/footer/MRT_TableFooterRow.d.ts +4 -0
  9. package/dist/cjs/types/head/MRT_TableHead.d.ts +4 -0
  10. package/dist/cjs/types/head/MRT_TableHeadRow.d.ts +4 -0
  11. package/dist/cjs/types/table/MRT_TableRoot.d.ts +12 -5
  12. package/dist/cjs/types/toolbar/MRT_TablePagination.d.ts +1 -1
  13. package/dist/esm/material-react-table.esm.js +172 -66
  14. package/dist/esm/material-react-table.esm.js.map +1 -1
  15. package/dist/esm/types/MaterialReactTable.d.ts +18 -5
  16. package/dist/esm/types/body/MRT_TableBody.d.ts +5 -0
  17. package/dist/esm/types/body/MRT_TableBodyCell.d.ts +3 -0
  18. package/dist/esm/types/body/MRT_TableBodyRow.d.ts +5 -1
  19. package/dist/esm/types/footer/MRT_TableFooter.d.ts +4 -0
  20. package/dist/esm/types/footer/MRT_TableFooterRow.d.ts +4 -0
  21. package/dist/esm/types/head/MRT_TableHead.d.ts +4 -0
  22. package/dist/esm/types/head/MRT_TableHeadRow.d.ts +4 -0
  23. package/dist/esm/types/table/MRT_TableRoot.d.ts +12 -5
  24. package/dist/esm/types/toolbar/MRT_TablePagination.d.ts +1 -1
  25. package/dist/index.d.ts +20 -7
  26. package/locales/ru.esm.js +1 -1
  27. package/locales/ru.js +1 -1
  28. package/package.json +6 -6
  29. package/src/MaterialReactTable.tsx +30 -8
  30. package/src/_locales/ru.ts +1 -1
  31. package/src/body/MRT_TableBody.tsx +42 -13
  32. package/src/body/MRT_TableBodyCell.tsx +17 -1
  33. package/src/body/MRT_TableBodyRow.tsx +24 -3
  34. package/src/footer/MRT_TableFooter.tsx +13 -1
  35. package/src/footer/MRT_TableFooterCell.tsx +10 -2
  36. package/src/footer/MRT_TableFooterRow.tsx +31 -4
  37. package/src/head/MRT_TableHead.tsx +13 -1
  38. package/src/head/MRT_TableHeadCell.tsx +6 -3
  39. package/src/head/MRT_TableHeadRow.tsx +30 -4
  40. package/src/inputs/MRT_FilterTextField.tsx +3 -2
  41. package/src/inputs/MRT_GlobalFilterTextField.tsx +1 -1
  42. package/src/table/MRT_Table.tsx +105 -7
  43. package/src/toolbar/MRT_TablePagination.tsx +2 -2
package/dist/cjs/index.js CHANGED
@@ -58,7 +58,7 @@ var useMediaQuery = require('@mui/material/useMediaQuery');
58
58
  var Collapse = require('@mui/material/Collapse');
59
59
  var InputAdornment = require('@mui/material/InputAdornment');
60
60
  var TextField = require('@mui/material/TextField');
61
- var debounce = require('@mui/material/utils/debounce');
61
+ var utils = require('@mui/material/utils');
62
62
  var LinearProgress = require('@mui/material/LinearProgress');
63
63
  var TablePagination = require('@mui/material/TablePagination');
64
64
  var Alert = require('@mui/material/Alert');
@@ -66,12 +66,12 @@ var AlertTitle = require('@mui/material/AlertTitle');
66
66
  var Chip = require('@mui/material/Chip');
67
67
  var Fade = require('@mui/material/Fade');
68
68
  var TableContainer = require('@mui/material/TableContainer');
69
+ var reactVirtual = require('@tanstack/react-virtual');
69
70
  var Table = require('@mui/material/Table');
70
71
  var TableHead = require('@mui/material/TableHead');
71
72
  var TableRow = require('@mui/material/TableRow');
72
73
  var TableCell = require('@mui/material/TableCell');
73
74
  var TableSortLabel = require('@mui/material/TableSortLabel');
74
- var reactVirtual = require('@tanstack/react-virtual');
75
75
  var TableBody = require('@mui/material/TableBody');
76
76
  var Skeleton = require('@mui/material/Skeleton');
77
77
  var TableFooter = require('@mui/material/TableFooter');
@@ -135,7 +135,6 @@ var useMediaQuery__default = /*#__PURE__*/_interopDefaultLegacy(useMediaQuery);
135
135
  var Collapse__default = /*#__PURE__*/_interopDefaultLegacy(Collapse);
136
136
  var InputAdornment__default = /*#__PURE__*/_interopDefaultLegacy(InputAdornment);
137
137
  var TextField__default = /*#__PURE__*/_interopDefaultLegacy(TextField);
138
- var debounce__default = /*#__PURE__*/_interopDefaultLegacy(debounce);
139
138
  var LinearProgress__default = /*#__PURE__*/_interopDefaultLegacy(LinearProgress);
140
139
  var TablePagination__default = /*#__PURE__*/_interopDefaultLegacy(TablePagination);
141
140
  var Alert__default = /*#__PURE__*/_interopDefaultLegacy(Alert);
@@ -1156,7 +1155,7 @@ const MRT_GlobalFilterTextField = ({ table, }) => {
1156
1155
  : muiSearchTextFieldProps;
1157
1156
  const [anchorEl, setAnchorEl] = React.useState(null);
1158
1157
  const [searchValue, setSearchValue] = React.useState(globalFilter !== null && globalFilter !== void 0 ? globalFilter : '');
1159
- const handleChangeDebounced = React.useCallback(debounce__default["default"]((event) => {
1158
+ const handleChangeDebounced = React.useCallback(utils.debounce((event) => {
1160
1159
  var _a;
1161
1160
  setGlobalFilter((_a = event.target.value) !== null && _a !== void 0 ? _a : undefined);
1162
1161
  }, manualFiltering ? 500 : 250), []);
@@ -1211,7 +1210,7 @@ const MRT_LinearProgressBar = ({ isTopToolbar, table }) => {
1211
1210
  React__default["default"].createElement(LinearProgress__default["default"], Object.assign({ "aria-label": "Loading", "aria-busy": "true", sx: { position: 'relative' } }, linearProgressProps))));
1212
1211
  };
1213
1212
 
1214
- const MRT_TablePagination = ({ table, position, }) => {
1213
+ const MRT_TablePagination = ({ table, position = 'bottom', }) => {
1215
1214
  const { getPrePaginationRowModel, getState, setPageIndex, setPageSize, options: { muiTablePaginationProps, enableToolbarInternalActions, localization, rowCount, }, } = table;
1216
1215
  const { pagination: { pageSize = 10, pageIndex = 0 }, showGlobalFilter, } = getState();
1217
1216
  const totalRowCount = rowCount !== null && rowCount !== void 0 ? rowCount : getPrePaginationRowModel().rows.length;
@@ -1527,7 +1526,7 @@ const MRT_TableHeadCellColumnActionsButton = ({ header, table, }) => {
1527
1526
  };
1528
1527
 
1529
1528
  const MRT_FilterTextField = ({ header, rangeFilterIndex, table, }) => {
1530
- var _a, _b, _c, _d, _e, _f, _g, _h;
1529
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j;
1531
1530
  const { options: { enableColumnFilterModes, columnFilterModeOptions, icons: { FilterListIcon, CloseIcon }, localization, manualFiltering, muiTableHeadCellFilterTextFieldProps, }, refs: { filterInputRefs }, setColumnFilterFns, } = table;
1532
1531
  const { column } = header;
1533
1532
  const { columnDef } = column;
@@ -1558,13 +1557,13 @@ const MRT_FilterTextField = ({ header, rangeFilterIndex, table, }) => {
1558
1557
  (currentFilterOption === null || currentFilterOption === void 0 ? void 0 : currentFilterOption.slice(1))}`]
1559
1558
  : '';
1560
1559
  const filterPlaceholder = !isRangeFilter
1561
- ? (_c = localization.filterByColumn) === null || _c === void 0 ? void 0 : _c.replace('{column}', String(columnDef.header))
1560
+ ? (_c = textFieldProps === null || textFieldProps === void 0 ? void 0 : textFieldProps.placeholder) !== null && _c !== void 0 ? _c : (_d = localization.filterByColumn) === null || _d === void 0 ? void 0 : _d.replace('{column}', String(columnDef.header))
1562
1561
  : rangeFilterIndex === 0
1563
1562
  ? localization.min
1564
1563
  : rangeFilterIndex === 1
1565
1564
  ? localization.max
1566
1565
  : '';
1567
- const allowedColumnFilterOptions = (_d = columnDef === null || columnDef === void 0 ? void 0 : columnDef.columnFilterModeOptions) !== null && _d !== void 0 ? _d : columnFilterModeOptions;
1566
+ const allowedColumnFilterOptions = (_e = columnDef === null || columnDef === void 0 ? void 0 : columnDef.columnFilterModeOptions) !== null && _e !== void 0 ? _e : columnFilterModeOptions;
1568
1567
  const showChangeModeButton = enableColumnFilterModes &&
1569
1568
  columnDef.enableColumnFilterModes !== false &&
1570
1569
  !rangeFilterIndex &&
@@ -1579,7 +1578,7 @@ const MRT_FilterTextField = ({ header, rangeFilterIndex, table, }) => {
1579
1578
  ? ((_a = column.getFilterValue()) === null || _a === void 0 ? void 0 : _a[rangeFilterIndex]) || []
1580
1579
  : (_b = column.getFilterValue()) !== null && _b !== void 0 ? _b : '';
1581
1580
  });
1582
- const handleChangeDebounced = React.useCallback(debounce__default["default"]((event) => {
1581
+ const handleChangeDebounced = React.useCallback(utils.debounce((event) => {
1583
1582
  const value = textFieldProps.type === 'date'
1584
1583
  ? event.target.valueAsDate
1585
1584
  : textFieldProps.type === 'number'
@@ -1634,7 +1633,7 @@ const MRT_FilterTextField = ({ header, rangeFilterIndex, table, }) => {
1634
1633
  isMounted.current = true;
1635
1634
  }, [column.getFilterValue()]);
1636
1635
  if (columnDef.Filter) {
1637
- return (React__default["default"].createElement(React__default["default"].Fragment, null, (_e = columnDef.Filter) === null || _e === void 0 ? void 0 : _e.call(columnDef, { column, header, rangeFilterIndex, table })));
1636
+ return (React__default["default"].createElement(React__default["default"].Fragment, null, (_f = columnDef.Filter) === null || _f === void 0 ? void 0 : _f.call(columnDef, { column, header, rangeFilterIndex, table })));
1638
1637
  }
1639
1638
  return (React__default["default"].createElement(React__default["default"].Fragment, null,
1640
1639
  React__default["default"].createElement(TextField__default["default"], Object.assign({ fullWidth: true, inputProps: {
@@ -1646,7 +1645,7 @@ const MRT_FilterTextField = ({ header, rangeFilterIndex, table, }) => {
1646
1645
  title: filterPlaceholder,
1647
1646
  }, helperText: showChangeModeButton ? (React__default["default"].createElement("label", null, localization.filterMode.replace('{filterType}',
1648
1647
  // @ts-ignore
1649
- localization[`filter${((_f = currentFilterOption === null || currentFilterOption === void 0 ? void 0 : currentFilterOption.charAt(0)) === null || _f === void 0 ? void 0 : _f.toUpperCase()) +
1648
+ localization[`filter${((_g = currentFilterOption === null || currentFilterOption === void 0 ? void 0 : currentFilterOption.charAt(0)) === null || _g === void 0 ? void 0 : _g.toUpperCase()) +
1650
1649
  (currentFilterOption === null || currentFilterOption === void 0 ? void 0 : currentFilterOption.slice(1))}`]))) : null, FormHelperTextProps: {
1651
1650
  sx: {
1652
1651
  fontSize: '0.75rem',
@@ -1663,7 +1662,7 @@ const MRT_FilterTextField = ({ header, rangeFilterIndex, table, }) => {
1663
1662
  React__default["default"].createElement(FilterListIcon, null)))),
1664
1663
  filterChipLabel && (React__default["default"].createElement(Chip__default["default"], { onDelete: handleClearEmptyFilterChip, label: filterChipLabel })))) : null,
1665
1664
  endAdornment: !filterChipLabel && (React__default["default"].createElement(InputAdornment__default["default"], { position: "end" },
1666
- React__default["default"].createElement(Tooltip__default["default"], { arrow: true, placement: "right", title: (_g = localization.clearFilter) !== null && _g !== void 0 ? _g : '' },
1665
+ React__default["default"].createElement(Tooltip__default["default"], { arrow: true, placement: "right", title: (_h = localization.clearFilter) !== null && _h !== void 0 ? _h : '' },
1667
1666
  React__default["default"].createElement("span", null,
1668
1667
  React__default["default"].createElement(IconButton__default["default"], { "aria-label": localization.clearFilter, disabled: !(filterValue === null || filterValue === void 0 ? void 0 : filterValue.length), onClick: handleClear, size: "small", sx: {
1669
1668
  height: '1.75rem',
@@ -1700,8 +1699,8 @@ const MRT_FilterTextField = ({ header, rangeFilterIndex, table, }) => {
1700
1699
  ? textFieldProps.sx(theme)
1701
1700
  : textFieldProps === null || textFieldProps === void 0 ? void 0 : textFieldProps.sx))) }),
1702
1701
  (isSelectFilter || isMultiSelectFilter) && (React__default["default"].createElement(MenuItem__default["default"], { divider: true, disabled: true, hidden: true, value: "" },
1703
- React__default["default"].createElement(Box__default["default"], { sx: { opacity: 0.5 } }, filterPlaceholder))), (_h = columnDef === null || columnDef === void 0 ? void 0 : columnDef.filterSelectOptions) === null || _h === void 0 ? void 0 :
1704
- _h.map((option) => {
1702
+ React__default["default"].createElement(Box__default["default"], { sx: { opacity: 0.5 } }, filterPlaceholder))), (_j = columnDef === null || columnDef === void 0 ? void 0 : columnDef.filterSelectOptions) === null || _j === void 0 ? void 0 :
1703
+ _j.map((option) => {
1705
1704
  var _a;
1706
1705
  let value;
1707
1706
  let text;
@@ -1910,7 +1909,7 @@ const MRT_TableHeadCellSortLabel = ({ header, table, tableCellProps, }) => {
1910
1909
  }, IconComponent: ArrowDownwardIcon })));
1911
1910
  };
1912
1911
 
1913
- const MRT_TableHeadCell = ({ header, table }) => {
1912
+ const MRT_TableHeadCell = ({ header, table, }) => {
1914
1913
  var _a, _b, _c, _d;
1915
1914
  const theme = styles.useTheme();
1916
1915
  const { getState, options: { enableColumnActions, enableColumnDragging, enableColumnOrdering, enableGrouping, enableMultiSort, layoutMode, muiTableHeadCellProps, }, refs: { tableHeadCellRefs }, setHoveredColumn, } = table;
@@ -2042,17 +2041,25 @@ const MRT_TableHeadCell = ({ header, table }) => {
2042
2041
  column.getCanFilter() && (React__default["default"].createElement(MRT_TableHeadCellFilterContainer, { header: header, table: table }))));
2043
2042
  };
2044
2043
 
2045
- const MRT_TableHeadRow = ({ headerGroup, table }) => {
2044
+ const MRT_TableHeadRow = ({ headerGroup, table, virtualColumns, virtualPaddingLeft, virtualPaddingRight, }) => {
2046
2045
  const { options: { layoutMode, muiTableHeadRowProps }, } = table;
2047
2046
  const tableRowProps = muiTableHeadRowProps instanceof Function
2048
2047
  ? muiTableHeadRowProps({ headerGroup, table })
2049
2048
  : muiTableHeadRowProps;
2050
2049
  return (React__default["default"].createElement(TableRow__default["default"], Object.assign({}, tableRowProps, { sx: (theme) => (Object.assign({ backgroundColor: styles.lighten(theme.palette.background.default, 0.04), boxShadow: `4px 0 8px ${styles.alpha(theme.palette.common.black, 0.1)}`, display: layoutMode === 'grid' ? 'flex' : 'table-row', top: 0 }, ((tableRowProps === null || tableRowProps === void 0 ? void 0 : tableRowProps.sx) instanceof Function
2051
2050
  ? tableRowProps === null || tableRowProps === void 0 ? void 0 : tableRowProps.sx(theme)
2052
- : tableRowProps === null || tableRowProps === void 0 ? void 0 : tableRowProps.sx))) }), headerGroup.headers.map((header) => (React__default["default"].createElement(MRT_TableHeadCell, { header: header, key: header.id, table: table })))));
2053
- };
2054
-
2055
- const MRT_TableHead = ({ table }) => {
2051
+ : tableRowProps === null || tableRowProps === void 0 ? void 0 : tableRowProps.sx))) }),
2052
+ virtualPaddingLeft ? (React__default["default"].createElement("th", { style: { display: 'flex', width: virtualPaddingLeft } })) : null,
2053
+ (virtualColumns !== null && virtualColumns !== void 0 ? virtualColumns : headerGroup.headers).map((headerOrVirtualHeader) => {
2054
+ const header = virtualColumns
2055
+ ? headerGroup.headers[headerOrVirtualHeader.index]
2056
+ : headerOrVirtualHeader;
2057
+ return (React__default["default"].createElement(MRT_TableHeadCell, { header: header, key: header.id, table: table }));
2058
+ }),
2059
+ virtualPaddingRight ? (React__default["default"].createElement("th", { style: { display: 'flex', width: virtualPaddingRight } })) : null));
2060
+ };
2061
+
2062
+ const MRT_TableHead = ({ table, virtualColumns, virtualPaddingLeft, virtualPaddingRight, }) => {
2056
2063
  const { getHeaderGroups, getState, options: { enableStickyHeader, layoutMode, muiTableHeadProps }, } = table;
2057
2064
  const { isFullScreen } = getState();
2058
2065
  const tableHeadProps = muiTableHeadProps instanceof Function
@@ -2061,7 +2068,7 @@ const MRT_TableHead = ({ table }) => {
2061
2068
  const stickyHeader = enableStickyHeader || isFullScreen;
2062
2069
  return (React__default["default"].createElement(TableHead__default["default"], Object.assign({}, tableHeadProps, { sx: (theme) => (Object.assign({ display: layoutMode === 'grid' ? 'grid' : 'table-row-group', opacity: 0.97, position: stickyHeader ? 'sticky' : 'relative', top: stickyHeader && layoutMode === 'grid' ? 0 : undefined, zIndex: stickyHeader ? 2 : undefined }, ((tableHeadProps === null || tableHeadProps === void 0 ? void 0 : tableHeadProps.sx) instanceof Function
2063
2070
  ? tableHeadProps === null || tableHeadProps === void 0 ? void 0 : tableHeadProps.sx(theme)
2064
- : tableHeadProps === null || tableHeadProps === void 0 ? void 0 : tableHeadProps.sx))) }), getHeaderGroups().map((headerGroup) => (React__default["default"].createElement(MRT_TableHeadRow, { headerGroup: headerGroup, key: headerGroup.id, table: table })))));
2071
+ : tableHeadProps === null || tableHeadProps === void 0 ? void 0 : tableHeadProps.sx))) }), getHeaderGroups().map((headerGroup) => (React__default["default"].createElement(MRT_TableHeadRow, { headerGroup: headerGroup, key: headerGroup.id, table: table, virtualColumns: virtualColumns, virtualPaddingLeft: virtualPaddingLeft, virtualPaddingRight: virtualPaddingRight })))));
2065
2072
  };
2066
2073
 
2067
2074
  const MRT_EditCellTextField = ({ cell, showLabel, table, }) => {
@@ -2200,7 +2207,7 @@ const MRT_TableBodyCellValue = ({ cell, table }) => {
2200
2207
  : (_b = (_a = columnDef === null || columnDef === void 0 ? void 0 : columnDef.Cell) === null || _a === void 0 ? void 0 : _a.call(columnDef, { cell, column, row, table })) !== null && _b !== void 0 ? _b : cell.renderValue()));
2201
2208
  };
2202
2209
 
2203
- const MRT_TableBodyCell = ({ cell, enableHover, numRows, rowIndex, rowRef, table, }) => {
2210
+ const MRT_TableBodyCell = ({ cell, enableHover, measureElement, numRows, rowIndex, rowRef, table, virtualCell, }) => {
2204
2211
  var _a, _b;
2205
2212
  const theme = styles.useTheme();
2206
2213
  const { getState, options: { editingMode, enableClickToCopy, enableColumnOrdering, enableEditing, enableGrouping, enableRowNumbers, layoutMode, muiTableBodyCellProps, muiTableBodyCellSkeletonProps, rowNumberMode, }, refs: { editInputRefs }, setEditingCell, setHoveredColumn, } = table;
@@ -2272,7 +2279,11 @@ const MRT_TableBodyCell = ({ cell, enableHover, numRows, rowIndex, rowRef, table
2272
2279
  setHoveredColumn(columnDef.enableColumnOrdering !== false ? column : null);
2273
2280
  }
2274
2281
  };
2275
- return (React__default["default"].createElement(TableCell__default["default"], Object.assign({}, tableCellProps, { onDragEnter: handleDragEnter, onDoubleClick: handleDoubleClick, sx: (theme) => (Object.assign(Object.assign({ alignItems: layoutMode === 'grid' ? 'center' : undefined, cursor: isEditable && editingMode === 'cell' ? 'pointer' : 'inherit', overflow: 'hidden', p: density === 'compact'
2282
+ return (React__default["default"].createElement(TableCell__default["default"], Object.assign({ "data-index": virtualCell === null || virtualCell === void 0 ? void 0 : virtualCell.index, ref: (node) => {
2283
+ if (node) {
2284
+ measureElement === null || measureElement === void 0 ? void 0 : measureElement(node);
2285
+ }
2286
+ } }, tableCellProps, { onDragEnter: handleDragEnter, onDoubleClick: handleDoubleClick, sx: (theme) => (Object.assign(Object.assign({ alignItems: layoutMode === 'grid' ? 'center' : undefined, cursor: isEditable && editingMode === 'cell' ? 'pointer' : 'inherit', overflow: 'hidden', p: density === 'compact'
2276
2287
  ? columnDefType === 'display'
2277
2288
  ? '0 0.5rem'
2278
2289
  : '0.5rem'
@@ -2298,7 +2309,12 @@ const MRT_TableBodyCell = ({ cell, enableHover, numRows, rowIndex, rowRef, table
2298
2309
  ? `${styles.lighten(theme.palette.background.default, 0.2)} !important`
2299
2310
  : `${styles.darken(theme.palette.background.default, 0.1)} !important`
2300
2311
  : undefined,
2301
- } }, getCommonCellStyles({ column, table, theme, tableCellProps })), draggingBorders)) }),
2312
+ } }, getCommonCellStyles({
2313
+ column,
2314
+ table,
2315
+ theme,
2316
+ tableCellProps,
2317
+ })), draggingBorders)) }),
2302
2318
  React__default["default"].createElement(React__default["default"].Fragment, null, cell.getIsPlaceholder() ? null : isLoading || showSkeletons ? (React__default["default"].createElement(Skeleton__default["default"], Object.assign({ animation: "wave", height: 20, width: skeletonWidth }, skeletonProps))) : enableRowNumbers &&
2303
2319
  rowNumberMode === 'static' &&
2304
2320
  column.id === 'mrt-row-numbers' ? (rowIndex + 1) : column.id === 'mrt-row-drag' ? (React__default["default"].createElement(MRT_TableBodyRowGrabHandle, { cell: cell, rowRef: rowRef, table: table })) : columnDefType === 'display' &&
@@ -2340,7 +2356,7 @@ const MRT_TableDetailPanel = ({ parentRowRef, row, table, virtualRow, }) => {
2340
2356
  : tableCellProps === null || tableCellProps === void 0 ? void 0 : tableCellProps.sx))) }), renderDetailPanel && (React__default["default"].createElement(Collapse__default["default"], { in: row.getIsExpanded(), mountOnEnter: true, unmountOnExit: true }, !isLoading && renderDetailPanel({ row, table }))))));
2341
2357
  };
2342
2358
 
2343
- const MRT_TableBodyRow = ({ measureElement, numRows, row, rowIndex, table, virtualRow, }) => {
2359
+ const MRT_TableBodyRow = ({ columnVirtualizer, measureElement, numRows, row, rowIndex, table, virtualColumns, virtualPaddingLeft, virtualPaddingRight, virtualRow, }) => {
2344
2360
  const theme = styles.useTheme();
2345
2361
  const { getIsSomeColumnsPinned, getState, options: { enableRowOrdering, layoutMode, memoMode, muiTableBodyRowProps, renderDetailPanel, }, setHoveredRow, } = table;
2346
2362
  const { draggingColumn, draggingRow, editingCell, editingRow, hoveredRow } = getState();
@@ -2379,37 +2395,50 @@ const MRT_TableBodyRow = ({ measureElement, numRows, row, rowIndex, table, virtu
2379
2395
  : undefined,
2380
2396
  } }, ((tableRowProps === null || tableRowProps === void 0 ? void 0 : tableRowProps.sx) instanceof Function
2381
2397
  ? tableRowProps.sx(theme)
2382
- : tableRowProps === null || tableRowProps === void 0 ? void 0 : tableRowProps.sx)), draggingBorders)) }), row.getVisibleCells().map((cell) => {
2383
- const props = {
2384
- cell,
2385
- enableHover: (tableRowProps === null || tableRowProps === void 0 ? void 0 : tableRowProps.hover) !== false,
2386
- key: cell.id,
2387
- numRows,
2388
- rowIndex,
2389
- rowRef,
2390
- table,
2391
- };
2392
- return memoMode === 'cells' &&
2393
- cell.column.columnDef.columnDefType === 'data' &&
2394
- !draggingColumn &&
2395
- !draggingRow &&
2396
- (editingCell === null || editingCell === void 0 ? void 0 : editingCell.id) !== cell.id &&
2397
- (editingRow === null || editingRow === void 0 ? void 0 : editingRow.id) !== row.id ? (React__default["default"].createElement(Memo_MRT_TableBodyCell, Object.assign({}, props))) : (React__default["default"].createElement(MRT_TableBodyCell, Object.assign({}, props)));
2398
- })),
2398
+ : tableRowProps === null || tableRowProps === void 0 ? void 0 : tableRowProps.sx)), draggingBorders)) }),
2399
+ virtualPaddingLeft ? (React__default["default"].createElement("td", { style: { display: 'flex', width: virtualPaddingLeft } })) : null,
2400
+ (virtualColumns !== null && virtualColumns !== void 0 ? virtualColumns : row.getVisibleCells()).map((cellOrVirtualCell) => {
2401
+ const cell = columnVirtualizer
2402
+ ? row.getVisibleCells()[cellOrVirtualCell.index]
2403
+ : cellOrVirtualCell;
2404
+ const props = {
2405
+ cell,
2406
+ enableHover: (tableRowProps === null || tableRowProps === void 0 ? void 0 : tableRowProps.hover) !== false,
2407
+ key: cell.id,
2408
+ measureElement: columnVirtualizer === null || columnVirtualizer === void 0 ? void 0 : columnVirtualizer.measureElement,
2409
+ numRows,
2410
+ rowIndex,
2411
+ rowRef,
2412
+ table,
2413
+ virtualCell: columnVirtualizer
2414
+ ? cellOrVirtualCell
2415
+ : undefined,
2416
+ };
2417
+ return memoMode === 'cells' &&
2418
+ cell.column.columnDef.columnDefType === 'data' &&
2419
+ !draggingColumn &&
2420
+ !draggingRow &&
2421
+ (editingCell === null || editingCell === void 0 ? void 0 : editingCell.id) !== cell.id &&
2422
+ (editingRow === null || editingRow === void 0 ? void 0 : editingRow.id) !== row.id ? (React__default["default"].createElement(Memo_MRT_TableBodyCell, Object.assign({}, props))) : (React__default["default"].createElement(MRT_TableBodyCell, Object.assign({}, props)));
2423
+ }),
2424
+ virtualPaddingRight ? (React__default["default"].createElement("td", { style: { display: 'flex', width: virtualPaddingRight } })) : null),
2399
2425
  renderDetailPanel && !row.getIsGrouped() && (React__default["default"].createElement(MRT_TableDetailPanel, { parentRowRef: rowRef, row: row, table: table, virtualRow: virtualRow }))));
2400
2426
  };
2401
2427
  const Memo_MRT_TableBodyRow = React.memo(MRT_TableBodyRow, (prev, next) => prev.row === next.row);
2402
2428
 
2403
- const MRT_TableBody = ({ table }) => {
2429
+ const MRT_TableBody = ({ columnVirtualizer, table, virtualColumns, virtualPaddingLeft, virtualPaddingRight, }) => {
2404
2430
  var _a, _b, _c;
2405
- const { getRowModel, getPrePaginationRowModel, getState, options: { enableGlobalFilterRankedResults, enablePagination, enableRowVirtualization, layoutMode, localization, manualFiltering, manualSorting, memoMode, muiTableBodyProps, virtualizerInstanceRef, virtualizerProps, }, refs: { tableContainerRef, tablePaperRef }, } = table;
2431
+ const { getRowModel, getPrePaginationRowModel, getState, options: { enableGlobalFilterRankedResults, enablePagination, enableRowVirtualization, layoutMode, localization, manualFiltering, manualSorting, memoMode, muiTableBodyProps, rowVirtualizerInstanceRef, rowVirtualizerProps, virtualizerInstanceRef, virtualizerProps, }, refs: { tableContainerRef, tablePaperRef }, } = table;
2406
2432
  const { columnFilters, density, globalFilter, pagination, sorting } = getState();
2407
2433
  const tableBodyProps = muiTableBodyProps instanceof Function
2408
2434
  ? muiTableBodyProps({ table })
2409
2435
  : muiTableBodyProps;
2410
- const vProps = virtualizerProps instanceof Function
2436
+ const vProps_old = virtualizerProps instanceof Function
2411
2437
  ? virtualizerProps({ table })
2412
2438
  : virtualizerProps;
2439
+ const vProps = rowVirtualizerProps instanceof Function
2440
+ ? rowVirtualizerProps({ table })
2441
+ : rowVirtualizerProps;
2413
2442
  const rows = React.useMemo(() => {
2414
2443
  if (enableGlobalFilterRankedResults &&
2415
2444
  globalFilter &&
@@ -2435,14 +2464,22 @@ const MRT_TableBody = ({ table }) => {
2435
2464
  pagination.pageIndex,
2436
2465
  pagination.pageSize,
2437
2466
  ]);
2438
- const virtualizer = enableRowVirtualization
2439
- ? reactVirtual.useVirtualizer(Object.assign({ count: rows.length, estimateSize: () => density === 'compact' ? 37 : density === 'comfortable' ? 58 : 73, getScrollElement: () => tableContainerRef.current, measureElement: (element) => element === null || element === void 0 ? void 0 : element.getBoundingClientRect().height, overscan: 4 }, vProps))
2467
+ const rowVirtualizer = enableRowVirtualization
2468
+ ? reactVirtual.useVirtualizer(Object.assign(Object.assign({ count: rows.length, estimateSize: () => density === 'compact' ? 37 : density === 'comfortable' ? 58 : 73, getScrollElement: () => tableContainerRef.current, measureElement: (element) => element === null || element === void 0 ? void 0 : element.getBoundingClientRect().height, overscan: 4 }, vProps_old), vProps))
2440
2469
  : undefined;
2441
- if (virtualizerInstanceRef && virtualizer) {
2442
- virtualizerInstanceRef.current = virtualizer;
2470
+ if (rowVirtualizerInstanceRef && rowVirtualizer) {
2471
+ rowVirtualizerInstanceRef.current = rowVirtualizer;
2472
+ }
2473
+ //deprecated
2474
+ if (virtualizerInstanceRef && rowVirtualizer) {
2475
+ virtualizerInstanceRef.current = rowVirtualizer;
2443
2476
  }
2444
- const virtualRows = virtualizer ? virtualizer.getVirtualItems() : undefined;
2445
- return (React__default["default"].createElement(TableBody__default["default"], Object.assign({}, tableBodyProps, { sx: (theme) => (Object.assign({ display: layoutMode === 'grid' ? 'grid' : 'table-row-group', height: virtualizer ? `${virtualizer.getTotalSize()}px` : 'inherit', minHeight: !rows.length ? '100px' : undefined, position: 'relative' }, ((tableBodyProps === null || tableBodyProps === void 0 ? void 0 : tableBodyProps.sx) instanceof Function
2477
+ const virtualRows = rowVirtualizer
2478
+ ? rowVirtualizer.getVirtualItems()
2479
+ : undefined;
2480
+ return (React__default["default"].createElement(TableBody__default["default"], Object.assign({}, tableBodyProps, { sx: (theme) => (Object.assign({ display: layoutMode === 'grid' ? 'grid' : 'table-row-group', height: rowVirtualizer
2481
+ ? `${rowVirtualizer.getTotalSize()}px`
2482
+ : 'inherit', minHeight: !rows.length ? '100px' : undefined, position: 'relative' }, ((tableBodyProps === null || tableBodyProps === void 0 ? void 0 : tableBodyProps.sx) instanceof Function
2446
2483
  ? tableBodyProps === null || tableBodyProps === void 0 ? void 0 : tableBodyProps.sx(theme)
2447
2484
  : tableBodyProps === null || tableBodyProps === void 0 ? void 0 : tableBodyProps.sx))) }), (_a = tableBodyProps === null || tableBodyProps === void 0 ? void 0 : tableBodyProps.children) !== null && _a !== void 0 ? _a : (!rows.length ? (React__default["default"].createElement("tr", { style: { display: layoutMode === 'grid' ? 'grid' : 'table-row' } },
2448
2485
  React__default["default"].createElement("td", { colSpan: table.getVisibleLeafColumns().length, style: { display: layoutMode === 'grid' ? 'grid' : 'table-cell' } },
@@ -2456,19 +2493,21 @@ const MRT_TableBody = ({ table }) => {
2456
2493
  } }, globalFilter || columnFilters.length
2457
2494
  ? localization.noResultsFound
2458
2495
  : localization.noRecordsToDisplay)))) : (React__default["default"].createElement(React__default["default"].Fragment, null, (virtualRows !== null && virtualRows !== void 0 ? virtualRows : rows).map((rowOrVirtualRow, rowIndex) => {
2459
- const row = virtualizer
2496
+ const row = rowVirtualizer
2460
2497
  ? rows[rowOrVirtualRow.index]
2461
2498
  : rowOrVirtualRow;
2462
2499
  const props = {
2500
+ columnVirtualizer,
2463
2501
  key: row.id,
2464
- measureElement: virtualizer
2465
- ? virtualizer.measureElement
2466
- : undefined,
2502
+ measureElement: rowVirtualizer === null || rowVirtualizer === void 0 ? void 0 : rowVirtualizer.measureElement,
2467
2503
  numRows: rows.length,
2468
2504
  row,
2469
- rowIndex: virtualizer ? rowOrVirtualRow.index : rowIndex,
2505
+ rowIndex: rowVirtualizer ? rowOrVirtualRow.index : rowIndex,
2470
2506
  table,
2471
- virtualRow: virtualizer
2507
+ virtualColumns,
2508
+ virtualPaddingLeft,
2509
+ virtualPaddingRight,
2510
+ virtualRow: rowVirtualizer
2472
2511
  ? rowOrVirtualRow
2473
2512
  : undefined,
2474
2513
  };
@@ -2477,7 +2516,7 @@ const MRT_TableBody = ({ table }) => {
2477
2516
  };
2478
2517
  const Memo_MRT_TableBody = React.memo(MRT_TableBody, (prev, next) => prev.table.options.data === next.table.options.data);
2479
2518
 
2480
- const MRT_TableFooterCell = ({ footer, table }) => {
2519
+ const MRT_TableFooterCell = ({ footer, table, }) => {
2481
2520
  var _a, _b, _c;
2482
2521
  const { getState, options: { layoutMode, muiTableFooterCellProps }, } = table;
2483
2522
  const { density } = getState();
@@ -2495,7 +2534,12 @@ const MRT_TableFooterCell = ({ footer, table }) => {
2495
2534
  ? '0.5rem'
2496
2535
  : density === 'comfortable'
2497
2536
  ? '1rem'
2498
- : '1.5rem', verticalAlign: 'top', zIndex: column.getIsPinned() && columnDefType !== 'group' ? 2 : 1 }, getCommonCellStyles({ column, table, theme, tableCellProps }))) }),
2537
+ : '1.5rem', verticalAlign: 'top', zIndex: column.getIsPinned() && columnDefType !== 'group' ? 2 : 1 }, getCommonCellStyles({
2538
+ column,
2539
+ table,
2540
+ theme,
2541
+ tableCellProps,
2542
+ }))) }),
2499
2543
  React__default["default"].createElement(React__default["default"].Fragment, null, footer.isPlaceholder
2500
2544
  ? null
2501
2545
  : (_c = (_b = (columnDef.Footer instanceof Function
@@ -2507,7 +2551,7 @@ const MRT_TableFooterCell = ({ footer, table }) => {
2507
2551
  : columnDef.Footer)) !== null && _b !== void 0 ? _b : columnDef.footer) !== null && _c !== void 0 ? _c : null)));
2508
2552
  };
2509
2553
 
2510
- const MRT_TableFooterRow = ({ footerGroup, table }) => {
2554
+ const MRT_TableFooterRow = ({ footerGroup, table, virtualColumns, virtualPaddingLeft, virtualPaddingRight, }) => {
2511
2555
  var _a;
2512
2556
  const { options: { layoutMode, muiTableFooterRowProps }, } = table;
2513
2557
  // if no content in row, skip row
@@ -2518,12 +2562,20 @@ const MRT_TableFooterRow = ({ footerGroup, table }) => {
2518
2562
  const tableRowProps = muiTableFooterRowProps instanceof Function
2519
2563
  ? muiTableFooterRowProps({ footerGroup, table })
2520
2564
  : muiTableFooterRowProps;
2521
- return (React__default["default"].createElement(TableRow__default["default"], Object.assign({}, tableRowProps, { sx: (theme) => (Object.assign({ display: layoutMode === 'grid' ? 'flex' : 'table-row' }, ((tableRowProps === null || tableRowProps === void 0 ? void 0 : tableRowProps.sx) instanceof Function
2565
+ return (React__default["default"].createElement(TableRow__default["default"], Object.assign({}, tableRowProps, { sx: (theme) => (Object.assign({ display: layoutMode === 'grid' ? 'flex' : 'table-row', width: '100%' }, ((tableRowProps === null || tableRowProps === void 0 ? void 0 : tableRowProps.sx) instanceof Function
2522
2566
  ? tableRowProps === null || tableRowProps === void 0 ? void 0 : tableRowProps.sx(theme)
2523
- : tableRowProps === null || tableRowProps === void 0 ? void 0 : tableRowProps.sx))) }), footerGroup.headers.map((footer) => (React__default["default"].createElement(MRT_TableFooterCell, { footer: footer, key: footer.id, table: table })))));
2524
- };
2525
-
2526
- const MRT_TableFooter = ({ table }) => {
2567
+ : tableRowProps === null || tableRowProps === void 0 ? void 0 : tableRowProps.sx))) }),
2568
+ virtualPaddingLeft ? (React__default["default"].createElement("th", { style: { display: 'flex', width: virtualPaddingLeft } })) : null,
2569
+ (virtualColumns !== null && virtualColumns !== void 0 ? virtualColumns : footerGroup.headers).map((footerOrVirtualFooter) => {
2570
+ const footer = virtualColumns
2571
+ ? footerGroup.headers[footerOrVirtualFooter.index]
2572
+ : footerOrVirtualFooter;
2573
+ return (React__default["default"].createElement(MRT_TableFooterCell, { footer: footer, key: footer.id, table: table }));
2574
+ }),
2575
+ virtualPaddingRight ? (React__default["default"].createElement("th", { style: { display: 'flex', width: virtualPaddingRight } })) : null));
2576
+ };
2577
+
2578
+ const MRT_TableFooter = ({ table, virtualColumns, virtualPaddingLeft, virtualPaddingRight, }) => {
2527
2579
  const { getFooterGroups, getState, options: { enableStickyFooter, layoutMode, muiTableFooterProps }, } = table;
2528
2580
  const { isFullScreen } = getState();
2529
2581
  const tableFooterProps = muiTableFooterProps instanceof Function
@@ -2536,21 +2588,74 @@ const MRT_TableFooter = ({ table }) => {
2536
2588
  : `1px solid ${theme.palette.grey[700]}`
2537
2589
  : undefined, position: stickFooter ? 'sticky' : undefined }, ((tableFooterProps === null || tableFooterProps === void 0 ? void 0 : tableFooterProps.sx) instanceof Function
2538
2590
  ? tableFooterProps === null || tableFooterProps === void 0 ? void 0 : tableFooterProps.sx(theme)
2539
- : tableFooterProps === null || tableFooterProps === void 0 ? void 0 : tableFooterProps.sx))) }), getFooterGroups().map((footerGroup) => (React__default["default"].createElement(MRT_TableFooterRow, { footerGroup: footerGroup, key: footerGroup.id, table: table })))));
2591
+ : tableFooterProps === null || tableFooterProps === void 0 ? void 0 : tableFooterProps.sx))) }), getFooterGroups().map((footerGroup) => (React__default["default"].createElement(MRT_TableFooterRow, { footerGroup: footerGroup, key: footerGroup.id, table: table, virtualColumns: virtualColumns, virtualPaddingLeft: virtualPaddingLeft, virtualPaddingRight: virtualPaddingRight })))));
2540
2592
  };
2541
2593
 
2542
2594
  const MRT_Table = ({ table }) => {
2543
- const { getState, options: { enableColumnResizing, enableStickyHeader, enableTableFooter, enableTableHead, layoutMode, memoMode, muiTableProps, }, } = table;
2544
- const { isFullScreen } = getState();
2595
+ var _a, _b;
2596
+ const { getState, options: { columnVirtualizerInstanceRef, columnVirtualizerProps, enableColumnResizing, enableColumnVirtualization, enablePinning, enableStickyHeader, enableTableFooter, enableTableHead, layoutMode, memoMode, muiTableProps, }, refs: { tableContainerRef }, } = table;
2597
+ const { isFullScreen, columnPinning, columnVisibility } = getState();
2545
2598
  const tableProps = muiTableProps instanceof Function
2546
2599
  ? muiTableProps({ table })
2547
2600
  : muiTableProps;
2548
- return (React__default["default"].createElement(Table__default["default"], Object.assign({ stickyHeader: enableStickyHeader || isFullScreen }, tableProps, { sx: (theme) => (Object.assign({ display: layoutMode === 'grid' ? 'grid' : 'table', tableLayout: enableColumnResizing ? 'fixed' : 'auto' }, ((tableProps === null || tableProps === void 0 ? void 0 : tableProps.sx) instanceof Function
2601
+ const vProps = columnVirtualizerProps instanceof Function
2602
+ ? columnVirtualizerProps({ table })
2603
+ : columnVirtualizerProps;
2604
+ //get first 16 column widths and average them
2605
+ const averageColumnWidth = React.useMemo(() => {
2606
+ var _a, _b, _c, _d;
2607
+ const columnsWidths = (_d = (_c = (_b = (_a = table
2608
+ .getRowModel()
2609
+ .rows[0]) === null || _a === void 0 ? void 0 : _a.getCenterVisibleCells()) === null || _b === void 0 ? void 0 : _b.slice(0, 16)) === null || _c === void 0 ? void 0 : _c.map((cell) => cell.column.getSize() * 1.25)) !== null && _d !== void 0 ? _d : [];
2610
+ return columnsWidths.reduce((a, b) => a + b, 0) / columnsWidths.length;
2611
+ }, [table.getRowModel().rows, columnPinning, columnVisibility]);
2612
+ const pinnedColumnIndexes = React.useMemo(() => enableColumnVirtualization && enablePinning
2613
+ ? [
2614
+ ...table.getLeftFlatHeaders().map((h) => h.column.getPinnedIndex()),
2615
+ ...table
2616
+ .getRightFlatHeaders()
2617
+ .map((h) => table.getVisibleFlatColumns().length -
2618
+ h.column.getPinnedIndex() -
2619
+ 1),
2620
+ ]
2621
+ : [], [columnPinning, enableColumnVirtualization, enablePinning]);
2622
+ const columnVirtualizer = enableColumnVirtualization
2623
+ ? reactVirtual.useVirtualizer(Object.assign({ count: table.getRowModel().rows[0].getVisibleCells().length, estimateSize: () => averageColumnWidth, getScrollElement: () => tableContainerRef.current, horizontal: true, measureElement: (element) => element === null || element === void 0 ? void 0 : element.getBoundingClientRect().width, overscan: 3, rangeExtractor: React.useCallback((range) => [
2624
+ ...new Set([
2625
+ ...pinnedColumnIndexes,
2626
+ ...reactVirtual.defaultRangeExtractor(range),
2627
+ ]),
2628
+ ].sort((a, b) => a - b), [pinnedColumnIndexes]) }, vProps))
2629
+ : undefined;
2630
+ if (columnVirtualizerInstanceRef && columnVirtualizer) {
2631
+ columnVirtualizerInstanceRef.current = columnVirtualizer;
2632
+ }
2633
+ const virtualColumns = columnVirtualizer
2634
+ ? columnVirtualizer.getVirtualItems()
2635
+ : undefined;
2636
+ let virtualPaddingLeft;
2637
+ let virtualPaddingRight;
2638
+ if (columnVirtualizer && (virtualColumns === null || virtualColumns === void 0 ? void 0 : virtualColumns.length)) {
2639
+ virtualPaddingLeft = (virtualColumns === null || virtualColumns === void 0 ? void 0 : virtualColumns.length)
2640
+ ? ((_a = virtualColumns[0]) === null || _a === void 0 ? void 0 : _a.start) || 0
2641
+ : 0;
2642
+ virtualPaddingRight = (virtualColumns === null || virtualColumns === void 0 ? void 0 : virtualColumns.length)
2643
+ ? columnVirtualizer.getTotalSize() -
2644
+ (((_b = virtualColumns[virtualColumns.length - 1]) === null || _b === void 0 ? void 0 : _b.end) || 0)
2645
+ : 0;
2646
+ }
2647
+ const props = {
2648
+ table,
2649
+ virtualColumns,
2650
+ virtualPaddingLeft,
2651
+ virtualPaddingRight,
2652
+ };
2653
+ return (React__default["default"].createElement(Table__default["default"], Object.assign({ stickyHeader: enableStickyHeader || isFullScreen }, tableProps, { sx: (theme) => (Object.assign({ display: layoutMode === 'grid' ? 'grid' : 'table', tableLayout: layoutMode !== 'grid' && enableColumnResizing ? 'fixed' : undefined }, ((tableProps === null || tableProps === void 0 ? void 0 : tableProps.sx) instanceof Function
2549
2654
  ? tableProps.sx(theme)
2550
2655
  : tableProps === null || tableProps === void 0 ? void 0 : tableProps.sx))) }),
2551
- enableTableHead && React__default["default"].createElement(MRT_TableHead, { table: table }),
2552
- memoMode === 'table-body' ? (React__default["default"].createElement(Memo_MRT_TableBody, { table: table })) : (React__default["default"].createElement(MRT_TableBody, { table: table })),
2553
- enableTableFooter && React__default["default"].createElement(MRT_TableFooter, { table: table })));
2656
+ enableTableHead && React__default["default"].createElement(MRT_TableHead, Object.assign({}, props)),
2657
+ memoMode === 'table-body' ? (React__default["default"].createElement(Memo_MRT_TableBody, Object.assign({ columnVirtualizer: columnVirtualizer }, props))) : (React__default["default"].createElement(MRT_TableBody, Object.assign({ columnVirtualizer: columnVirtualizer }, props))),
2658
+ enableTableFooter && React__default["default"].createElement(MRT_TableFooter, Object.assign({}, props))));
2554
2659
  };
2555
2660
 
2556
2661
  const useIsomorphicLayoutEffect = typeof window !== 'undefined' ? React.useLayoutEffect : React.useEffect;
@@ -2905,7 +3010,7 @@ const MaterialReactTable = (_a) => {
2905
3010
  const _sortingFns = React.useMemo(() => (Object.assign(Object.assign({}, MRT_SortingFns), sortingFns)), []);
2906
3011
  const _defaultColumn = React.useMemo(() => (Object.assign(Object.assign({}, MRT_DefaultColumn), defaultColumn)), []);
2907
3012
  const _defaultDisplayColumn = React.useMemo(() => (Object.assign(Object.assign({}, MRT_DefaultDisplayColumn), defaultDisplayColumn)), []);
2908
- if (rest.enableRowVirtualization) {
3013
+ if (rest.enableRowVirtualization || rest.enableColumnVirtualization) {
2909
3014
  layoutMode = 'grid';
2910
3015
  enableStickyHeader = true;
2911
3016
  }