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.
Files changed (143) hide show
  1. package/README.md +2 -2
  2. package/dist/cjs/index.js +2408 -2334
  3. package/dist/cjs/index.js.map +1 -1
  4. package/dist/cjs/types/MaterialReactTable.d.ts +1 -1
  5. package/dist/cjs/types/buttons/MRT_GrabHandleButton.d.ts +1 -1
  6. package/dist/cjs/types/buttons/MRT_RowPinButton.d.ts +2 -2
  7. package/dist/cjs/types/column.utils.d.ts +6 -6
  8. package/dist/cjs/types/filterFns.d.ts +14 -14
  9. package/dist/cjs/types/head/MRT_TableHeadCellFilterLabel.d.ts +1 -1
  10. package/dist/cjs/types/head/MRT_TableHeadCellSortLabel.d.ts +1 -1
  11. package/dist/cjs/types/hooks/useMRT_DisplayColumns.d.ts +3 -3
  12. package/dist/cjs/types/icons.d.ts +1 -1
  13. package/dist/cjs/types/inputs/MRT_FilterRangeSlider.d.ts +1 -1
  14. package/dist/cjs/types/locales/np.d.ts +2 -0
  15. package/dist/cjs/types/menus/MRT_ColumnActionMenu.d.ts +4 -4
  16. package/dist/cjs/types/menus/MRT_ShowHideColumnsMenuItems.d.ts +1 -1
  17. package/dist/cjs/types/toolbar/MRT_TablePagination.d.ts +2 -2
  18. package/dist/cjs/types/toolbar/MRT_TopToolbar.d.ts +1 -1
  19. package/dist/cjs/types/types.d.ts +217 -197
  20. package/dist/esm/material-react-table.esm.js +2311 -2239
  21. package/dist/esm/material-react-table.esm.js.map +1 -1
  22. package/dist/esm/types/MaterialReactTable.d.ts +1 -1
  23. package/dist/esm/types/buttons/MRT_GrabHandleButton.d.ts +1 -1
  24. package/dist/esm/types/buttons/MRT_RowPinButton.d.ts +2 -2
  25. package/dist/esm/types/column.utils.d.ts +6 -6
  26. package/dist/esm/types/filterFns.d.ts +14 -14
  27. package/dist/esm/types/head/MRT_TableHeadCellFilterLabel.d.ts +1 -1
  28. package/dist/esm/types/head/MRT_TableHeadCellSortLabel.d.ts +1 -1
  29. package/dist/esm/types/hooks/useMRT_DisplayColumns.d.ts +3 -3
  30. package/dist/esm/types/icons.d.ts +1 -1
  31. package/dist/esm/types/inputs/MRT_FilterRangeSlider.d.ts +1 -1
  32. package/dist/esm/types/locales/np.d.ts +2 -0
  33. package/dist/esm/types/menus/MRT_ColumnActionMenu.d.ts +4 -4
  34. package/dist/esm/types/menus/MRT_ShowHideColumnsMenuItems.d.ts +1 -1
  35. package/dist/esm/types/toolbar/MRT_TablePagination.d.ts +2 -2
  36. package/dist/esm/types/toolbar/MRT_TopToolbar.d.ts +1 -1
  37. package/dist/esm/types/types.d.ts +217 -197
  38. package/dist/index.d.ts +258 -238
  39. package/locales/fr.esm.js +1 -1
  40. package/locales/fr.esm.js.map +1 -1
  41. package/locales/fr.js +1 -1
  42. package/locales/fr.js.map +1 -1
  43. package/locales/np.d.ts +2 -0
  44. package/locales/np.esm.d.ts +2 -0
  45. package/locales/np.esm.js +94 -0
  46. package/locales/np.esm.js.map +1 -0
  47. package/locales/np.js +98 -0
  48. package/locales/np.js.map +1 -0
  49. package/locales/tr.d.ts +2 -0
  50. package/locales/tr.esm.d.ts +2 -0
  51. package/locales/tr.esm.js +93 -0
  52. package/locales/tr.esm.js.map +1 -0
  53. package/locales/tr.js +97 -0
  54. package/locales/tr.js.map +1 -0
  55. package/locales/uk.d.ts +2 -0
  56. package/locales/uk.esm.d.ts +2 -0
  57. package/locales/uk.esm.js +93 -0
  58. package/locales/uk.esm.js.map +1 -0
  59. package/locales/uk.js +97 -0
  60. package/locales/uk.js.map +1 -0
  61. package/locales/vi.d.ts +2 -0
  62. package/locales/vi.esm.d.ts +2 -0
  63. package/locales/vi.esm.js +93 -0
  64. package/locales/vi.esm.js.map +1 -0
  65. package/locales/vi.js +97 -0
  66. package/locales/vi.js.map +1 -0
  67. package/locales/zh-Hans.d.ts +2 -0
  68. package/locales/zh-Hans.esm.d.ts +2 -0
  69. package/locales/zh-Hans.esm.js +93 -0
  70. package/locales/zh-Hans.esm.js.map +1 -0
  71. package/locales/zh-Hans.js +97 -0
  72. package/locales/zh-Hans.js.map +1 -0
  73. package/locales/zh-Hant.d.ts +2 -0
  74. package/locales/zh-Hant.esm.d.ts +2 -0
  75. package/locales/zh-Hant.esm.js +93 -0
  76. package/locales/zh-Hant.esm.js.map +1 -0
  77. package/locales/zh-Hant.js +97 -0
  78. package/locales/zh-Hant.js.map +1 -0
  79. package/package.json +27 -26
  80. package/src/MaterialReactTable.tsx +2 -2
  81. package/src/body/MRT_TableBody.tsx +9 -9
  82. package/src/body/MRT_TableBodyCell.tsx +22 -22
  83. package/src/body/MRT_TableBodyCellValue.tsx +5 -5
  84. package/src/body/MRT_TableBodyRow.tsx +32 -32
  85. package/src/body/MRT_TableBodyRowGrabHandle.tsx +2 -2
  86. package/src/body/MRT_TableBodyRowPinButton.tsx +3 -3
  87. package/src/body/MRT_TableDetailPanel.tsx +3 -3
  88. package/src/buttons/MRT_CopyButton.tsx +1 -1
  89. package/src/buttons/MRT_EditActionButtons.tsx +4 -4
  90. package/src/buttons/MRT_ExpandAllButton.tsx +3 -3
  91. package/src/buttons/MRT_ExpandButton.tsx +1 -1
  92. package/src/buttons/MRT_GrabHandleButton.tsx +10 -10
  93. package/src/buttons/MRT_RowPinButton.tsx +5 -5
  94. package/src/buttons/MRT_ShowHideColumnsButton.tsx +1 -1
  95. package/src/buttons/MRT_ToggleFullScreenButton.tsx +2 -2
  96. package/src/buttons/MRT_ToggleRowActionMenuButton.tsx +8 -8
  97. package/src/column.utils.ts +24 -22
  98. package/src/filterFns.ts +29 -29
  99. package/src/footer/MRT_TableFooter.tsx +9 -9
  100. package/src/footer/MRT_TableFooterCell.tsx +1 -1
  101. package/src/footer/MRT_TableFooterRow.tsx +2 -2
  102. package/src/head/MRT_TableHead.tsx +9 -9
  103. package/src/head/MRT_TableHeadCell.tsx +10 -6
  104. package/src/head/MRT_TableHeadCellColumnActionsButton.tsx +9 -6
  105. package/src/head/MRT_TableHeadCellFilterContainer.tsx +12 -5
  106. package/src/head/MRT_TableHeadCellFilterLabel.tsx +106 -61
  107. package/src/head/MRT_TableHeadCellGrabHandle.tsx +2 -2
  108. package/src/head/MRT_TableHeadCellResizeHandle.tsx +11 -11
  109. package/src/head/MRT_TableHeadCellSortLabel.tsx +8 -8
  110. package/src/head/MRT_TableHeadRow.tsx +2 -2
  111. package/src/hooks/useMRT_DisplayColumns.tsx +5 -5
  112. package/src/hooks/useMRT_Effects.ts +3 -3
  113. package/src/hooks/useMRT_TableInstance.ts +15 -14
  114. package/src/hooks/useMRT_TableOptions.ts +3 -3
  115. package/src/icons.ts +2 -2
  116. package/src/inputs/MRT_EditCellTextField.tsx +9 -9
  117. package/src/inputs/MRT_FilterCheckbox.tsx +7 -7
  118. package/src/inputs/MRT_FilterRangeFields.tsx +1 -1
  119. package/src/inputs/MRT_FilterRangeSlider.tsx +6 -6
  120. package/src/inputs/MRT_FilterTextField.tsx +309 -230
  121. package/src/inputs/MRT_GlobalFilterTextField.tsx +26 -26
  122. package/src/inputs/MRT_SelectCheckbox.tsx +7 -7
  123. package/src/locales/fr.ts +1 -1
  124. package/src/locales/np.ts +94 -0
  125. package/src/menus/MRT_ColumnActionMenu.tsx +48 -45
  126. package/src/menus/MRT_FilterOptionMenu.tsx +36 -36
  127. package/src/menus/MRT_RowActionMenu.tsx +7 -7
  128. package/src/menus/MRT_ShowHideColumnsMenu.tsx +6 -6
  129. package/src/menus/MRT_ShowHideColumnsMenuItems.tsx +5 -5
  130. package/src/modals/MRT_EditRowModal.tsx +8 -8
  131. package/src/sortingFns.ts +1 -1
  132. package/src/table/MRT_Table.tsx +7 -7
  133. package/src/table/MRT_TableContainer.tsx +10 -10
  134. package/src/table/MRT_TablePaper.tsx +9 -9
  135. package/src/toolbar/MRT_BottomToolbar.tsx +5 -5
  136. package/src/toolbar/MRT_LinearProgressBar.tsx +4 -4
  137. package/src/toolbar/MRT_TablePagination.tsx +19 -19
  138. package/src/toolbar/MRT_ToolbarAlertBanner.tsx +4 -4
  139. package/src/toolbar/MRT_ToolbarDropZone.tsx +6 -6
  140. package/src/toolbar/MRT_ToolbarInternalButtons.tsx +8 -5
  141. package/src/toolbar/MRT_TopToolbar.tsx +7 -7
  142. package/src/types.ts +288 -257
  143. 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
- icons: { FilterListIcon, CloseIcon },
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
- columnDef.filterVariant === 'range' || rangeFilterIndex !== undefined;
60
- const isSelectFilter = columnDef.filterVariant === 'select';
61
- const isMultiSelectFilter = columnDef.filterVariant === 'multi-select';
84
+ filterVariant?.includes('range') || rangeFilterIndex !== undefined;
85
+ const isSelectFilter = filterVariant === 'select';
86
+ const isMultiSelectFilter = filterVariant === 'multi-select';
62
87
  const isTextboxFilter =
63
- columnDef.filterVariant === 'text' ||
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 filterSelectOptions = useMemo(
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
- (event: ChangeEvent<HTMLInputElement>) => {
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<string | Date | number | null>) => {
134
+ column.setFilterValue((old: Array<Date | null | number | string>) => {
132
135
  const newFilterValues = old ?? ['', ''];
133
- newFilterValues[rangeFilterIndex as number] = value;
136
+ newFilterValues[rangeFilterIndex as number] = newValue;
134
137
  return newFilterValues;
135
138
  });
136
139
  } else {
137
- column.setFilterValue(value ?? undefined);
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 = (event: ChangeEvent<HTMLInputElement>) => {
146
- setFilterValue(event.target.value);
147
- handleChangeDebounced(event);
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
- <TextField
205
- fullWidth
206
- inputProps={{
207
- disabled: !!filterChipLabel,
208
- sx: {
209
- textOverflow: 'ellipsis',
210
- width: filterChipLabel ? 0 : undefined,
211
- },
212
- title: filterPlaceholder,
213
- }}
214
- helperText={
215
- showChangeModeButton ? (
216
- <label>
217
- {localization.filterMode.replace(
218
- '{filterType}',
219
- // @ts-ignore
220
- localization[
221
- `filter${
222
- currentFilterOption?.charAt(0)?.toUpperCase() +
223
- currentFilterOption?.slice(1)
224
- }`
225
- ],
226
- )}
227
- </label>
228
- ) : null
229
- }
230
- FormHelperTextProps={{
231
- sx: {
232
- fontSize: '0.75rem',
233
- lineHeight: '0.8rem',
234
- whiteSpace: 'nowrap',
235
- },
236
- }}
237
- margin="none"
238
- placeholder={
239
- filterChipLabel || isSelectFilter || isMultiSelectFilter
240
- ? undefined
241
- : filterPlaceholder
242
- }
243
- onChange={handleChange}
244
- onClick={(e: MouseEvent<HTMLInputElement>) => e.stopPropagation()}
245
- select={isSelectFilter || isMultiSelectFilter}
246
- value={filterValue ?? ''}
247
- variant="standard"
248
- InputProps={{
249
- startAdornment: showChangeModeButton ? (
250
- <InputAdornment position="start">
251
- <Tooltip arrow title={localization.changeFilterMode}>
252
- <span>
253
- <IconButton
254
- aria-label={localization.changeFilterMode}
255
- onClick={handleFilterMenuOpen}
256
- size="small"
257
- sx={{ height: '1.75rem', width: '1.75rem' }}
258
- >
259
- <FilterListIcon />
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
- return (
313
- <Chip
314
- key={value}
315
- label={
316
- selectedValue instanceof Object
317
- ? selectedValue.text
318
- : selectedValue
319
- }
320
- />
321
- );
322
- })}
323
- </Box>
324
- )
325
- : undefined,
326
- }}
327
- {...textFieldProps}
328
- inputRef={(inputRef) => {
329
- filterInputRefs.current[`${column.id}-${rangeFilterIndex ?? 0}`] =
330
- inputRef;
331
- if (textFieldProps.inputRef) {
332
- textFieldProps.inputRef = inputRef;
333
- }
334
- }}
335
- sx={(theme) => ({
336
- p: 0,
337
- minWidth: isRangeFilter
338
- ? '100px'
339
- : !filterChipLabel
340
- ? '120px'
341
- : 'auto',
342
- width: 'calc(100% + 4px)',
343
- mx: '-2px',
344
- '& .MuiSelect-icon': {
345
- mr: '1.5rem',
346
- },
347
- ...(parseFromValuesOrFunc(textFieldProps?.sx, theme) as any),
348
- })}
349
- >
350
- {(isSelectFilter || isMultiSelectFilter) && (
351
- <MenuItem divider disabled hidden value="">
352
- <Box sx={{ opacity: 0.5 }}>{filterPlaceholder}</Box>
353
- </MenuItem>
354
- )}
355
- {textFieldProps.children ??
356
- filterSelectOptions?.map(
357
- (option: string | { text: string; value: string }) => {
358
- if (!option) return '';
359
- let value: string;
360
- let text: string;
361
- if (typeof option !== 'object') {
362
- value = option;
363
- text = option;
364
- } else {
365
- value = option.value;
366
- text = option.text;
367
- }
368
- return (
369
- <MenuItem
370
- key={value}
371
- sx={{
372
- display: 'flex',
373
- m: 0,
374
- alignItems: 'center',
375
- gap: '0.5rem',
376
- }}
377
- value={value}
378
- >
379
- {isMultiSelectFilter && (
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
  );