material-react-table 2.0.0-alpha.1 → 2.0.0-alpha.3
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 +2 -2
- package/dist/cjs/index.js +2408 -2334
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/types/MaterialReactTable.d.ts +1 -1
- package/dist/cjs/types/buttons/MRT_GrabHandleButton.d.ts +1 -1
- package/dist/cjs/types/buttons/MRT_RowPinButton.d.ts +2 -2
- package/dist/cjs/types/column.utils.d.ts +6 -6
- package/dist/cjs/types/filterFns.d.ts +14 -14
- package/dist/cjs/types/head/MRT_TableHeadCellFilterLabel.d.ts +1 -1
- package/dist/cjs/types/head/MRT_TableHeadCellSortLabel.d.ts +1 -1
- package/dist/cjs/types/hooks/useMRT_DisplayColumns.d.ts +3 -3
- package/dist/cjs/types/icons.d.ts +1 -1
- package/dist/cjs/types/inputs/MRT_FilterRangeSlider.d.ts +1 -1
- package/dist/cjs/types/locales/np.d.ts +2 -0
- package/dist/cjs/types/menus/MRT_ColumnActionMenu.d.ts +4 -4
- package/dist/cjs/types/menus/MRT_ShowHideColumnsMenuItems.d.ts +1 -1
- package/dist/cjs/types/toolbar/MRT_TablePagination.d.ts +2 -2
- package/dist/cjs/types/toolbar/MRT_TopToolbar.d.ts +1 -1
- package/dist/cjs/types/types.d.ts +217 -197
- package/dist/esm/material-react-table.esm.js +2311 -2239
- package/dist/esm/material-react-table.esm.js.map +1 -1
- package/dist/esm/types/MaterialReactTable.d.ts +1 -1
- package/dist/esm/types/buttons/MRT_GrabHandleButton.d.ts +1 -1
- package/dist/esm/types/buttons/MRT_RowPinButton.d.ts +2 -2
- package/dist/esm/types/column.utils.d.ts +6 -6
- package/dist/esm/types/filterFns.d.ts +14 -14
- package/dist/esm/types/head/MRT_TableHeadCellFilterLabel.d.ts +1 -1
- package/dist/esm/types/head/MRT_TableHeadCellSortLabel.d.ts +1 -1
- package/dist/esm/types/hooks/useMRT_DisplayColumns.d.ts +3 -3
- package/dist/esm/types/icons.d.ts +1 -1
- package/dist/esm/types/inputs/MRT_FilterRangeSlider.d.ts +1 -1
- package/dist/esm/types/locales/np.d.ts +2 -0
- package/dist/esm/types/menus/MRT_ColumnActionMenu.d.ts +4 -4
- package/dist/esm/types/menus/MRT_ShowHideColumnsMenuItems.d.ts +1 -1
- package/dist/esm/types/toolbar/MRT_TablePagination.d.ts +2 -2
- package/dist/esm/types/toolbar/MRT_TopToolbar.d.ts +1 -1
- package/dist/esm/types/types.d.ts +217 -197
- package/dist/index.d.ts +258 -238
- package/locales/fr.esm.js +1 -1
- package/locales/fr.esm.js.map +1 -1
- package/locales/fr.js +1 -1
- package/locales/fr.js.map +1 -1
- package/locales/np.d.ts +2 -0
- package/locales/np.esm.d.ts +2 -0
- package/locales/np.esm.js +94 -0
- package/locales/np.esm.js.map +1 -0
- package/locales/np.js +98 -0
- package/locales/np.js.map +1 -0
- package/locales/tr.d.ts +2 -0
- package/locales/tr.esm.d.ts +2 -0
- package/locales/tr.esm.js +93 -0
- package/locales/tr.esm.js.map +1 -0
- package/locales/tr.js +97 -0
- package/locales/tr.js.map +1 -0
- package/locales/uk.d.ts +2 -0
- package/locales/uk.esm.d.ts +2 -0
- package/locales/uk.esm.js +93 -0
- package/locales/uk.esm.js.map +1 -0
- package/locales/uk.js +97 -0
- package/locales/uk.js.map +1 -0
- package/locales/vi.d.ts +2 -0
- package/locales/vi.esm.d.ts +2 -0
- package/locales/vi.esm.js +93 -0
- package/locales/vi.esm.js.map +1 -0
- package/locales/vi.js +97 -0
- package/locales/vi.js.map +1 -0
- package/locales/zh-Hans.d.ts +2 -0
- package/locales/zh-Hans.esm.d.ts +2 -0
- package/locales/zh-Hans.esm.js +93 -0
- package/locales/zh-Hans.esm.js.map +1 -0
- package/locales/zh-Hans.js +97 -0
- package/locales/zh-Hans.js.map +1 -0
- package/locales/zh-Hant.d.ts +2 -0
- package/locales/zh-Hant.esm.d.ts +2 -0
- package/locales/zh-Hant.esm.js +93 -0
- package/locales/zh-Hant.esm.js.map +1 -0
- package/locales/zh-Hant.js +97 -0
- package/locales/zh-Hant.js.map +1 -0
- package/package.json +27 -26
- package/src/MaterialReactTable.tsx +2 -2
- package/src/body/MRT_TableBody.tsx +9 -9
- package/src/body/MRT_TableBodyCell.tsx +22 -22
- package/src/body/MRT_TableBodyCellValue.tsx +5 -5
- package/src/body/MRT_TableBodyRow.tsx +32 -32
- package/src/body/MRT_TableBodyRowGrabHandle.tsx +2 -2
- package/src/body/MRT_TableBodyRowPinButton.tsx +3 -3
- package/src/body/MRT_TableDetailPanel.tsx +3 -3
- package/src/buttons/MRT_CopyButton.tsx +1 -1
- package/src/buttons/MRT_EditActionButtons.tsx +4 -4
- package/src/buttons/MRT_ExpandAllButton.tsx +3 -3
- package/src/buttons/MRT_ExpandButton.tsx +1 -1
- package/src/buttons/MRT_GrabHandleButton.tsx +10 -10
- package/src/buttons/MRT_RowPinButton.tsx +5 -5
- package/src/buttons/MRT_ShowHideColumnsButton.tsx +1 -1
- package/src/buttons/MRT_ToggleFullScreenButton.tsx +2 -2
- package/src/buttons/MRT_ToggleRowActionMenuButton.tsx +8 -8
- package/src/column.utils.ts +24 -22
- package/src/filterFns.ts +29 -29
- package/src/footer/MRT_TableFooter.tsx +9 -9
- package/src/footer/MRT_TableFooterCell.tsx +1 -1
- package/src/footer/MRT_TableFooterRow.tsx +2 -2
- package/src/head/MRT_TableHead.tsx +9 -9
- package/src/head/MRT_TableHeadCell.tsx +10 -6
- package/src/head/MRT_TableHeadCellColumnActionsButton.tsx +9 -6
- package/src/head/MRT_TableHeadCellFilterContainer.tsx +12 -5
- package/src/head/MRT_TableHeadCellFilterLabel.tsx +106 -61
- package/src/head/MRT_TableHeadCellGrabHandle.tsx +2 -2
- package/src/head/MRT_TableHeadCellResizeHandle.tsx +11 -11
- package/src/head/MRT_TableHeadCellSortLabel.tsx +8 -8
- package/src/head/MRT_TableHeadRow.tsx +2 -2
- package/src/hooks/useMRT_DisplayColumns.tsx +5 -5
- package/src/hooks/useMRT_Effects.ts +3 -3
- package/src/hooks/useMRT_TableInstance.ts +15 -14
- package/src/hooks/useMRT_TableOptions.ts +3 -3
- package/src/icons.ts +2 -2
- package/src/inputs/MRT_EditCellTextField.tsx +9 -9
- package/src/inputs/MRT_FilterCheckbox.tsx +7 -7
- package/src/inputs/MRT_FilterRangeFields.tsx +1 -1
- package/src/inputs/MRT_FilterRangeSlider.tsx +6 -6
- package/src/inputs/MRT_FilterTextField.tsx +309 -230
- package/src/inputs/MRT_GlobalFilterTextField.tsx +26 -26
- package/src/inputs/MRT_SelectCheckbox.tsx +7 -7
- package/src/locales/fr.ts +1 -1
- package/src/locales/np.ts +94 -0
- package/src/menus/MRT_ColumnActionMenu.tsx +48 -45
- package/src/menus/MRT_FilterOptionMenu.tsx +36 -36
- package/src/menus/MRT_RowActionMenu.tsx +7 -7
- package/src/menus/MRT_ShowHideColumnsMenu.tsx +6 -6
- package/src/menus/MRT_ShowHideColumnsMenuItems.tsx +5 -5
- package/src/modals/MRT_EditRowModal.tsx +8 -8
- package/src/sortingFns.ts +1 -1
- package/src/table/MRT_Table.tsx +7 -7
- package/src/table/MRT_TableContainer.tsx +10 -10
- package/src/table/MRT_TablePaper.tsx +9 -9
- package/src/toolbar/MRT_BottomToolbar.tsx +5 -5
- package/src/toolbar/MRT_LinearProgressBar.tsx +4 -4
- package/src/toolbar/MRT_TablePagination.tsx +19 -19
- package/src/toolbar/MRT_ToolbarAlertBanner.tsx +4 -4
- package/src/toolbar/MRT_ToolbarDropZone.tsx +6 -6
- package/src/toolbar/MRT_ToolbarInternalButtons.tsx +8 -5
- package/src/toolbar/MRT_TopToolbar.tsx +7 -7
- package/src/types.ts +288 -257
- package/src/useMaterialReactTable.ts +1 -1
@@ -3,23 +3,27 @@ import {
|
|
3
3
|
type MouseEvent,
|
4
4
|
useCallback,
|
5
5
|
useEffect,
|
6
|
+
useMemo,
|
6
7
|
useRef,
|
7
8
|
useState,
|
8
|
-
useMemo,
|
9
9
|
} from 'react';
|
10
|
+
import Autocomplete from '@mui/material/Autocomplete';
|
10
11
|
import Box from '@mui/material/Box';
|
11
12
|
import Checkbox from '@mui/material/Checkbox';
|
12
13
|
import Chip from '@mui/material/Chip';
|
13
14
|
import IconButton from '@mui/material/IconButton';
|
14
15
|
import InputAdornment from '@mui/material/InputAdornment';
|
15
16
|
import MenuItem from '@mui/material/MenuItem';
|
16
|
-
import TextField from '@mui/material/TextField';
|
17
|
+
import TextField, { type TextFieldProps } from '@mui/material/TextField';
|
17
18
|
import Tooltip from '@mui/material/Tooltip';
|
18
19
|
import { debounce } from '@mui/material/utils';
|
20
|
+
import {
|
21
|
+
DatePicker,
|
22
|
+
type DatePickerProps,
|
23
|
+
} from '@mui/x-date-pickers/DatePicker';
|
24
|
+
import { parseFromValuesOrFunc } from '../column.utils';
|
19
25
|
import { MRT_FilterOptionMenu } from '../menus/MRT_FilterOptionMenu';
|
20
|
-
import { type TextFieldProps } from '@mui/material/TextField';
|
21
26
|
import { type MRT_Header, type MRT_TableInstance } from '../types';
|
22
|
-
import { parseFromValuesOrFunc } from '../column.utils';
|
23
27
|
|
24
28
|
interface Props<TData extends Record<string, any>> {
|
25
29
|
header: MRT_Header<TData>;
|
@@ -34,11 +38,13 @@ export const MRT_FilterTextField = <TData extends Record<string, any>>({
|
|
34
38
|
}: Props<TData>) => {
|
35
39
|
const {
|
36
40
|
options: {
|
37
|
-
enableColumnFilterModes,
|
38
41
|
columnFilterModeOptions,
|
39
|
-
|
42
|
+
enableColumnFilterModes,
|
43
|
+
icons: { CloseIcon, FilterListIcon },
|
40
44
|
localization,
|
41
45
|
manualFiltering,
|
46
|
+
muiFilterAutocompleteProps,
|
47
|
+
muiFilterDatePickerProps,
|
42
48
|
muiFilterTextFieldProps,
|
43
49
|
},
|
44
50
|
refs: { filterInputRefs },
|
@@ -46,6 +52,7 @@ export const MRT_FilterTextField = <TData extends Record<string, any>>({
|
|
46
52
|
} = table;
|
47
53
|
const { column } = header;
|
48
54
|
const { columnDef } = column;
|
55
|
+
const { filterVariant } = columnDef;
|
49
56
|
|
50
57
|
const textFieldProps: TextFieldProps = {
|
51
58
|
...parseFromValuesOrFunc(muiFilterTextFieldProps, { column, table }),
|
@@ -55,12 +62,30 @@ export const MRT_FilterTextField = <TData extends Record<string, any>>({
|
|
55
62
|
}),
|
56
63
|
};
|
57
64
|
|
65
|
+
const autocompleteProps = {
|
66
|
+
...parseFromValuesOrFunc(muiFilterAutocompleteProps, { column, table }),
|
67
|
+
...parseFromValuesOrFunc(columnDef.muiFilterAutocompleteProps, {
|
68
|
+
column,
|
69
|
+
table,
|
70
|
+
}),
|
71
|
+
};
|
72
|
+
|
73
|
+
const datePickerProps: DatePickerProps<any> = {
|
74
|
+
...parseFromValuesOrFunc(muiFilterDatePickerProps, { column, table }),
|
75
|
+
...parseFromValuesOrFunc(columnDef.muiFilterDatePickerProps, {
|
76
|
+
column,
|
77
|
+
table,
|
78
|
+
}),
|
79
|
+
};
|
80
|
+
|
81
|
+
const isDateFilter = filterVariant?.startsWith('date');
|
82
|
+
const isAutocompleteFilter = filterVariant === 'autocomplete';
|
58
83
|
const isRangeFilter =
|
59
|
-
|
60
|
-
const isSelectFilter =
|
61
|
-
const isMultiSelectFilter =
|
84
|
+
filterVariant?.includes('range') || rangeFilterIndex !== undefined;
|
85
|
+
const isSelectFilter = filterVariant === 'select';
|
86
|
+
const isMultiSelectFilter = filterVariant === 'multi-select';
|
62
87
|
const isTextboxFilter =
|
63
|
-
|
88
|
+
['autocomplete', 'text'].includes(filterVariant!) ||
|
64
89
|
(!isSelectFilter && !isMultiSelectFilter);
|
65
90
|
const currentFilterOption = columnDef._filterFn;
|
66
91
|
const filterChipLabel = ['empty', 'notEmpty'].includes(currentFilterOption)
|
@@ -91,50 +116,28 @@ export const MRT_FilterTextField = <TData extends Record<string, any>>({
|
|
91
116
|
|
92
117
|
const facetedUniqueValues = column.getFacetedUniqueValues();
|
93
118
|
|
94
|
-
const
|
95
|
-
() =>
|
96
|
-
columnDef.filterSelectOptions ??
|
97
|
-
((isSelectFilter || isMultiSelectFilter) && facetedUniqueValues
|
98
|
-
? Array.from(facetedUniqueValues.keys())
|
99
|
-
.filter((value) => value !== null && value !== undefined)
|
100
|
-
.sort((a, b) => a.localeCompare(b))
|
101
|
-
: undefined),
|
102
|
-
[
|
103
|
-
columnDef.filterSelectOptions,
|
104
|
-
facetedUniqueValues,
|
105
|
-
isMultiSelectFilter,
|
106
|
-
isSelectFilter,
|
107
|
-
],
|
108
|
-
);
|
109
|
-
|
110
|
-
const [anchorEl, setAnchorEl] = useState<null | HTMLElement>(null);
|
119
|
+
const [anchorEl, setAnchorEl] = useState<HTMLElement | null>(null);
|
111
120
|
const [filterValue, setFilterValue] = useState<string | string[]>(() =>
|
112
121
|
isMultiSelectFilter
|
113
122
|
? (column.getFilterValue() as string[]) || []
|
114
123
|
: isRangeFilter
|
115
124
|
? (column.getFilterValue() as [string, string])?.[
|
116
125
|
rangeFilterIndex as number
|
117
|
-
] ||
|
126
|
+
] || ''
|
118
127
|
: (column.getFilterValue() as string) ?? '',
|
119
128
|
);
|
120
129
|
|
121
130
|
const handleChangeDebounced = useCallback(
|
122
131
|
debounce(
|
123
|
-
(
|
124
|
-
const value =
|
125
|
-
textFieldProps.type === 'date'
|
126
|
-
? event.target.valueAsDate
|
127
|
-
: textFieldProps.type === 'number'
|
128
|
-
? event.target.valueAsNumber
|
129
|
-
: event.target.value;
|
132
|
+
(newValue: any) => {
|
130
133
|
if (isRangeFilter) {
|
131
|
-
column.setFilterValue((old: Array<
|
134
|
+
column.setFilterValue((old: Array<Date | null | number | string>) => {
|
132
135
|
const newFilterValues = old ?? ['', ''];
|
133
|
-
newFilterValues[rangeFilterIndex as number] =
|
136
|
+
newFilterValues[rangeFilterIndex as number] = newValue;
|
134
137
|
return newFilterValues;
|
135
138
|
});
|
136
139
|
} else {
|
137
|
-
column.setFilterValue(
|
140
|
+
column.setFilterValue(newValue ?? undefined);
|
138
141
|
}
|
139
142
|
},
|
140
143
|
isTextboxFilter ? (manualFiltering ? 400 : 200) : 1,
|
@@ -142,9 +145,20 @@ export const MRT_FilterTextField = <TData extends Record<string, any>>({
|
|
142
145
|
[],
|
143
146
|
);
|
144
147
|
|
145
|
-
const handleChange = (
|
146
|
-
setFilterValue(
|
147
|
-
handleChangeDebounced(
|
148
|
+
const handleChange = (newValue: any) => {
|
149
|
+
setFilterValue(newValue?.toString() ?? '');
|
150
|
+
handleChangeDebounced(newValue);
|
151
|
+
};
|
152
|
+
|
153
|
+
const handleTextFieldChange = (event: ChangeEvent<HTMLInputElement>) => {
|
154
|
+
const newValue =
|
155
|
+
textFieldProps.type === 'date'
|
156
|
+
? event.target.valueAsDate
|
157
|
+
: textFieldProps.type === 'number'
|
158
|
+
? event.target.valueAsNumber
|
159
|
+
: event.target.value;
|
160
|
+
handleChange(newValue);
|
161
|
+
textFieldProps?.onChange?.(event);
|
148
162
|
};
|
149
163
|
|
150
164
|
const handleClear = () => {
|
@@ -199,205 +213,270 @@ export const MRT_FilterTextField = <TData extends Record<string, any>>({
|
|
199
213
|
);
|
200
214
|
}
|
201
215
|
|
216
|
+
const dropdownOptions = useMemo(
|
217
|
+
() =>
|
218
|
+
columnDef.filterSelectOptions ??
|
219
|
+
((isSelectFilter || isMultiSelectFilter || isAutocompleteFilter) &&
|
220
|
+
facetedUniqueValues
|
221
|
+
? Array.from(facetedUniqueValues.keys())
|
222
|
+
.filter((value) => value !== null && value !== undefined)
|
223
|
+
.sort((a, b) => a.localeCompare(b))
|
224
|
+
: undefined),
|
225
|
+
[
|
226
|
+
columnDef.filterSelectOptions,
|
227
|
+
facetedUniqueValues,
|
228
|
+
isMultiSelectFilter,
|
229
|
+
isSelectFilter,
|
230
|
+
],
|
231
|
+
);
|
232
|
+
|
233
|
+
const endAdornment =
|
234
|
+
!isAutocompleteFilter && !isDateFilter && !filterChipLabel ? (
|
235
|
+
<InputAdornment
|
236
|
+
position="end"
|
237
|
+
sx={{ mr: isSelectFilter || isMultiSelectFilter ? '20px' : undefined }}
|
238
|
+
>
|
239
|
+
<Tooltip arrow placement="right" title={localization.clearFilter ?? ''}>
|
240
|
+
<span>
|
241
|
+
<IconButton
|
242
|
+
aria-label={localization.clearFilter}
|
243
|
+
disabled={!filterValue?.toString()?.length}
|
244
|
+
onClick={handleClear}
|
245
|
+
size="small"
|
246
|
+
sx={{
|
247
|
+
height: '2rem',
|
248
|
+
transform: 'scale(0.9)',
|
249
|
+
width: '2rem'
|
250
|
+
}}
|
251
|
+
>
|
252
|
+
<CloseIcon />
|
253
|
+
</IconButton>
|
254
|
+
</span>
|
255
|
+
</Tooltip>
|
256
|
+
</InputAdornment>
|
257
|
+
) : null;
|
258
|
+
|
259
|
+
const startAdornment = showChangeModeButton ? (
|
260
|
+
<InputAdornment position="start">
|
261
|
+
<Tooltip arrow title={localization.changeFilterMode}>
|
262
|
+
<span>
|
263
|
+
<IconButton
|
264
|
+
aria-label={localization.changeFilterMode}
|
265
|
+
onClick={handleFilterMenuOpen}
|
266
|
+
size="small"
|
267
|
+
sx={{ height: '1.75rem', width: '1.75rem' }}
|
268
|
+
>
|
269
|
+
<FilterListIcon />
|
270
|
+
</IconButton>
|
271
|
+
</span>
|
272
|
+
</Tooltip>
|
273
|
+
{filterChipLabel && (
|
274
|
+
<Chip label={filterChipLabel} onDelete={handleClearEmptyFilterChip} />
|
275
|
+
)}
|
276
|
+
</InputAdornment>
|
277
|
+
) : null;
|
278
|
+
|
279
|
+
const commonTextFieldProps: TextFieldProps = {
|
280
|
+
FormHelperTextProps: {
|
281
|
+
sx: {
|
282
|
+
fontSize: '0.75rem',
|
283
|
+
lineHeight: '0.8rem',
|
284
|
+
whiteSpace: 'nowrap',
|
285
|
+
},
|
286
|
+
},
|
287
|
+
InputProps: endAdornment //hack because mui looks for presense of endAdornment key instead of undefined
|
288
|
+
? { endAdornment, startAdornment }
|
289
|
+
: { startAdornment },
|
290
|
+
fullWidth: true,
|
291
|
+
helperText: showChangeModeButton ? (
|
292
|
+
<label>
|
293
|
+
{localization.filterMode.replace(
|
294
|
+
'{filterType}',
|
295
|
+
// @ts-ignore
|
296
|
+
localization[
|
297
|
+
`filter${
|
298
|
+
currentFilterOption?.charAt(0)?.toUpperCase() +
|
299
|
+
currentFilterOption?.slice(1)
|
300
|
+
}`
|
301
|
+
],
|
302
|
+
)}
|
303
|
+
</label>
|
304
|
+
) : null,
|
305
|
+
inputProps: {
|
306
|
+
autoComplete: 'new-password', // disable autocomplete and autofill
|
307
|
+
disabled: !!filterChipLabel,
|
308
|
+
sx: {
|
309
|
+
textOverflow: 'ellipsis',
|
310
|
+
width: filterChipLabel ? 0 : undefined,
|
311
|
+
},
|
312
|
+
title: filterPlaceholder,
|
313
|
+
},
|
314
|
+
inputRef: (inputRef) => {
|
315
|
+
filterInputRefs.current[`${column.id}-${rangeFilterIndex ?? 0}`] =
|
316
|
+
inputRef;
|
317
|
+
if (textFieldProps.inputRef) {
|
318
|
+
textFieldProps.inputRef = inputRef;
|
319
|
+
}
|
320
|
+
},
|
321
|
+
margin: 'none',
|
322
|
+
onClick: (e: MouseEvent<HTMLInputElement>) => e.stopPropagation(),
|
323
|
+
placeholder:
|
324
|
+
filterChipLabel || isSelectFilter || isMultiSelectFilter
|
325
|
+
? undefined
|
326
|
+
: filterPlaceholder,
|
327
|
+
variant: 'standard',
|
328
|
+
...textFieldProps,
|
329
|
+
sx: (theme) => ({
|
330
|
+
minWidth: isDateFilter
|
331
|
+
? '160px'
|
332
|
+
: isRangeFilter
|
333
|
+
? '100px'
|
334
|
+
: !filterChipLabel
|
335
|
+
? '120px'
|
336
|
+
: 'auto',
|
337
|
+
mx: '-2px',
|
338
|
+
p: 0,
|
339
|
+
width: 'calc(100% + 4px)',
|
340
|
+
...(parseFromValuesOrFunc(textFieldProps?.sx, theme) as any),
|
341
|
+
}),
|
342
|
+
};
|
343
|
+
|
202
344
|
return (
|
203
345
|
<>
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
|
208
|
-
|
209
|
-
|
210
|
-
|
211
|
-
|
212
|
-
|
213
|
-
|
214
|
-
|
215
|
-
|
216
|
-
|
217
|
-
|
218
|
-
|
219
|
-
|
220
|
-
|
221
|
-
|
222
|
-
|
223
|
-
|
224
|
-
|
225
|
-
|
226
|
-
|
227
|
-
|
228
|
-
|
229
|
-
|
230
|
-
|
231
|
-
|
232
|
-
|
233
|
-
|
234
|
-
|
235
|
-
|
236
|
-
|
237
|
-
|
238
|
-
|
239
|
-
|
240
|
-
|
241
|
-
|
242
|
-
|
243
|
-
|
244
|
-
|
245
|
-
|
246
|
-
|
247
|
-
|
248
|
-
|
249
|
-
|
250
|
-
|
251
|
-
|
252
|
-
|
253
|
-
|
254
|
-
|
255
|
-
|
256
|
-
|
257
|
-
sx={{
|
258
|
-
|
259
|
-
|
260
|
-
</IconButton>
|
261
|
-
</span>
|
262
|
-
</Tooltip>
|
263
|
-
{filterChipLabel && (
|
264
|
-
<Chip
|
265
|
-
onDelete={handleClearEmptyFilterChip}
|
266
|
-
label={filterChipLabel}
|
267
|
-
/>
|
268
|
-
)}
|
269
|
-
</InputAdornment>
|
270
|
-
) : null,
|
271
|
-
endAdornment: !filterChipLabel && (
|
272
|
-
<InputAdornment position="end">
|
273
|
-
<Tooltip
|
274
|
-
arrow
|
275
|
-
placement="right"
|
276
|
-
title={localization.clearFilter ?? ''}
|
277
|
-
>
|
278
|
-
<span>
|
279
|
-
<IconButton
|
280
|
-
aria-label={localization.clearFilter}
|
281
|
-
disabled={!filterValue?.toString()?.length}
|
282
|
-
onClick={handleClear}
|
283
|
-
size="small"
|
284
|
-
sx={{
|
285
|
-
height: '1.75rem',
|
286
|
-
width: '1.75rem',
|
287
|
-
}}
|
288
|
-
>
|
289
|
-
<CloseIcon />
|
290
|
-
</IconButton>
|
291
|
-
</span>
|
292
|
-
</Tooltip>
|
293
|
-
</InputAdornment>
|
294
|
-
),
|
295
|
-
}}
|
296
|
-
SelectProps={{
|
297
|
-
displayEmpty: true,
|
298
|
-
multiple: isMultiSelectFilter,
|
299
|
-
renderValue: isMultiSelectFilter
|
300
|
-
? (selected: any) =>
|
301
|
-
!selected?.length ? (
|
302
|
-
<Box sx={{ opacity: 0.5 }}>{filterPlaceholder}</Box>
|
303
|
-
) : (
|
304
|
-
<Box sx={{ display: 'flex', flexWrap: 'wrap', gap: '2px' }}>
|
305
|
-
{(selected as string[])?.map((value) => {
|
306
|
-
const selectedValue = filterSelectOptions?.find(
|
307
|
-
(option) =>
|
346
|
+
{isDateFilter ? (
|
347
|
+
<DatePicker
|
348
|
+
onChange={(newDate) => {
|
349
|
+
handleChange(newDate);
|
350
|
+
}}
|
351
|
+
value={filterValue || null}
|
352
|
+
{...datePickerProps}
|
353
|
+
slotProps={{
|
354
|
+
field: {
|
355
|
+
clearable: true,
|
356
|
+
onClear: () => handleClear(),
|
357
|
+
...datePickerProps?.slotProps?.field,
|
358
|
+
},
|
359
|
+
textField: {
|
360
|
+
...commonTextFieldProps,
|
361
|
+
...datePickerProps?.slotProps?.textField,
|
362
|
+
},
|
363
|
+
}}
|
364
|
+
/>
|
365
|
+
) : isAutocompleteFilter ? (
|
366
|
+
<Autocomplete
|
367
|
+
getOptionLabel={(option) => option}
|
368
|
+
onChange={(_e, newValue) => handleChange(newValue)}
|
369
|
+
options={dropdownOptions ?? []}
|
370
|
+
{...autocompleteProps}
|
371
|
+
renderInput={(builtinTextFieldProps) => (
|
372
|
+
<TextField
|
373
|
+
{...builtinTextFieldProps}
|
374
|
+
{...commonTextFieldProps}
|
375
|
+
InputProps={{
|
376
|
+
...builtinTextFieldProps.InputProps,
|
377
|
+
startAdornment:
|
378
|
+
commonTextFieldProps?.InputProps?.startAdornment,
|
379
|
+
}}
|
380
|
+
inputProps={{
|
381
|
+
...builtinTextFieldProps.inputProps,
|
382
|
+
...commonTextFieldProps?.inputProps,
|
383
|
+
}}
|
384
|
+
onChange={handleTextFieldChange}
|
385
|
+
/>
|
386
|
+
)}
|
387
|
+
value={filterValue}
|
388
|
+
/>
|
389
|
+
) : (
|
390
|
+
<TextField
|
391
|
+
SelectProps={{
|
392
|
+
displayEmpty: true,
|
393
|
+
multiple: isMultiSelectFilter,
|
394
|
+
renderValue: isMultiSelectFilter
|
395
|
+
? (selected: any) =>
|
396
|
+
!selected?.length ? (
|
397
|
+
<Box sx={{ opacity: 0.5 }}>{filterPlaceholder}</Box>
|
398
|
+
) : (
|
399
|
+
<Box sx={{ display: 'flex', flexWrap: 'wrap', gap: '2px' }}>
|
400
|
+
{(selected as string[])?.map((value) => {
|
401
|
+
const selectedValue = dropdownOptions?.find((option) =>
|
308
402
|
option instanceof Object
|
309
403
|
? option.value === value
|
310
404
|
: option === value,
|
311
|
-
|
312
|
-
|
313
|
-
|
314
|
-
|
315
|
-
|
316
|
-
|
317
|
-
|
318
|
-
|
319
|
-
|
320
|
-
|
321
|
-
|
322
|
-
|
323
|
-
|
324
|
-
|
325
|
-
|
326
|
-
|
327
|
-
|
328
|
-
|
329
|
-
|
330
|
-
|
331
|
-
|
332
|
-
|
333
|
-
|
334
|
-
|
335
|
-
|
336
|
-
|
337
|
-
|
338
|
-
|
339
|
-
|
340
|
-
|
341
|
-
|
342
|
-
|
343
|
-
|
344
|
-
|
345
|
-
|
346
|
-
|
347
|
-
|
348
|
-
|
349
|
-
|
350
|
-
|
351
|
-
|
352
|
-
|
353
|
-
|
354
|
-
|
355
|
-
|
356
|
-
|
357
|
-
|
358
|
-
|
359
|
-
|
360
|
-
|
361
|
-
|
362
|
-
|
363
|
-
|
364
|
-
|
365
|
-
|
366
|
-
|
367
|
-
|
368
|
-
|
369
|
-
|
370
|
-
|
371
|
-
|
372
|
-
|
373
|
-
|
374
|
-
|
375
|
-
|
376
|
-
|
377
|
-
|
378
|
-
|
379
|
-
|
380
|
-
<Checkbox
|
381
|
-
checked={(
|
382
|
-
(column.getFilterValue() ?? []) as string[]
|
383
|
-
).includes(value)}
|
384
|
-
sx={{ mr: '0.5rem' }}
|
385
|
-
/>
|
386
|
-
)}
|
387
|
-
{text}{' '}
|
388
|
-
{!columnDef.filterSelectOptions &&
|
389
|
-
`(${facetedUniqueValues.get(value)})`}
|
390
|
-
</MenuItem>
|
391
|
-
);
|
392
|
-
},
|
393
|
-
)}
|
394
|
-
</TextField>
|
405
|
+
);
|
406
|
+
return (
|
407
|
+
<Chip
|
408
|
+
key={value}
|
409
|
+
label={
|
410
|
+
selectedValue instanceof Object
|
411
|
+
? selectedValue.text
|
412
|
+
: selectedValue
|
413
|
+
}
|
414
|
+
/>
|
415
|
+
);
|
416
|
+
})}
|
417
|
+
</Box>
|
418
|
+
)
|
419
|
+
: undefined,
|
420
|
+
}}
|
421
|
+
onChange={handleTextFieldChange}
|
422
|
+
select={isSelectFilter || isMultiSelectFilter}
|
423
|
+
{...commonTextFieldProps}
|
424
|
+
value={filterValue ?? ''}
|
425
|
+
>
|
426
|
+
{(isSelectFilter || isMultiSelectFilter) && [
|
427
|
+
<MenuItem disabled divider hidden key="p" value="">
|
428
|
+
<Box sx={{ opacity: 0.5 }}>{filterPlaceholder}</Box>
|
429
|
+
</MenuItem>,
|
430
|
+
...[
|
431
|
+
textFieldProps.children ??
|
432
|
+
dropdownOptions?.map(
|
433
|
+
(option: { text: string; value: string } | string, index) => {
|
434
|
+
if (!option) return '';
|
435
|
+
let value: string;
|
436
|
+
let text: string;
|
437
|
+
if (typeof option !== 'object') {
|
438
|
+
value = option;
|
439
|
+
text = option;
|
440
|
+
} else {
|
441
|
+
value = option.value;
|
442
|
+
text = option.text;
|
443
|
+
}
|
444
|
+
return (
|
445
|
+
<MenuItem
|
446
|
+
key={`${index}-${value}`}
|
447
|
+
sx={{
|
448
|
+
alignItems: 'center',
|
449
|
+
display: 'flex',
|
450
|
+
gap: '0.5rem',
|
451
|
+
m: 0,
|
452
|
+
}}
|
453
|
+
value={value}
|
454
|
+
>
|
455
|
+
{isMultiSelectFilter && (
|
456
|
+
<Checkbox
|
457
|
+
checked={(
|
458
|
+
(column.getFilterValue() ?? []) as string[]
|
459
|
+
).includes(value)}
|
460
|
+
sx={{ mr: '0.5rem' }}
|
461
|
+
/>
|
462
|
+
)}
|
463
|
+
{text}{' '}
|
464
|
+
{!columnDef.filterSelectOptions &&
|
465
|
+
`(${facetedUniqueValues.get(value)})`}
|
466
|
+
</MenuItem>
|
467
|
+
);
|
468
|
+
},
|
469
|
+
),
|
470
|
+
],
|
471
|
+
]}
|
472
|
+
</TextField>
|
473
|
+
)}
|
395
474
|
<MRT_FilterOptionMenu
|
396
475
|
anchorEl={anchorEl}
|
397
476
|
header={header}
|
398
477
|
setAnchorEl={setAnchorEl}
|
399
|
-
table={table}
|
400
478
|
setFilterValue={setFilterValue}
|
479
|
+
table={table}
|
401
480
|
/>
|
402
481
|
</>
|
403
482
|
);
|