material-react-table 2.11.3 → 2.12.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (37) hide show
  1. package/README.md +29 -22
  2. package/dist/index.d.ts +19 -2
  3. package/dist/index.esm.js +136 -105
  4. package/dist/index.esm.js.map +1 -1
  5. package/dist/index.js +137 -104
  6. package/dist/index.js.map +1 -1
  7. package/locales/hr/index.d.ts +3 -0
  8. package/locales/hr/index.esm.d.ts +3 -0
  9. package/locales/hr/index.esm.js +95 -0
  10. package/locales/hr/index.js +99 -0
  11. package/locales/hr/package.json +6 -0
  12. package/package.json +25 -25
  13. package/src/components/body/MRT_TableBodyCell.tsx +7 -0
  14. package/src/components/body/MRT_TableBodyRow.tsx +5 -0
  15. package/src/components/body/MRT_TableDetailPanel.tsx +2 -5
  16. package/src/components/head/MRT_TableHead.tsx +11 -11
  17. package/src/components/head/MRT_TableHeadCell.tsx +7 -0
  18. package/src/components/head/MRT_TableHeadCellFilterContainer.tsx +3 -4
  19. package/src/components/head/MRT_TableHeadCellFilterLabel.tsx +61 -37
  20. package/src/components/inputs/MRT_FilterRangeFields.tsx +8 -2
  21. package/src/components/inputs/MRT_FilterTextField.tsx +41 -63
  22. package/src/components/menus/MRT_ShowHideColumnsMenuItems.tsx +1 -4
  23. package/src/components/table/MRT_TablePaper.tsx +4 -4
  24. package/src/components/toolbar/MRT_TablePagination.tsx +10 -12
  25. package/src/components/toolbar/MRT_ToolbarDropZone.tsx +5 -0
  26. package/src/hooks/display-columns/getMRT_RowActionsColumnDef.tsx +1 -1
  27. package/src/hooks/display-columns/getMRT_RowDragColumnDef.tsx +1 -1
  28. package/src/hooks/display-columns/getMRT_RowExpandColumnDef.tsx +1 -1
  29. package/src/hooks/display-columns/getMRT_RowNumbersColumnDef.tsx +1 -1
  30. package/src/hooks/display-columns/getMRT_RowPinningColumnDef.tsx +1 -1
  31. package/src/hooks/display-columns/getMRT_RowSelectColumnDef.tsx +1 -1
  32. package/src/hooks/display-columns/getMRT_RowSpacerColumnDef.tsx +1 -1
  33. package/src/hooks/useMRT_ColumnVirtualizer.ts +6 -8
  34. package/src/locales/hr.ts +96 -0
  35. package/src/types.ts +0 -1
  36. package/src/utils/column.utils.ts +86 -0
  37. package/src/utils/utils.ts +1 -1
@@ -0,0 +1,3 @@
1
+ import { type MRT_Localization } from '../..';
2
+ export declare const MRT_Localization_HR: MRT_Localization;
3
+
@@ -0,0 +1,3 @@
1
+ import { type MRT_Localization } from '../..';
2
+ export declare const MRT_Localization_HR: MRT_Localization;
3
+
@@ -0,0 +1,95 @@
1
+ const MRT_Localization_HR = {
2
+ actions: 'Radnje',
3
+ and: 'i',
4
+ cancel: 'Odustani',
5
+ changeFilterMode: 'Promijeni način filtriranja',
6
+ changeSearchMode: 'Promijeni način pretraživanja',
7
+ clearFilter: 'Očisti filtriranje',
8
+ clearSearch: 'Očisti pretragu',
9
+ clearSelection: 'Očisti odabir',
10
+ clearSort: 'Očisti sortiranje',
11
+ clickToCopy: 'Klikni za kopiranje',
12
+ copy: 'Kopiraj',
13
+ collapse: 'Sažmi',
14
+ collapseAll: 'Sažmi sve',
15
+ columnActions: 'Radnje s stupcima',
16
+ copiedToClipboard: 'Kopirano u međuspremnik',
17
+ dropToGroupBy: 'Ispusti za grupiranje po {column}',
18
+ edit: 'Uredi',
19
+ expand: 'Proširi',
20
+ expandAll: 'Proširi sve',
21
+ filterArrIncludes: 'Uključuje',
22
+ filterArrIncludesAll: 'Uključuje sve',
23
+ filterArrIncludesSome: 'Uključuje',
24
+ filterBetween: 'Između',
25
+ filterBetweenInclusive: 'Između uključivo',
26
+ filterByColumn: 'Filtriraj po {column}',
27
+ filterContains: 'Sadrži',
28
+ filterEmpty: 'Prazno',
29
+ filterEndsWith: 'Završava s',
30
+ filterEquals: 'Jednako',
31
+ filterEqualsString: 'Jednako',
32
+ filterFuzzy: 'Maglovito',
33
+ filterGreaterThan: 'Veće od',
34
+ filterGreaterThanOrEqualTo: 'Veće od ili jednako',
35
+ filterInNumberRange: 'Između',
36
+ filterIncludesString: 'Sadrži',
37
+ filterIncludesStringSensitive: 'Sadrži',
38
+ filterLessThan: 'Manje od',
39
+ filterLessThanOrEqualTo: 'Manje od ili jednako',
40
+ filterMode: 'Način filtriranja: {filterType}',
41
+ filterNotEmpty: 'Nije prazno',
42
+ filterNotEquals: 'Nije jednako',
43
+ filterStartsWith: 'Počinje s',
44
+ filterWeakEquals: 'Jednako',
45
+ filteringByColumn: 'Filtriranje po {column} - {filterType} {filterValue}',
46
+ goToFirstPage: 'Idi na prvu stranicu',
47
+ goToLastPage: 'Idi na zadnju stranicu',
48
+ goToNextPage: 'Idi na sljedeću stranicu',
49
+ goToPreviousPage: 'Idi na prethodnu stranicu',
50
+ grab: 'Uhvati',
51
+ groupByColumn: 'Grupiraj po {column}',
52
+ groupedBy: 'Grupirano po ',
53
+ hideAll: 'Sakrij sve',
54
+ hideColumn: 'Sakrij stupac {column}',
55
+ max: 'Maks.',
56
+ min: 'Min.',
57
+ move: 'Premjesti',
58
+ noRecordsToDisplay: 'Nema zapisa za prikaz',
59
+ noResultsFound: 'Nema pronađenih rezultata',
60
+ of: 'od',
61
+ or: 'ili',
62
+ pin: 'Prikači',
63
+ pinToLeft: 'Prikači na lijevo',
64
+ pinToRight: 'Prikači na desno',
65
+ resetColumnSize: 'Resetiraj veličinu stupca',
66
+ resetOrder: 'Resetiraj redoslijed',
67
+ rowActions: 'Radnje retka',
68
+ rowNumber: '#',
69
+ rowNumbers: 'Brojevi redaka',
70
+ rowsPerPage: 'Redaka po stranici',
71
+ save: 'Spremi',
72
+ search: 'Pretraži',
73
+ selectedCountOfRowCountRowsSelected: '{selectedCount} od {rowCount} odabranih redaka',
74
+ select: 'Odaberi',
75
+ showAll: 'Prikaži sve',
76
+ showAllColumns: 'Prikaži sve stupce',
77
+ showHideColumns: 'Prikaži/sakrij stupce',
78
+ showHideFilters: 'Prikaži/sakrij filtere',
79
+ showHideSearch: 'Prikaži/sakrij pretragu',
80
+ sortByColumnAsc: 'Sortiraj po {column} uzlazno',
81
+ sortByColumnDesc: 'Sortiraj po {column} silazno',
82
+ sortedByColumnAsc: 'Sortirano po {column} uzlazno',
83
+ sortedByColumnDesc: 'Sortirano po {column} silazno',
84
+ thenBy: ', zatim po ',
85
+ toggleDensity: 'Promijeni gustoću',
86
+ toggleFullScreen: 'Prebaci u puni zaslon',
87
+ toggleSelectAll: 'Prebaci odabir svih',
88
+ toggleSelectRow: 'Prebaci odabir retka',
89
+ toggleVisibility: 'Prebaci vidljivost',
90
+ ungroupByColumn: 'Razgrupiraj po {column}',
91
+ unpin: 'Odkači',
92
+ unpinAll: 'Odkači sve',
93
+ };
94
+
95
+ export { MRT_Localization_HR };
@@ -0,0 +1,99 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ const MRT_Localization_HR = {
6
+ actions: 'Radnje',
7
+ and: 'i',
8
+ cancel: 'Odustani',
9
+ changeFilterMode: 'Promijeni način filtriranja',
10
+ changeSearchMode: 'Promijeni način pretraživanja',
11
+ clearFilter: 'Očisti filtriranje',
12
+ clearSearch: 'Očisti pretragu',
13
+ clearSelection: 'Očisti odabir',
14
+ clearSort: 'Očisti sortiranje',
15
+ clickToCopy: 'Klikni za kopiranje',
16
+ copy: 'Kopiraj',
17
+ collapse: 'Sažmi',
18
+ collapseAll: 'Sažmi sve',
19
+ columnActions: 'Radnje s stupcima',
20
+ copiedToClipboard: 'Kopirano u međuspremnik',
21
+ dropToGroupBy: 'Ispusti za grupiranje po {column}',
22
+ edit: 'Uredi',
23
+ expand: 'Proširi',
24
+ expandAll: 'Proširi sve',
25
+ filterArrIncludes: 'Uključuje',
26
+ filterArrIncludesAll: 'Uključuje sve',
27
+ filterArrIncludesSome: 'Uključuje',
28
+ filterBetween: 'Između',
29
+ filterBetweenInclusive: 'Između uključivo',
30
+ filterByColumn: 'Filtriraj po {column}',
31
+ filterContains: 'Sadrži',
32
+ filterEmpty: 'Prazno',
33
+ filterEndsWith: 'Završava s',
34
+ filterEquals: 'Jednako',
35
+ filterEqualsString: 'Jednako',
36
+ filterFuzzy: 'Maglovito',
37
+ filterGreaterThan: 'Veće od',
38
+ filterGreaterThanOrEqualTo: 'Veće od ili jednako',
39
+ filterInNumberRange: 'Između',
40
+ filterIncludesString: 'Sadrži',
41
+ filterIncludesStringSensitive: 'Sadrži',
42
+ filterLessThan: 'Manje od',
43
+ filterLessThanOrEqualTo: 'Manje od ili jednako',
44
+ filterMode: 'Način filtriranja: {filterType}',
45
+ filterNotEmpty: 'Nije prazno',
46
+ filterNotEquals: 'Nije jednako',
47
+ filterStartsWith: 'Počinje s',
48
+ filterWeakEquals: 'Jednako',
49
+ filteringByColumn: 'Filtriranje po {column} - {filterType} {filterValue}',
50
+ goToFirstPage: 'Idi na prvu stranicu',
51
+ goToLastPage: 'Idi na zadnju stranicu',
52
+ goToNextPage: 'Idi na sljedeću stranicu',
53
+ goToPreviousPage: 'Idi na prethodnu stranicu',
54
+ grab: 'Uhvati',
55
+ groupByColumn: 'Grupiraj po {column}',
56
+ groupedBy: 'Grupirano po ',
57
+ hideAll: 'Sakrij sve',
58
+ hideColumn: 'Sakrij stupac {column}',
59
+ max: 'Maks.',
60
+ min: 'Min.',
61
+ move: 'Premjesti',
62
+ noRecordsToDisplay: 'Nema zapisa za prikaz',
63
+ noResultsFound: 'Nema pronađenih rezultata',
64
+ of: 'od',
65
+ or: 'ili',
66
+ pin: 'Prikači',
67
+ pinToLeft: 'Prikači na lijevo',
68
+ pinToRight: 'Prikači na desno',
69
+ resetColumnSize: 'Resetiraj veličinu stupca',
70
+ resetOrder: 'Resetiraj redoslijed',
71
+ rowActions: 'Radnje retka',
72
+ rowNumber: '#',
73
+ rowNumbers: 'Brojevi redaka',
74
+ rowsPerPage: 'Redaka po stranici',
75
+ save: 'Spremi',
76
+ search: 'Pretraži',
77
+ selectedCountOfRowCountRowsSelected: '{selectedCount} od {rowCount} odabranih redaka',
78
+ select: 'Odaberi',
79
+ showAll: 'Prikaži sve',
80
+ showAllColumns: 'Prikaži sve stupce',
81
+ showHideColumns: 'Prikaži/sakrij stupce',
82
+ showHideFilters: 'Prikaži/sakrij filtere',
83
+ showHideSearch: 'Prikaži/sakrij pretragu',
84
+ sortByColumnAsc: 'Sortiraj po {column} uzlazno',
85
+ sortByColumnDesc: 'Sortiraj po {column} silazno',
86
+ sortedByColumnAsc: 'Sortirano po {column} uzlazno',
87
+ sortedByColumnDesc: 'Sortirano po {column} silazno',
88
+ thenBy: ', zatim po ',
89
+ toggleDensity: 'Promijeni gustoću',
90
+ toggleFullScreen: 'Prebaci u puni zaslon',
91
+ toggleSelectAll: 'Prebaci odabir svih',
92
+ toggleSelectRow: 'Prebaci odabir retka',
93
+ toggleVisibility: 'Prebaci vidljivost',
94
+ ungroupByColumn: 'Razgrupiraj po {column}',
95
+ unpin: 'Odkači',
96
+ unpinAll: 'Odkači sve',
97
+ };
98
+
99
+ exports.MRT_Localization_HR = MRT_Localization_HR;
@@ -0,0 +1,6 @@
1
+ {
2
+ "main": "index.js",
3
+ "module": "index.esm.js",
4
+ "sideEffects": false,
5
+ "types": "index.d.ts"
6
+ }
package/package.json CHANGED
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "2.11.3",
2
+ "version": "2.12.1",
3
3
  "license": "MIT",
4
4
  "name": "material-react-table",
5
5
  "description": "A fully featured Material UI V5 implementation of TanStack React Table V8, written from the ground up in TypeScript.",
@@ -61,32 +61,32 @@
61
61
  "storybook:dev": "storybook dev -p 6006"
62
62
  },
63
63
  "devDependencies": {
64
- "@babel/core": "^7.23.9",
64
+ "@babel/core": "^7.24.0",
65
65
  "@babel/preset-react": "^7.23.3",
66
- "@emotion/react": "^11.11.3",
66
+ "@emotion/react": "^11.11.4",
67
67
  "@emotion/styled": "^11.11.0",
68
68
  "@faker-js/faker": "^8.4.1",
69
- "@mui/icons-material": "^5.15.10",
70
- "@mui/material": "^5.15.10",
71
- "@mui/x-date-pickers": "^6.19.4",
69
+ "@mui/icons-material": "^5.15.11",
70
+ "@mui/material": "^5.15.11",
71
+ "@mui/x-date-pickers": "^6.19.5",
72
72
  "@rollup/plugin-typescript": "^11.1.6",
73
73
  "@size-limit/preset-small-lib": "^11.0.2",
74
- "@storybook/addon-a11y": "^7.6.15",
75
- "@storybook/addon-essentials": "^7.6.15",
76
- "@storybook/addon-interactions": "^7.6.15",
77
- "@storybook/addon-links": "^7.6.15",
78
- "@storybook/addon-storysource": "^7.6.15",
79
- "@storybook/blocks": "^7.6.15",
80
- "@storybook/react": "^7.6.15",
81
- "@storybook/react-vite": "^7.6.15",
74
+ "@storybook/addon-a11y": "^7.6.17",
75
+ "@storybook/addon-essentials": "^7.6.17",
76
+ "@storybook/addon-interactions": "^7.6.17",
77
+ "@storybook/addon-links": "^7.6.17",
78
+ "@storybook/addon-storysource": "^7.6.17",
79
+ "@storybook/blocks": "^7.6.17",
80
+ "@storybook/react": "^7.6.17",
81
+ "@storybook/react-vite": "^7.6.17",
82
82
  "@storybook/testing-library": "^0.2.2",
83
- "@types/node": "^20.11.17",
84
- "@types/react": "^18.2.55",
83
+ "@types/node": "^20.11.22",
84
+ "@types/react": "^18.2.60",
85
85
  "@types/react-dom": "^18.2.19",
86
- "@typescript-eslint/eslint-plugin": "^7.0.1",
87
- "@typescript-eslint/parser": "^7.0.1",
86
+ "@typescript-eslint/eslint-plugin": "^7.1.0",
87
+ "@typescript-eslint/parser": "^7.1.0",
88
88
  "@vitejs/plugin-react": "^4.2.1",
89
- "eslint": "^8.56.0",
89
+ "eslint": "^8.57.0",
90
90
  "eslint-plugin-mui-path-imports": "^0.0.15",
91
91
  "eslint-plugin-perfectionist": "^2.5.0",
92
92
  "prop-types": "^15.8.1",
@@ -99,11 +99,11 @@
99
99
  "rollup-plugin-dts": "^6.1.0",
100
100
  "rollup-plugin-peer-deps-external": "^2.2.4",
101
101
  "size-limit": "^11.0.2",
102
- "storybook": "^7.6.15",
102
+ "storybook": "^7.6.17",
103
103
  "storybook-dark-mode": "^3.0.3",
104
104
  "tslib": "^2.6.2",
105
105
  "typescript": "^5.3.3",
106
- "vite": "^5.1.1"
106
+ "vite": "^5.1.4"
107
107
  },
108
108
  "peerDependencies": {
109
109
  "@emotion/react": ">=11.11",
@@ -111,13 +111,13 @@
111
111
  "@mui/icons-material": ">=5.11",
112
112
  "@mui/material": ">=5.13",
113
113
  "@mui/x-date-pickers": ">=6.15.0",
114
- "react": ">=18.0",
115
- "react-dom": ">=18.0"
114
+ "react": ">=17.0",
115
+ "react-dom": ">=17.0"
116
116
  },
117
117
  "dependencies": {
118
118
  "@tanstack/match-sorter-utils": "8.11.8",
119
- "@tanstack/react-table": "8.12.0",
120
- "@tanstack/react-virtual": "3.0.4",
119
+ "@tanstack/react-table": "8.13.2",
120
+ "@tanstack/react-virtual": "3.1.3",
121
121
  "highlight-words": "1.2.2"
122
122
  }
123
123
  }
@@ -210,6 +210,12 @@ export const MRT_TableBodyCell = <TData extends MRT_RowData>({
210
210
  }
211
211
  };
212
212
 
213
+ const handleDragOver = (e: DragEvent) => {
214
+ if (columnDef.enableColumnOrdering !== false) {
215
+ e.preventDefault();
216
+ }
217
+ };
218
+
213
219
  const handleContextMenu = (e: MouseEvent<HTMLTableCellElement>) => {
214
220
  tableCellProps?.onContextMenu?.(e);
215
221
  if (isRightClickable) {
@@ -228,6 +234,7 @@ export const MRT_TableBodyCell = <TData extends MRT_RowData>({
228
234
  onContextMenu={handleContextMenu}
229
235
  onDoubleClick={handleDoubleClick}
230
236
  onDragEnter={handleDragEnter}
237
+ onDragOver={handleDragOver}
231
238
  sx={(theme) => ({
232
239
  '&:hover': {
233
240
  outline:
@@ -140,6 +140,10 @@ export const MRT_TableBodyRow = <TData extends MRT_RowData>({
140
140
  }
141
141
  };
142
142
 
143
+ const handleDragOver = (e: DragEvent) => {
144
+ e.preventDefault();
145
+ };
146
+
143
147
  const rowRef = useRef<HTMLTableRowElement | null>(null);
144
148
 
145
149
  const cellHighlightColor = isRowSelected
@@ -164,6 +168,7 @@ export const MRT_TableBodyRow = <TData extends MRT_RowData>({
164
168
  data-pinned={!!isRowPinned || undefined}
165
169
  data-selected={isRowSelected || undefined}
166
170
  onDragEnter={handleDragEnter}
171
+ onDragOver={handleDragOver}
167
172
  ref={(node: HTMLTableRowElement) => {
168
173
  if (node) {
169
174
  rowRef.current = node;
@@ -34,7 +34,6 @@ export const MRT_TableDetailPanel = <TData extends MRT_RowData>({
34
34
  getState,
35
35
  getVisibleLeafColumns,
36
36
  options: {
37
- enableRowVirtualization,
38
37
  layoutMode,
39
38
  mrtTheme: { baseBackgroundColor },
40
39
  muiDetailPanelProps,
@@ -93,14 +92,12 @@ export const MRT_TableDetailPanel = <TData extends MRT_RowData>({
93
92
  borderBottom: !row.getIsExpanded() ? 'none' : undefined,
94
93
  display: layoutMode?.startsWith('grid') ? 'flex' : undefined,
95
94
  py: !!DetailPanel && row.getIsExpanded() ? '1rem' : 0,
96
- transition: !enableRowVirtualization
97
- ? 'all 150ms ease-in-out'
98
- : undefined,
95
+ transition: !virtualRow ? 'all 150ms ease-in-out' : undefined,
99
96
  width: `100%`,
100
97
  ...(parseFromValuesOrFunc(tableCellProps?.sx, theme) as any),
101
98
  })}
102
99
  >
103
- {enableRowVirtualization ? (
100
+ {virtualRow ? (
104
101
  row.getIsExpanded() && DetailPanel
105
102
  ) : (
106
103
  <Collapse in={row.getIsExpanded()} mountOnEnter unmountOnExit>
@@ -20,8 +20,6 @@ export const MRT_TableHead = <TData extends MRT_RowData>({
20
20
  ...rest
21
21
  }: MRT_TableHeadProps<TData>) => {
22
22
  const {
23
- getHeaderGroups,
24
- getSelectedRowModel,
25
23
  getState,
26
24
  options: {
27
25
  enableStickyHeader,
@@ -60,7 +58,7 @@ export const MRT_TableHead = <TData extends MRT_RowData>({
60
58
  })}
61
59
  >
62
60
  {positionToolbarAlertBanner === 'head-overlay' &&
63
- (showAlertBanner || getSelectedRowModel().rows.length > 0) ? (
61
+ (showAlertBanner || table.getSelectedRowModel().rows.length > 0) ? (
64
62
  <tr
65
63
  style={{
66
64
  display: layoutMode?.startsWith('grid') ? 'grid' : undefined,
@@ -77,14 +75,16 @@ export const MRT_TableHead = <TData extends MRT_RowData>({
77
75
  </th>
78
76
  </tr>
79
77
  ) : (
80
- getHeaderGroups().map((headerGroup) => (
81
- <MRT_TableHeadRow
82
- columnVirtualizer={columnVirtualizer}
83
- headerGroup={headerGroup as any}
84
- key={headerGroup.id}
85
- table={table}
86
- />
87
- ))
78
+ table
79
+ .getHeaderGroups()
80
+ .map((headerGroup) => (
81
+ <MRT_TableHeadRow
82
+ columnVirtualizer={columnVirtualizer}
83
+ headerGroup={headerGroup as any}
84
+ key={headerGroup.id}
85
+ table={table}
86
+ />
87
+ ))
88
88
  )}
89
89
  </TableHead>
90
90
  );
@@ -141,6 +141,12 @@ export const MRT_TableHeadCell = <TData extends MRT_RowData>({
141
141
  }
142
142
  };
143
143
 
144
+ const handleDragOver = (e: DragEvent) => {
145
+ if (columnDef.enableColumnOrdering !== false) {
146
+ e.preventDefault();
147
+ }
148
+ };
149
+
144
150
  const HeaderElement =
145
151
  parseFromValuesOrFunc(columnDef.Header, {
146
152
  column,
@@ -161,6 +167,7 @@ export const MRT_TableHeadCell = <TData extends MRT_RowData>({
161
167
  data-index={staticColumnIndex}
162
168
  data-pinned={!!isColumnPinned || undefined}
163
169
  onDragEnter={handleDragEnter}
170
+ onDragOver={handleDragOver}
164
171
  ref={(node: HTMLTableCellElement) => {
165
172
  if (node) {
166
173
  tableHeadCellRefs.current[column.id] = node;
@@ -4,6 +4,7 @@ import {
4
4
  type MRT_RowData,
5
5
  type MRT_TableInstance,
6
6
  } from '../../types';
7
+ import { getColumnFilterInfo } from '../../utils/column.utils';
7
8
  import { MRT_FilterCheckbox } from '../inputs/MRT_FilterCheckbox';
8
9
  import { MRT_FilterRangeFields } from '../inputs/MRT_FilterRangeFields';
9
10
  import { MRT_FilterRangeSlider } from '../inputs/MRT_FilterRangeSlider';
@@ -28,6 +29,7 @@ export const MRT_TableHeadCellFilterContainer = <TData extends MRT_RowData>({
28
29
  const { showColumnFilters } = getState();
29
30
  const { column } = header;
30
31
  const { columnDef } = column;
32
+ const { isRangeFilter } = getColumnFilterInfo({ header, table });
31
33
 
32
34
  return (
33
35
  <Collapse
@@ -40,10 +42,7 @@ export const MRT_TableHeadCellFilterContainer = <TData extends MRT_RowData>({
40
42
  <MRT_FilterCheckbox column={column} table={table} />
41
43
  ) : columnDef.filterVariant === 'range-slider' ? (
42
44
  <MRT_FilterRangeSlider header={header} table={table} />
43
- ) : columnDef.filterVariant?.includes('range') ||
44
- ['between', 'betweenInclusive', 'inNumberRange'].includes(
45
- columnDef._filterFn,
46
- ) ? (
45
+ ) : isRangeFilter ? (
47
46
  <MRT_FilterRangeFields header={header} table={table} />
48
47
  ) : (
49
48
  <MRT_FilterTextField header={header} table={table} />
@@ -10,7 +10,11 @@ import {
10
10
  type MRT_RowData,
11
11
  type MRT_TableInstance,
12
12
  } from '../../types';
13
- import { parseFromValuesOrFunc } from '../../utils/utils';
13
+ import {
14
+ getColumnFilterInfo,
15
+ useDropdownOptions,
16
+ } from '../../utils/column.utils';
17
+ import { getValueAndLabel, parseFromValuesOrFunc } from '../../utils/utils';
14
18
 
15
19
  export interface MRT_TableHeadCellFilterLabelProps<TData extends MRT_RowData>
16
20
  extends IconButtonProps {
@@ -35,20 +39,32 @@ export const MRT_TableHeadCellFilterLabel = <TData extends MRT_RowData = {}>({
35
39
  const { column } = header;
36
40
  const { columnDef } = column;
37
41
 
38
- const filterValue = column.getFilterValue();
42
+ const filterValue = column.getFilterValue() as [string, string] | string;
39
43
 
40
44
  const [anchorEl, setAnchorEl] = useState<HTMLButtonElement | null>(null);
41
45
 
46
+ const {
47
+ currentFilterOption,
48
+ isMultiSelectFilter,
49
+ isRangeFilter,
50
+ isSelectFilter,
51
+ } = getColumnFilterInfo({ header, table });
52
+
53
+ const dropdownOptions = useDropdownOptions({ header, table });
54
+
55
+ const getSelectLabel = (index?: number) =>
56
+ getValueAndLabel(
57
+ dropdownOptions?.find(
58
+ (option) =>
59
+ getValueAndLabel(option).value ===
60
+ (index !== undefined ? filterValue[index] : filterValue),
61
+ ),
62
+ ).label;
63
+
42
64
  const isFilterActive =
43
65
  (Array.isArray(filterValue) && filterValue.some(Boolean)) ||
44
66
  (!!filterValue && !Array.isArray(filterValue));
45
67
 
46
- const isRangeFilter =
47
- columnDef.filterVariant?.includes('range') ||
48
- ['between', 'betweenInclusive', 'inNumberRange'].includes(
49
- columnDef._filterFn,
50
- );
51
- const currentFilterOption = columnDef._filterFn;
52
68
  const filterTooltip =
53
69
  columnFilterDisplayMode === 'popover' && !isFilterActive
54
70
  ? localization.filterByColumn?.replace(
@@ -73,10 +89,16 @@ export const MRT_TableHeadCellFilterLabel = <TData extends MRT_RowData = {}>({
73
89
  '{filterValue}',
74
90
  `"${
75
91
  Array.isArray(filterValue)
76
- ? (filterValue as [string, string]).join(
77
- `" ${isRangeFilter ? localization.and : localization.or} "`,
78
- )
79
- : (filterValue as string)
92
+ ? (filterValue as [string, string])
93
+ .map((value, index) =>
94
+ isMultiSelectFilter ? getSelectLabel(index) : value,
95
+ )
96
+ .join(
97
+ `" ${isRangeFilter ? localization.and : localization.or} "`,
98
+ )
99
+ : isSelectFilter
100
+ ? getSelectLabel()
101
+ : (filterValue as string)
80
102
  }"`,
81
103
  )
82
104
  .replace('" "', '');
@@ -126,31 +148,33 @@ export const MRT_TableHeadCellFilterLabel = <TData extends MRT_RowData = {}>({
126
148
  </Tooltip>
127
149
  </Box>
128
150
  </Grow>
129
- <Popover
130
- anchorEl={anchorEl}
131
- anchorOrigin={{
132
- horizontal: 'center',
133
- vertical: 'top',
134
- }}
135
- disableScrollLock
136
- onClick={(event) => event.stopPropagation()}
137
- onClose={(event) => {
138
- //@ts-ignore
139
- event.stopPropagation();
140
- setAnchorEl(null);
141
- }}
142
- onKeyDown={(event) => event.key === 'Enter' && setAnchorEl(null)}
143
- open={!!anchorEl}
144
- slotProps={{ paper: { sx: { overflow: 'visible' } } }}
145
- transformOrigin={{
146
- horizontal: 'center',
147
- vertical: 'bottom',
148
- }}
149
- >
150
- <Box sx={{ p: '1rem' }}>
151
- <MRT_TableHeadCellFilterContainer header={header} table={table} />
152
- </Box>
153
- </Popover>
151
+ {columnFilterDisplayMode === 'popover' && (
152
+ <Popover
153
+ anchorEl={anchorEl}
154
+ anchorOrigin={{
155
+ horizontal: 'center',
156
+ vertical: 'top',
157
+ }}
158
+ disableScrollLock
159
+ onClick={(event) => event.stopPropagation()}
160
+ onClose={(event) => {
161
+ //@ts-ignore
162
+ event.stopPropagation();
163
+ setAnchorEl(null);
164
+ }}
165
+ onKeyDown={(event) => event.key === 'Enter' && setAnchorEl(null)}
166
+ open={!!anchorEl}
167
+ slotProps={{ paper: { sx: { overflow: 'visible' } } }}
168
+ transformOrigin={{
169
+ horizontal: 'center',
170
+ vertical: 'bottom',
171
+ }}
172
+ >
173
+ <Box sx={{ p: '1rem' }}>
174
+ <MRT_TableHeadCellFilterContainer header={header} table={table} />
175
+ </Box>
176
+ </Popover>
177
+ )}
154
178
  </>
155
179
  );
156
180
  };
@@ -28,8 +28,14 @@ export const MRT_FilterRangeFields = <TData extends MRT_RowData>({
28
28
  ...(parseFromValuesOrFunc(rest?.sx, theme) as any),
29
29
  })}
30
30
  >
31
- <MRT_FilterTextField header={header} rangeFilterIndex={0} table={table} />
32
- <MRT_FilterTextField header={header} rangeFilterIndex={1} table={table} />
31
+ {[0, 1].map((rangeFilterIndex) => (
32
+ <MRT_FilterTextField
33
+ header={header}
34
+ key={rangeFilterIndex}
35
+ rangeFilterIndex={rangeFilterIndex}
36
+ table={table}
37
+ />
38
+ ))}
33
39
  </Box>
34
40
  );
35
41
  };