material-react-table 0.23.3 → 0.24.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 +13 -1
- package/dist/MaterialReactTable.d.ts +48 -16
- package/dist/body/MRT_TableBodyCell.d.ts +2 -1
- package/dist/body/MRT_TableBodyRowGrabHandle.d.ts +9 -0
- package/dist/buttons/MRT_GrabHandleButton.d.ts +4 -2
- package/dist/head/MRT_TableHeadCellGrabHandle.d.ts +9 -0
- package/dist/localization.d.ts +1 -0
- package/dist/material-react-table.cjs.development.js +293 -172
- package/dist/material-react-table.cjs.development.js.map +1 -1
- package/dist/material-react-table.cjs.production.min.js +1 -1
- package/dist/material-react-table.cjs.production.min.js.map +1 -1
- package/dist/material-react-table.esm.js +294 -173
- package/dist/material-react-table.esm.js.map +1 -1
- package/dist/toolbar/MRT_LinearProgressBar.d.ts +1 -1
- package/dist/utils.d.ts +1 -1
- package/package.json +3 -3
- package/src/MaterialReactTable.tsx +71 -14
- package/src/body/MRT_TableBodyCell.tsx +17 -3
- package/src/body/MRT_TableBodyRow.tsx +37 -3
- package/src/body/MRT_TableBodyRowGrabHandle.tsx +48 -0
- package/src/buttons/MRT_GrabHandleButton.tsx +12 -8
- package/src/head/MRT_TableHeadCell.tsx +14 -31
- package/src/head/MRT_TableHeadCellGrabHandle.tsx +77 -0
- package/src/localization.ts +2 -0
- package/src/menus/MRT_ColumnActionMenu.tsx +1 -1
- package/src/menus/MRT_ShowHideColumnsMenuItems.tsx +3 -3
- package/src/table/MRT_TableRoot.tsx +25 -6
- package/src/toolbar/MRT_LinearProgressBar.tsx +5 -5
- package/src/toolbar/MRT_ToolbarBottom.tsx +1 -1
- package/src/toolbar/MRT_ToolbarTop.tsx +1 -1
- package/src/utils.ts +9 -8
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import React, { DragEvent, FC, RefObject } from 'react';
|
|
2
|
+
import { MRT_GrabHandleButton } from '../buttons/MRT_GrabHandleButton';
|
|
3
|
+
import { reorderColumn } from '../utils';
|
|
4
|
+
import type { MRT_Column, MRT_TableInstance } from '..';
|
|
5
|
+
|
|
6
|
+
interface Props {
|
|
7
|
+
column: MRT_Column;
|
|
8
|
+
table: MRT_TableInstance;
|
|
9
|
+
tableHeadCellRef: RefObject<HTMLTableCellElement>;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
export const MRT_TableHeadCellGrabHandle: FC<Props> = ({
|
|
13
|
+
column,
|
|
14
|
+
table,
|
|
15
|
+
tableHeadCellRef,
|
|
16
|
+
}) => {
|
|
17
|
+
const {
|
|
18
|
+
getState,
|
|
19
|
+
options: {
|
|
20
|
+
enableColumnOrdering,
|
|
21
|
+
muiTableHeadCellDragHandleProps,
|
|
22
|
+
onColumnDrop,
|
|
23
|
+
},
|
|
24
|
+
setColumnOrder,
|
|
25
|
+
setCurrentDraggingColumn,
|
|
26
|
+
setCurrentHoveredColumn,
|
|
27
|
+
} = table;
|
|
28
|
+
const { columnDef } = column;
|
|
29
|
+
const { currentHoveredColumn, currentDraggingColumn, columnOrder } =
|
|
30
|
+
getState();
|
|
31
|
+
|
|
32
|
+
const mIconButtonProps =
|
|
33
|
+
muiTableHeadCellDragHandleProps instanceof Function
|
|
34
|
+
? muiTableHeadCellDragHandleProps({ column, table })
|
|
35
|
+
: muiTableHeadCellDragHandleProps;
|
|
36
|
+
|
|
37
|
+
const mcIconButtonProps =
|
|
38
|
+
columnDef.muiTableHeadCellDragHandleProps instanceof Function
|
|
39
|
+
? columnDef.muiTableHeadCellDragHandleProps({ column, table })
|
|
40
|
+
: columnDef.muiTableHeadCellDragHandleProps;
|
|
41
|
+
|
|
42
|
+
const iconButtonProps = {
|
|
43
|
+
...mIconButtonProps,
|
|
44
|
+
...mcIconButtonProps,
|
|
45
|
+
};
|
|
46
|
+
|
|
47
|
+
const handleDragStart = (e: DragEvent<HTMLButtonElement>) => {
|
|
48
|
+
setCurrentDraggingColumn(column);
|
|
49
|
+
e.dataTransfer.setDragImage(tableHeadCellRef.current as HTMLElement, 0, 0);
|
|
50
|
+
};
|
|
51
|
+
|
|
52
|
+
const handleDragEnd = (event: DragEvent<HTMLButtonElement>) => {
|
|
53
|
+
onColumnDrop?.({
|
|
54
|
+
event,
|
|
55
|
+
draggedColumn: column,
|
|
56
|
+
targetColumn: currentHoveredColumn,
|
|
57
|
+
});
|
|
58
|
+
if (
|
|
59
|
+
enableColumnOrdering &&
|
|
60
|
+
currentHoveredColumn &&
|
|
61
|
+
currentHoveredColumn?.id !== currentDraggingColumn?.id
|
|
62
|
+
) {
|
|
63
|
+
setColumnOrder(reorderColumn(column, currentHoveredColumn, columnOrder));
|
|
64
|
+
}
|
|
65
|
+
setCurrentDraggingColumn(null);
|
|
66
|
+
setCurrentHoveredColumn(null);
|
|
67
|
+
};
|
|
68
|
+
|
|
69
|
+
return (
|
|
70
|
+
<MRT_GrabHandleButton
|
|
71
|
+
iconButtonProps={iconButtonProps}
|
|
72
|
+
onDragStart={handleDragStart}
|
|
73
|
+
onDragEnd={handleDragEnd}
|
|
74
|
+
table={table}
|
|
75
|
+
/>
|
|
76
|
+
);
|
|
77
|
+
};
|
package/src/localization.ts
CHANGED
|
@@ -34,6 +34,7 @@ export interface MRT_Localization {
|
|
|
34
34
|
hideColumn: string;
|
|
35
35
|
max: string;
|
|
36
36
|
min: string;
|
|
37
|
+
move: string;
|
|
37
38
|
pinToLeft: string;
|
|
38
39
|
pinToRight: string;
|
|
39
40
|
resetColumnSize: string;
|
|
@@ -102,6 +103,7 @@ export const MRT_DefaultLocalization_EN: MRT_Localization = {
|
|
|
102
103
|
hideColumn: 'Hide {column} column',
|
|
103
104
|
max: 'Max',
|
|
104
105
|
min: 'Min',
|
|
106
|
+
move: 'Move',
|
|
105
107
|
pinToLeft: 'Pin to left',
|
|
106
108
|
pinToRight: 'Pin to right',
|
|
107
109
|
resetColumnSize: 'Reset column size',
|
|
@@ -100,7 +100,7 @@ export const MRT_ColumnActionMenu: FC<Props> = ({
|
|
|
100
100
|
|
|
101
101
|
const handleGroupByColumn = () => {
|
|
102
102
|
column.toggleGrouping();
|
|
103
|
-
setColumnOrder((old) => ['mrt-expand', ...old]);
|
|
103
|
+
setColumnOrder((old) => ['mrt-row-expand', ...old]);
|
|
104
104
|
setAnchorEl(null);
|
|
105
105
|
};
|
|
106
106
|
|
|
@@ -90,7 +90,7 @@ export const MRT_ShowHideColumnsMenuItems: FC<Props> = ({
|
|
|
90
90
|
return (
|
|
91
91
|
<>
|
|
92
92
|
<MenuItem
|
|
93
|
-
disableRipple
|
|
93
|
+
disableRipple
|
|
94
94
|
ref={menuItemRef as any}
|
|
95
95
|
onDragEnter={handleDragEnter}
|
|
96
96
|
sx={(theme) => ({
|
|
@@ -122,8 +122,8 @@ export const MRT_ShowHideColumnsMenuItems: FC<Props> = ({
|
|
|
122
122
|
) &&
|
|
123
123
|
(columnDef.enableColumnOrdering !== false ? (
|
|
124
124
|
<MRT_GrabHandleButton
|
|
125
|
-
|
|
126
|
-
|
|
125
|
+
onDragEnd={handleDragEnd}
|
|
126
|
+
onDragStart={handleDragStart}
|
|
127
127
|
table={table}
|
|
128
128
|
/>
|
|
129
129
|
) : (
|
|
@@ -53,14 +53,18 @@ export const MRT_TableRoot = <TData extends Record<string, any> = {}>(
|
|
|
53
53
|
const [columnOrder, setColumnOrder] = useState(
|
|
54
54
|
initialState.columnOrder ?? [],
|
|
55
55
|
);
|
|
56
|
+
const [currentDraggingColumn, setCurrentDraggingColumn] =
|
|
57
|
+
useState<MRT_Column<TData> | null>(null);
|
|
58
|
+
const [currentDraggingRow, setCurrentDraggingRow] =
|
|
59
|
+
useState<MRT_Row<TData> | null>(null);
|
|
56
60
|
const [currentEditingCell, setCurrentEditingCell] =
|
|
57
61
|
useState<MRT_Cell<TData> | null>(initialState?.currentEditingCell ?? null);
|
|
58
62
|
const [currentEditingRow, setCurrentEditingRow] =
|
|
59
63
|
useState<MRT_Row<TData> | null>(initialState?.currentEditingRow ?? null);
|
|
60
|
-
const [currentDraggingColumn, setCurrentDraggingColumn] =
|
|
61
|
-
useState<MRT_Column<TData> | null>(null);
|
|
62
64
|
const [currentHoveredColumn, setCurrentHoveredColumn] =
|
|
63
65
|
useState<MRT_Column<TData> | null>(null);
|
|
66
|
+
const [currentHoveredRow, setCurrentHoveredRow] =
|
|
67
|
+
useState<MRT_Row<TData> | null>(null);
|
|
64
68
|
const [density, setDensity] = useState(
|
|
65
69
|
initialState?.density ?? 'comfortable',
|
|
66
70
|
);
|
|
@@ -108,6 +112,14 @@ export const MRT_TableRoot = <TData extends Record<string, any> = {}>(
|
|
|
108
112
|
() =>
|
|
109
113
|
(
|
|
110
114
|
[
|
|
115
|
+
columnOrder.includes('mrt-row-drag') && {
|
|
116
|
+
columnDefType: 'display',
|
|
117
|
+
header: props.localization?.move,
|
|
118
|
+
id: 'mrt-row-drag',
|
|
119
|
+
muiTableBodyCellProps: props.muiTableBodyCellProps,
|
|
120
|
+
muiTableHeadCellProps: props.muiTableHeadCellProps,
|
|
121
|
+
size: 60,
|
|
122
|
+
},
|
|
111
123
|
columnOrder.includes('mrt-row-actions') && {
|
|
112
124
|
Cell: ({ cell }) => (
|
|
113
125
|
<MRT_ToggleRowActionMenuButton
|
|
@@ -122,7 +134,7 @@ export const MRT_TableRoot = <TData extends Record<string, any> = {}>(
|
|
|
122
134
|
muiTableHeadCellProps: props.muiTableHeadCellProps,
|
|
123
135
|
size: 70,
|
|
124
136
|
},
|
|
125
|
-
columnOrder.includes('mrt-expand') && {
|
|
137
|
+
columnOrder.includes('mrt-row-expand') && {
|
|
126
138
|
Cell: ({ cell }) => (
|
|
127
139
|
<MRT_ExpandButton row={cell.row as any} table={table} />
|
|
128
140
|
),
|
|
@@ -132,12 +144,12 @@ export const MRT_TableRoot = <TData extends Record<string, any> = {}>(
|
|
|
132
144
|
) : null,
|
|
133
145
|
columnDefType: 'display',
|
|
134
146
|
header: props.localization?.expand,
|
|
135
|
-
id: 'mrt-expand',
|
|
147
|
+
id: 'mrt-row-expand',
|
|
136
148
|
muiTableBodyCellProps: props.muiTableBodyCellProps,
|
|
137
149
|
muiTableHeadCellProps: props.muiTableHeadCellProps,
|
|
138
150
|
size: 60,
|
|
139
151
|
},
|
|
140
|
-
columnOrder.includes('mrt-select') && {
|
|
152
|
+
columnOrder.includes('mrt-row-select') && {
|
|
141
153
|
Cell: ({ cell }) => (
|
|
142
154
|
<MRT_SelectCheckbox row={cell.row as any} table={table} />
|
|
143
155
|
),
|
|
@@ -147,7 +159,7 @@ export const MRT_TableRoot = <TData extends Record<string, any> = {}>(
|
|
|
147
159
|
) : null,
|
|
148
160
|
columnDefType: 'display',
|
|
149
161
|
header: props.localization?.select,
|
|
150
|
-
id: 'mrt-select',
|
|
162
|
+
id: 'mrt-row-select',
|
|
151
163
|
muiTableBodyCellProps: props.muiTableBodyCellProps,
|
|
152
164
|
muiTableHeadCellProps: props.muiTableHeadCellProps,
|
|
153
165
|
size: 60,
|
|
@@ -173,6 +185,7 @@ export const MRT_TableRoot = <TData extends Record<string, any> = {}>(
|
|
|
173
185
|
props.enableGrouping,
|
|
174
186
|
props.enableRowActions,
|
|
175
187
|
props.enableRowNumbers,
|
|
188
|
+
props.enableRowOrdering,
|
|
176
189
|
props.enableRowSelection,
|
|
177
190
|
props.enableSelectAll,
|
|
178
191
|
props.localization,
|
|
@@ -229,11 +242,13 @@ export const MRT_TableRoot = <TData extends Record<string, any> = {}>(
|
|
|
229
242
|
state: {
|
|
230
243
|
columnOrder,
|
|
231
244
|
currentDraggingColumn,
|
|
245
|
+
currentDraggingRow,
|
|
232
246
|
currentEditingCell,
|
|
233
247
|
currentEditingRow,
|
|
234
248
|
currentFilterFns,
|
|
235
249
|
currentGlobalFilterFn,
|
|
236
250
|
currentHoveredColumn,
|
|
251
|
+
currentHoveredRow,
|
|
237
252
|
density,
|
|
238
253
|
isFullScreen,
|
|
239
254
|
showAlertBanner,
|
|
@@ -245,6 +260,8 @@ export const MRT_TableRoot = <TData extends Record<string, any> = {}>(
|
|
|
245
260
|
}),
|
|
246
261
|
setCurrentDraggingColumn:
|
|
247
262
|
props.onCurrentDraggingColumnChange ?? setCurrentDraggingColumn,
|
|
263
|
+
setCurrentDraggingRow:
|
|
264
|
+
props.onCurrentDraggingRowChange ?? setCurrentDraggingRow,
|
|
248
265
|
setCurrentEditingCell:
|
|
249
266
|
props.onCurrentEditingCellChange ?? setCurrentEditingCell,
|
|
250
267
|
setCurrentEditingRow:
|
|
@@ -254,6 +271,8 @@ export const MRT_TableRoot = <TData extends Record<string, any> = {}>(
|
|
|
254
271
|
props.onCurrentGlobalFilterFnChange ?? setCurrentGlobalFilterFn,
|
|
255
272
|
setCurrentHoveredColumn:
|
|
256
273
|
props.onCurrentHoveredColumnChange ?? setCurrentHoveredColumn,
|
|
274
|
+
setCurrentHoveredRow:
|
|
275
|
+
props.onCurrentHoveredRowChange ?? setCurrentHoveredRow,
|
|
257
276
|
setDensity: props.onDensityChange ?? setDensity,
|
|
258
277
|
setIsFullScreen: props.onIsFullScreenChange ?? setIsFullScreen,
|
|
259
278
|
setShowAlertBanner: props.onShowAlertBannerChange ?? setShowAlertBanner,
|
|
@@ -3,11 +3,11 @@ import { Collapse, LinearProgress } from '@mui/material';
|
|
|
3
3
|
import { MRT_TableInstance } from '..';
|
|
4
4
|
|
|
5
5
|
interface Props {
|
|
6
|
-
|
|
6
|
+
isTopToolbar: boolean;
|
|
7
7
|
table: MRT_TableInstance;
|
|
8
8
|
}
|
|
9
9
|
|
|
10
|
-
export const MRT_LinearProgressBar: FC<Props> = ({
|
|
10
|
+
export const MRT_LinearProgressBar: FC<Props> = ({ isTopToolbar, table }) => {
|
|
11
11
|
const {
|
|
12
12
|
options: { muiLinearProgressProps },
|
|
13
13
|
getState,
|
|
@@ -16,7 +16,7 @@ export const MRT_LinearProgressBar: FC<Props> = ({ alignTo, table }) => {
|
|
|
16
16
|
|
|
17
17
|
const linearProgressProps =
|
|
18
18
|
muiLinearProgressProps instanceof Function
|
|
19
|
-
? muiLinearProgressProps({ table })
|
|
19
|
+
? muiLinearProgressProps({ isTopToolbar, table })
|
|
20
20
|
: muiLinearProgressProps;
|
|
21
21
|
|
|
22
22
|
return (
|
|
@@ -25,9 +25,9 @@ export const MRT_LinearProgressBar: FC<Props> = ({ alignTo, table }) => {
|
|
|
25
25
|
mountOnEnter
|
|
26
26
|
unmountOnExit
|
|
27
27
|
sx={{
|
|
28
|
-
bottom:
|
|
28
|
+
bottom: isTopToolbar ? 0 : undefined,
|
|
29
29
|
position: 'absolute',
|
|
30
|
-
top:
|
|
30
|
+
top: !isTopToolbar ? 0 : undefined,
|
|
31
31
|
width: '100%',
|
|
32
32
|
}}
|
|
33
33
|
>
|
|
@@ -53,7 +53,7 @@ export const MRT_ToolbarBottom: FC<Props> = ({ table }) => {
|
|
|
53
53
|
} as any)
|
|
54
54
|
}
|
|
55
55
|
>
|
|
56
|
-
<MRT_LinearProgressBar
|
|
56
|
+
<MRT_LinearProgressBar isTopToolbar={false} table={table} />
|
|
57
57
|
{positionToolbarAlertBanner === 'bottom' && (
|
|
58
58
|
<MRT_ToolbarAlertBanner table={table} />
|
|
59
59
|
)}
|
|
@@ -103,7 +103,7 @@ export const MRT_ToolbarTop: FC<Props> = ({ table }) => {
|
|
|
103
103
|
['top', 'both'].includes(positionPagination ?? '') && (
|
|
104
104
|
<MRT_TablePagination table={table} position="top" />
|
|
105
105
|
)}
|
|
106
|
-
<MRT_LinearProgressBar
|
|
106
|
+
<MRT_LinearProgressBar isTopToolbar table={table} />
|
|
107
107
|
</Toolbar>
|
|
108
108
|
);
|
|
109
109
|
};
|
package/src/utils.ts
CHANGED
|
@@ -61,17 +61,17 @@ export const prepareColumns = <TData extends Record<string, any> = {}>(
|
|
|
61
61
|
}) as MRT_DefinedColumnDef<TData>[];
|
|
62
62
|
|
|
63
63
|
export const reorderColumn = <TData extends Record<string, any> = {}>(
|
|
64
|
-
|
|
65
|
-
|
|
64
|
+
draggedColumn: MRT_Column<TData>,
|
|
65
|
+
targetColumn: MRT_Column<TData>,
|
|
66
66
|
columnOrder: ColumnOrderState,
|
|
67
67
|
): ColumnOrderState => {
|
|
68
|
-
if (
|
|
69
|
-
|
|
68
|
+
if (draggedColumn.getCanPin()) {
|
|
69
|
+
draggedColumn.pin(targetColumn.getIsPinned());
|
|
70
70
|
}
|
|
71
71
|
columnOrder.splice(
|
|
72
|
-
columnOrder.indexOf(
|
|
72
|
+
columnOrder.indexOf(targetColumn.id),
|
|
73
73
|
0,
|
|
74
|
-
columnOrder.splice(columnOrder.indexOf(
|
|
74
|
+
columnOrder.splice(columnOrder.indexOf(draggedColumn.id), 1)[0],
|
|
75
75
|
);
|
|
76
76
|
return [...columnOrder];
|
|
77
77
|
};
|
|
@@ -82,14 +82,15 @@ export const getLeadingDisplayColumnIds = <
|
|
|
82
82
|
props: MaterialReactTableProps<TData>,
|
|
83
83
|
) =>
|
|
84
84
|
[
|
|
85
|
+
(props.enableRowDragging || props.enableRowOrdering) && 'mrt-row-drag',
|
|
85
86
|
((props.positionActionsColumn === 'first' && props.enableRowActions) ||
|
|
86
87
|
(props.enableEditing && props.editingMode === 'row')) &&
|
|
87
88
|
'mrt-row-actions',
|
|
88
89
|
(props.enableExpanding ||
|
|
89
90
|
props.enableGrouping ||
|
|
90
91
|
props.renderDetailPanel) &&
|
|
91
|
-
'mrt-expand',
|
|
92
|
-
props.enableRowSelection && 'mrt-select',
|
|
92
|
+
'mrt-row-expand',
|
|
93
|
+
props.enableRowSelection && 'mrt-row-select',
|
|
93
94
|
props.enableRowNumbers && 'mrt-row-numbers',
|
|
94
95
|
].filter(Boolean) as string[];
|
|
95
96
|
|