material-react-table 2.11.2 → 2.12.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/README.md +29 -22
- package/dist/index.d.ts +30 -16
- package/dist/index.esm.js +161 -152
- package/dist/index.esm.js.map +1 -1
- package/dist/index.js +162 -156
- package/dist/index.js.map +1 -1
- package/package.json +24 -24
- package/src/components/body/MRT_TableBodyCell.tsx +11 -6
- package/src/components/body/MRT_TableBodyCellValue.tsx +5 -4
- package/src/components/body/MRT_TableBodyRow.tsx +10 -7
- package/src/components/body/MRT_TableDetailPanel.tsx +4 -9
- package/src/components/footer/MRT_TableFooterRow.tsx +6 -3
- package/src/components/head/MRT_TableHead.tsx +11 -11
- package/src/components/head/MRT_TableHeadCell.tsx +9 -3
- package/src/components/head/MRT_TableHeadCellFilterContainer.tsx +3 -4
- package/src/components/head/MRT_TableHeadCellFilterLabel.tsx +61 -37
- package/src/components/head/MRT_TableHeadRow.tsx +7 -3
- package/src/components/inputs/MRT_FilterRangeFields.tsx +8 -2
- package/src/components/inputs/MRT_FilterTextField.tsx +29 -38
- package/src/components/inputs/MRT_SelectCheckbox.tsx +2 -1
- package/src/components/menus/MRT_CellActionMenu.tsx +1 -5
- package/src/components/menus/MRT_ColumnActionMenu.tsx +1 -5
- package/src/components/menus/MRT_FilterOptionMenu.tsx +1 -5
- package/src/components/menus/MRT_RowActionMenu.tsx +1 -5
- package/src/components/menus/MRT_ShowHideColumnsMenu.tsx +1 -5
- package/src/components/menus/MRT_ShowHideColumnsMenuItems.tsx +3 -2
- package/src/components/table/MRT_TableLoadingOverlay.tsx +8 -8
- package/src/components/table/MRT_TablePaper.tsx +6 -6
- package/src/components/toolbar/MRT_ToolbarAlertBanner.tsx +3 -1
- package/src/components/toolbar/MRT_ToolbarDropZone.tsx +5 -0
- package/src/hooks/display-columns/getMRT_RowActionsColumnDef.tsx +1 -1
- package/src/hooks/display-columns/getMRT_RowDragColumnDef.tsx +1 -1
- package/src/hooks/display-columns/getMRT_RowExpandColumnDef.tsx +1 -1
- package/src/hooks/display-columns/getMRT_RowNumbersColumnDef.tsx +1 -1
- package/src/hooks/display-columns/getMRT_RowPinningColumnDef.tsx +1 -1
- package/src/hooks/display-columns/getMRT_RowSelectColumnDef.tsx +1 -1
- package/src/hooks/display-columns/getMRT_RowSpacerColumnDef.tsx +1 -1
- package/src/hooks/useMRT_TableOptions.ts +4 -0
- package/src/types.ts +15 -13
- package/src/utils/column.utils.ts +78 -40
- package/src/utils/row.utils.ts +2 -1
- package/src/utils/style.utils.ts +24 -26
- package/src/utils/utils.ts +1 -1
package/package.json
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
{
|
|
2
|
-
"version": "2.
|
|
2
|
+
"version": "2.12.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.",
|
|
@@ -65,26 +65,26 @@
|
|
|
65
65
|
"@babel/preset-react": "^7.23.3",
|
|
66
66
|
"@emotion/react": "^11.11.3",
|
|
67
67
|
"@emotion/styled": "^11.11.0",
|
|
68
|
-
"@faker-js/faker": "^8.4.
|
|
69
|
-
"@mui/icons-material": "^5.15.
|
|
70
|
-
"@mui/material": "^5.15.
|
|
71
|
-
"@mui/x-date-pickers": "^6.19.
|
|
68
|
+
"@faker-js/faker": "^8.4.1",
|
|
69
|
+
"@mui/icons-material": "^5.15.10",
|
|
70
|
+
"@mui/material": "^5.15.10",
|
|
71
|
+
"@mui/x-date-pickers": "^6.19.4",
|
|
72
72
|
"@rollup/plugin-typescript": "^11.1.6",
|
|
73
73
|
"@size-limit/preset-small-lib": "^11.0.2",
|
|
74
|
-
"@storybook/addon-a11y": "^7.6.
|
|
75
|
-
"@storybook/addon-essentials": "^7.6.
|
|
76
|
-
"@storybook/addon-interactions": "^7.6.
|
|
77
|
-
"@storybook/addon-links": "^7.6.
|
|
78
|
-
"@storybook/addon-storysource": "^7.6.
|
|
79
|
-
"@storybook/blocks": "^7.6.
|
|
80
|
-
"@storybook/react": "^7.6.
|
|
81
|
-
"@storybook/react-vite": "^7.6.
|
|
74
|
+
"@storybook/addon-a11y": "^7.6.16",
|
|
75
|
+
"@storybook/addon-essentials": "^7.6.16",
|
|
76
|
+
"@storybook/addon-interactions": "^7.6.16",
|
|
77
|
+
"@storybook/addon-links": "^7.6.16",
|
|
78
|
+
"@storybook/addon-storysource": "^7.6.16",
|
|
79
|
+
"@storybook/blocks": "^7.6.16",
|
|
80
|
+
"@storybook/react": "^7.6.16",
|
|
81
|
+
"@storybook/react-vite": "^7.6.16",
|
|
82
82
|
"@storybook/testing-library": "^0.2.2",
|
|
83
|
-
"@types/node": "^20.11.
|
|
84
|
-
"@types/react": "^18.2.
|
|
85
|
-
"@types/react-dom": "^18.2.
|
|
86
|
-
"@typescript-eslint/eslint-plugin": "^
|
|
87
|
-
"@typescript-eslint/parser": "^
|
|
83
|
+
"@types/node": "^20.11.19",
|
|
84
|
+
"@types/react": "^18.2.56",
|
|
85
|
+
"@types/react-dom": "^18.2.19",
|
|
86
|
+
"@typescript-eslint/eslint-plugin": "^7.0.1",
|
|
87
|
+
"@typescript-eslint/parser": "^7.0.1",
|
|
88
88
|
"@vitejs/plugin-react": "^4.2.1",
|
|
89
89
|
"eslint": "^8.56.0",
|
|
90
90
|
"eslint-plugin-mui-path-imports": "^0.0.15",
|
|
@@ -99,11 +99,11 @@
|
|
|
99
99
|
"rollup-plugin-dts": "^6.1.0",
|
|
100
100
|
"rollup-plugin-peer-deps-external": "^2.2.4",
|
|
101
101
|
"size-limit": "^11.0.2",
|
|
102
|
-
"storybook": "^7.6.
|
|
102
|
+
"storybook": "^7.6.16",
|
|
103
103
|
"storybook-dark-mode": "^3.0.3",
|
|
104
104
|
"tslib": "^2.6.2",
|
|
105
105
|
"typescript": "^5.3.3",
|
|
106
|
-
"vite": "^5.
|
|
106
|
+
"vite": "^5.1.3"
|
|
107
107
|
},
|
|
108
108
|
"peerDependencies": {
|
|
109
109
|
"@emotion/react": ">=11.11",
|
|
@@ -111,13 +111,13 @@
|
|
|
111
111
|
"@mui/icons-material": ">=5.11",
|
|
112
112
|
"@mui/material": ">=5.13",
|
|
113
113
|
"@mui/x-date-pickers": ">=6.15.0",
|
|
114
|
-
"react": ">=
|
|
115
|
-
"react-dom": ">=
|
|
114
|
+
"react": ">=17.0",
|
|
115
|
+
"react-dom": ">=17.0"
|
|
116
116
|
},
|
|
117
117
|
"dependencies": {
|
|
118
118
|
"@tanstack/match-sorter-utils": "8.11.8",
|
|
119
|
-
"@tanstack/react-table": "8.
|
|
120
|
-
"@tanstack/react-virtual": "3.
|
|
119
|
+
"@tanstack/react-table": "8.12.0",
|
|
120
|
+
"@tanstack/react-virtual": "3.1.1",
|
|
121
121
|
"highlight-words": "1.2.2"
|
|
122
122
|
}
|
|
123
123
|
}
|
|
@@ -17,8 +17,7 @@ import {
|
|
|
17
17
|
type MRT_TableInstance,
|
|
18
18
|
} from '../../types';
|
|
19
19
|
import { isCellEditable, openEditingCell } from '../../utils/cell.utils';
|
|
20
|
-
import {
|
|
21
|
-
import { getCommonMRTCellStyles, getMRTTheme } from '../../utils/style.utils';
|
|
20
|
+
import { getCommonMRTCellStyles } from '../../utils/style.utils';
|
|
22
21
|
import { parseFromValuesOrFunc } from '../../utils/utils';
|
|
23
22
|
import { MRT_CopyButton } from '../buttons/MRT_CopyButton';
|
|
24
23
|
import { MRT_EditCellTextField } from '../inputs/MRT_EditCellTextField';
|
|
@@ -56,6 +55,7 @@ export const MRT_TableBodyCell = <TData extends MRT_RowData>({
|
|
|
56
55
|
enableColumnPinning,
|
|
57
56
|
enableGrouping,
|
|
58
57
|
layoutMode,
|
|
58
|
+
mrtTheme: { draggingBorderColor },
|
|
59
59
|
muiSkeletonProps,
|
|
60
60
|
muiTableBodyCellProps,
|
|
61
61
|
},
|
|
@@ -93,8 +93,6 @@ export const MRT_TableBodyCell = <TData extends MRT_RowData>({
|
|
|
93
93
|
table,
|
|
94
94
|
});
|
|
95
95
|
|
|
96
|
-
const { draggingBorderColor } = getMRTTheme(table, theme);
|
|
97
|
-
|
|
98
96
|
const [skeletonWidth, setSkeletonWidth] = useState(100);
|
|
99
97
|
useEffect(() => {
|
|
100
98
|
if ((!isLoading && !showSkeletons) || skeletonWidth !== 100) return;
|
|
@@ -111,8 +109,8 @@ export const MRT_TableBodyCell = <TData extends MRT_RowData>({
|
|
|
111
109
|
const isHoveredColumn = hoveredColumn?.id === column.id;
|
|
112
110
|
const isDraggingRow = draggingRow?.id === row.id;
|
|
113
111
|
const isHoveredRow = hoveredRow?.id === row.id;
|
|
114
|
-
const isFirstColumn = getIsFirstColumn(
|
|
115
|
-
const isLastColumn = getIsLastColumn(
|
|
112
|
+
const isFirstColumn = column.getIsFirstColumn();
|
|
113
|
+
const isLastColumn = column.getIsLastColumn();
|
|
116
114
|
const isLastRow = numRows && staticRowIndex === numRows - 1;
|
|
117
115
|
const isResizingColumn = columnSizingInfo.isResizingColumn === column.id;
|
|
118
116
|
const showResizeBorder =
|
|
@@ -212,6 +210,12 @@ export const MRT_TableBodyCell = <TData extends MRT_RowData>({
|
|
|
212
210
|
}
|
|
213
211
|
};
|
|
214
212
|
|
|
213
|
+
const handleDragOver = (e: DragEvent) => {
|
|
214
|
+
if (columnDef.enableColumnOrdering !== false) {
|
|
215
|
+
e.preventDefault();
|
|
216
|
+
}
|
|
217
|
+
};
|
|
218
|
+
|
|
215
219
|
const handleContextMenu = (e: MouseEvent<HTMLTableCellElement>) => {
|
|
216
220
|
tableCellProps?.onContextMenu?.(e);
|
|
217
221
|
if (isRightClickable) {
|
|
@@ -230,6 +234,7 @@ export const MRT_TableBodyCell = <TData extends MRT_RowData>({
|
|
|
230
234
|
onContextMenu={handleContextMenu}
|
|
231
235
|
onDoubleClick={handleDoubleClick}
|
|
232
236
|
onDragEnter={handleDragEnter}
|
|
237
|
+
onDragOver={handleDragOver}
|
|
233
238
|
sx={(theme) => ({
|
|
234
239
|
'&:hover': {
|
|
235
240
|
outline:
|
|
@@ -5,7 +5,6 @@ import {
|
|
|
5
5
|
type MRT_RowData,
|
|
6
6
|
type MRT_TableInstance,
|
|
7
7
|
} from '../../types';
|
|
8
|
-
import { getMRTTheme } from '../../utils/style.utils';
|
|
9
8
|
import highlightWords from 'highlight-words';
|
|
10
9
|
|
|
11
10
|
const allowedTypes = ['string', 'number'];
|
|
@@ -27,7 +26,10 @@ export const MRT_TableBodyCellValue = <TData extends MRT_RowData>({
|
|
|
27
26
|
}: MRT_TableBodyCellValueProps<TData>) => {
|
|
28
27
|
const {
|
|
29
28
|
getState,
|
|
30
|
-
options: {
|
|
29
|
+
options: {
|
|
30
|
+
enableFilterMatchHighlighting,
|
|
31
|
+
mrtTheme: { matchHighlightColor },
|
|
32
|
+
},
|
|
31
33
|
} = table;
|
|
32
34
|
const { column, row } = cell;
|
|
33
35
|
const { columnDef } = column;
|
|
@@ -88,8 +90,7 @@ export const MRT_TableBodyCellValue = <TData extends MRT_RowData>({
|
|
|
88
90
|
sx={
|
|
89
91
|
match
|
|
90
92
|
? {
|
|
91
|
-
backgroundColor:
|
|
92
|
-
getMRTTheme(table, theme).matchHighlightColor,
|
|
93
|
+
backgroundColor: matchHighlightColor,
|
|
93
94
|
borderRadius: '2px',
|
|
94
95
|
color: (theme) =>
|
|
95
96
|
theme.palette.mode === 'dark'
|
|
@@ -23,7 +23,6 @@ import { getIsRowSelected } from '../../utils/row.utils';
|
|
|
23
23
|
import {
|
|
24
24
|
commonCellBeforeAfterStyles,
|
|
25
25
|
getCommonPinnedCellStyles,
|
|
26
|
-
getMRTTheme,
|
|
27
26
|
} from '../../utils/style.utils';
|
|
28
27
|
import { parseFromValuesOrFunc } from '../../utils/utils';
|
|
29
28
|
|
|
@@ -61,6 +60,11 @@ export const MRT_TableBodyRow = <TData extends MRT_RowData>({
|
|
|
61
60
|
enableStickyHeader,
|
|
62
61
|
layoutMode,
|
|
63
62
|
memoMode,
|
|
63
|
+
mrtTheme: {
|
|
64
|
+
baseBackgroundColor,
|
|
65
|
+
pinnedRowBackgroundColor,
|
|
66
|
+
selectedRowBackgroundColor,
|
|
67
|
+
},
|
|
64
68
|
muiTableBodyRowProps,
|
|
65
69
|
renderDetailPanel,
|
|
66
70
|
rowPinningDisplayMode,
|
|
@@ -136,13 +140,11 @@ export const MRT_TableBodyRow = <TData extends MRT_RowData>({
|
|
|
136
140
|
}
|
|
137
141
|
};
|
|
138
142
|
|
|
139
|
-
const
|
|
143
|
+
const handleDragOver = (e: DragEvent) => {
|
|
144
|
+
e.preventDefault();
|
|
145
|
+
};
|
|
140
146
|
|
|
141
|
-
const
|
|
142
|
-
baseBackgroundColor,
|
|
143
|
-
pinnedRowBackgroundColor,
|
|
144
|
-
selectedRowBackgroundColor,
|
|
145
|
-
} = getMRTTheme(table, theme);
|
|
147
|
+
const rowRef = useRef<HTMLTableRowElement | null>(null);
|
|
146
148
|
|
|
147
149
|
const cellHighlightColor = isRowSelected
|
|
148
150
|
? selectedRowBackgroundColor
|
|
@@ -166,6 +168,7 @@ export const MRT_TableBodyRow = <TData extends MRT_RowData>({
|
|
|
166
168
|
data-pinned={!!isRowPinned || undefined}
|
|
167
169
|
data-selected={isRowSelected || undefined}
|
|
168
170
|
onDragEnter={handleDragEnter}
|
|
171
|
+
onDragOver={handleDragOver}
|
|
169
172
|
ref={(node: HTMLTableRowElement) => {
|
|
170
173
|
if (node) {
|
|
171
174
|
rowRef.current = node;
|
|
@@ -9,7 +9,6 @@ import {
|
|
|
9
9
|
type MRT_TableInstance,
|
|
10
10
|
type MRT_VirtualItem,
|
|
11
11
|
} from '../../types';
|
|
12
|
-
import { getMRTTheme } from '../../utils/style.utils';
|
|
13
12
|
import { parseFromValuesOrFunc } from '../../utils/utils';
|
|
14
13
|
|
|
15
14
|
export interface MRT_TableDetailPanelProps<TData extends MRT_RowData>
|
|
@@ -35,8 +34,8 @@ export const MRT_TableDetailPanel = <TData extends MRT_RowData>({
|
|
|
35
34
|
getState,
|
|
36
35
|
getVisibleLeafColumns,
|
|
37
36
|
options: {
|
|
38
|
-
enableRowVirtualization,
|
|
39
37
|
layoutMode,
|
|
38
|
+
mrtTheme: { baseBackgroundColor },
|
|
40
39
|
muiDetailPanelProps,
|
|
41
40
|
muiTableBodyRowProps,
|
|
42
41
|
renderDetailPanel,
|
|
@@ -89,20 +88,16 @@ export const MRT_TableDetailPanel = <TData extends MRT_RowData>({
|
|
|
89
88
|
colSpan={getVisibleLeafColumns().length}
|
|
90
89
|
{...tableCellProps}
|
|
91
90
|
sx={(theme) => ({
|
|
92
|
-
backgroundColor: virtualRow
|
|
93
|
-
? getMRTTheme(table, theme).baseBackgroundColor
|
|
94
|
-
: undefined,
|
|
91
|
+
backgroundColor: virtualRow ? baseBackgroundColor : undefined,
|
|
95
92
|
borderBottom: !row.getIsExpanded() ? 'none' : undefined,
|
|
96
93
|
display: layoutMode?.startsWith('grid') ? 'flex' : undefined,
|
|
97
94
|
py: !!DetailPanel && row.getIsExpanded() ? '1rem' : 0,
|
|
98
|
-
transition: !
|
|
99
|
-
? 'all 150ms ease-in-out'
|
|
100
|
-
: undefined,
|
|
95
|
+
transition: !virtualRow ? 'all 150ms ease-in-out' : undefined,
|
|
101
96
|
width: `100%`,
|
|
102
97
|
...(parseFromValuesOrFunc(tableCellProps?.sx, theme) as any),
|
|
103
98
|
})}
|
|
104
99
|
>
|
|
105
|
-
{
|
|
100
|
+
{virtualRow ? (
|
|
106
101
|
row.getIsExpanded() && DetailPanel
|
|
107
102
|
) : (
|
|
108
103
|
<Collapse in={row.getIsExpanded()} mountOnEnter unmountOnExit>
|
|
@@ -8,7 +8,6 @@ import {
|
|
|
8
8
|
type MRT_TableInstance,
|
|
9
9
|
type MRT_VirtualItem,
|
|
10
10
|
} from '../../types';
|
|
11
|
-
import { getMRTTheme } from '../../utils/style.utils';
|
|
12
11
|
import { parseFromValuesOrFunc } from '../../utils/utils';
|
|
13
12
|
|
|
14
13
|
export interface MRT_TableFooterRowProps<TData extends MRT_RowData>
|
|
@@ -25,7 +24,11 @@ export const MRT_TableFooterRow = <TData extends MRT_RowData>({
|
|
|
25
24
|
...rest
|
|
26
25
|
}: MRT_TableFooterRowProps<TData>) => {
|
|
27
26
|
const {
|
|
28
|
-
options: {
|
|
27
|
+
options: {
|
|
28
|
+
layoutMode,
|
|
29
|
+
mrtTheme: { baseBackgroundColor },
|
|
30
|
+
muiTableFooterRowProps,
|
|
31
|
+
},
|
|
29
32
|
} = table;
|
|
30
33
|
|
|
31
34
|
const { virtualColumns, virtualPaddingLeft, virtualPaddingRight } =
|
|
@@ -55,7 +58,7 @@ export const MRT_TableFooterRow = <TData extends MRT_RowData>({
|
|
|
55
58
|
<TableRow
|
|
56
59
|
{...tableRowProps}
|
|
57
60
|
sx={(theme) => ({
|
|
58
|
-
backgroundColor:
|
|
61
|
+
backgroundColor: baseBackgroundColor,
|
|
59
62
|
display: layoutMode?.startsWith('grid') ? 'flex' : undefined,
|
|
60
63
|
position: 'relative',
|
|
61
64
|
width: '100%',
|
|
@@ -20,8 +20,6 @@ export const MRT_TableHead = <TData extends MRT_RowData>({
|
|
|
20
20
|
...rest
|
|
21
21
|
}: MRT_TableHeadProps<TData>) => {
|
|
22
22
|
const {
|
|
23
|
-
getHeaderGroups,
|
|
24
|
-
getSelectedRowModel,
|
|
25
23
|
getState,
|
|
26
24
|
options: {
|
|
27
25
|
enableStickyHeader,
|
|
@@ -60,7 +58,7 @@ export const MRT_TableHead = <TData extends MRT_RowData>({
|
|
|
60
58
|
})}
|
|
61
59
|
>
|
|
62
60
|
{positionToolbarAlertBanner === 'head-overlay' &&
|
|
63
|
-
(showAlertBanner || getSelectedRowModel().rows.length > 0) ? (
|
|
61
|
+
(showAlertBanner || table.getSelectedRowModel().rows.length > 0) ? (
|
|
64
62
|
<tr
|
|
65
63
|
style={{
|
|
66
64
|
display: layoutMode?.startsWith('grid') ? 'grid' : undefined,
|
|
@@ -77,14 +75,16 @@ export const MRT_TableHead = <TData extends MRT_RowData>({
|
|
|
77
75
|
</th>
|
|
78
76
|
</tr>
|
|
79
77
|
) : (
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
78
|
+
table
|
|
79
|
+
.getHeaderGroups()
|
|
80
|
+
.map((headerGroup) => (
|
|
81
|
+
<MRT_TableHeadRow
|
|
82
|
+
columnVirtualizer={columnVirtualizer}
|
|
83
|
+
headerGroup={headerGroup as any}
|
|
84
|
+
key={headerGroup.id}
|
|
85
|
+
table={table}
|
|
86
|
+
/>
|
|
87
|
+
))
|
|
88
88
|
)}
|
|
89
89
|
</TableHead>
|
|
90
90
|
);
|
|
@@ -15,7 +15,7 @@ import {
|
|
|
15
15
|
type MRT_RowData,
|
|
16
16
|
type MRT_TableInstance,
|
|
17
17
|
} from '../../types';
|
|
18
|
-
import { getCommonMRTCellStyles
|
|
18
|
+
import { getCommonMRTCellStyles } from '../../utils/style.utils';
|
|
19
19
|
import { parseFromValuesOrFunc } from '../../utils/utils';
|
|
20
20
|
|
|
21
21
|
export interface MRT_TableHeadCellProps<TData extends MRT_RowData>
|
|
@@ -47,6 +47,7 @@ export const MRT_TableHeadCell = <TData extends MRT_RowData>({
|
|
|
47
47
|
enableGrouping,
|
|
48
48
|
enableMultiSort,
|
|
49
49
|
layoutMode,
|
|
50
|
+
mrtTheme: { draggingBorderColor },
|
|
50
51
|
muiTableHeadCellProps,
|
|
51
52
|
},
|
|
52
53
|
refs: { tableHeadCellRefs },
|
|
@@ -73,8 +74,6 @@ export const MRT_TableHeadCell = <TData extends MRT_RowData>({
|
|
|
73
74
|
...rest,
|
|
74
75
|
};
|
|
75
76
|
|
|
76
|
-
const { draggingBorderColor } = getMRTTheme(table, theme);
|
|
77
|
-
|
|
78
77
|
const isColumnPinned =
|
|
79
78
|
enableColumnPinning &&
|
|
80
79
|
columnDef.columnDefType !== 'group' &&
|
|
@@ -142,6 +141,12 @@ export const MRT_TableHeadCell = <TData extends MRT_RowData>({
|
|
|
142
141
|
}
|
|
143
142
|
};
|
|
144
143
|
|
|
144
|
+
const handleDragOver = (e: DragEvent) => {
|
|
145
|
+
if (columnDef.enableColumnOrdering !== false) {
|
|
146
|
+
e.preventDefault();
|
|
147
|
+
}
|
|
148
|
+
};
|
|
149
|
+
|
|
145
150
|
const HeaderElement =
|
|
146
151
|
parseFromValuesOrFunc(columnDef.Header, {
|
|
147
152
|
column,
|
|
@@ -162,6 +167,7 @@ export const MRT_TableHeadCell = <TData extends MRT_RowData>({
|
|
|
162
167
|
data-index={staticColumnIndex}
|
|
163
168
|
data-pinned={!!isColumnPinned || undefined}
|
|
164
169
|
onDragEnter={handleDragEnter}
|
|
170
|
+
onDragOver={handleDragOver}
|
|
165
171
|
ref={(node: HTMLTableCellElement) => {
|
|
166
172
|
if (node) {
|
|
167
173
|
tableHeadCellRefs.current[column.id] = node;
|
|
@@ -4,6 +4,7 @@ import {
|
|
|
4
4
|
type MRT_RowData,
|
|
5
5
|
type MRT_TableInstance,
|
|
6
6
|
} from '../../types';
|
|
7
|
+
import { getColumnFilterInfo } from '../../utils/column.utils';
|
|
7
8
|
import { MRT_FilterCheckbox } from '../inputs/MRT_FilterCheckbox';
|
|
8
9
|
import { MRT_FilterRangeFields } from '../inputs/MRT_FilterRangeFields';
|
|
9
10
|
import { MRT_FilterRangeSlider } from '../inputs/MRT_FilterRangeSlider';
|
|
@@ -28,6 +29,7 @@ export const MRT_TableHeadCellFilterContainer = <TData extends MRT_RowData>({
|
|
|
28
29
|
const { showColumnFilters } = getState();
|
|
29
30
|
const { column } = header;
|
|
30
31
|
const { columnDef } = column;
|
|
32
|
+
const { isRangeFilter } = getColumnFilterInfo({ header, table });
|
|
31
33
|
|
|
32
34
|
return (
|
|
33
35
|
<Collapse
|
|
@@ -40,10 +42,7 @@ export const MRT_TableHeadCellFilterContainer = <TData extends MRT_RowData>({
|
|
|
40
42
|
<MRT_FilterCheckbox column={column} table={table} />
|
|
41
43
|
) : columnDef.filterVariant === 'range-slider' ? (
|
|
42
44
|
<MRT_FilterRangeSlider header={header} table={table} />
|
|
43
|
-
) :
|
|
44
|
-
['between', 'betweenInclusive', 'inNumberRange'].includes(
|
|
45
|
-
columnDef._filterFn,
|
|
46
|
-
) ? (
|
|
45
|
+
) : isRangeFilter ? (
|
|
47
46
|
<MRT_FilterRangeFields header={header} table={table} />
|
|
48
47
|
) : (
|
|
49
48
|
<MRT_FilterTextField header={header} table={table} />
|
|
@@ -10,7 +10,11 @@ import {
|
|
|
10
10
|
type MRT_RowData,
|
|
11
11
|
type MRT_TableInstance,
|
|
12
12
|
} from '../../types';
|
|
13
|
-
import {
|
|
13
|
+
import {
|
|
14
|
+
getColumnFilterInfo,
|
|
15
|
+
useDropdownOptions,
|
|
16
|
+
} from '../../utils/column.utils';
|
|
17
|
+
import { getValueAndLabel, parseFromValuesOrFunc } from '../../utils/utils';
|
|
14
18
|
|
|
15
19
|
export interface MRT_TableHeadCellFilterLabelProps<TData extends MRT_RowData>
|
|
16
20
|
extends IconButtonProps {
|
|
@@ -35,20 +39,32 @@ export const MRT_TableHeadCellFilterLabel = <TData extends MRT_RowData = {}>({
|
|
|
35
39
|
const { column } = header;
|
|
36
40
|
const { columnDef } = column;
|
|
37
41
|
|
|
38
|
-
const filterValue = column.getFilterValue();
|
|
42
|
+
const filterValue = column.getFilterValue() as [string, string] | string;
|
|
39
43
|
|
|
40
44
|
const [anchorEl, setAnchorEl] = useState<HTMLButtonElement | null>(null);
|
|
41
45
|
|
|
46
|
+
const {
|
|
47
|
+
currentFilterOption,
|
|
48
|
+
isMultiSelectFilter,
|
|
49
|
+
isRangeFilter,
|
|
50
|
+
isSelectFilter,
|
|
51
|
+
} = getColumnFilterInfo({ header, table });
|
|
52
|
+
|
|
53
|
+
const dropdownOptions = useDropdownOptions({ header, table });
|
|
54
|
+
|
|
55
|
+
const getSelectLabel = (index?: number) =>
|
|
56
|
+
getValueAndLabel(
|
|
57
|
+
dropdownOptions?.find(
|
|
58
|
+
(option) =>
|
|
59
|
+
getValueAndLabel(option).value ===
|
|
60
|
+
(index !== undefined ? filterValue[index] : filterValue),
|
|
61
|
+
),
|
|
62
|
+
).label;
|
|
63
|
+
|
|
42
64
|
const isFilterActive =
|
|
43
65
|
(Array.isArray(filterValue) && filterValue.some(Boolean)) ||
|
|
44
66
|
(!!filterValue && !Array.isArray(filterValue));
|
|
45
67
|
|
|
46
|
-
const isRangeFilter =
|
|
47
|
-
columnDef.filterVariant?.includes('range') ||
|
|
48
|
-
['between', 'betweenInclusive', 'inNumberRange'].includes(
|
|
49
|
-
columnDef._filterFn,
|
|
50
|
-
);
|
|
51
|
-
const currentFilterOption = columnDef._filterFn;
|
|
52
68
|
const filterTooltip =
|
|
53
69
|
columnFilterDisplayMode === 'popover' && !isFilterActive
|
|
54
70
|
? localization.filterByColumn?.replace(
|
|
@@ -73,10 +89,16 @@ export const MRT_TableHeadCellFilterLabel = <TData extends MRT_RowData = {}>({
|
|
|
73
89
|
'{filterValue}',
|
|
74
90
|
`"${
|
|
75
91
|
Array.isArray(filterValue)
|
|
76
|
-
? (filterValue as [string, string])
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
92
|
+
? (filterValue as [string, string])
|
|
93
|
+
.map((value, index) =>
|
|
94
|
+
isMultiSelectFilter ? getSelectLabel(index) : value,
|
|
95
|
+
)
|
|
96
|
+
.join(
|
|
97
|
+
`" ${isRangeFilter ? localization.and : localization.or} "`,
|
|
98
|
+
)
|
|
99
|
+
: isSelectFilter
|
|
100
|
+
? getSelectLabel()
|
|
101
|
+
: (filterValue as string)
|
|
80
102
|
}"`,
|
|
81
103
|
)
|
|
82
104
|
.replace('" "', '');
|
|
@@ -126,31 +148,33 @@ export const MRT_TableHeadCellFilterLabel = <TData extends MRT_RowData = {}>({
|
|
|
126
148
|
</Tooltip>
|
|
127
149
|
</Box>
|
|
128
150
|
</Grow>
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
<
|
|
152
|
-
|
|
153
|
-
|
|
151
|
+
{columnFilterDisplayMode === 'popover' && (
|
|
152
|
+
<Popover
|
|
153
|
+
anchorEl={anchorEl}
|
|
154
|
+
anchorOrigin={{
|
|
155
|
+
horizontal: 'center',
|
|
156
|
+
vertical: 'top',
|
|
157
|
+
}}
|
|
158
|
+
disableScrollLock
|
|
159
|
+
onClick={(event) => event.stopPropagation()}
|
|
160
|
+
onClose={(event) => {
|
|
161
|
+
//@ts-ignore
|
|
162
|
+
event.stopPropagation();
|
|
163
|
+
setAnchorEl(null);
|
|
164
|
+
}}
|
|
165
|
+
onKeyDown={(event) => event.key === 'Enter' && setAnchorEl(null)}
|
|
166
|
+
open={!!anchorEl}
|
|
167
|
+
slotProps={{ paper: { sx: { overflow: 'visible' } } }}
|
|
168
|
+
transformOrigin={{
|
|
169
|
+
horizontal: 'center',
|
|
170
|
+
vertical: 'bottom',
|
|
171
|
+
}}
|
|
172
|
+
>
|
|
173
|
+
<Box sx={{ p: '1rem' }}>
|
|
174
|
+
<MRT_TableHeadCellFilterContainer header={header} table={table} />
|
|
175
|
+
</Box>
|
|
176
|
+
</Popover>
|
|
177
|
+
)}
|
|
154
178
|
</>
|
|
155
179
|
);
|
|
156
180
|
};
|
|
@@ -9,7 +9,6 @@ import {
|
|
|
9
9
|
type MRT_TableInstance,
|
|
10
10
|
type MRT_VirtualItem,
|
|
11
11
|
} from '../../types';
|
|
12
|
-
import { getMRTTheme } from '../../utils/style.utils';
|
|
13
12
|
import { parseFromValuesOrFunc } from '../../utils/utils';
|
|
14
13
|
|
|
15
14
|
export interface MRT_TableHeadRowProps<TData extends MRT_RowData>
|
|
@@ -26,7 +25,12 @@ export const MRT_TableHeadRow = <TData extends MRT_RowData>({
|
|
|
26
25
|
...rest
|
|
27
26
|
}: MRT_TableHeadRowProps<TData>) => {
|
|
28
27
|
const {
|
|
29
|
-
options: {
|
|
28
|
+
options: {
|
|
29
|
+
enableStickyHeader,
|
|
30
|
+
layoutMode,
|
|
31
|
+
mrtTheme: { baseBackgroundColor },
|
|
32
|
+
muiTableHeadRowProps,
|
|
33
|
+
},
|
|
30
34
|
} = table;
|
|
31
35
|
|
|
32
36
|
const { virtualColumns, virtualPaddingLeft, virtualPaddingRight } =
|
|
@@ -44,7 +48,7 @@ export const MRT_TableHeadRow = <TData extends MRT_RowData>({
|
|
|
44
48
|
<TableRow
|
|
45
49
|
{...tableRowProps}
|
|
46
50
|
sx={(theme) => ({
|
|
47
|
-
backgroundColor:
|
|
51
|
+
backgroundColor: baseBackgroundColor,
|
|
48
52
|
boxShadow: `4px 0 8px ${alpha(theme.palette.common.black, 0.1)}`,
|
|
49
53
|
display: layoutMode?.startsWith('grid') ? 'flex' : undefined,
|
|
50
54
|
position:
|
|
@@ -28,8 +28,14 @@ export const MRT_FilterRangeFields = <TData extends MRT_RowData>({
|
|
|
28
28
|
...(parseFromValuesOrFunc(rest?.sx, theme) as any),
|
|
29
29
|
})}
|
|
30
30
|
>
|
|
31
|
-
|
|
32
|
-
|
|
31
|
+
{[0, 1].map((rangeFilterIndex) => (
|
|
32
|
+
<MRT_FilterTextField
|
|
33
|
+
header={header}
|
|
34
|
+
key={rangeFilterIndex}
|
|
35
|
+
rangeFilterIndex={rangeFilterIndex}
|
|
36
|
+
table={table}
|
|
37
|
+
/>
|
|
38
|
+
))}
|
|
33
39
|
</Box>
|
|
34
40
|
);
|
|
35
41
|
};
|