material-react-table 0.14.3 → 0.14.6

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.
@@ -0,0 +1,4 @@
1
+ import type { MRT_Row } from '.';
2
+ export declare const MRT_SortingFns: {
3
+ fuzzy: (rowA: MRT_Row, rowB: MRT_Row, columnId: string) => number;
4
+ };
package/dist/utils.d.ts CHANGED
@@ -7,7 +7,7 @@ export declare const createGroup: <D extends Record<string, any> = {}>(table: Ta
7
7
  export declare const createDataColumn: <D extends Record<string, any> = {}>(table: Table<D>, column: MRT_ColumnDef<D>, currentFilterFns: {
8
8
  [key: string]: import("@tanstack/react-table").FilterFnOption<import("@tanstack/react-table").TableGenerics>;
9
9
  }) => ColumnDef<D>;
10
- export declare const createDisplayColumn: <D extends Record<string, any> = {}>(table: Table<D>, column: Pick<MRT_ColumnDef<D>, "accessorFn" | "footer" | "columns" | "filterFn" | "id" | "accessorKey" | "meta" | "enableHiding" | "enablePinning" | "enableColumnFilter" | "enableGlobalFilter" | "sortingFn" | "sortDescFirst" | "enableSorting" | "enableMultiSort" | "invertSorting" | "sortUndefined" | "aggregationFn" | "enableGrouping" | "enableResizing" | "size" | "minSize" | "maxSize" | "AggregatedCell" | "Cell" | "Edit" | "Filter" | "Footer" | "Header" | "enableClickToCopy" | "enableColumnActions" | "enableColumnOrdering" | "enableEditing" | "enabledColumnFilterOptions" | "filterSelectOptions" | "muiTableBodyCellCopyButtonProps" | "muiTableBodyCellEditTextFieldProps" | "muiTableBodyCellProps" | "muiTableFooterCellProps" | "muiTableHeadCellColumnActionsButtonProps" | "muiTableHeadCellFilterTextFieldProps" | "muiTableHeadCellProps" | "onCellEditBlur" | "onCellEditChanged" | "onColumnFilterValueChanged" | "onColumnFilterValueChangedDebounced"> & {
10
+ export declare const createDisplayColumn: <D extends Record<string, any> = {}>(table: Table<D>, column: Pick<MRT_ColumnDef<D>, "accessorFn" | "columns" | "filterFn" | "footer" | "sortingFn" | "id" | "accessorKey" | "meta" | "enableHiding" | "enablePinning" | "enableColumnFilter" | "enableGlobalFilter" | "sortDescFirst" | "enableSorting" | "enableMultiSort" | "invertSorting" | "sortUndefined" | "aggregationFn" | "enableGrouping" | "enableResizing" | "size" | "minSize" | "maxSize" | "AggregatedCell" | "Cell" | "Edit" | "Filter" | "Footer" | "Header" | "enableClickToCopy" | "enableColumnActions" | "enableColumnOrdering" | "enableEditing" | "enableColumnFilterChangeMode" | "enabledColumnFilterOptions" | "filterSelectOptions" | "muiTableBodyCellCopyButtonProps" | "muiTableBodyCellEditTextFieldProps" | "muiTableBodyCellProps" | "muiTableFooterCellProps" | "muiTableHeadCellColumnActionsButtonProps" | "muiTableHeadCellFilterTextFieldProps" | "muiTableHeadCellProps" | "onCellEditBlur" | "onCellEditChanged" | "onColumnFilterValueChanged" | "onColumnFilterValueChangedDebounced"> & {
11
11
  header?: string | undefined;
12
12
  }) => ColumnDef<D>;
13
13
  export declare const reorderColumn: (movingColumn: MRT_Column, receivingColumn: MRT_Column, columnOrder: ColumnOrderState, setColumnOrder: (updater: Updater<ColumnOrderState>) => void) => void;
package/package.json CHANGED
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "0.14.3",
2
+ "version": "0.14.6",
3
3
  "license": "MIT",
4
4
  "name": "material-react-table",
5
5
  "description": "A fully featured Material UI implementation of TanStack React Table, inspired by material-table and the MUI X DataGrid, written from the ground up in TypeScript.",
@@ -59,9 +59,9 @@
59
59
  "@babel/core": "^7.18.5",
60
60
  "@emotion/react": "^11.9.3",
61
61
  "@emotion/styled": "^11.9.3",
62
- "@faker-js/faker": "^6.3.1",
62
+ "@faker-js/faker": "^7.3.0",
63
63
  "@mui/icons-material": "^5.8.4",
64
- "@mui/material": "^5.8.4",
64
+ "@mui/material": "^5.8.5",
65
65
  "@size-limit/preset-small-lib": "^7.0.8",
66
66
  "@storybook/addon-a11y": "^6.5.9",
67
67
  "@storybook/addon-actions": "^6.5.9",
@@ -73,7 +73,7 @@
73
73
  "@types/react": "^18.0.14",
74
74
  "@types/react-dom": "^18.0.5",
75
75
  "babel-loader": "^8.2.5",
76
- "eslint": "^8.17.0",
76
+ "eslint": "^8.18.0",
77
77
  "eslint-plugin-react-hooks": "^4.6.0",
78
78
  "husky": "^8.0.1",
79
79
  "prettier": "^2.7.1",
@@ -87,7 +87,7 @@
87
87
  "storybook-dark-mode": "^1.1.0",
88
88
  "tsdx": "^0.14.1",
89
89
  "tslib": "^2.4.0",
90
- "typescript": "^4.7.3"
90
+ "typescript": "^4.7.4"
91
91
  },
92
92
  "peerDependencies": {
93
93
  "@emotion/react": ">=11",
@@ -38,6 +38,8 @@ import {
38
38
  Overwrite,
39
39
  ReactTableGenerics,
40
40
  Row,
41
+ SortingFn,
42
+ SortingFnOption,
41
43
  TableGenerics,
42
44
  TableInstance,
43
45
  TableState,
@@ -52,13 +54,12 @@ import { MRT_TableRoot } from './table/MRT_TableRoot';
52
54
  export type MRT_TableOptions<D extends Record<string, any> = {}> = Partial<
53
55
  Omit<
54
56
  UseTableInstanceOptions<ReactTableGenerics>,
55
- 'columns' | 'data' | 'initialState' | 'state' | 'expandRowsFn' | 'filterFns'
57
+ 'columns' | 'data' | 'initialState' | 'state' | 'expandRowsFn'
56
58
  >
57
59
  > & {
58
60
  columns: MRT_ColumnDef<D>[];
59
61
  data: D[];
60
62
  expandRowsFn?: (dataRow: D) => D[];
61
- filterFns?: MRT_FILTER_OPTION | FilterFn<D> | string | number | symbol;
62
63
  initialState?: Partial<MRT_TableState<D>>;
63
64
  state?: Partial<MRT_TableState<D>>;
64
65
  };
@@ -145,11 +146,12 @@ export type MRT_ColumnDef<D extends Record<string, any> = {}> = Omit<
145
146
  ColumnDef<D>,
146
147
  | 'accessorFn'
147
148
  | 'aggregatedCell'
148
- | 'header'
149
- | 'footer'
149
+ | 'cell'
150
150
  | 'columns'
151
151
  | 'filterFn'
152
- | 'cell'
152
+ | 'footer'
153
+ | 'header'
154
+ | 'sortingFn'
153
155
  > & {
154
156
  AggregatedCell?: ({
155
157
  cell,
@@ -203,6 +205,7 @@ export type MRT_ColumnDef<D extends Record<string, any> = {}> = Omit<
203
205
  enableColumnActions?: boolean;
204
206
  enableColumnOrdering?: boolean;
205
207
  enableEditing?: boolean;
208
+ enableColumnFilterChangeMode?: boolean;
206
209
  enabledColumnFilterOptions?: (MRT_FILTER_OPTION | string)[] | null;
207
210
  filterFn?: MRT_FilterFn;
208
211
  filterSelectOptions?: (string | { text: string; value: string })[];
@@ -312,6 +315,7 @@ export type MRT_ColumnDef<D extends Record<string, any> = {}> = Omit<
312
315
  filterValue: any;
313
316
  instance: MRT_TableInstance<D>;
314
317
  }) => void;
318
+ sortingFn?: MRT_SortingFn;
315
319
  };
316
320
 
317
321
  export type MRT_Column<D extends Record<string, any> = {}> = Omit<
@@ -357,6 +361,10 @@ export type MRT_Cell<D extends Record<string, any> = {}> = Omit<
357
361
  row: MRT_Row<D>;
358
362
  };
359
363
 
364
+ export type MRT_SortingOption = SortingFnOption<TableGenerics> | 'fuzzy';
365
+
366
+ export type MRT_SortingFn = SortingFn<TableGenerics> | MRT_SortingOption;
367
+
360
368
  export type MRT_FILTER_OPTION =
361
369
  | 'between'
362
370
  | 'contains'
@@ -373,23 +381,20 @@ export type MRT_FILTER_OPTION =
373
381
  | 'startsWith'
374
382
  | FilterFnOption<TableGenerics>;
375
383
 
376
- export type MRT_FilterFn =
377
- | FilterFn<TableGenerics>
378
- | MRT_FILTER_OPTION
379
- | number
380
- | string
381
- | symbol;
384
+ export type MRT_FilterFn = FilterFn<TableGenerics> | MRT_FILTER_OPTION;
382
385
 
383
386
  export type MaterialReactTableProps<D extends Record<string, any> = {}> =
384
387
  MRT_TableOptions<D> & {
385
388
  editingMode?: 'table' | 'row' | 'cell';
386
389
  enableClickToCopy?: boolean;
387
390
  enableColumnActions?: boolean;
391
+ enableColumnFilterChangeMode?: boolean;
388
392
  enableColumnOrdering?: boolean;
389
393
  enableDensityToggle?: boolean;
390
394
  enableEditing?: boolean;
391
395
  enableExpandAll?: boolean;
392
396
  enableFullScreenToggle?: boolean;
397
+ enableGlobalFilterChangeMode?: boolean;
393
398
  enablePagination?: boolean;
394
399
  enablePersistentState?: boolean;
395
400
  enableRowActions?: boolean;
@@ -824,7 +829,7 @@ export type MaterialReactTableProps<D extends Record<string, any> = {}> =
824
829
  rowNumberMode?: 'original' | 'static';
825
830
  selectAllMode?: 'all' | 'page';
826
831
  tableId?: string;
827
- virtualizerProps?: VirtualizerOptions<HTMLDivElement>;
832
+ virtualizerProps?: Partial<VirtualizerOptions<HTMLDivElement>>;
828
833
  };
829
834
 
830
835
  export default <D extends Record<string, any> = {}>({
@@ -833,6 +838,7 @@ export default <D extends Record<string, any> = {}>({
833
838
  defaultColumn = { minSize: 40, maxSize: 1000, size: 180 },
834
839
  editingMode = 'row',
835
840
  enableColumnActions = true,
841
+ enableColumnFilterChangeMode = true,
836
842
  enableColumnFilters = true,
837
843
  enableColumnOrdering = false,
838
844
  enableColumnResizing = false,
@@ -841,6 +847,7 @@ export default <D extends Record<string, any> = {}>({
841
847
  enableFilters = true,
842
848
  enableFullScreenToggle = true,
843
849
  enableGlobalFilter = true,
850
+ enableGlobalFilterChangeMode = true,
844
851
  enableGrouping = false,
845
852
  enableHiding = true,
846
853
  enableMultiRowSelection = true,
@@ -872,6 +879,7 @@ export default <D extends Record<string, any> = {}>({
872
879
  defaultColumn={defaultColumn}
873
880
  editingMode={editingMode}
874
881
  enableColumnActions={enableColumnActions}
882
+ enableColumnFilterChangeMode={enableColumnFilterChangeMode}
875
883
  enableColumnFilters={enableColumnFilters}
876
884
  enableColumnOrdering={enableColumnOrdering}
877
885
  enableColumnResizing={enableColumnResizing}
@@ -880,6 +888,7 @@ export default <D extends Record<string, any> = {}>({
880
888
  enableFilters={enableFilters}
881
889
  enableFullScreenToggle={enableFullScreenToggle}
882
890
  enableGlobalFilter={enableGlobalFilter}
891
+ enableGlobalFilterChangeMode={enableGlobalFilterChangeMode}
883
892
  enableGrouping={enableGrouping}
884
893
  enableHiding={enableHiding}
885
894
  enableMultiRowSelection={enableMultiRowSelection}
@@ -133,7 +133,7 @@ export const notEmpty = (
133
133
 
134
134
  notEmpty.autoRemove = (val: any) => !val;
135
135
 
136
- export const defaultFilterFNs = {
136
+ export const MRT_FilterFns = {
137
137
  between,
138
138
  contains,
139
139
  empty,
@@ -12,32 +12,32 @@ interface Props {
12
12
  dragRef?: Ref<HTMLButtonElement>;
13
13
  dropRef?: Ref<HTMLDivElement>;
14
14
  header: MRT_Header;
15
+ instance: MRT_TableInstance;
15
16
  isDragging?: boolean;
16
17
  previewRef?: Ref<HTMLTableCellElement>;
17
- instance: MRT_TableInstance;
18
18
  }
19
19
 
20
20
  export const MRT_TableHeadCell: FC<Props> = ({
21
21
  dragRef,
22
22
  dropRef,
23
23
  header,
24
+ instance,
24
25
  isDragging,
25
26
  previewRef,
26
- instance,
27
27
  }) => {
28
28
  const {
29
29
  getState,
30
30
  options: {
31
31
  enableColumnActions,
32
- enableColumnFilters,
33
32
  enableColumnOrdering,
34
33
  enableColumnResizing,
35
34
  enableGrouping,
35
+ enableMultiSort,
36
36
  muiTableHeadCellProps,
37
37
  },
38
38
  } = instance;
39
39
 
40
- const { density } = getState();
40
+ const { density, showFilters } = getState();
41
41
 
42
42
  const { column } = header;
43
43
 
@@ -139,7 +139,9 @@ export const MRT_TableHeadCell: FC<Props> = ({
139
139
  right:
140
140
  column.getIsPinned() === 'right' ? `${getTotalRight()}px` : undefined,
141
141
  transition: `all ${enableColumnResizing ? 0 : '0.2s'} ease-in-out`,
142
- verticalAlign: 'text-top',
142
+ userSelect: enableMultiSort ? 'none' : undefined,
143
+ verticalAlign:
144
+ columnDefType === 'display' && showFilters ? 'center' : 'text-top',
143
145
  zIndex: column.getIsResizing()
144
146
  ? 3
145
147
  : column.getIsPinned() && columnDefType !== 'group'
@@ -167,7 +169,7 @@ export const MRT_TableHeadCell: FC<Props> = ({
167
169
  }}
168
170
  >
169
171
  <Box
170
- onClick={() => column.toggleSorting()}
172
+ onClick={column.getToggleSortingHandler()}
171
173
  sx={{
172
174
  alignItems: 'center',
173
175
  cursor:
@@ -184,14 +186,12 @@ export const MRT_TableHeadCell: FC<Props> = ({
184
186
  {columnDefType === 'data' && column.getCanSort() && (
185
187
  <MRT_TableHeadCellSortLabel header={header} instance={instance} />
186
188
  )}
187
- {columnDefType === 'data' &&
188
- enableColumnFilters &&
189
- column.getCanFilter() && (
190
- <MRT_TableHeadCellFilterLabel
191
- header={header}
192
- instance={instance}
193
- />
194
- )}
189
+ {columnDefType === 'data' && column.getCanFilter() && (
190
+ <MRT_TableHeadCellFilterLabel
191
+ header={header}
192
+ instance={instance}
193
+ />
194
+ )}
195
195
  </Box>
196
196
  <Box sx={{ whiteSpace: 'nowrap' }}>
197
197
  {columnDefType === 'data' &&
@@ -1,5 +1,5 @@
1
1
  import React, { FC, MouseEvent } from 'react';
2
- import { IconButton, Tooltip } from '@mui/material';
2
+ import { Grow, IconButton, Tooltip } from '@mui/material';
3
3
  import { MRT_Header, MRT_TableInstance } from '..';
4
4
 
5
5
  interface Props {
@@ -14,73 +14,71 @@ export const MRT_TableHeadCellFilterLabel: FC<Props> = ({
14
14
  const {
15
15
  getState,
16
16
  options: {
17
- icons: { FilterAltIcon, FilterAltOffIcon },
17
+ icons: { FilterAltIcon },
18
18
  localization,
19
19
  },
20
- setShowFilters,
21
20
  } = instance;
22
21
 
23
- const { showFilters } = getState();
22
+ const { currentFilterFns } = getState();
24
23
 
25
24
  const { column } = header;
26
25
 
27
26
  const { columnDef } = column;
28
27
 
29
- const filterFn = getState()?.currentFilterFns?.[header.id];
28
+ const filterFn = currentFilterFns?.[header.id];
30
29
 
31
- const filterTooltip = !!column.getFilterValue()
32
- ? localization.filteringByColumn
33
- .replace('{column}', String(columnDef.header))
34
- .replace(
35
- '{filterType}',
36
- filterFn instanceof Function
37
- ? ''
38
- : // @ts-ignore
39
- localization[
40
- `filter${filterFn.charAt(0).toUpperCase() + filterFn.slice(1)}`
41
- ],
42
- )
43
- .replace(
44
- '{filterValue}',
45
- `"${
46
- Array.isArray(column.getFilterValue())
47
- ? (column.getFilterValue() as [string, string]).join(
48
- `" ${localization.and} "`,
49
- )
50
- : (column.getFilterValue() as string)
51
- }"`,
52
- )
53
- .replace('" "', '')
54
- : localization.showHideFilters;
30
+ const filterTooltip = localization.filteringByColumn
31
+ .replace('{column}', String(columnDef.header))
32
+ .replace(
33
+ '{filterType}',
34
+ filterFn instanceof Function
35
+ ? ''
36
+ : // @ts-ignore
37
+ localization[
38
+ `filter${filterFn.charAt(0).toUpperCase() + filterFn.slice(1)}`
39
+ ],
40
+ )
41
+ .replace(
42
+ '{filterValue}',
43
+ `"${
44
+ Array.isArray(column.getFilterValue())
45
+ ? (column.getFilterValue() as [string, string]).join(
46
+ `" ${localization.and} "`,
47
+ )
48
+ : (column.getFilterValue() as string)
49
+ }"`,
50
+ )
51
+ .replace('" "', '');
55
52
 
56
53
  return (
57
- <Tooltip arrow placement="top" title={filterTooltip}>
58
- <IconButton
59
- disableRipple
60
- onClick={(event: MouseEvent<HTMLButtonElement>) => {
61
- event.stopPropagation();
62
- setShowFilters(!showFilters);
63
- }}
64
- size="small"
65
- sx={{
66
- m: 0,
67
- opacity: !!column.getFilterValue() || showFilters ? 0.8 : 0,
68
- p: '2px',
69
- transition: 'all 0.2s ease-in-out',
70
- transform: 'scale(0.66)',
71
- '&:hover': {
72
- backgroundColor: 'transparent',
73
- opacity: 0.8,
74
- },
75
- width: '1.5ch',
76
- }}
77
- >
78
- {showFilters && !column.getFilterValue() ? (
79
- <FilterAltOffIcon />
80
- ) : (
81
- <FilterAltIcon />
82
- )}
83
- </IconButton>
84
- </Tooltip>
54
+ <Grow
55
+ unmountOnExit
56
+ in={
57
+ (!!column.getFilterValue() && filterFn !== 'between') ||
58
+ (filterFn === 'between' && // @ts-ignore
59
+ (!!column.getFilterValue()?.[0] || !!column.getFilterValue()?.[1]))
60
+ }
61
+ >
62
+ <span>
63
+ <Tooltip arrow placement="top" title={filterTooltip}>
64
+ <IconButton
65
+ disableRipple
66
+ onClick={(event: MouseEvent<HTMLButtonElement>) => {
67
+ event.stopPropagation();
68
+ }}
69
+ size="small"
70
+ sx={{
71
+ m: 0,
72
+ opacity: 0.8,
73
+ p: '2px',
74
+ transform: 'scale(0.66)',
75
+ width: '1.5ch',
76
+ }}
77
+ >
78
+ <FilterAltIcon />
79
+ </IconButton>
80
+ </Tooltip>
81
+ </span>
82
+ </Grow>
85
83
  );
86
84
  };
@@ -32,6 +32,7 @@ export const MRT_FilterTextField: FC<Props> = ({
32
32
  const {
33
33
  getState,
34
34
  options: {
35
+ enableColumnFilterChangeMode,
35
36
  enabledColumnFilterOptions,
36
37
  icons: { FilterListIcon, CloseIcon },
37
38
  localization,
@@ -176,6 +177,10 @@ export const MRT_FilterTextField: FC<Props> = ({
176
177
  const allowedColumnFilterOptions =
177
178
  columnDef?.enabledColumnFilterOptions ?? enabledColumnFilterOptions;
178
179
 
180
+ const allowColumnChangeMode =
181
+ enableColumnFilterChangeMode &&
182
+ columnDef.enableColumnFilterChangeMode !== false;
183
+
179
184
  return (
180
185
  <>
181
186
  <TextField
@@ -190,6 +195,7 @@ export const MRT_FilterTextField: FC<Props> = ({
190
195
  title: filterPlaceholder,
191
196
  }}
192
197
  helperText={
198
+ allowColumnChangeMode &&
193
199
  !inputIndex &&
194
200
  (allowedColumnFilterOptions === undefined ||
195
201
  (allowedColumnFilterOptions?.length ?? 0) > 0) ? (
@@ -224,7 +230,6 @@ export const MRT_FilterTextField: FC<Props> = ({
224
230
  whiteSpace: 'nowrap',
225
231
  },
226
232
  }}
227
- label={isSelectFilter && !filterValue ? filterPlaceholder : undefined}
228
233
  margin="none"
229
234
  placeholder={
230
235
  filterChipLabel || isSelectFilter ? undefined : filterPlaceholder
@@ -235,10 +240,12 @@ export const MRT_FilterTextField: FC<Props> = ({
235
240
  value={filterValue ?? ''}
236
241
  variant="standard"
237
242
  InputProps={{
238
- startAdornment: !isSelectFilter &&
243
+ startAdornment:
244
+ allowColumnChangeMode &&
245
+ !isSelectFilter &&
239
246
  !inputIndex &&
240
247
  (allowedColumnFilterOptions === undefined ||
241
- (allowedColumnFilterOptions?.length ?? 0) > 0) && (
248
+ !!allowedColumnFilterOptions?.length) ? (
242
249
  <InputAdornment position="start">
243
250
  <Tooltip arrow title={localization.changeFilterMode}>
244
251
  <span>
@@ -259,6 +266,8 @@ export const MRT_FilterTextField: FC<Props> = ({
259
266
  />
260
267
  )}
261
268
  </InputAdornment>
269
+ ) : (
270
+ <FilterListIcon />
262
271
  ),
263
272
  endAdornment: !filterChipLabel && (
264
273
  <InputAdornment position="end">
@@ -292,7 +301,6 @@ export const MRT_FilterTextField: FC<Props> = ({
292
301
  p: 0,
293
302
  minWidth: !filterChipLabel ? '8rem' : 'auto',
294
303
  width: 'calc(100% + 0.5rem)',
295
- mt: isSelectFilter && !filterValue ? '-1rem' : undefined,
296
304
  '& .MuiSelect-icon': {
297
305
  mr: '1.5rem',
298
306
  },
@@ -20,17 +20,18 @@ interface Props {
20
20
  instance: MRT_TableInstance;
21
21
  }
22
22
 
23
- export const MRT_SearchTextField: FC<Props> = ({ instance }) => {
23
+ export const MRT_GlobalFilterTextField: FC<Props> = ({ instance }) => {
24
24
  const {
25
25
  getState,
26
26
  setGlobalFilter,
27
27
  options: {
28
+ enableGlobalFilterChangeMode,
28
29
  icons: { SearchIcon, CloseIcon },
29
- tableId,
30
30
  localization,
31
31
  muiSearchTextFieldProps,
32
32
  onGlobalFilterValueChanged,
33
33
  onGlobalFilterValueChangedDebounced,
34
+ tableId,
34
35
  },
35
36
  } = instance;
36
37
 
@@ -76,7 +77,7 @@ export const MRT_SearchTextField: FC<Props> = ({ instance }) => {
76
77
  value={searchValue ?? ''}
77
78
  variant="standard"
78
79
  InputProps={{
79
- startAdornment: (
80
+ startAdornment: enableGlobalFilterChangeMode ? (
80
81
  <InputAdornment position="start">
81
82
  <Tooltip arrow title={localization.changeSearchMode}>
82
83
  <IconButton
@@ -89,18 +90,23 @@ export const MRT_SearchTextField: FC<Props> = ({ instance }) => {
89
90
  </IconButton>
90
91
  </Tooltip>
91
92
  </InputAdornment>
93
+ ) : (
94
+ <SearchIcon />
92
95
  ),
93
96
  endAdornment: (
94
97
  <InputAdornment position="end">
95
- <IconButton
96
- aria-label={localization.clearSearch}
97
- disabled={searchValue?.length === 0}
98
- onClick={handleClear}
99
- size="small"
100
- title={localization.clearSearch}
101
- >
102
- <CloseIcon />
103
- </IconButton>
98
+ <Tooltip arrow title={localization.clearSearch ?? ''}>
99
+ <span>
100
+ <IconButton
101
+ aria-label={localization.clearSearch}
102
+ disabled={!searchValue?.length}
103
+ onClick={handleClear}
104
+ size="small"
105
+ >
106
+ <CloseIcon />
107
+ </IconButton>
108
+ </span>
109
+ </Tooltip>
104
110
  </InputAdornment>
105
111
  ),
106
112
  }}
@@ -18,7 +18,7 @@ import {
18
18
  notEmpty,
19
19
  notEquals,
20
20
  startsWith,
21
- } from '../filtersFNs';
21
+ } from '../filtersFns';
22
22
 
23
23
  const commonMenuItemStyles = {
24
24
  py: '6px',
@@ -0,0 +1,21 @@
1
+ import { compareItems, RankingInfo } from '@tanstack/match-sorter-utils';
2
+ import { Row, sortingFns } from '@tanstack/react-table';
3
+ import type { MRT_Row } from '.';
4
+
5
+ const fuzzy = (rowA: MRT_Row, rowB: MRT_Row, columnId: string) => {
6
+ let dir = 0;
7
+ if (rowA.columnFiltersMeta[columnId]) {
8
+ dir = compareItems(
9
+ rowA.columnFiltersMeta[columnId]! as RankingInfo,
10
+ rowB.columnFiltersMeta[columnId]! as RankingInfo,
11
+ );
12
+ }
13
+ // Provide a fallback for when the item ranks are equal
14
+ return dir === 0
15
+ ? sortingFns.alphanumeric(rowA as Row<any>, rowB as Row<any>, columnId)
16
+ : dir;
17
+ };
18
+
19
+ export const MRT_SortingFns = {
20
+ fuzzy,
21
+ };
@@ -1,18 +1,20 @@
1
1
  import React, { useEffect, useMemo, useState } from 'react';
2
2
  import {
3
3
  FilterFn,
4
+ ReactTableGenerics,
5
+ Table,
6
+ TableState,
4
7
  createTable,
8
+ filterFns,
9
+ getCoreRowModel,
5
10
  getExpandedRowModel,
6
- getPaginationRowModel,
7
- useTableInstance,
11
+ getFacetedRowModel,
12
+ getFilteredRowModel,
8
13
  getGroupedRowModel,
14
+ getPaginationRowModel,
9
15
  getSortedRowModel,
10
- getCoreRowModel,
11
- getFilteredRowModel,
12
- ReactTableGenerics,
13
- getFacetedRowModel,
14
- TableState,
15
- Table,
16
+ useTableInstance,
17
+ sortingFns,
16
18
  } from '@tanstack/react-table';
17
19
  import {
18
20
  MRT_Cell,
@@ -29,6 +31,7 @@ import { MRT_ToggleRowActionMenuButton } from '../buttons/MRT_ToggleRowActionMen
29
31
  import { MRT_SelectCheckbox } from '../inputs/MRT_SelectCheckbox';
30
32
  import { MaterialReactTableProps } from '../MaterialReactTable';
31
33
  import { MRT_TablePaper } from './MRT_TablePaper';
34
+ import { Box, Dialog, Grow } from '@mui/material';
32
35
  import {
33
36
  createDataColumn,
34
37
  createDisplayColumn,
@@ -36,8 +39,8 @@ import {
36
39
  getAllLeafColumnDefs,
37
40
  getDefaultColumnOrderIds,
38
41
  } from '../utils';
39
- import { defaultFilterFNs } from '../filtersFNs';
40
- import { Box, Dialog, Grow } from '@mui/material';
42
+ import { MRT_FilterFns } from '../filtersFns';
43
+ import { MRT_SortingFns } from '../sortingFns';
41
44
 
42
45
  export const MRT_TableRoot = <D extends Record<string, any> = {}>(
43
46
  props: MaterialReactTableProps<D>,
@@ -123,8 +126,7 @@ export const MRT_TableRoot = <D extends Record<string, any> = {}>(
123
126
  () =>
124
127
  // @ts-ignore
125
128
  createTable().setOptions({
126
- //@ts-ignore
127
- filterFns: defaultFilterFNs,
129
+ filterFns: { ...filterFns, ...MRT_FilterFns, ...props.filterFns },
128
130
  getCoreRowModel: getCoreRowModel(),
129
131
  getExpandedRowModel: getExpandedRowModel(),
130
132
  getFacetedRowModel: getFacetedRowModel(),
@@ -132,8 +134,7 @@ export const MRT_TableRoot = <D extends Record<string, any> = {}>(
132
134
  getGroupedRowModel: getGroupedRowModel(),
133
135
  getPaginationRowModel: getPaginationRowModel(),
134
136
  getSortedRowModel: getSortedRowModel(),
135
- getSubRows: (row) => (row as MRT_Row)?.subRows,
136
- tableId,
137
+ sortingFns: { ...sortingFns, ...MRT_SortingFns, ...props.sortingFns },
137
138
  }) as Table<D>,
138
139
  [],
139
140
  );
@@ -252,6 +253,7 @@ export const MRT_TableRoot = <D extends Record<string, any> = {}>(
252
253
  //@ts-ignore
253
254
  columns,
254
255
  data,
256
+ getSubRows: (row) => (row as MRT_Row)?.subRows,
255
257
  //@ts-ignore
256
258
  globalFilterFn: currentGlobalFilterFn,
257
259
  initialState,
@@ -267,6 +269,7 @@ export const MRT_TableRoot = <D extends Record<string, any> = {}>(
267
269
  showGlobalFilter,
268
270
  ...props.state,
269
271
  } as TableState,
272
+ tableId,
270
273
  }),
271
274
  setCurrentEditingCell:
272
275
  props.onCurrentEditingCellChange ?? setCurrentEditingCell,