material-react-table 0.10.0 → 0.12.1

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.
@@ -32,10 +32,13 @@ export const MRT_FilterTextField: FC<Props> = ({
32
32
  const {
33
33
  getState,
34
34
  options: {
35
+ enabledColumnFilterOptions,
35
36
  icons: { FilterListIcon, CloseIcon },
36
- tableId,
37
37
  localization,
38
38
  muiTableHeadCellFilterTextFieldProps,
39
+ onColumnFilterValueChanged,
40
+ onColumnFilterValueChangedDebounced,
41
+ tableId,
39
42
  },
40
43
  setCurrentFilterFns,
41
44
  } = instance;
@@ -73,20 +76,45 @@ export const MRT_FilterTextField: FC<Props> = ({
73
76
  );
74
77
 
75
78
  const handleChangeDebounced = useCallback(
76
- debounce(
77
- (event: ChangeEvent<HTMLInputElement>) =>
78
- inputIndex !== undefined
79
- ? column.setFilterValue((old: [string, string]) => {
80
- const newFilterValues = old ?? ['', ''];
81
- newFilterValues[inputIndex] = event.target.value;
82
- return newFilterValues;
83
- })
84
- : column.setFilterValue(event.target.value ?? undefined),
85
- 150,
86
- ),
79
+ debounce((event: ChangeEvent<HTMLInputElement>) => {
80
+ if (inputIndex !== undefined) {
81
+ column.setFilterValue((old: [string, string]) => {
82
+ const newFilterValues = old ?? ['', ''];
83
+ newFilterValues[inputIndex] = event.target.value;
84
+ return newFilterValues;
85
+ });
86
+ } else {
87
+ column.setFilterValue(event.target.value ?? undefined);
88
+ }
89
+ onColumnFilterValueChangedDebounced?.({
90
+ column,
91
+ event,
92
+ filterValue: event.target.value,
93
+ });
94
+ columnDef.onColumnFilterValueChangedDebounced?.({
95
+ column,
96
+ event,
97
+ filterValue: event.target.value,
98
+ });
99
+ }, 200),
87
100
  [],
88
101
  );
89
102
 
103
+ const handleChange = (event: ChangeEvent<HTMLInputElement>) => {
104
+ setFilterValue(event.target.value);
105
+ handleChangeDebounced(event);
106
+ onColumnFilterValueChanged?.({
107
+ column,
108
+ event,
109
+ filterValue: event.target.value,
110
+ });
111
+ columnDef.onColumnFilterValueChanged?.({
112
+ column,
113
+ event,
114
+ filterValue: event.target.value,
115
+ });
116
+ };
117
+
90
118
  const handleFilterMenuOpen = (event: MouseEvent<HTMLElement>) => {
91
119
  setAnchorEl(event.currentTarget);
92
120
  };
@@ -141,6 +169,9 @@ export const MRT_FilterTextField: FC<Props> = ({
141
169
  ? localization.max
142
170
  : '';
143
171
 
172
+ const allowedColumnFilterOptions =
173
+ columnDef?.enabledColumnFilterOptions ?? enabledColumnFilterOptions;
174
+
144
175
  return (
145
176
  <>
146
177
  <TextField
@@ -155,7 +186,9 @@ export const MRT_FilterTextField: FC<Props> = ({
155
186
  title: filterPlaceholder,
156
187
  }}
157
188
  helperText={
158
- !inputIndex ? (
189
+ !inputIndex &&
190
+ (allowedColumnFilterOptions === undefined ||
191
+ (allowedColumnFilterOptions?.length ?? 0) > 0) ? (
159
192
  <label htmlFor={filterId}>
160
193
  {filterFn instanceof Function
161
194
  ? localization.filterMode.replace(
@@ -192,37 +225,37 @@ export const MRT_FilterTextField: FC<Props> = ({
192
225
  placeholder={
193
226
  filterChipLabel || isSelectFilter ? undefined : filterPlaceholder
194
227
  }
195
- onChange={(event: ChangeEvent<HTMLInputElement>) => {
196
- setFilterValue(event.target.value);
197
- handleChangeDebounced(event);
198
- }}
228
+ onChange={handleChange}
199
229
  onClick={(e: MouseEvent<HTMLInputElement>) => e.stopPropagation()}
200
230
  select={isSelectFilter}
201
231
  value={filterValue ?? ''}
202
232
  variant="standard"
203
233
  InputProps={{
204
- startAdornment: !isSelectFilter && !inputIndex && (
205
- <InputAdornment position="start">
206
- <Tooltip arrow title={localization.changeFilterMode}>
207
- <span>
208
- <IconButton
209
- aria-label={localization.changeFilterMode}
210
- onClick={handleFilterMenuOpen}
211
- size="small"
212
- sx={{ height: '1.75rem', width: '1.75rem' }}
213
- >
214
- <FilterListIcon />
215
- </IconButton>
216
- </span>
217
- </Tooltip>
218
- {filterChipLabel && (
219
- <Chip
220
- onDelete={handleClearFilterChip}
221
- label={filterChipLabel}
222
- />
223
- )}
224
- </InputAdornment>
225
- ),
234
+ startAdornment: !isSelectFilter &&
235
+ !inputIndex &&
236
+ (allowedColumnFilterOptions === undefined ||
237
+ (allowedColumnFilterOptions?.length ?? 0) > 0) && (
238
+ <InputAdornment position="start">
239
+ <Tooltip arrow title={localization.changeFilterMode}>
240
+ <span>
241
+ <IconButton
242
+ aria-label={localization.changeFilterMode}
243
+ onClick={handleFilterMenuOpen}
244
+ size="small"
245
+ sx={{ height: '1.75rem', width: '1.75rem' }}
246
+ >
247
+ <FilterListIcon />
248
+ </IconButton>
249
+ </span>
250
+ </Tooltip>
251
+ {filterChipLabel && (
252
+ <Chip
253
+ onDelete={handleClearFilterChip}
254
+ label={filterChipLabel}
255
+ />
256
+ )}
257
+ </InputAdornment>
258
+ ),
226
259
  endAdornment: !filterChipLabel && (
227
260
  <InputAdornment position="end">
228
261
  <Tooltip
@@ -29,7 +29,8 @@ export const MRT_SearchTextField: FC<Props> = ({ instance }) => {
29
29
  tableId,
30
30
  localization,
31
31
  muiSearchTextFieldProps,
32
- onMrtGlobalFilterValueChange,
32
+ onGlobalFilterValueChanged,
33
+ onGlobalFilterValueChangedDebounced,
33
34
  },
34
35
  } = instance;
35
36
 
@@ -38,14 +39,20 @@ export const MRT_SearchTextField: FC<Props> = ({ instance }) => {
38
39
  const [anchorEl, setAnchorEl] = useState<null | HTMLElement>(null);
39
40
  const [searchValue, setSearchValue] = useState(globalFilter ?? '');
40
41
 
41
- const handleChange = useCallback(
42
+ const handleChangeDebounced = useCallback(
42
43
  debounce((event: ChangeEvent<HTMLInputElement>) => {
43
44
  setGlobalFilter(event.target.value ?? undefined);
44
- onMrtGlobalFilterValueChange?.({ event, instance });
45
- }, 200),
45
+ onGlobalFilterValueChangedDebounced?.({ event, instance });
46
+ }, 250),
46
47
  [],
47
48
  );
48
49
 
50
+ const handleChange = (event: ChangeEvent<HTMLInputElement>) => {
51
+ setSearchValue(event.target.value);
52
+ handleChangeDebounced(event);
53
+ onGlobalFilterValueChanged?.({ event, instance });
54
+ };
55
+
49
56
  const handleGlobalFilterMenuOpen = (event: MouseEvent<HTMLElement>) => {
50
57
  setAnchorEl(event.currentTarget);
51
58
  };
@@ -65,10 +72,7 @@ export const MRT_SearchTextField: FC<Props> = ({ instance }) => {
65
72
  <TextField
66
73
  id={`mrt-${tableId}-search-text-field`}
67
74
  placeholder={localization.search}
68
- onChange={(event: ChangeEvent<HTMLInputElement>) => {
69
- setSearchValue(event.target.value);
70
- handleChange(event);
71
- }}
75
+ onChange={handleChange}
72
76
  value={searchValue ?? ''}
73
77
  variant="standard"
74
78
  InputProps={{
@@ -16,8 +16,8 @@ export const MRT_SelectCheckbox: FC<Props> = ({ row, selectAll, instance }) => {
16
16
  options: {
17
17
  localization,
18
18
  muiSelectCheckboxProps,
19
- onMrtSelectRowChange,
20
- onMrtSelectAllChange,
19
+ onRowSelectionChanged,
20
+ onRowSelectAllChanged,
21
21
  selectAllMode,
22
22
  },
23
23
  } = instance;
@@ -31,14 +31,14 @@ export const MRT_SelectCheckbox: FC<Props> = ({ row, selectAll, instance }) => {
31
31
  } else if (selectAllMode === 'page') {
32
32
  instance.getToggleAllPageRowsSelectedHandler()(event as any);
33
33
  }
34
- onMrtSelectAllChange?.({
34
+ onRowSelectAllChanged?.({
35
35
  event,
36
36
  selectedRows: event.target.checked ? getRowModel().flatRows : [],
37
37
  instance,
38
38
  });
39
39
  } else if (row) {
40
40
  row?.getToggleSelectedHandler()(event as any);
41
- onMrtSelectRowChange?.({
41
+ onRowSelectionChanged?.({
42
42
  event,
43
43
  row,
44
44
  selectedRows: event.target.checked
@@ -43,7 +43,11 @@ export const MRT_FilterOptionMenu: FC<Props> = ({
43
43
  }) => {
44
44
  const {
45
45
  getState,
46
- options: { enabledGlobalFilterOptions, localization },
46
+ options: {
47
+ enabledGlobalFilterOptions,
48
+ enabledColumnFilterOptions,
49
+ localization,
50
+ },
47
51
  setCurrentFilterFns,
48
52
  setCurrentGlobalFilterFn,
49
53
  } = instance;
@@ -55,6 +59,9 @@ export const MRT_FilterOptionMenu: FC<Props> = ({
55
59
 
56
60
  const { columnDef } = column ?? {};
57
61
 
62
+ const allowedColumnFilterOptions =
63
+ columnDef?.enabledColumnFilterOptions ?? enabledColumnFilterOptions;
64
+
58
65
  const filterOptions = useMemo(
59
66
  () =>
60
67
  [
@@ -126,8 +133,8 @@ export const MRT_FilterOptionMenu: FC<Props> = ({
126
133
  },
127
134
  ].filter((filterType) =>
128
135
  columnDef
129
- ? !columnDef.enabledColumnFilterOptions ||
130
- columnDef.enabledColumnFilterOptions.includes(filterType.option)
136
+ ? allowedColumnFilterOptions === undefined ||
137
+ allowedColumnFilterOptions?.includes(filterType.option)
131
138
  : (!enabledGlobalFilterOptions ||
132
139
  enabledGlobalFilterOptions.includes(filterType.option)) &&
133
140
  ['fuzzy', 'contains'].includes(filterType.option),
@@ -21,7 +21,7 @@ export const MRT_ShowHideColumnsMenuItems: FC<Props> = ({
21
21
  }) => {
22
22
  const {
23
23
  getState,
24
- options: { enableColumnOrdering, onMrtToggleColumnVisibility },
24
+ options: { enableColumnOrdering, onColumnVisibilityChanged },
25
25
  setColumnOrder,
26
26
  } = instance;
27
27
 
@@ -56,7 +56,7 @@ export const MRT_ShowHideColumnsMenuItems: FC<Props> = ({
56
56
  } else {
57
57
  column.toggleVisibility();
58
58
  }
59
- onMrtToggleColumnVisibility?.({
59
+ onColumnVisibilityChanged?.({
60
60
  column,
61
61
  columnVisibility,
62
62
  instance,