material-react-table 1.9.4 → 1.11.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 (45) hide show
  1. package/dist/cjs/index.js +216 -215
  2. package/dist/cjs/index.js.map +1 -1
  3. package/dist/cjs/types/MaterialReactTable.d.ts +4 -0
  4. package/dist/cjs/types/_locales/fi.d.ts +2 -0
  5. package/dist/cjs/types/_locales/id.d.ts +2 -0
  6. package/dist/cjs/types/body/MRT_TableDetailPanel.d.ts +2 -1
  7. package/dist/cjs/types/column.utils.d.ts +1 -1
  8. package/dist/cjs/types/menus/MRT_ShowHideColumnsMenu.d.ts +1 -1
  9. package/dist/cjs/types/menus/MRT_ShowHideColumnsMenuItems.d.ts +1 -2
  10. package/dist/esm/material-react-table.esm.js +213 -212
  11. package/dist/esm/material-react-table.esm.js.map +1 -1
  12. package/dist/esm/types/MaterialReactTable.d.ts +4 -0
  13. package/dist/esm/types/_locales/fi.d.ts +2 -0
  14. package/dist/esm/types/_locales/id.d.ts +2 -0
  15. package/dist/esm/types/body/MRT_TableDetailPanel.d.ts +2 -1
  16. package/dist/esm/types/column.utils.d.ts +1 -1
  17. package/dist/esm/types/menus/MRT_ShowHideColumnsMenu.d.ts +1 -1
  18. package/dist/esm/types/menus/MRT_ShowHideColumnsMenuItems.d.ts +1 -2
  19. package/dist/index.d.ts +4 -0
  20. package/locales/fi.d.ts +2 -0
  21. package/locales/fi.esm.d.ts +2 -0
  22. package/locales/fi.esm.js +94 -0
  23. package/locales/fi.esm.js.map +1 -0
  24. package/locales/fi.js +98 -0
  25. package/locales/fi.js.map +1 -0
  26. package/locales/id.d.ts +2 -0
  27. package/locales/id.esm.d.ts +2 -0
  28. package/locales/id.esm.js +94 -0
  29. package/locales/id.esm.js.map +1 -0
  30. package/locales/id.js +98 -0
  31. package/locales/id.js.map +1 -0
  32. package/package.json +10 -8
  33. package/src/MaterialReactTable.tsx +4 -0
  34. package/src/_locales/fi.ts +94 -0
  35. package/src/_locales/id.ts +95 -0
  36. package/src/body/MRT_TableBody.tsx +22 -17
  37. package/src/body/MRT_TableBodyRow.tsx +2 -1
  38. package/src/body/MRT_TableDetailPanel.tsx +3 -1
  39. package/src/column.utils.ts +95 -83
  40. package/src/head/MRT_TableHeadCell.tsx +2 -2
  41. package/src/head/MRT_TableHeadCellResizeHandle.tsx +1 -1
  42. package/src/menus/MRT_ColumnActionMenu.tsx +3 -26
  43. package/src/menus/MRT_ShowHideColumnsMenu.tsx +4 -6
  44. package/src/menus/MRT_ShowHideColumnsMenuItems.tsx +3 -8
  45. package/src/toolbar/MRT_ToolbarDropZone.tsx +1 -0
@@ -1,4 +1,4 @@
1
- import React, { useMemo, useRef, useState, useCallback, useEffect, Fragment, memo, useLayoutEffect } from 'react';
1
+ import React, { useMemo, useState, useRef, useCallback, useEffect, Fragment, memo, useLayoutEffect } from 'react';
2
2
  import { aggregationFns, filterFns, sortingFns, useReactTable, getCoreRowModel, getExpandedRowModel, getFacetedRowModel, getFilteredRowModel, getGroupedRowModel, getPaginationRowModel, getSortedRowModel } from '@tanstack/react-table';
3
3
  import { alpha, lighten, useTheme, darken } from '@mui/material/styles';
4
4
  import { rankItem, rankings, compareItems } from '@tanstack/match-sorter-utils';
@@ -39,10 +39,6 @@ import ListItemIcon from '@mui/material/ListItemIcon';
39
39
  import Menu from '@mui/material/Menu';
40
40
  import MenuItem from '@mui/material/MenuItem';
41
41
  import Button from '@mui/material/Button';
42
- import Divider from '@mui/material/Divider';
43
- import FormControlLabel from '@mui/material/FormControlLabel';
44
- import Switch from '@mui/material/Switch';
45
- import Typography from '@mui/material/Typography';
46
42
  import Checkbox from '@mui/material/Checkbox';
47
43
  import Radio from '@mui/material/Radio';
48
44
  import Paper from '@mui/material/Paper';
@@ -57,6 +53,10 @@ import TablePagination from '@mui/material/TablePagination';
57
53
  import Alert from '@mui/material/Alert';
58
54
  import AlertTitle from '@mui/material/AlertTitle';
59
55
  import Chip from '@mui/material/Chip';
56
+ import Divider from '@mui/material/Divider';
57
+ import FormControlLabel from '@mui/material/FormControlLabel';
58
+ import Switch from '@mui/material/Switch';
59
+ import Typography from '@mui/material/Typography';
60
60
  import Fade from '@mui/material/Fade';
61
61
  import TableContainer from '@mui/material/TableContainer';
62
62
  import { useVirtualizer, defaultRangeExtractor } from '@tanstack/react-virtual';
@@ -200,13 +200,17 @@ const getTrailingDisplayColumnIds = (props) => {
200
200
  props.positionExpandColumn === 'last' &&
201
201
  showExpandColumn(props) &&
202
202
  'mrt-row-expand',
203
- ];
203
+ ].filter(Boolean);
204
+ };
205
+ const getDefaultColumnOrderIds = (props) => {
206
+ const leadingDisplayCols = getLeadingDisplayColumnIds(props);
207
+ const trailingDisplayCols = getTrailingDisplayColumnIds(props);
208
+ const allLeafColumnDefs = getAllLeafColumnDefs(props.columns)
209
+ .map((columnDef) => getColumnId(columnDef))
210
+ .filter((columnId) => !leadingDisplayCols.includes(columnId) &&
211
+ !trailingDisplayCols.includes(columnId));
212
+ return [...leadingDisplayCols, ...allLeafColumnDefs, ...trailingDisplayCols];
204
213
  };
205
- const getDefaultColumnOrderIds = (props) => [
206
- ...getLeadingDisplayColumnIds(props),
207
- ...getAllLeafColumnDefs(props.columns).map((columnDef) => getColumnId(columnDef)),
208
- ...getTrailingDisplayColumnIds(props),
209
- ].filter(Boolean);
210
214
  const getDefaultColumnFilterFn = (columnDef) => {
211
215
  if (columnDef.filterVariant === 'multi-select')
212
216
  return 'arrIncludesSome';
@@ -236,28 +240,33 @@ const getTotalRight = (table, column) => {
236
240
  };
237
241
  const getCommonCellStyles = ({ column, header, table, tableCellProps, theme, }) => {
238
242
  var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k;
239
- return (Object.assign(Object.assign({ backgroundColor: column.getIsPinned() && column.columnDef.columnDefType !== 'group'
243
+ const widthStyles = {
244
+ minWidth: `max(calc(var(--${header ? 'header' : 'col'}-${parseCSSVarId((_a = header === null || header === void 0 ? void 0 : header.id) !== null && _a !== void 0 ? _a : column.id)}-size) * 1px), ${(_b = column.columnDef.minSize) !== null && _b !== void 0 ? _b : 30}px)`,
245
+ width: `calc(var(--${header ? 'header' : 'col'}-${parseCSSVarId((_c = header === null || header === void 0 ? void 0 : header.id) !== null && _c !== void 0 ? _c : column.id)}-size) * 1px)`,
246
+ };
247
+ return Object.assign(Object.assign(Object.assign({ backgroundColor: column.getIsPinned() && column.columnDef.columnDefType !== 'group'
240
248
  ? alpha(lighten(theme.palette.background.default, 0.04), 0.97)
241
249
  : 'inherit', backgroundImage: 'inherit', boxShadow: getIsLastLeftPinnedColumn(table, column)
242
250
  ? `-4px 0 8px -6px ${alpha(theme.palette.common.black, 0.2)} inset`
243
251
  : getIsFirstRightPinnedColumn(column)
244
252
  ? `4px 0 8px -6px ${alpha(theme.palette.common.black, 0.2)} inset`
245
253
  : undefined, display: table.options.layoutMode === 'grid' ? 'flex' : 'table-cell', flex: table.options.layoutMode === 'grid'
246
- ? `var(--${header ? 'header' : 'col'}-${parseCSSVarId((_a = header === null || header === void 0 ? void 0 : header.id) !== null && _a !== void 0 ? _a : column.id)}-size) 0 auto`
254
+ ? `var(--${header ? 'header' : 'col'}-${parseCSSVarId((_d = header === null || header === void 0 ? void 0 : header.id) !== null && _d !== void 0 ? _d : column.id)}-size) 0 auto`
247
255
  : undefined, left: column.getIsPinned() === 'left'
248
256
  ? `${column.getStart('left')}px`
249
257
  : undefined, ml: table.options.enableColumnVirtualization &&
250
258
  column.getIsPinned() === 'left' &&
251
259
  column.getPinnedIndex() === 0
252
- ? `-${column.getSize() * ((_c = (_b = table.getState().columnPinning.left) === null || _b === void 0 ? void 0 : _b.length) !== null && _c !== void 0 ? _c : 1)}px`
260
+ ? `-${column.getSize() *
261
+ ((_f = (_e = table.getState().columnPinning.left) === null || _e === void 0 ? void 0 : _e.length) !== null && _f !== void 0 ? _f : 1)}px`
253
262
  : undefined, mr: table.options.enableColumnVirtualization &&
254
263
  column.getIsPinned() === 'right' &&
255
264
  column.getPinnedIndex() === table.getVisibleLeafColumns().length - 1
256
265
  ? `-${column.getSize() *
257
- ((_e = (_d = table.getState().columnPinning.right) === null || _d === void 0 ? void 0 : _d.length) !== null && _e !== void 0 ? _e : 1) *
266
+ ((_h = (_g = table.getState().columnPinning.right) === null || _g === void 0 ? void 0 : _g.length) !== null && _h !== void 0 ? _h : 1) *
258
267
  1.2}px`
259
- : undefined, opacity: ((_f = table.getState().draggingColumn) === null || _f === void 0 ? void 0 : _f.id) === column.id ||
260
- ((_g = table.getState().hoveredColumn) === null || _g === void 0 ? void 0 : _g.id) === column.id
268
+ : undefined, opacity: ((_j = table.getState().draggingColumn) === null || _j === void 0 ? void 0 : _j.id) === column.id ||
269
+ ((_k = table.getState().hoveredColumn) === null || _k === void 0 ? void 0 : _k.id) === column.id
261
270
  ? 0.5
262
271
  : 1, position: column.getIsPinned() && column.columnDef.columnDefType !== 'group'
263
272
  ? 'sticky'
@@ -265,9 +274,9 @@ const getCommonCellStyles = ({ column, header, table, tableCellProps, theme, })
265
274
  ? `${getTotalRight(table, column)}px`
266
275
  : undefined, transition: table.options.enableColumnVirtualization
267
276
  ? 'none'
268
- : `padding 150ms ease-in-out` }, ((tableCellProps === null || tableCellProps === void 0 ? void 0 : tableCellProps.sx) instanceof Function
277
+ : `padding 150ms ease-in-out` }, (!table.options.enableColumnResizing && widthStyles)), ((tableCellProps === null || tableCellProps === void 0 ? void 0 : tableCellProps.sx) instanceof Function
269
278
  ? tableCellProps.sx(theme)
270
- : tableCellProps === null || tableCellProps === void 0 ? void 0 : tableCellProps.sx)), { minWidth: `max(calc(var(--${header ? 'header' : 'col'}-${parseCSSVarId((_h = header === null || header === void 0 ? void 0 : header.id) !== null && _h !== void 0 ? _h : column.id)}-size) * 1px), ${(_j = column.columnDef.minSize) !== null && _j !== void 0 ? _j : 30}px)`, width: `calc(var(--${header ? 'header' : 'col'}-${parseCSSVarId((_k = header === null || header === void 0 ? void 0 : header.id) !== null && _k !== void 0 ? _k : column.id)}-size) * 1px)` }));
279
+ : tableCellProps === null || tableCellProps === void 0 ? void 0 : tableCellProps.sx)), (table.options.enableColumnResizing && widthStyles));
271
280
  };
272
281
  const MRT_DefaultColumn = {
273
282
  filterVariant: 'text',
@@ -660,168 +669,6 @@ const MRT_FilterOptionMenu = ({ anchorEl, header, onSelect, setAnchorEl, setFilt
660
669
  label)))));
661
670
  };
662
671
 
663
- const MRT_ColumnPinningButtons = ({ column, table, }) => {
664
- const { options: { icons: { PushPinIcon }, localization, }, } = table;
665
- const handlePinColumn = (pinDirection) => {
666
- column.pin(pinDirection);
667
- };
668
- return (React.createElement(Box, { sx: { minWidth: '70px', textAlign: 'center' } }, column.getIsPinned() ? (React.createElement(Tooltip, { arrow: true, title: localization.unpin },
669
- React.createElement(IconButton, { onClick: () => handlePinColumn(false), size: "small" },
670
- React.createElement(PushPinIcon, null)))) : (React.createElement(React.Fragment, null,
671
- React.createElement(Tooltip, { arrow: true, title: localization.pinToLeft },
672
- React.createElement(IconButton, { onClick: () => handlePinColumn('left'), size: "small" },
673
- React.createElement(PushPinIcon, { style: {
674
- transform: 'rotate(90deg)',
675
- } }))),
676
- React.createElement(Tooltip, { arrow: true, title: localization.pinToRight },
677
- React.createElement(IconButton, { onClick: () => handlePinColumn('right'), size: "small" },
678
- React.createElement(PushPinIcon, { style: {
679
- transform: 'rotate(-90deg)',
680
- } })))))));
681
- };
682
-
683
- const MRT_GrabHandleButton = ({ iconButtonProps, onDragEnd, onDragStart, table, }) => {
684
- var _a;
685
- const { options: { icons: { DragHandleIcon }, localization, }, } = table;
686
- return (React.createElement(Tooltip, { arrow: true, enterDelay: 1000, enterNextDelay: 1000, placement: "top", title: (_a = iconButtonProps === null || iconButtonProps === void 0 ? void 0 : iconButtonProps.title) !== null && _a !== void 0 ? _a : localization.move },
687
- React.createElement(IconButton, Object.assign({ disableRipple: true, draggable: "true", size: "small" }, iconButtonProps, { onClick: (e) => {
688
- var _a;
689
- e.stopPropagation();
690
- (_a = iconButtonProps === null || iconButtonProps === void 0 ? void 0 : iconButtonProps.onClick) === null || _a === void 0 ? void 0 : _a.call(iconButtonProps, e);
691
- }, onDragStart: onDragStart, onDragEnd: onDragEnd, sx: (theme) => (Object.assign({ cursor: 'grab', m: '0 -0.1rem', opacity: 0.5, p: '2px', transition: 'all 150ms ease-in-out', '&:hover': {
692
- backgroundColor: 'transparent',
693
- opacity: 1,
694
- }, '&:active': {
695
- cursor: 'grabbing',
696
- } }, ((iconButtonProps === null || iconButtonProps === void 0 ? void 0 : iconButtonProps.sx) instanceof Function
697
- ? iconButtonProps === null || iconButtonProps === void 0 ? void 0 : iconButtonProps.sx(theme)
698
- : iconButtonProps === null || iconButtonProps === void 0 ? void 0 : iconButtonProps.sx))), title: undefined }),
699
- React.createElement(DragHandleIcon, null))));
700
- };
701
-
702
- const MRT_ShowHideColumnsMenuItems = ({ allColumns, hoveredColumn, setHoveredColumn, column, isSubMenu, table, }) => {
703
- var _a;
704
- const { getState, options: { enableColumnOrdering, enableHiding, enablePinning, localization, }, setColumnOrder, } = table;
705
- const { columnOrder } = getState();
706
- const { columnDef } = column;
707
- const { columnDefType } = columnDef;
708
- const switchChecked = (columnDefType !== 'group' && column.getIsVisible()) ||
709
- (columnDefType === 'group' &&
710
- column.getLeafColumns().some((col) => col.getIsVisible()));
711
- const handleToggleColumnHidden = (column) => {
712
- var _a, _b;
713
- if (columnDefType === 'group') {
714
- (_b = (_a = column === null || column === void 0 ? void 0 : column.columns) === null || _a === void 0 ? void 0 : _a.forEach) === null || _b === void 0 ? void 0 : _b.call(_a, (childColumn) => {
715
- childColumn.toggleVisibility(!switchChecked);
716
- });
717
- }
718
- else {
719
- column.toggleVisibility();
720
- }
721
- };
722
- const menuItemRef = useRef(null);
723
- const [isDragging, setIsDragging] = useState(false);
724
- const handleDragStart = (e) => {
725
- setIsDragging(true);
726
- e.dataTransfer.setDragImage(menuItemRef.current, 0, 0);
727
- };
728
- const handleDragEnd = (_e) => {
729
- setIsDragging(false);
730
- setHoveredColumn(null);
731
- if (hoveredColumn) {
732
- setColumnOrder(reorderColumn(column, hoveredColumn, columnOrder));
733
- }
734
- };
735
- const handleDragEnter = (_e) => {
736
- if (!isDragging && columnDef.enableColumnOrdering !== false) {
737
- setHoveredColumn(column);
738
- }
739
- };
740
- return (React.createElement(React.Fragment, null,
741
- React.createElement(MenuItem, { disableRipple: true, ref: menuItemRef, onDragEnter: handleDragEnter, sx: (theme) => ({
742
- alignItems: 'center',
743
- justifyContent: 'flex-start',
744
- my: 0,
745
- opacity: isDragging ? 0.5 : 1,
746
- outlineOffset: '-2px',
747
- outline: isDragging
748
- ? `2px dashed ${theme.palette.divider}`
749
- : (hoveredColumn === null || hoveredColumn === void 0 ? void 0 : hoveredColumn.id) === column.id
750
- ? `2px dashed ${theme.palette.primary.main}`
751
- : 'none',
752
- pl: `${(column.depth + 0.5) * 2}rem`,
753
- py: '6px',
754
- }) },
755
- React.createElement(Box, { sx: {
756
- display: 'flex',
757
- flexWrap: 'nowrap',
758
- gap: '8px',
759
- } },
760
- !isSubMenu &&
761
- columnDefType !== 'group' &&
762
- enableColumnOrdering &&
763
- !allColumns.some((col) => col.columnDef.columnDefType === 'group') &&
764
- (columnDef.enableColumnOrdering !== false ? (React.createElement(MRT_GrabHandleButton, { onDragEnd: handleDragEnd, onDragStart: handleDragStart, table: table })) : (React.createElement(Box, { sx: { width: '28px' } }))),
765
- !isSubMenu &&
766
- enablePinning &&
767
- (column.getCanPin() ? (React.createElement(MRT_ColumnPinningButtons, { column: column, table: table })) : (React.createElement(Box, { sx: { width: '70px' } }))),
768
- enableHiding ? (React.createElement(FormControlLabel, { componentsProps: {
769
- typography: {
770
- sx: {
771
- mb: 0,
772
- opacity: columnDefType !== 'display' ? 1 : 0.5,
773
- },
774
- },
775
- }, checked: switchChecked, control: React.createElement(Tooltip, { arrow: true, enterDelay: 1000, enterNextDelay: 1000, title: localization.toggleVisibility },
776
- React.createElement(Switch, null)), disabled: (isSubMenu && switchChecked) || !column.getCanHide(), label: columnDef.header, onChange: () => handleToggleColumnHidden(column) })) : (React.createElement(Typography, { sx: { alignSelf: 'center' } }, columnDef.header)))), (_a = column.columns) === null || _a === void 0 ? void 0 :
777
- _a.map((c, i) => (React.createElement(MRT_ShowHideColumnsMenuItems, { allColumns: allColumns, column: c, hoveredColumn: hoveredColumn, isSubMenu: isSubMenu, key: `${i}-${c.id}`, setHoveredColumn: setHoveredColumn, table: table })))));
778
- };
779
-
780
- const MRT_ShowHideColumnsMenu = ({ anchorEl, isSubMenu, setAnchorEl, table, }) => {
781
- const { getAllColumns, getAllLeafColumns, getCenterLeafColumns, getIsAllColumnsVisible, getIsSomeColumnsPinned, getIsSomeColumnsVisible, getLeftLeafColumns, getRightLeafColumns, getState, toggleAllColumnsVisible, options: { enableColumnOrdering, enableHiding, enablePinning, localization, }, } = table;
782
- const { density, columnOrder, columnPinning } = getState();
783
- const hideAllColumns = () => {
784
- getAllLeafColumns()
785
- .filter((col) => col.columnDef.enableHiding !== false)
786
- .forEach((col) => col.toggleVisibility(false));
787
- };
788
- const allColumns = useMemo(() => {
789
- const columns = getAllColumns();
790
- if (columnOrder.length > 0 &&
791
- !columns.some((col) => col.columnDef.columnDefType === 'group')) {
792
- return [
793
- ...getLeftLeafColumns(),
794
- ...Array.from(new Set(columnOrder)).map((colId) => getCenterLeafColumns().find((col) => (col === null || col === void 0 ? void 0 : col.id) === colId)),
795
- ...getRightLeafColumns(),
796
- ].filter(Boolean);
797
- }
798
- return columns;
799
- }, [
800
- columnOrder,
801
- columnPinning,
802
- getAllColumns(),
803
- getCenterLeafColumns(),
804
- getLeftLeafColumns(),
805
- getRightLeafColumns(),
806
- ]);
807
- const [hoveredColumn, setHoveredColumn] = useState(null);
808
- return (React.createElement(Menu, { anchorEl: anchorEl, open: !!anchorEl, onClose: () => setAnchorEl(null), MenuListProps: {
809
- dense: density === 'compact',
810
- } },
811
- React.createElement(Box, { sx: {
812
- display: 'flex',
813
- justifyContent: isSubMenu ? 'center' : 'space-between',
814
- p: '0.5rem',
815
- pt: 0,
816
- } },
817
- !isSubMenu && enableHiding && (React.createElement(Button, { disabled: !getIsSomeColumnsVisible(), onClick: hideAllColumns }, localization.hideAll)),
818
- !isSubMenu && enableColumnOrdering && (React.createElement(Button, { onClick: () => table.setColumnOrder(getDefaultColumnOrderIds(table.options)) }, localization.resetOrder)),
819
- !isSubMenu && enablePinning && (React.createElement(Button, { disabled: !getIsSomeColumnsPinned(), onClick: () => table.resetColumnPinning(true) }, localization.unpinAll)),
820
- enableHiding && (React.createElement(Button, { disabled: getIsAllColumnsVisible(), onClick: () => toggleAllColumnsVisible(true) }, localization.showAll))),
821
- React.createElement(Divider, null),
822
- allColumns.map((column, index) => (React.createElement(MRT_ShowHideColumnsMenuItems, { allColumns: allColumns, column: column, hoveredColumn: hoveredColumn, isSubMenu: isSubMenu, key: `${index}-${column.id}`, setHoveredColumn: setHoveredColumn, table: table })))));
823
- };
824
-
825
672
  const commonMenuItemStyles = {
826
673
  py: '6px',
827
674
  my: 0,
@@ -837,9 +684,8 @@ const MRT_ColumnActionMenu = ({ anchorEl, header, setAnchorEl, table, }) => {
837
684
  const { getState, toggleAllColumnsVisible, setColumnOrder, options: { columnFilterModeOptions, enableColumnFilterModes, enableColumnFilters, enableColumnResizing, enableGrouping, enableHiding, enablePinning, enableSorting, icons: { ArrowRightIcon, ClearAllIcon, ViewColumnIcon, DynamicFeedIcon, FilterListIcon, FilterListOffIcon, PushPinIcon, SortIcon, RestartAltIcon, VisibilityOffIcon, }, localization, renderColumnActionsMenuItems, }, refs: { filterInputRefs }, setColumnSizingInfo, setShowColumnFilters, } = table;
838
685
  const { column } = header;
839
686
  const { columnDef } = column;
840
- const { columnSizing, columnVisibility, density } = getState();
687
+ const { columnSizing, columnVisibility, density, showColumnFilters } = getState();
841
688
  const [filterMenuAnchorEl, setFilterMenuAnchorEl] = useState(null);
842
- const [showHideColumnsMenuAnchorEl, setShowHideColumnsMenuAnchorEl] = useState(null);
843
689
  const handleClearSort = () => {
844
690
  column.clearSorting();
845
691
  setAnchorEl(null);
@@ -887,10 +733,6 @@ const MRT_ColumnActionMenu = ({ anchorEl, header, setAnchorEl, table, }) => {
887
733
  event.stopPropagation();
888
734
  setFilterMenuAnchorEl(event.currentTarget);
889
735
  };
890
- const handleOpenShowHideColumnsMenu = (event) => {
891
- event.stopPropagation();
892
- setShowHideColumnsMenuAnchorEl(event.currentTarget);
893
- };
894
736
  const isSelectFilter = !!columnDef.filterSelectOptions;
895
737
  const allowedColumnFilterOptions = (_a = columnDef === null || columnDef === void 0 ? void 0 : columnDef.columnFilterModeOptions) !== null && _a !== void 0 ? _a : columnFilterModeOptions;
896
738
  const showFilterModeSubMenu = enableColumnFilterModes &&
@@ -934,7 +776,7 @@ const MRT_ColumnActionMenu = ({ anchorEl, header, setAnchorEl, table, }) => {
934
776
  React.createElement(ListItemIcon, null,
935
777
  React.createElement(FilterListOffIcon, null)),
936
778
  localization.clearFilter)),
937
- React.createElement(MenuItem, { divider: enableGrouping || enableHiding, key: 1, onClick: handleFilterByColumn, sx: commonMenuItemStyles },
779
+ React.createElement(MenuItem, { disabled: showColumnFilters && !enableColumnFilterModes, divider: enableGrouping || enableHiding, key: 1, onClick: handleFilterByColumn, sx: commonMenuItemStyles },
938
780
  React.createElement(Box, { sx: commonListItemStyles },
939
781
  React.createElement(ListItemIcon, null,
940
782
  React.createElement(FilterListIcon, null)), (_g = localization.filterByColumn) === null || _g === void 0 ? void 0 :
@@ -988,10 +830,7 @@ const MRT_ColumnActionMenu = ({ anchorEl, header, setAnchorEl, table, }) => {
988
830
  React.createElement(Box, { sx: commonListItemStyles },
989
831
  React.createElement(ListItemIcon, null,
990
832
  React.createElement(ViewColumnIcon, null)), (_k = localization.showAllColumns) === null || _k === void 0 ? void 0 :
991
- _k.replace('{column}', String(columnDef.header))),
992
- React.createElement(IconButton, { onClick: handleOpenShowHideColumnsMenu, onMouseEnter: handleOpenShowHideColumnsMenu, size: "small", sx: { p: 0 } },
993
- React.createElement(ArrowRightIcon, null))),
994
- React.createElement(MRT_ShowHideColumnsMenu, { anchorEl: showHideColumnsMenuAnchorEl, isSubMenu: true, key: 2, setAnchorEl: setShowHideColumnsMenuAnchorEl, table: table }),
833
+ _k.replace('{column}', String(columnDef.header)))),
995
834
  ]));
996
835
  };
997
836
 
@@ -1282,6 +1121,166 @@ const MRT_FullScreenToggleButton = (_a) => {
1282
1121
  React.createElement(IconButton, Object.assign({ "aria-label": localization.showHideFilters, onClick: handleToggleFullScreen }, rest, { title: undefined }), isFullScreen ? React.createElement(FullscreenExitIcon, null) : React.createElement(FullscreenIcon, null))));
1283
1122
  };
1284
1123
 
1124
+ const MRT_ColumnPinningButtons = ({ column, table, }) => {
1125
+ const { options: { icons: { PushPinIcon }, localization, }, } = table;
1126
+ const handlePinColumn = (pinDirection) => {
1127
+ column.pin(pinDirection);
1128
+ };
1129
+ return (React.createElement(Box, { sx: { minWidth: '70px', textAlign: 'center' } }, column.getIsPinned() ? (React.createElement(Tooltip, { arrow: true, title: localization.unpin },
1130
+ React.createElement(IconButton, { onClick: () => handlePinColumn(false), size: "small" },
1131
+ React.createElement(PushPinIcon, null)))) : (React.createElement(React.Fragment, null,
1132
+ React.createElement(Tooltip, { arrow: true, title: localization.pinToLeft },
1133
+ React.createElement(IconButton, { onClick: () => handlePinColumn('left'), size: "small" },
1134
+ React.createElement(PushPinIcon, { style: {
1135
+ transform: 'rotate(90deg)',
1136
+ } }))),
1137
+ React.createElement(Tooltip, { arrow: true, title: localization.pinToRight },
1138
+ React.createElement(IconButton, { onClick: () => handlePinColumn('right'), size: "small" },
1139
+ React.createElement(PushPinIcon, { style: {
1140
+ transform: 'rotate(-90deg)',
1141
+ } })))))));
1142
+ };
1143
+
1144
+ const MRT_GrabHandleButton = ({ iconButtonProps, onDragEnd, onDragStart, table, }) => {
1145
+ var _a;
1146
+ const { options: { icons: { DragHandleIcon }, localization, }, } = table;
1147
+ return (React.createElement(Tooltip, { arrow: true, enterDelay: 1000, enterNextDelay: 1000, placement: "top", title: (_a = iconButtonProps === null || iconButtonProps === void 0 ? void 0 : iconButtonProps.title) !== null && _a !== void 0 ? _a : localization.move },
1148
+ React.createElement(IconButton, Object.assign({ disableRipple: true, draggable: "true", size: "small" }, iconButtonProps, { onClick: (e) => {
1149
+ var _a;
1150
+ e.stopPropagation();
1151
+ (_a = iconButtonProps === null || iconButtonProps === void 0 ? void 0 : iconButtonProps.onClick) === null || _a === void 0 ? void 0 : _a.call(iconButtonProps, e);
1152
+ }, onDragStart: onDragStart, onDragEnd: onDragEnd, sx: (theme) => (Object.assign({ cursor: 'grab', m: '0 -0.1rem', opacity: 0.5, p: '2px', transition: 'all 150ms ease-in-out', '&:hover': {
1153
+ backgroundColor: 'transparent',
1154
+ opacity: 1,
1155
+ }, '&:active': {
1156
+ cursor: 'grabbing',
1157
+ } }, ((iconButtonProps === null || iconButtonProps === void 0 ? void 0 : iconButtonProps.sx) instanceof Function
1158
+ ? iconButtonProps === null || iconButtonProps === void 0 ? void 0 : iconButtonProps.sx(theme)
1159
+ : iconButtonProps === null || iconButtonProps === void 0 ? void 0 : iconButtonProps.sx))), title: undefined }),
1160
+ React.createElement(DragHandleIcon, null))));
1161
+ };
1162
+
1163
+ const MRT_ShowHideColumnsMenuItems = ({ allColumns, hoveredColumn, setHoveredColumn, column, table, }) => {
1164
+ var _a;
1165
+ const { getState, options: { enableColumnOrdering, enableHiding, enablePinning, localization, }, setColumnOrder, } = table;
1166
+ const { columnOrder } = getState();
1167
+ const { columnDef } = column;
1168
+ const { columnDefType } = columnDef;
1169
+ const switchChecked = (columnDefType !== 'group' && column.getIsVisible()) ||
1170
+ (columnDefType === 'group' &&
1171
+ column.getLeafColumns().some((col) => col.getIsVisible()));
1172
+ const handleToggleColumnHidden = (column) => {
1173
+ var _a, _b;
1174
+ if (columnDefType === 'group') {
1175
+ (_b = (_a = column === null || column === void 0 ? void 0 : column.columns) === null || _a === void 0 ? void 0 : _a.forEach) === null || _b === void 0 ? void 0 : _b.call(_a, (childColumn) => {
1176
+ childColumn.toggleVisibility(!switchChecked);
1177
+ });
1178
+ }
1179
+ else {
1180
+ column.toggleVisibility();
1181
+ }
1182
+ };
1183
+ const menuItemRef = useRef(null);
1184
+ const [isDragging, setIsDragging] = useState(false);
1185
+ const handleDragStart = (e) => {
1186
+ setIsDragging(true);
1187
+ e.dataTransfer.setDragImage(menuItemRef.current, 0, 0);
1188
+ };
1189
+ const handleDragEnd = (_e) => {
1190
+ setIsDragging(false);
1191
+ setHoveredColumn(null);
1192
+ if (hoveredColumn) {
1193
+ setColumnOrder(reorderColumn(column, hoveredColumn, columnOrder));
1194
+ }
1195
+ };
1196
+ const handleDragEnter = (_e) => {
1197
+ if (!isDragging && columnDef.enableColumnOrdering !== false) {
1198
+ setHoveredColumn(column);
1199
+ }
1200
+ };
1201
+ return (React.createElement(React.Fragment, null,
1202
+ React.createElement(MenuItem, { disableRipple: true, ref: menuItemRef, onDragEnter: handleDragEnter, sx: (theme) => ({
1203
+ alignItems: 'center',
1204
+ justifyContent: 'flex-start',
1205
+ my: 0,
1206
+ opacity: isDragging ? 0.5 : 1,
1207
+ outlineOffset: '-2px',
1208
+ outline: isDragging
1209
+ ? `2px dashed ${theme.palette.divider}`
1210
+ : (hoveredColumn === null || hoveredColumn === void 0 ? void 0 : hoveredColumn.id) === column.id
1211
+ ? `2px dashed ${theme.palette.primary.main}`
1212
+ : 'none',
1213
+ pl: `${(column.depth + 0.5) * 2}rem`,
1214
+ py: '6px',
1215
+ }) },
1216
+ React.createElement(Box, { sx: {
1217
+ display: 'flex',
1218
+ flexWrap: 'nowrap',
1219
+ gap: '8px',
1220
+ } },
1221
+ columnDefType !== 'group' &&
1222
+ enableColumnOrdering &&
1223
+ !allColumns.some((col) => col.columnDef.columnDefType === 'group') &&
1224
+ (columnDef.enableColumnOrdering !== false ? (React.createElement(MRT_GrabHandleButton, { onDragEnd: handleDragEnd, onDragStart: handleDragStart, table: table })) : (React.createElement(Box, { sx: { width: '28px' } }))),
1225
+ enablePinning &&
1226
+ (column.getCanPin() ? (React.createElement(MRT_ColumnPinningButtons, { column: column, table: table })) : (React.createElement(Box, { sx: { width: '70px' } }))),
1227
+ enableHiding ? (React.createElement(FormControlLabel, { componentsProps: {
1228
+ typography: {
1229
+ sx: {
1230
+ mb: 0,
1231
+ opacity: columnDefType !== 'display' ? 1 : 0.5,
1232
+ },
1233
+ },
1234
+ }, checked: switchChecked, control: React.createElement(Tooltip, { arrow: true, enterDelay: 1000, enterNextDelay: 1000, title: localization.toggleVisibility },
1235
+ React.createElement(Switch, null)), disabled: !column.getCanHide(), label: columnDef.header, onChange: () => handleToggleColumnHidden(column) })) : (React.createElement(Typography, { sx: { alignSelf: 'center' } }, columnDef.header)))), (_a = column.columns) === null || _a === void 0 ? void 0 :
1236
+ _a.map((c, i) => (React.createElement(MRT_ShowHideColumnsMenuItems, { allColumns: allColumns, column: c, hoveredColumn: hoveredColumn, key: `${i}-${c.id}`, setHoveredColumn: setHoveredColumn, table: table })))));
1237
+ };
1238
+
1239
+ const MRT_ShowHideColumnsMenu = ({ anchorEl, setAnchorEl, table, }) => {
1240
+ const { getAllColumns, getAllLeafColumns, getCenterLeafColumns, getIsAllColumnsVisible, getIsSomeColumnsPinned, getIsSomeColumnsVisible, getLeftLeafColumns, getRightLeafColumns, getState, toggleAllColumnsVisible, options: { enableColumnOrdering, enableHiding, enablePinning, localization, }, } = table;
1241
+ const { density, columnOrder, columnPinning } = getState();
1242
+ const hideAllColumns = () => {
1243
+ getAllLeafColumns()
1244
+ .filter((col) => col.columnDef.enableHiding !== false)
1245
+ .forEach((col) => col.toggleVisibility(false));
1246
+ };
1247
+ const allColumns = useMemo(() => {
1248
+ const columns = getAllColumns();
1249
+ if (columnOrder.length > 0 &&
1250
+ !columns.some((col) => col.columnDef.columnDefType === 'group')) {
1251
+ return [
1252
+ ...getLeftLeafColumns(),
1253
+ ...Array.from(new Set(columnOrder)).map((colId) => getCenterLeafColumns().find((col) => (col === null || col === void 0 ? void 0 : col.id) === colId)),
1254
+ ...getRightLeafColumns(),
1255
+ ].filter(Boolean);
1256
+ }
1257
+ return columns;
1258
+ }, [
1259
+ columnOrder,
1260
+ columnPinning,
1261
+ getAllColumns(),
1262
+ getCenterLeafColumns(),
1263
+ getLeftLeafColumns(),
1264
+ getRightLeafColumns(),
1265
+ ]);
1266
+ const [hoveredColumn, setHoveredColumn] = useState(null);
1267
+ return (React.createElement(Menu, { anchorEl: anchorEl, open: !!anchorEl, onClose: () => setAnchorEl(null), MenuListProps: {
1268
+ dense: density === 'compact',
1269
+ } },
1270
+ React.createElement(Box, { sx: {
1271
+ display: 'flex',
1272
+ justifyContent: 'space-between',
1273
+ p: '0.5rem',
1274
+ pt: 0,
1275
+ } },
1276
+ enableHiding && (React.createElement(Button, { disabled: !getIsSomeColumnsVisible(), onClick: hideAllColumns }, localization.hideAll)),
1277
+ enableColumnOrdering && (React.createElement(Button, { onClick: () => table.setColumnOrder(getDefaultColumnOrderIds(table.options)) }, localization.resetOrder)),
1278
+ enablePinning && (React.createElement(Button, { disabled: !getIsSomeColumnsPinned(), onClick: () => table.resetColumnPinning(true) }, localization.unpinAll)),
1279
+ enableHiding && (React.createElement(Button, { disabled: getIsAllColumnsVisible(), onClick: () => toggleAllColumnsVisible(true) }, localization.showAll))),
1280
+ React.createElement(Divider, null),
1281
+ allColumns.map((column, index) => (React.createElement(MRT_ShowHideColumnsMenuItems, { allColumns: allColumns, column: column, hoveredColumn: hoveredColumn, key: `${index}-${column.id}`, setHoveredColumn: setHoveredColumn, table: table })))));
1282
+ };
1283
+
1285
1284
  const MRT_ShowHideColumnsButton = (_a) => {
1286
1285
  var _b;
1287
1286
  var { table } = _a, rest = __rest(_a, ["table"]);
@@ -1370,6 +1369,7 @@ const MRT_ToolbarDropZone = ({ table, }) => {
1370
1369
  if (((_a = table.options.state) === null || _a === void 0 ? void 0 : _a.showToolbarDropZone) !== undefined) {
1371
1370
  setShowToolbarDropZone(!!enableGrouping &&
1372
1371
  !!draggingColumn &&
1372
+ draggingColumn.columnDef.enableGrouping !== false &&
1373
1373
  !grouping.includes(draggingColumn.id));
1374
1374
  }
1375
1375
  }, [enableGrouping, draggingColumn, grouping]);
@@ -1870,7 +1870,7 @@ const MRT_TableHeadCellResizeHandle = ({ header, table }) => {
1870
1870
  cursor: 'col-resize',
1871
1871
  mr: density === 'compact' ? '-0.75rem' : '-1rem',
1872
1872
  position: 'absolute',
1873
- right: '1px',
1873
+ right: '4px',
1874
1874
  px: '4px',
1875
1875
  '&:active > hr': {
1876
1876
  backgroundColor: theme.palette.info.main,
@@ -2014,7 +2014,7 @@ const MRT_TableHeadCell = ({ header, table }) => {
2014
2014
  theme,
2015
2015
  })), draggingBorders)) }),
2016
2016
  header.isPlaceholder ? null : (React.createElement(Box, { className: "Mui-TableHeadCell-Content", sx: {
2017
- alignItems: 'flex-start',
2017
+ alignItems: 'center',
2018
2018
  display: 'flex',
2019
2019
  flexDirection: (tableCellProps === null || tableCellProps === void 0 ? void 0 : tableCellProps.align) === 'right' ? 'row-reverse' : 'row',
2020
2020
  justifyContent: columnDefType === 'group' || (tableCellProps === null || tableCellProps === void 0 ? void 0 : tableCellProps.align) === 'center'
@@ -2038,7 +2038,7 @@ const MRT_TableHeadCell = ({ header, table }) => {
2038
2038
  : undefined,
2039
2039
  } },
2040
2040
  React.createElement(Box, { className: "Mui-TableHeadCell-Content-Wrapper", sx: {
2041
- minWidth: '5ch',
2041
+ minWidth: `${Math.min(columnDef.header.length, 5)}ch`,
2042
2042
  overflow: columnDefType === 'data' ? 'hidden' : undefined,
2043
2043
  textOverflow: 'ellipsis',
2044
2044
  whiteSpace: ((_d = (_c = columnDef.header) === null || _c === void 0 ? void 0 : _c.length) !== null && _d !== void 0 ? _d : 0) < 20 ? 'nowrap' : 'normal',
@@ -2436,11 +2436,11 @@ const MRT_TableBodyCell = ({ cell, measureElement, numRows, rowIndex, rowRef, ta
2436
2436
  };
2437
2437
  const Memo_MRT_TableBodyCell = memo(MRT_TableBodyCell, (prev, next) => next.cell === prev.cell);
2438
2438
 
2439
- const MRT_TableDetailPanel = ({ parentRowRef, row, table, virtualRow, }) => {
2439
+ const MRT_TableDetailPanel = ({ parentRowRef, row, rowIndex, table, virtualRow, }) => {
2440
2440
  const { getVisibleLeafColumns, getState, options: { layoutMode, muiTableBodyRowProps, muiTableDetailPanelProps, renderDetailPanel, }, } = table;
2441
2441
  const { isLoading } = getState();
2442
2442
  const tableRowProps = muiTableBodyRowProps instanceof Function
2443
- ? muiTableBodyRowProps({ isDetailPanel: true, row, table })
2443
+ ? muiTableBodyRowProps({ isDetailPanel: true, row, staticRowIndex: rowIndex, table })
2444
2444
  : muiTableBodyRowProps;
2445
2445
  const tableCellProps = muiTableDetailPanelProps instanceof Function
2446
2446
  ? muiTableDetailPanelProps({ row, table })
@@ -2466,7 +2466,7 @@ const MRT_TableBodyRow = ({ columnVirtualizer, measureElement, numRows, row, row
2466
2466
  const { getState, options: { enableRowOrdering, layoutMode, memoMode, muiTableBodyRowProps, renderDetailPanel, }, setHoveredRow, } = table;
2467
2467
  const { draggingColumn, draggingRow, editingCell, editingRow, hoveredRow } = getState();
2468
2468
  const tableRowProps = muiTableBodyRowProps instanceof Function
2469
- ? muiTableBodyRowProps({ row, table })
2469
+ ? muiTableBodyRowProps({ row, staticRowIndex: rowIndex, table })
2470
2470
  : muiTableBodyRowProps;
2471
2471
  const handleDragEnter = (_e) => {
2472
2472
  if (enableRowOrdering && draggingRow) {
@@ -2518,13 +2518,13 @@ const MRT_TableBodyRow = ({ columnVirtualizer, measureElement, numRows, row, row
2518
2518
  (editingRow === null || editingRow === void 0 ? void 0 : editingRow.id) !== row.id ? (React.createElement(Memo_MRT_TableBodyCell, Object.assign({}, props))) : (React.createElement(MRT_TableBodyCell, Object.assign({}, props)));
2519
2519
  }),
2520
2520
  virtualPaddingRight ? (React.createElement("td", { style: { display: 'flex', width: virtualPaddingRight } })) : null),
2521
- renderDetailPanel && !row.getIsGrouped() && (React.createElement(MRT_TableDetailPanel, { parentRowRef: rowRef, row: row, table: table, virtualRow: virtualRow }))));
2521
+ renderDetailPanel && !row.getIsGrouped() && (React.createElement(MRT_TableDetailPanel, { parentRowRef: rowRef, row: row, rowIndex: rowIndex, table: table, virtualRow: virtualRow }))));
2522
2522
  };
2523
2523
  const Memo_MRT_TableBodyRow = memo(MRT_TableBodyRow, (prev, next) => prev.row === next.row && prev.rowIndex === next.rowIndex);
2524
2524
 
2525
2525
  const MRT_TableBody = ({ columnVirtualizer, table, virtualColumns, virtualPaddingLeft, virtualPaddingRight, }) => {
2526
- var _a, _b, _c;
2527
- const { getRowModel, getPrePaginationRowModel, getState, options: { enableGlobalFilterRankedResults, enablePagination, enableRowVirtualization, layoutMode, localization, manualExpanding, manualFiltering, manualGrouping, manualPagination, manualSorting, memoMode, muiTableBodyProps, rowVirtualizerInstanceRef, rowVirtualizerProps, virtualizerInstanceRef, virtualizerProps, }, refs: { tableContainerRef, tablePaperRef }, } = table;
2526
+ var _a, _b, _c, _d;
2527
+ const { getRowModel, getPrePaginationRowModel, getState, options: { enableGlobalFilterRankedResults, enablePagination, enableRowVirtualization, layoutMode, localization, manualExpanding, manualFiltering, manualGrouping, manualPagination, manualSorting, memoMode, muiTableBodyProps, renderEmptyRowsFallback, rowVirtualizerInstanceRef, rowVirtualizerProps, virtualizerInstanceRef, virtualizerProps, }, refs: { tableContainerRef, tablePaperRef }, } = table;
2528
2528
  const { columnFilters, density, expanded, globalFilter, globalFilterFn, pagination, sorting, } = getState();
2529
2529
  const tableBodyProps = muiTableBodyProps instanceof Function
2530
2530
  ? muiTableBodyProps({ table })
@@ -2587,17 +2587,18 @@ const MRT_TableBody = ({ columnVirtualizer, table, virtualColumns, virtualPaddin
2587
2587
  : 'inherit', minHeight: !rows.length ? '100px' : undefined, position: 'relative' }, ((tableBodyProps === null || tableBodyProps === void 0 ? void 0 : tableBodyProps.sx) instanceof Function
2588
2588
  ? tableBodyProps === null || tableBodyProps === void 0 ? void 0 : tableBodyProps.sx(theme)
2589
2589
  : 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.createElement("tr", { style: { display: layoutMode === 'grid' ? 'grid' : 'table-row' } },
2590
- React.createElement("td", { colSpan: table.getVisibleLeafColumns().length, style: { display: layoutMode === 'grid' ? 'grid' : 'table-cell' } },
2591
- React.createElement(Typography, { sx: {
2592
- color: 'text.secondary',
2593
- fontStyle: 'italic',
2594
- maxWidth: `min(100vw, ${(_c = (_b = tablePaperRef.current) === null || _b === void 0 ? void 0 : _b.clientWidth) !== null && _c !== void 0 ? _c : 360}px)`,
2595
- py: '2rem',
2596
- textAlign: 'center',
2597
- width: '100%',
2598
- } }, globalFilter || columnFilters.length
2599
- ? localization.noResultsFound
2600
- : localization.noRecordsToDisplay)))) : (React.createElement(React.Fragment, null, (virtualRows !== null && virtualRows !== void 0 ? virtualRows : rows).map((rowOrVirtualRow, rowIndex) => {
2590
+ React.createElement("td", { colSpan: table.getVisibleLeafColumns().length, style: {
2591
+ display: layoutMode === 'grid' ? 'grid' : 'table-cell',
2592
+ } }, (_b = renderEmptyRowsFallback === null || renderEmptyRowsFallback === void 0 ? void 0 : renderEmptyRowsFallback({ table })) !== null && _b !== void 0 ? _b : (React.createElement(Typography, { sx: {
2593
+ color: 'text.secondary',
2594
+ fontStyle: 'italic',
2595
+ maxWidth: `min(100vw, ${(_d = (_c = tablePaperRef.current) === null || _c === void 0 ? void 0 : _c.clientWidth) !== null && _d !== void 0 ? _d : 360}px)`,
2596
+ py: '2rem',
2597
+ textAlign: 'center',
2598
+ width: '100%',
2599
+ } }, globalFilter || columnFilters.length
2600
+ ? localization.noResultsFound
2601
+ : localization.noRecordsToDisplay))))) : (React.createElement(React.Fragment, null, (virtualRows !== null && virtualRows !== void 0 ? virtualRows : rows).map((rowOrVirtualRow, rowIndex) => {
2601
2602
  const row = rowVirtualizer
2602
2603
  ? rows[rowOrVirtualRow.index]
2603
2604
  : rowOrVirtualRow;