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
|
@@ -1,11 +1,14 @@
|
|
|
1
|
+
import { useMemo } from 'react';
|
|
1
2
|
import { type Row } from '@tanstack/react-table';
|
|
2
3
|
import {
|
|
4
|
+
type DropdownOption,
|
|
3
5
|
type MRT_Column,
|
|
4
6
|
type MRT_ColumnDef,
|
|
5
7
|
type MRT_ColumnOrderState,
|
|
6
8
|
type MRT_DefinedColumnDef,
|
|
7
9
|
type MRT_DefinedTableOptions,
|
|
8
10
|
type MRT_FilterOption,
|
|
11
|
+
type MRT_Header,
|
|
9
12
|
type MRT_RowData,
|
|
10
13
|
type MRT_TableInstance,
|
|
11
14
|
} from '../types';
|
|
@@ -123,49 +126,84 @@ export const getDefaultColumnFilterFn = <TData extends MRT_RowData>(
|
|
|
123
126
|
return 'fuzzy';
|
|
124
127
|
};
|
|
125
128
|
|
|
126
|
-
export const
|
|
127
|
-
|
|
128
|
-
table
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
}
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
column
|
|
138
|
-
|
|
139
|
-
) => {
|
|
140
|
-
const rightColumns = table.getRightVisibleLeafColumns();
|
|
141
|
-
const columns = table.getVisibleLeafColumns();
|
|
142
|
-
return rightColumns.length
|
|
143
|
-
? rightColumns[rightColumns.length - 1].id === column.id
|
|
144
|
-
: columns[columns.length - 1].id === column.id;
|
|
145
|
-
};
|
|
129
|
+
export const getColumnFilterInfo = <TData extends MRT_RowData>({
|
|
130
|
+
header,
|
|
131
|
+
table,
|
|
132
|
+
}: {
|
|
133
|
+
header: MRT_Header<TData>;
|
|
134
|
+
table: MRT_TableInstance<TData>;
|
|
135
|
+
}) => {
|
|
136
|
+
const {
|
|
137
|
+
options: { columnFilterModeOptions },
|
|
138
|
+
} = table;
|
|
139
|
+
const { column } = header;
|
|
140
|
+
const { columnDef } = column;
|
|
141
|
+
const { filterVariant } = columnDef;
|
|
146
142
|
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
column: MRT_Column<TData>,
|
|
150
|
-
) => {
|
|
151
|
-
return (
|
|
152
|
-
column.getIsPinned() === 'left' &&
|
|
153
|
-
table.getLeftLeafHeaders().length - 1 === column.getPinnedIndex()
|
|
143
|
+
const isDateFilter = !!(
|
|
144
|
+
filterVariant?.startsWith('date') || filterVariant?.startsWith('time')
|
|
154
145
|
);
|
|
155
|
-
|
|
146
|
+
const isAutocompleteFilter = filterVariant === 'autocomplete';
|
|
147
|
+
const isRangeFilter =
|
|
148
|
+
filterVariant?.includes('range') ||
|
|
149
|
+
['between', 'betweenInclusive', 'inNumberRange'].includes(
|
|
150
|
+
columnDef._filterFn,
|
|
151
|
+
);
|
|
152
|
+
const isSelectFilter = filterVariant === 'select';
|
|
153
|
+
const isMultiSelectFilter = filterVariant === 'multi-select';
|
|
154
|
+
const isTextboxFilter =
|
|
155
|
+
['autocomplete', 'text'].includes(filterVariant!) ||
|
|
156
|
+
(!isSelectFilter && !isMultiSelectFilter);
|
|
157
|
+
const currentFilterOption = columnDef._filterFn;
|
|
156
158
|
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
159
|
+
const allowedColumnFilterOptions =
|
|
160
|
+
columnDef?.columnFilterModeOptions ?? columnFilterModeOptions;
|
|
161
|
+
|
|
162
|
+
const facetedUniqueValues = column.getFacetedUniqueValues();
|
|
163
|
+
|
|
164
|
+
return {
|
|
165
|
+
allowedColumnFilterOptions,
|
|
166
|
+
currentFilterOption,
|
|
167
|
+
facetedUniqueValues,
|
|
168
|
+
isAutocompleteFilter,
|
|
169
|
+
isDateFilter,
|
|
170
|
+
isMultiSelectFilter,
|
|
171
|
+
isRangeFilter,
|
|
172
|
+
isSelectFilter,
|
|
173
|
+
isTextboxFilter,
|
|
174
|
+
} as const;
|
|
161
175
|
};
|
|
162
176
|
|
|
163
|
-
export const
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
177
|
+
export const useDropdownOptions = <TData extends MRT_RowData>({
|
|
178
|
+
header,
|
|
179
|
+
table,
|
|
180
|
+
}: {
|
|
181
|
+
header: MRT_Header<TData>;
|
|
182
|
+
table: MRT_TableInstance<TData>;
|
|
183
|
+
}): DropdownOption[] | undefined => {
|
|
184
|
+
const { column } = header;
|
|
185
|
+
const { columnDef } = column;
|
|
186
|
+
const {
|
|
187
|
+
facetedUniqueValues,
|
|
188
|
+
isAutocompleteFilter,
|
|
189
|
+
isMultiSelectFilter,
|
|
190
|
+
isSelectFilter,
|
|
191
|
+
} = getColumnFilterInfo({ header, table });
|
|
192
|
+
|
|
193
|
+
return useMemo<DropdownOption[] | undefined>(
|
|
194
|
+
() =>
|
|
195
|
+
columnDef.filterSelectOptions ??
|
|
196
|
+
((isSelectFilter || isMultiSelectFilter || isAutocompleteFilter) &&
|
|
197
|
+
facetedUniqueValues
|
|
198
|
+
? Array.from(facetedUniqueValues.keys())
|
|
199
|
+
.filter((value) => value !== null && value !== undefined)
|
|
200
|
+
.sort((a, b) => a.localeCompare(b))
|
|
201
|
+
: undefined),
|
|
202
|
+
[
|
|
203
|
+
columnDef.filterSelectOptions,
|
|
204
|
+
facetedUniqueValues,
|
|
205
|
+
isMultiSelectFilter,
|
|
206
|
+
isSelectFilter,
|
|
207
|
+
],
|
|
208
|
+
);
|
|
171
209
|
};
|
package/src/utils/row.utils.ts
CHANGED
|
@@ -243,13 +243,14 @@ export const getMRT_SelectAllHandler =
|
|
|
243
243
|
(
|
|
244
244
|
event: ChangeEvent<HTMLInputElement> | MouseEvent<HTMLButtonElement>,
|
|
245
245
|
value?: boolean,
|
|
246
|
+
forceAll?: boolean,
|
|
246
247
|
) => {
|
|
247
248
|
const {
|
|
248
249
|
options: { enableRowPinning, rowPinningDisplayMode, selectAllMode },
|
|
249
250
|
refs: { lastSelectedRowId },
|
|
250
251
|
} = table;
|
|
251
252
|
|
|
252
|
-
selectAllMode === 'all'
|
|
253
|
+
selectAllMode === 'all' || forceAll
|
|
253
254
|
? table.toggleAllRowsSelected(value ?? (event as any).target.checked)
|
|
254
255
|
: table.toggleAllPageRowsSelected(value ?? (event as any).target.checked);
|
|
255
256
|
if (enableRowPinning && rowPinningDisplayMode?.includes('select')) {
|
package/src/utils/style.utils.ts
CHANGED
|
@@ -8,37 +8,34 @@ import {
|
|
|
8
8
|
type MRT_Header,
|
|
9
9
|
type MRT_RowData,
|
|
10
10
|
type MRT_TableInstance,
|
|
11
|
+
type MRT_TableOptions,
|
|
12
|
+
type MRT_Theme,
|
|
11
13
|
} from '../types';
|
|
12
|
-
import {
|
|
13
|
-
getIsFirstRightPinnedColumn,
|
|
14
|
-
getIsLastLeftPinnedColumn,
|
|
15
|
-
getTotalRight,
|
|
16
|
-
} from '../utils/column.utils';
|
|
17
14
|
import { parseFromValuesOrFunc } from './utils';
|
|
18
15
|
|
|
19
16
|
export const parseCSSVarId = (id: string) => id.replace(/[^a-zA-Z0-9]/g, '_');
|
|
20
17
|
|
|
21
18
|
export const getMRTTheme = <TData extends MRT_RowData>(
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
) => {
|
|
25
|
-
const
|
|
19
|
+
mrtTheme: MRT_TableOptions<TData>['mrtTheme'],
|
|
20
|
+
muiTheme: Theme,
|
|
21
|
+
): MRT_Theme => {
|
|
22
|
+
const mrtThemeOverrides = parseFromValuesOrFunc(mrtTheme, muiTheme);
|
|
26
23
|
const baseBackgroundColor =
|
|
27
|
-
|
|
28
|
-
(
|
|
29
|
-
? lighten(
|
|
30
|
-
:
|
|
24
|
+
mrtThemeOverrides?.baseBackgroundColor ??
|
|
25
|
+
(muiTheme.palette.mode === 'dark'
|
|
26
|
+
? lighten(muiTheme.palette.background.default, 0.05)
|
|
27
|
+
: muiTheme.palette.background.default);
|
|
31
28
|
return {
|
|
32
29
|
baseBackgroundColor,
|
|
33
|
-
draggingBorderColor:
|
|
30
|
+
draggingBorderColor: muiTheme.palette.primary.main,
|
|
34
31
|
matchHighlightColor:
|
|
35
|
-
|
|
36
|
-
? darken(
|
|
37
|
-
: lighten(
|
|
32
|
+
muiTheme.palette.mode === 'dark'
|
|
33
|
+
? darken(muiTheme.palette.warning.dark, 0.25)
|
|
34
|
+
: lighten(muiTheme.palette.warning.light, 0.5),
|
|
38
35
|
menuBackgroundColor: lighten(baseBackgroundColor, 0.07),
|
|
39
|
-
pinnedRowBackgroundColor: alpha(
|
|
40
|
-
selectedRowBackgroundColor: alpha(
|
|
41
|
-
...
|
|
36
|
+
pinnedRowBackgroundColor: alpha(muiTheme.palette.primary.main, 0.1),
|
|
37
|
+
selectedRowBackgroundColor: alpha(muiTheme.palette.primary.main, 0.2),
|
|
38
|
+
...mrtThemeOverrides,
|
|
42
39
|
};
|
|
43
40
|
};
|
|
44
41
|
|
|
@@ -61,7 +58,9 @@ export const getCommonPinnedCellStyles = <TData extends MRT_RowData>({
|
|
|
61
58
|
table: MRT_TableInstance<TData>;
|
|
62
59
|
theme: Theme;
|
|
63
60
|
}) => {
|
|
64
|
-
const { baseBackgroundColor } =
|
|
61
|
+
const { baseBackgroundColor } = table.options.mrtTheme;
|
|
62
|
+
const isPinned = column?.getIsPinned();
|
|
63
|
+
|
|
65
64
|
return {
|
|
66
65
|
'&[data-pinned="true"]': {
|
|
67
66
|
'&:before': {
|
|
@@ -73,9 +72,9 @@ export const getCommonPinnedCellStyles = <TData extends MRT_RowData>({
|
|
|
73
72
|
0.97,
|
|
74
73
|
),
|
|
75
74
|
boxShadow: column
|
|
76
|
-
?
|
|
75
|
+
? isPinned === 'left' && column.getIsLastColumn(isPinned)
|
|
77
76
|
? `-4px 0 4px -4px ${alpha(theme.palette.grey[700], 0.5)} inset`
|
|
78
|
-
:
|
|
77
|
+
: isPinned === 'right' && column.getIsFirstColumn(isPinned)
|
|
79
78
|
? `4px 0 4px -4px ${alpha(theme.palette.grey[700], 0.5)} inset`
|
|
80
79
|
: undefined
|
|
81
80
|
: undefined,
|
|
@@ -141,7 +140,7 @@ export const getCommonMRTCellStyles = <TData extends MRT_RowData>({
|
|
|
141
140
|
position: 'sticky',
|
|
142
141
|
right:
|
|
143
142
|
isColumnPinned === 'right'
|
|
144
|
-
? `${
|
|
143
|
+
? `${column.getAfter('right')}px`
|
|
145
144
|
: undefined,
|
|
146
145
|
}
|
|
147
146
|
: {};
|
|
@@ -179,13 +178,12 @@ export const getCommonMRTCellStyles = <TData extends MRT_RowData>({
|
|
|
179
178
|
|
|
180
179
|
export const getCommonToolbarStyles = <TData extends MRT_RowData>({
|
|
181
180
|
table,
|
|
182
|
-
theme,
|
|
183
181
|
}: {
|
|
184
182
|
table: MRT_TableInstance<TData>;
|
|
185
183
|
theme: Theme;
|
|
186
184
|
}) => ({
|
|
187
185
|
alignItems: 'flex-start',
|
|
188
|
-
backgroundColor:
|
|
186
|
+
backgroundColor: table.options.mrtTheme.baseBackgroundColor,
|
|
189
187
|
display: 'grid',
|
|
190
188
|
flexWrap: 'wrap-reverse',
|
|
191
189
|
minHeight: '3.5rem',
|
package/src/utils/utils.ts
CHANGED
|
@@ -6,7 +6,7 @@ export const parseFromValuesOrFunc = <T, U>(
|
|
|
6
6
|
): T | undefined => (fn instanceof Function ? fn(arg) : fn);
|
|
7
7
|
|
|
8
8
|
export const getValueAndLabel = (
|
|
9
|
-
option
|
|
9
|
+
option?: DropdownOption,
|
|
10
10
|
): { label: string; value: string } => {
|
|
11
11
|
let label: string = '';
|
|
12
12
|
let value: string = '';
|