material-react-table 2.5.2 → 2.6.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.
package/package.json CHANGED
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "2.5.2",
2
+ "version": "2.6.0",
3
3
  "license": "MIT",
4
4
  "name": "material-react-table",
5
5
  "description": "A fully featured Material UI V5 implementation of TanStack React Table V8, written from the ground up in TypeScript.",
@@ -68,7 +68,7 @@
68
68
  "@faker-js/faker": "^8.3.1",
69
69
  "@mui/icons-material": "^5.15.4",
70
70
  "@mui/material": "^5.15.4",
71
- "@mui/x-date-pickers": "^6.18.7",
71
+ "@mui/x-date-pickers": "^6.19.0",
72
72
  "@rollup/plugin-typescript": "^11.1.6",
73
73
  "@size-limit/preset-small-lib": "^11.0.1",
74
74
  "@storybook/addon-a11y": "^7.6.7",
@@ -80,7 +80,7 @@
80
80
  "@storybook/react": "^7.6.7",
81
81
  "@storybook/react-vite": "^7.6.7",
82
82
  "@storybook/testing-library": "^0.2.2",
83
- "@types/node": "^20.10.8",
83
+ "@types/node": "^20.11.0",
84
84
  "@types/react": "^18.2.47",
85
85
  "@types/react-dom": "^18.2.18",
86
86
  "@typescript-eslint/eslint-plugin": "^6.18.1",
@@ -114,7 +114,7 @@
114
114
  },
115
115
  "dependencies": {
116
116
  "@tanstack/match-sorter-utils": "8.11.3",
117
- "@tanstack/react-table": "8.11.3",
117
+ "@tanstack/react-table": "8.11.4",
118
118
  "@tanstack/react-virtual": "3.0.1",
119
119
  "highlight-words": "1.2.2"
120
120
  }
@@ -37,6 +37,7 @@ export const MRT_TableBody = <TData extends MRT_RowData>({
37
37
  localization,
38
38
  memoMode,
39
39
  muiTableBodyProps,
40
+ renderDetailPanel,
40
41
  renderEmptyRowsFallback,
41
42
  rowPinningDisplayMode,
42
43
  },
@@ -77,7 +78,11 @@ export const MRT_TableBody = <TData extends MRT_RowData>({
77
78
  };
78
79
 
79
80
  const CreatingRow = creatingRow && createDisplayMode === 'row' && (
80
- <MRT_TableBodyRow {...commonRowProps} row={creatingRow} rowIndex={-1} />
81
+ <MRT_TableBodyRow
82
+ {...commonRowProps}
83
+ row={creatingRow}
84
+ staticRowIndex={-1}
85
+ />
81
86
  );
82
87
 
83
88
  return (
@@ -94,11 +99,11 @@ export const MRT_TableBody = <TData extends MRT_RowData>({
94
99
  ...(parseFromValuesOrFunc(tableBodyProps?.sx, theme) as any),
95
100
  })}
96
101
  >
97
- {getTopRows().map((row, rowIndex) => {
102
+ {getTopRows().map((row, staticRowIndex) => {
98
103
  const props = {
99
104
  ...commonRowProps,
100
105
  row,
101
- rowIndex,
106
+ staticRowIndex,
102
107
  };
103
108
  return memoMode === 'rows' ? (
104
109
  <Memo_MRT_TableBodyRow key={row.id} {...props} />
@@ -167,16 +172,27 @@ export const MRT_TableBody = <TData extends MRT_RowData>({
167
172
  </tr>
168
173
  ) : (
169
174
  <>
170
- {(virtualRows ?? rows).map((rowOrVirtualRow, rowIndex) => {
175
+ {(virtualRows ?? rows).map((rowOrVirtualRow, staticRowIndex) => {
176
+ if (rowVirtualizer) {
177
+ if (renderDetailPanel) {
178
+ if (rowOrVirtualRow.index % 2 === 1) {
179
+ return null;
180
+ } else {
181
+ staticRowIndex = rowOrVirtualRow.index / 2;
182
+ }
183
+ } else {
184
+ staticRowIndex = rowOrVirtualRow.index;
185
+ }
186
+ }
171
187
  const row = rowVirtualizer
172
- ? rows[rowOrVirtualRow.index]
188
+ ? rows[staticRowIndex]
173
189
  : (rowOrVirtualRow as MRT_Row<TData>);
174
190
  const props = {
175
191
  ...commonRowProps,
176
- measureElement: rowVirtualizer?.measureElement,
177
192
  pinnedRowIds,
178
193
  row,
179
- rowIndex: rowVirtualizer ? rowOrVirtualRow.index : rowIndex,
194
+ rowVirtualizer,
195
+ staticRowIndex,
180
196
  virtualRow: rowVirtualizer
181
197
  ? (rowOrVirtualRow as VirtualItem)
182
198
  : undefined,
@@ -203,11 +219,11 @@ export const MRT_TableBody = <TData extends MRT_RowData>({
203
219
  ...(parseFromValuesOrFunc(tableBodyProps?.sx, theme) as any),
204
220
  })}
205
221
  >
206
- {getBottomRows().map((row, rowIndex) => {
222
+ {getBottomRows().map((row, staticRowIndex) => {
207
223
  const props = {
208
224
  ...commonRowProps,
209
225
  row,
210
- rowIndex,
226
+ staticRowIndex,
211
227
  };
212
228
  return memoMode === 'rows' ? (
213
229
  <Memo_MRT_TableBodyRow key={row.id} {...props} />
@@ -29,8 +29,8 @@ interface Props<TData extends MRT_RowData> extends TableCellProps {
29
29
  cell: MRT_Cell<TData>;
30
30
  measureElement?: (element: HTMLTableCellElement) => void;
31
31
  numRows?: number;
32
- rowIndex: number;
33
32
  rowRef: RefObject<HTMLTableRowElement>;
33
+ staticRowIndex: number;
34
34
  table: MRT_TableInstance<TData>;
35
35
  virtualColumnIndex?: number;
36
36
  }
@@ -39,8 +39,8 @@ export const MRT_TableBodyCell = <TData extends MRT_RowData>({
39
39
  cell,
40
40
  measureElement,
41
41
  numRows,
42
- rowIndex,
43
42
  rowRef,
43
+ staticRowIndex,
44
44
  table,
45
45
  virtualColumnIndex,
46
46
  ...rest
@@ -60,6 +60,7 @@ export const MRT_TableBodyCell = <TData extends MRT_RowData>({
60
60
  layoutMode,
61
61
  muiSkeletonProps,
62
62
  muiTableBodyCellProps,
63
+ positionExpandColumn,
63
64
  },
64
65
  refs: { editInputRefs },
65
66
  setEditingCell,
@@ -116,7 +117,7 @@ export const MRT_TableBodyCell = <TData extends MRT_RowData>({
116
117
  const isHoveredRow = hoveredRow?.id === row.id;
117
118
  const isFirstColumn = getIsFirstColumn(column, table);
118
119
  const isLastColumn = getIsLastColumn(column, table);
119
- const isLastRow = numRows && rowIndex === numRows - 1;
120
+ const isLastRow = numRows && staticRowIndex === numRows - 1;
120
121
  const isResizingColumn = columnSizingInfo.isResizingColumn === column.id;
121
122
  const showResizeBorder =
122
123
  isResizingColumn && columnResizeMode === 'onChange';
@@ -162,7 +163,7 @@ export const MRT_TableBodyCell = <TData extends MRT_RowData>({
162
163
  draggingRow,
163
164
  hoveredColumn,
164
165
  hoveredRow,
165
- rowIndex,
166
+ staticRowIndex,
166
167
  ]);
167
168
 
168
169
  const isEditable =
@@ -214,6 +215,7 @@ export const MRT_TableBodyCell = <TData extends MRT_RowData>({
214
215
 
215
216
  return (
216
217
  <TableCell
218
+ align={theme.direction === 'rtl' ? 'right' : 'left'}
217
219
  data-index={virtualColumnIndex}
218
220
  ref={(node: HTMLTableCellElement) => {
219
221
  if (node) {
@@ -253,7 +255,9 @@ export const MRT_TableBodyCell = <TData extends MRT_RowData>({
253
255
  ? '1rem 1.25rem'
254
256
  : '1.5rem',
255
257
  textOverflow: columnDefType !== 'display' ? 'ellipsis' : undefined,
256
- [theme.direction === 'rtl' ? 'pr' : 'pl']:
258
+ [theme.direction === 'rtl' || positionExpandColumn === 'last'
259
+ ? 'pr'
260
+ : 'pl']:
257
261
  column.id === 'mrt-row-expand'
258
262
  ? `${
259
263
  row.depth +
@@ -299,7 +303,7 @@ export const MRT_TableBodyCell = <TData extends MRT_RowData>({
299
303
  renderedCellValue: cell.renderValue() as any,
300
304
  row,
301
305
  rowRef,
302
- staticRowIndex: rowIndex,
306
+ staticRowIndex,
303
307
  table,
304
308
  })
305
309
  ) : isCreating || isEditing ? (
@@ -17,27 +17,28 @@ import {
17
17
  type MRT_ColumnVirtualizer,
18
18
  type MRT_Row,
19
19
  type MRT_RowData,
20
+ type MRT_RowVirtualizer,
20
21
  type MRT_TableInstance,
21
22
  } from '../types';
22
23
 
23
24
  interface Props<TData extends MRT_RowData> {
24
25
  columnVirtualizer?: MRT_ColumnVirtualizer;
25
- measureElement?: (element: HTMLTableRowElement) => void;
26
26
  numRows?: number;
27
27
  pinnedRowIds?: string[];
28
28
  row: MRT_Row<TData>;
29
- rowIndex: number;
29
+ rowVirtualizer?: MRT_RowVirtualizer;
30
+ staticRowIndex: number;
30
31
  table: MRT_TableInstance<TData>;
31
32
  virtualRow?: VirtualItem;
32
33
  }
33
34
 
34
35
  export const MRT_TableBodyRow = <TData extends MRT_RowData>({
35
36
  columnVirtualizer,
36
- measureElement,
37
37
  numRows,
38
38
  pinnedRowIds,
39
39
  row,
40
- rowIndex,
40
+ rowVirtualizer,
41
+ staticRowIndex,
41
42
  table,
42
43
  virtualRow,
43
44
  }: Props<TData>) => {
@@ -79,7 +80,7 @@ export const MRT_TableBodyRow = <TData extends MRT_RowData>({
79
80
 
80
81
  const tableRowProps = parseFromValuesOrFunc(muiTableBodyRowProps, {
81
82
  row,
82
- staticRowIndex: rowIndex,
83
+ staticRowIndex,
83
84
  table,
84
85
  });
85
86
 
@@ -132,7 +133,7 @@ export const MRT_TableBodyRow = <TData extends MRT_RowData>({
132
133
  return (
133
134
  <>
134
135
  <TableRow
135
- data-index={rowIndex}
136
+ data-index={renderDetailPanel ? staticRowIndex * 2 : staticRowIndex}
136
137
  data-pinned={!!isPinned || undefined}
137
138
  data-selected={
138
139
  row.getIsSelected() || row.getIsAllSubRowsSelected() || undefined
@@ -141,7 +142,7 @@ export const MRT_TableBodyRow = <TData extends MRT_RowData>({
141
142
  ref={(node: HTMLTableRowElement) => {
142
143
  if (node) {
143
144
  rowRef.current = node;
144
- measureElement?.(node);
145
+ rowVirtualizer?.measureElement?.(node);
145
146
  }
146
147
  }}
147
148
  selected={row.getIsSelected()}
@@ -217,8 +218,8 @@ export const MRT_TableBodyRow = <TData extends MRT_RowData>({
217
218
  ? columnVirtualizer?.measureElement
218
219
  : undefined,
219
220
  numRows,
220
- rowIndex,
221
221
  rowRef,
222
+ staticRowIndex,
222
223
  table,
223
224
  virtualColumnIndex: columnVirtualizer
224
225
  ? (cellOrVirtualCell as VirtualItem).index
@@ -245,7 +246,8 @@ export const MRT_TableBodyRow = <TData extends MRT_RowData>({
245
246
  <MRT_TableDetailPanel
246
247
  parentRowRef={rowRef}
247
248
  row={row}
248
- rowIndex={rowIndex}
249
+ rowVirtualizer={rowVirtualizer}
250
+ staticRowIndex={staticRowIndex}
249
251
  table={table}
250
252
  virtualRow={virtualRow}
251
253
  />
@@ -256,5 +258,6 @@ export const MRT_TableBodyRow = <TData extends MRT_RowData>({
256
258
 
257
259
  export const Memo_MRT_TableBodyRow = memo(
258
260
  MRT_TableBodyRow,
259
- (prev, next) => prev.row === next.row && prev.rowIndex === next.rowIndex,
261
+ (prev, next) =>
262
+ prev.row === next.row && prev.staticRowIndex === next.staticRowIndex,
260
263
  ) as typeof MRT_TableBodyRow;
@@ -8,13 +8,15 @@ import { getMRTTheme } from '../style.utils';
8
8
  import {
9
9
  type MRT_Row,
10
10
  type MRT_RowData,
11
+ type MRT_RowVirtualizer,
11
12
  type MRT_TableInstance,
12
13
  } from '../types';
13
14
 
14
15
  interface Props<TData extends MRT_RowData> extends TableCellProps {
15
16
  parentRowRef: RefObject<HTMLTableRowElement>;
16
17
  row: MRT_Row<TData>;
17
- rowIndex: number;
18
+ rowVirtualizer?: MRT_RowVirtualizer;
19
+ staticRowIndex: number;
18
20
  table: MRT_TableInstance<TData>;
19
21
  virtualRow?: VirtualItem;
20
22
  }
@@ -22,7 +24,8 @@ interface Props<TData extends MRT_RowData> extends TableCellProps {
22
24
  export const MRT_TableDetailPanel = <TData extends MRT_RowData>({
23
25
  parentRowRef,
24
26
  row,
25
- rowIndex,
27
+ rowVirtualizer,
28
+ staticRowIndex,
26
29
  table,
27
30
  virtualRow,
28
31
  ...rest
@@ -31,6 +34,7 @@ export const MRT_TableDetailPanel = <TData extends MRT_RowData>({
31
34
  getState,
32
35
  getVisibleLeafColumns,
33
36
  options: {
37
+ enableRowVirtualization,
34
38
  layoutMode,
35
39
  muiDetailPanelProps,
36
40
  muiTableBodyRowProps,
@@ -42,7 +46,7 @@ export const MRT_TableDetailPanel = <TData extends MRT_RowData>({
42
46
  const tableRowProps = parseFromValuesOrFunc(muiTableBodyRowProps, {
43
47
  isDetailPanel: true,
44
48
  row,
45
- staticRowIndex: rowIndex,
49
+ staticRowIndex,
46
50
  table,
47
51
  });
48
52
 
@@ -54,9 +58,17 @@ export const MRT_TableDetailPanel = <TData extends MRT_RowData>({
54
58
  ...rest,
55
59
  };
56
60
 
61
+ const DetailPanel = !isLoading && renderDetailPanel?.({ row, table });
62
+
57
63
  return (
58
64
  <TableRow
59
65
  className="Mui-TableBodyCell-DetailPanel"
66
+ data-index={renderDetailPanel ? staticRowIndex * 2 + 1 : staticRowIndex}
67
+ ref={(node: HTMLTableRowElement) => {
68
+ if (node) {
69
+ rowVirtualizer?.measureElement?.(node);
70
+ }
71
+ }}
60
72
  {...tableRowProps}
61
73
  sx={(theme) => ({
62
74
  display: layoutMode?.startsWith('grid') ? 'flex' : undefined,
@@ -68,7 +80,6 @@ export const MRT_TableDetailPanel = <TData extends MRT_RowData>({
68
80
  ? `translateY(${virtualRow?.start}px)`
69
81
  : undefined,
70
82
  width: '100%',
71
- zIndex: virtualRow ? 2 : undefined,
72
83
  ...(parseFromValuesOrFunc(tableRowProps?.sx, theme) as any),
73
84
  })}
74
85
  >
@@ -82,15 +93,19 @@ export const MRT_TableDetailPanel = <TData extends MRT_RowData>({
82
93
  : undefined,
83
94
  borderBottom: !row.getIsExpanded() ? 'none' : undefined,
84
95
  display: layoutMode?.startsWith('grid') ? 'flex' : undefined,
85
- py: row.getIsExpanded() ? '1rem' : 0,
86
- transition: 'all 150ms ease-in-out',
87
- width: `${table.getTotalSize()}px`,
96
+ py: !!DetailPanel && row.getIsExpanded() ? '1rem' : 0,
97
+ transition: !enableRowVirtualization
98
+ ? 'all 150ms ease-in-out'
99
+ : undefined,
100
+ width: `100%`,
88
101
  ...(parseFromValuesOrFunc(tableCellProps?.sx, theme) as any),
89
102
  })}
90
103
  >
91
- {renderDetailPanel && (
92
- <Collapse in={row.getIsExpanded()} mountOnEnter unmountOnExit>
93
- {!isLoading && renderDetailPanel({ row, table })}
104
+ {enableRowVirtualization ? (
105
+ row.getIsExpanded() && DetailPanel
106
+ ) : (
107
+ <Collapse in={!!row.getIsExpanded()} mountOnEnter unmountOnExit>
108
+ {DetailPanel}
94
109
  </Collapse>
95
110
  )}
96
111
  </TableCell>
@@ -1,6 +1,7 @@
1
1
  import { type MouseEvent } from 'react';
2
2
  import IconButton, { type IconButtonProps } from '@mui/material/IconButton';
3
3
  import Tooltip from '@mui/material/Tooltip';
4
+ import { useTheme } from '@mui/material/styles';
4
5
  import { parseFromValuesOrFunc } from '../column.utils';
5
6
  import {
6
7
  type MRT_Row,
@@ -17,12 +18,14 @@ export const MRT_ExpandButton = <TData extends MRT_RowData>({
17
18
  row,
18
19
  table,
19
20
  }: Props<TData>) => {
21
+ const theme = useTheme();
20
22
  const {
21
23
  getState,
22
24
  options: {
23
25
  icons: { ExpandMoreIcon },
24
26
  localization,
25
27
  muiExpandButtonProps,
28
+ positionExpandColumn,
26
29
  renderDetailPanel,
27
30
  },
28
31
  } = table;
@@ -42,9 +45,11 @@ export const MRT_ExpandButton = <TData extends MRT_RowData>({
42
45
  iconButtonProps?.onClick?.(event);
43
46
  };
44
47
 
48
+ const detailPanel = !!renderDetailPanel?.({ row, table });
49
+
45
50
  return (
46
51
  <Tooltip
47
- disableHoverListener={!canExpand && !renderDetailPanel}
52
+ disableHoverListener={!canExpand && !detailPanel}
48
53
  enterDelay={1000}
49
54
  enterNextDelay={1000}
50
55
  title={
@@ -55,12 +60,12 @@ export const MRT_ExpandButton = <TData extends MRT_RowData>({
55
60
  <span>
56
61
  <IconButton
57
62
  aria-label={localization.expand}
58
- disabled={!canExpand && !renderDetailPanel}
63
+ disabled={!canExpand && !detailPanel}
59
64
  {...iconButtonProps}
60
65
  onClick={handleToggleExpand}
61
66
  sx={(theme) => ({
62
67
  height: density === 'compact' ? '1.75rem' : '2.25rem',
63
- opacity: !canExpand && !renderDetailPanel ? 0.3 : 1,
68
+ opacity: !canExpand && !detailPanel ? 0.3 : 1,
64
69
  width: density === 'compact' ? '1.75rem' : '2.25rem',
65
70
  ...(parseFromValuesOrFunc(iconButtonProps?.sx, theme) as any),
66
71
  })}
@@ -70,7 +75,14 @@ export const MRT_ExpandButton = <TData extends MRT_RowData>({
70
75
  <ExpandMoreIcon
71
76
  style={{
72
77
  transform: `rotate(${
73
- !canExpand && !renderDetailPanel ? -90 : isExpanded ? -180 : 0
78
+ !canExpand && !renderDetailPanel
79
+ ? positionExpandColumn === 'last' ||
80
+ theme.direction === 'rtl'
81
+ ? 90
82
+ : -90
83
+ : isExpanded
84
+ ? -180
85
+ : 0
74
86
  }deg)`,
75
87
  transition: 'transform 150ms',
76
88
  }}
@@ -1,4 +1,5 @@
1
1
  import TableCell, { type TableCellProps } from '@mui/material/TableCell';
2
+ import { useTheme } from '@mui/material/styles';
2
3
  import { parseFromValuesOrFunc } from '../column.utils';
3
4
  import { getCommonMRTCellStyles } from '../style.utils';
4
5
  import {
@@ -17,6 +18,7 @@ export const MRT_TableFooterCell = <TData extends MRT_RowData>({
17
18
  table,
18
19
  ...rest
19
20
  }: Props<TData>) => {
21
+ const theme = useTheme();
20
22
  const {
21
23
  getState,
22
24
  options: { layoutMode, muiTableFooterCellProps },
@@ -35,9 +37,15 @@ export const MRT_TableFooterCell = <TData extends MRT_RowData>({
35
37
 
36
38
  return (
37
39
  <TableCell
38
- align={columnDefType === 'group' ? 'center' : 'left'}
40
+ align={
41
+ columnDefType === 'group'
42
+ ? 'center'
43
+ : theme.direction === 'rtl'
44
+ ? 'right'
45
+ : 'left'
46
+ }
39
47
  colSpan={footer.colSpan}
40
- variant="head"
48
+ variant="footer"
41
49
  {...tableCellProps}
42
50
  sx={(theme) => ({
43
51
  display: layoutMode?.startsWith('grid') ? 'grid' : undefined,
@@ -130,7 +130,7 @@ export const MRT_TableHeadCell = <TData extends MRT_RowData>({
130
130
  }
131
131
  };
132
132
 
133
- const headerElement =
133
+ const HeaderElement =
134
134
  parseFromValuesOrFunc(columnDef.Header, {
135
135
  column,
136
136
  header,
@@ -139,7 +139,13 @@ export const MRT_TableHeadCell = <TData extends MRT_RowData>({
139
139
 
140
140
  return (
141
141
  <TableCell
142
- align={columnDefType === 'group' ? 'center' : 'left'}
142
+ align={
143
+ columnDefType === 'group'
144
+ ? 'center'
145
+ : theme.direction === 'rtl'
146
+ ? 'right'
147
+ : 'left'
148
+ }
143
149
  colSpan={header.colSpan}
144
150
  onDragEnter={handleDragEnter}
145
151
  ref={(node: HTMLTableCellElement) => {
@@ -255,7 +261,7 @@ export const MRT_TableHeadCell = <TData extends MRT_RowData>({
255
261
  columnDefType === 'data' ? columnDef.header : undefined
256
262
  }
257
263
  >
258
- {headerElement}
264
+ {HeaderElement}
259
265
  </Box>
260
266
  {column.getCanFilter() && (
261
267
  <MRT_TableHeadCellFilterLabel header={header} table={table} />
@@ -1,5 +1,5 @@
1
- import { alpha } from '@mui/material';
2
1
  import TableRow, { type TableRowProps } from '@mui/material/TableRow';
2
+ import { alpha } from '@mui/material/styles';
3
3
  import { MRT_TableHeadCell } from './MRT_TableHeadCell';
4
4
  import { parseFromValuesOrFunc } from '../column.utils';
5
5
  import { getMRTTheme } from '../style.utils';
@@ -68,6 +68,7 @@ export const useMRT_DisplayColumns = <TData extends MRT_RowData>(
68
68
  tableOptions.groupedColumnMode,
69
69
  tableOptions.localization,
70
70
  tableOptions.positionActionsColumn,
71
+ tableOptions.positionExpandColumn,
71
72
  tableOptions.renderDetailPanel,
72
73
  tableOptions.renderRowActionMenuItems,
73
74
  tableOptions.renderRowActions,
@@ -160,6 +161,13 @@ function makeRowExpandColumn<TData extends MRT_RowData>(
160
161
  order.includes(id) &&
161
162
  showExpandColumn(tableOptions, tableOptions.state?.grouping ?? grouping)
162
163
  ) {
164
+ const alignProps =
165
+ tableOptions.positionExpandColumn === 'last'
166
+ ? ({
167
+ align: 'right',
168
+ } as const)
169
+ : undefined;
170
+
163
171
  return {
164
172
  Cell: ({ cell, column, row, table }) => {
165
173
  const expandButtonProps = { row, table };
@@ -207,6 +215,8 @@ function makeRowExpandColumn<TData extends MRT_RowData>(
207
215
  );
208
216
  }
209
217
  : undefined,
218
+ muiTableBodyCellProps: alignProps,
219
+ muiTableHeadCellProps: alignProps,
210
220
  ...defaultDisplayColumnProps(
211
221
  tableOptions,
212
222
  id,
@@ -24,22 +24,32 @@ export const useMRT_RowVirtualizer = <
24
24
  getState,
25
25
  options: {
26
26
  enableRowVirtualization,
27
+ renderDetailPanel,
27
28
  rowVirtualizerInstanceRef,
28
29
  rowVirtualizerOptions,
29
30
  },
30
31
  refs: { tableContainerRef },
31
32
  } = table;
32
- const { density, draggingRow } = getState();
33
+ const { density, draggingRow, expanded } = getState();
33
34
 
34
35
  const rowVirtualizerProps = parseFromValuesOrFunc(rowVirtualizerOptions, {
35
36
  table,
36
37
  });
37
38
 
39
+ const rowCount = rows?.length ?? getRowModel().rows.length;
40
+
41
+ const normalRowHeight =
42
+ density === 'compact' ? 37 : density === 'comfortable' ? 58 : 73;
43
+
38
44
  const rowVirtualizer = enableRowVirtualization
39
45
  ? (useVirtualizer({
40
- count: rows?.length ?? getRowModel().rows.length,
41
- estimateSize: () =>
42
- density === 'compact' ? 37 : density === 'comfortable' ? 58 : 73,
46
+ count: renderDetailPanel ? rowCount * 2 : rowCount,
47
+ estimateSize: (index) =>
48
+ renderDetailPanel && index % 2 === 1
49
+ ? expanded === true
50
+ ? 100
51
+ : 0
52
+ : normalRowHeight,
43
53
  getScrollElement: () => tableContainerRef.current,
44
54
  measureElement:
45
55
  typeof window !== 'undefined' &&
@@ -1,5 +1,5 @@
1
1
  import { useMemo } from 'react';
2
- import { useTheme } from '@mui/material';
2
+ import { useTheme } from '@mui/material/styles';
3
3
  import { MRT_AggregationFns } from '../aggregationFns';
4
4
  import { MRT_FilterFns } from '../filterFns';
5
5
  import { MRT_Default_Icons } from '../icons';
@@ -62,7 +62,7 @@ export const MRT_SelectCheckbox = <TData extends MRT_RowData>({
62
62
  event: ChangeEvent<HTMLInputElement>,
63
63
  row: MRT_Row<TData>,
64
64
  ) => {
65
- if (row.getIsAllSubRowsSelected()) {
65
+ if (row.getIsAllSubRowsSelected() && row.getCanSelectSubRows()) {
66
66
  row.subRows?.forEach((r) => r.toggleSelected(false));
67
67
  }
68
68
  row.getToggleSelectedHandler()(event);
@@ -93,7 +93,8 @@ export const MRT_SelectCheckbox = <TData extends MRT_RowData>({
93
93
  : localization.toggleSelectRow,
94
94
  checked: selectAll
95
95
  ? allRowsSelected
96
- : row?.getIsSelected() || row?.getIsAllSubRowsSelected(),
96
+ : row?.getIsSelected() ||
97
+ (row?.getIsAllSubRowsSelected() && row.getCanSelectSubRows()),
97
98
  disabled:
98
99
  isLoading || (row && !row.getCanSelect()) || row?.id === 'mrt-row-create',
99
100
  inputProps: {
@@ -139,7 +140,7 @@ export const MRT_SelectCheckbox = <TData extends MRT_RowData>({
139
140
  indeterminate={
140
141
  selectAll
141
142
  ? table.getIsSomeRowsSelected() && !allRowsSelected
142
- : row?.getIsSomeSelected()
143
+ : row?.getIsSomeSelected() && row.getCanSelectSubRows()
143
144
  }
144
145
  {...commonProps}
145
146
  />
@@ -57,7 +57,7 @@ export const getCommonMRTCellStyles = <TData extends MRT_RowData>({
57
57
  )}-size) * 1px), ${column.columnDef.minSize ?? 30}px)`,
58
58
  width: `calc(var(--${header ? 'header' : 'col'}-${parseCSSVarId(
59
59
  header?.id ?? column.id,
60
- )}-size) * 1px)`,
60
+ )}-size) * 1px${header ? ` + ${header?.subHeaders?.length ?? 0}rem` : ''})`,
61
61
  };
62
62
 
63
63
  if (layoutMode === 'grid') {
@@ -128,3 +128,8 @@ export const getCommonToolbarStyles = <TData extends MRT_RowData>({
128
128
  transition: 'all 150ms ease-in-out',
129
129
  zIndex: 1,
130
130
  });
131
+
132
+ export const flipIconStyles = (theme: Theme) =>
133
+ theme.direction === 'rtl'
134
+ ? { style: { transform: 'scaleX(-1)' } }
135
+ : undefined;
@@ -42,9 +42,7 @@ export const MRT_Table = <TData extends MRT_RowData>({
42
42
  const colSizes: { [key: string]: number } = {};
43
43
  for (let i = 0; i < headers.length; i++) {
44
44
  const header = headers[i];
45
- let colSize = header.getSize();
46
- if (header.subHeaders?.length)
47
- colSize = colSize * 1.05 + header.subHeaders.length * 2;
45
+ const colSize = header.getSize();
48
46
  colSizes[`--header-${parseCSSVarId(header.id)}-size`] = colSize;
49
47
  colSizes[`--col-${parseCSSVarId(header.column.id)}-size`] = colSize;
50
48
  }
@@ -1,5 +1,5 @@
1
- import { alpha } from '@mui/material';
2
1
  import Box, { type BoxProps } from '@mui/material/Box';
2
+ import { alpha } from '@mui/material/styles';
3
3
  import useMediaQuery from '@mui/material/useMediaQuery';
4
4
  import { MRT_LinearProgressBar } from './MRT_LinearProgressBar';
5
5
  import { MRT_TablePagination } from './MRT_TablePagination';