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/dist/index.d.ts +16 -10
- package/dist/index.esm.js +116 -59
- package/dist/index.esm.js.map +1 -1
- package/dist/index.js +116 -58
- package/dist/index.js.map +1 -1
- package/package.json +4 -4
- package/src/body/MRT_TableBody.tsx +25 -9
- package/src/body/MRT_TableBodyCell.tsx +10 -6
- package/src/body/MRT_TableBodyRow.tsx +13 -10
- package/src/body/MRT_TableDetailPanel.tsx +25 -10
- package/src/buttons/MRT_ExpandButton.tsx +16 -4
- package/src/footer/MRT_TableFooterCell.tsx +10 -2
- package/src/head/MRT_TableHeadCell.tsx +9 -3
- package/src/head/MRT_TableHeadRow.tsx +1 -1
- package/src/hooks/useMRT_DisplayColumns.tsx +10 -0
- package/src/hooks/useMRT_RowVirtualizer.ts +14 -4
- package/src/hooks/useMRT_TableOptions.ts +1 -1
- package/src/inputs/MRT_SelectCheckbox.tsx +4 -3
- package/src/style.utils.ts +6 -1
- package/src/table/MRT_Table.tsx +1 -3
- package/src/toolbar/MRT_BottomToolbar.tsx +1 -1
- package/src/toolbar/MRT_TablePagination.tsx +8 -4
package/package.json
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
{
|
2
|
-
"version": "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.
|
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.
|
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.
|
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
|
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,
|
102
|
+
{getTopRows().map((row, staticRowIndex) => {
|
98
103
|
const props = {
|
99
104
|
...commonRowProps,
|
100
105
|
row,
|
101
|
-
|
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,
|
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[
|
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
|
-
|
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,
|
222
|
+
{getBottomRows().map((row, staticRowIndex) => {
|
207
223
|
const props = {
|
208
224
|
...commonRowProps,
|
209
225
|
row,
|
210
|
-
|
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 &&
|
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
|
-
|
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'
|
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
|
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
|
-
|
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
|
-
|
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
|
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={
|
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
|
-
|
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) =>
|
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
|
-
|
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
|
-
|
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
|
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:
|
87
|
-
|
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
|
-
{
|
92
|
-
|
93
|
-
|
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 && !
|
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 && !
|
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 && !
|
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
|
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={
|
40
|
+
align={
|
41
|
+
columnDefType === 'group'
|
42
|
+
? 'center'
|
43
|
+
: theme.direction === 'rtl'
|
44
|
+
? 'right'
|
45
|
+
: 'left'
|
46
|
+
}
|
39
47
|
colSpan={footer.colSpan}
|
40
|
-
variant="
|
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
|
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={
|
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
|
-
{
|
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:
|
41
|
-
estimateSize: () =>
|
42
|
-
|
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() ||
|
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
|
/>
|
package/src/style.utils.ts
CHANGED
@@ -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;
|
package/src/table/MRT_Table.tsx
CHANGED
@@ -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
|
-
|
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';
|