material-react-table 1.12.0 → 1.13.0

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 (77) hide show
  1. package/dist/cjs/index.js +264 -161
  2. package/dist/cjs/index.js.map +1 -1
  3. package/dist/cjs/types/MaterialReactTable.d.ts +1 -1
  4. package/dist/cjs/types/inputs/MRT_FilterRangeSlider.d.ts +7 -0
  5. package/dist/cjs/types/types.d.ts +12 -2
  6. package/dist/esm/material-react-table.esm.js +268 -167
  7. package/dist/esm/material-react-table.esm.js.map +1 -1
  8. package/dist/esm/types/MaterialReactTable.d.ts +1 -1
  9. package/dist/esm/types/inputs/MRT_FilterRangeSlider.d.ts +7 -0
  10. package/dist/esm/types/types.d.ts +12 -2
  11. package/dist/index.d.ts +14 -10
  12. package/locales/cs.esm.js +89 -91
  13. package/locales/cs.js +89 -91
  14. package/locales/da.esm.js +89 -90
  15. package/locales/da.js +89 -90
  16. package/locales/de.esm.js +89 -90
  17. package/locales/de.js +89 -90
  18. package/locales/en.esm.js +89 -90
  19. package/locales/en.js +89 -90
  20. package/locales/es.esm.js +89 -90
  21. package/locales/es.js +89 -90
  22. package/locales/fa.esm.js +89 -90
  23. package/locales/fa.js +89 -90
  24. package/locales/fi.esm.js +89 -91
  25. package/locales/fi.js +89 -91
  26. package/locales/fr.esm.js +89 -90
  27. package/locales/fr.js +89 -90
  28. package/locales/hu.esm.js +89 -90
  29. package/locales/hu.js +89 -90
  30. package/locales/id.esm.js +89 -91
  31. package/locales/id.js +89 -91
  32. package/locales/it.esm.js +89 -90
  33. package/locales/it.js +89 -90
  34. package/locales/ja.esm.js +89 -90
  35. package/locales/ja.js +89 -90
  36. package/locales/nl.esm.js +89 -90
  37. package/locales/nl.js +89 -90
  38. package/locales/pl.esm.js +89 -90
  39. package/locales/pl.js +89 -90
  40. package/locales/pt-BR.esm.js +89 -90
  41. package/locales/pt-BR.js +89 -90
  42. package/locales/pt.esm.js +89 -90
  43. package/locales/pt.js +89 -90
  44. package/locales/ro.esm.js +89 -90
  45. package/locales/ro.js +89 -90
  46. package/locales/ru.esm.js +89 -90
  47. package/locales/ru.js +89 -90
  48. package/locales/sk.esm.js +89 -91
  49. package/locales/sk.js +89 -91
  50. package/locales/sr-Cyrl-RS.esm.js +89 -90
  51. package/locales/sr-Cyrl-RS.js +89 -90
  52. package/locales/sr-Latn-RS.esm.js +89 -90
  53. package/locales/sr-Latn-RS.js +89 -90
  54. package/locales/sv.esm.js +89 -90
  55. package/locales/sv.js +89 -90
  56. package/locales/tr.esm.js +89 -90
  57. package/locales/tr.js +89 -90
  58. package/locales/uk.esm.js +89 -90
  59. package/locales/uk.js +89 -90
  60. package/locales/vi.esm.js +89 -90
  61. package/locales/vi.js +89 -90
  62. package/locales/zh-Hans.esm.js +89 -89
  63. package/locales/zh-Hans.js +89 -89
  64. package/locales/zh-Hant.esm.js +89 -89
  65. package/locales/zh-Hant.js +89 -89
  66. package/package.json +23 -23
  67. package/src/MaterialReactTable.tsx +2 -0
  68. package/src/body/MRT_TableBody.tsx +2 -3
  69. package/src/body/MRT_TableBodyRow.tsx +2 -3
  70. package/src/column.utils.ts +5 -1
  71. package/src/head/MRT_TableHeadCellFilterContainer.tsx +4 -1
  72. package/src/inputs/MRT_FilterRangeFields.tsx +1 -1
  73. package/src/inputs/MRT_FilterRangeSlider.tsx +134 -0
  74. package/src/inputs/MRT_FilterTextField.tsx +24 -3
  75. package/src/menus/MRT_FilterOptionMenu.tsx +8 -1
  76. package/src/table/MRT_TableRoot.tsx +28 -6
  77. package/src/types.ts +22 -2
@@ -3,95 +3,95 @@
3
3
  Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
5
  const MRT_Localization_ZH_HANT = {
6
- actions: '動作',
7
- and: '與',
8
- cancel: '取消',
9
- changeFilterMode: '更改過濾模式',
10
- changeSearchMode: '更改搜尋模式',
11
- clearFilter: '清除過濾',
12
- clearSearch: '清除搜尋',
13
- clearSort: '清除排序',
14
- clickToCopy: '點擊以複製',
15
- collapse: '折疊',
16
- collapseAll: '全部折疊',
17
- columnActions: '欄位動作',
18
- copiedToClipboard: '已複製至剪貼簿',
19
- dropToGroupBy: '拖放以按 {column} 分組',
20
- edit: '編輯',
21
- expand: '展開',
22
- expandAll: '全部展開',
23
- filterArrIncludes: '包括',
24
- filterArrIncludesAll: '包括所有',
25
- filterArrIncludesSome: '包括',
26
- filterBetween: '介於首尾',
27
- filterBetweenInclusive: '介於首尾之間',
28
- filterByColumn: '以 {column} 過濾',
29
- filterContains: '包含',
30
- filterEmpty: '是空字串',
31
- filterEndsWith: '結尾為',
32
- filterEquals: '等於',
33
- filterEqualsString: '等於',
34
- filterFuzzy: '模糊搜索',
35
- filterGreaterThan: '大於',
36
- filterGreaterThanOrEqualTo: '大於等於',
37
- filterInNumberRange: '介於',
38
- filterIncludesString: '包含',
39
- filterIncludesStringSensitive: '包含',
40
- filterLessThan: '小於',
41
- filterLessThanOrEqualTo: '小於等於',
42
- filterMode: '過濾模式:{filterType}',
43
- filterNotEmpty: '非空字串',
44
- filterNotEquals: '不等於',
45
- filterStartsWith: '開首為',
46
- filterWeakEquals: '等於',
47
- filteringByColumn: '正以 {column} 過濾:{filterType} {filterValue}',
48
- goToFirstPage: '到第一頁',
49
- goToLastPage: '到最後一頁',
50
- goToNextPage: '下一頁',
51
- goToPreviousPage: '上一頁',
52
- grab: '拖曳',
53
- groupByColumn: '按 {column} 分組',
54
- groupedBy: '分組依據 ',
55
- hideAll: '隱藏全部',
56
- hideColumn: '隱藏 {column} 欄位',
57
- max: '最大',
58
- min: '最小',
59
- move: '移動',
60
- noRecordsToDisplay: '無紀錄可顯示',
61
- noResultsFound: '未找到結果',
62
- of: '/',
63
- or: '或',
64
- pinToLeft: '固定至左邊',
65
- pinToRight: '固定至右邊',
66
- resetColumnSize: '重置欄位大小',
67
- resetOrder: '重置排序',
68
- rowActions: '橫列動作',
69
- rowNumber: '#',
70
- rowNumbers: '橫列編號',
71
- rowsPerPage: '每頁橫列數量',
72
- save: '儲存',
73
- search: '搜尋',
74
- selectedCountOfRowCountRowsSelected: '已選擇橫列:{selectedCount}/{rowCount}',
75
- select: '選擇',
76
- showAll: '顯示全部',
77
- showAllColumns: '顯示全部欄位',
78
- showHideColumns: '顯示/隱藏 欄位',
79
- showHideFilters: '顯示/隱藏 過濾條件',
80
- showHideSearch: '顯示/隱藏 搜尋條件',
81
- sortByColumnAsc: '按 {column} 順序排序',
82
- sortByColumnDesc: '按 {column} 倒序排序',
83
- sortedByColumnAsc: '已按 {column} 順序排序',
84
- sortedByColumnDesc: '已按 {column} 倒序排序',
85
- thenBy: ',然後以',
86
- toggleDensity: '切換密度',
87
- toggleFullScreen: '切換全螢幕',
88
- toggleSelectAll: '切換選擇全部',
89
- toggleSelectRow: '切換選擇橫列',
90
- toggleVisibility: '切換可見度',
91
- ungroupByColumn: '取消按 {column} 分組',
92
- unpin: '取消固定',
93
- unpinAll: '全部取消固定',
94
- unsorted: '取消排序',
6
+ actions: '動作',
7
+ and: '與',
8
+ cancel: '取消',
9
+ changeFilterMode: '更改過濾模式',
10
+ changeSearchMode: '更改搜尋模式',
11
+ clearFilter: '清除過濾',
12
+ clearSearch: '清除搜尋',
13
+ clearSort: '清除排序',
14
+ clickToCopy: '點擊以複製',
15
+ collapse: '折疊',
16
+ collapseAll: '全部折疊',
17
+ columnActions: '欄位動作',
18
+ copiedToClipboard: '已複製至剪貼簿',
19
+ dropToGroupBy: '拖放以按 {column} 分組',
20
+ edit: '編輯',
21
+ expand: '展開',
22
+ expandAll: '全部展開',
23
+ filterArrIncludes: '包括',
24
+ filterArrIncludesAll: '包括所有',
25
+ filterArrIncludesSome: '包括',
26
+ filterBetween: '介於首尾',
27
+ filterBetweenInclusive: '介於首尾之間',
28
+ filterByColumn: '以 {column} 過濾',
29
+ filterContains: '包含',
30
+ filterEmpty: '是空字串',
31
+ filterEndsWith: '結尾為',
32
+ filterEquals: '等於',
33
+ filterEqualsString: '等於',
34
+ filterFuzzy: '模糊搜索',
35
+ filterGreaterThan: '大於',
36
+ filterGreaterThanOrEqualTo: '大於等於',
37
+ filterInNumberRange: '介於',
38
+ filterIncludesString: '包含',
39
+ filterIncludesStringSensitive: '包含',
40
+ filterLessThan: '小於',
41
+ filterLessThanOrEqualTo: '小於等於',
42
+ filterMode: '過濾模式:{filterType}',
43
+ filterNotEmpty: '非空字串',
44
+ filterNotEquals: '不等於',
45
+ filterStartsWith: '開首為',
46
+ filterWeakEquals: '等於',
47
+ filteringByColumn: '正以 {column} 過濾:{filterType} {filterValue}',
48
+ goToFirstPage: '到第一頁',
49
+ goToLastPage: '到最後一頁',
50
+ goToNextPage: '下一頁',
51
+ goToPreviousPage: '上一頁',
52
+ grab: '拖曳',
53
+ groupByColumn: '按 {column} 分組',
54
+ groupedBy: '分組依據 ',
55
+ hideAll: '隱藏全部',
56
+ hideColumn: '隱藏 {column} 欄位',
57
+ max: '最大',
58
+ min: '最小',
59
+ move: '移動',
60
+ noRecordsToDisplay: '無紀錄可顯示',
61
+ noResultsFound: '未找到結果',
62
+ of: '/',
63
+ or: '或',
64
+ pinToLeft: '固定至左邊',
65
+ pinToRight: '固定至右邊',
66
+ resetColumnSize: '重置欄位大小',
67
+ resetOrder: '重置排序',
68
+ rowActions: '橫列動作',
69
+ rowNumber: '#',
70
+ rowNumbers: '橫列編號',
71
+ rowsPerPage: '每頁橫列數量',
72
+ save: '儲存',
73
+ search: '搜尋',
74
+ selectedCountOfRowCountRowsSelected: '已選擇橫列:{selectedCount}/{rowCount}',
75
+ select: '選擇',
76
+ showAll: '顯示全部',
77
+ showAllColumns: '顯示全部欄位',
78
+ showHideColumns: '顯示/隱藏 欄位',
79
+ showHideFilters: '顯示/隱藏 過濾條件',
80
+ showHideSearch: '顯示/隱藏 搜尋條件',
81
+ sortByColumnAsc: '按 {column} 順序排序',
82
+ sortByColumnDesc: '按 {column} 倒序排序',
83
+ sortedByColumnAsc: '已按 {column} 順序排序',
84
+ sortedByColumnDesc: '已按 {column} 倒序排序',
85
+ thenBy: ',然後以',
86
+ toggleDensity: '切換密度',
87
+ toggleFullScreen: '切換全螢幕',
88
+ toggleSelectAll: '切換選擇全部',
89
+ toggleSelectRow: '切換選擇橫列',
90
+ toggleVisibility: '切換可見度',
91
+ ungroupByColumn: '取消按 {column} 分組',
92
+ unpin: '取消固定',
93
+ unpinAll: '全部取消固定',
94
+ unsorted: '取消排序',
95
95
  };
96
96
 
97
97
  exports.MRT_Localization_ZH_HANT = MRT_Localization_ZH_HANT;
package/package.json CHANGED
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "1.12.0",
2
+ "version": "1.13.0",
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.",
@@ -60,33 +60,33 @@
60
60
  "storybook:dev": "storybook dev -p 6006"
61
61
  },
62
62
  "devDependencies": {
63
- "@babel/core": "^7.22.1",
64
- "@babel/preset-react": "^7.22.3",
65
- "@emotion/react": "^11.11.0",
63
+ "@babel/core": "^7.22.5",
64
+ "@babel/preset-react": "^7.22.5",
65
+ "@emotion/react": "^11.11.1",
66
66
  "@emotion/styled": "^11.11.0",
67
67
  "@faker-js/faker": "^8.0.2",
68
68
  "@mui/icons-material": "^5.11.16",
69
- "@mui/material": "^5.13.2",
69
+ "@mui/material": "^5.13.4",
70
70
  "@rollup/plugin-babel": "^6.0.3",
71
- "@rollup/plugin-node-resolve": "^15.0.2",
71
+ "@rollup/plugin-node-resolve": "^15.1.0",
72
72
  "@rollup/plugin-typescript": "^11.1.1",
73
73
  "@size-limit/preset-small-lib": "^8.2.4",
74
- "@storybook/addon-a11y": "^7.0.18",
75
- "@storybook/addon-essentials": "^7.0.18",
76
- "@storybook/addon-interactions": "^7.0.18",
77
- "@storybook/addon-links": "^7.0.18",
78
- "@storybook/addon-storysource": "^7.0.18",
79
- "@storybook/blocks": "^7.0.18",
80
- "@storybook/react": "^7.0.18",
81
- "@storybook/react-vite": "^7.0.18",
74
+ "@storybook/addon-a11y": "^7.0.20",
75
+ "@storybook/addon-essentials": "^7.0.20",
76
+ "@storybook/addon-interactions": "^7.0.20",
77
+ "@storybook/addon-links": "^7.0.20",
78
+ "@storybook/addon-storysource": "^7.0.20",
79
+ "@storybook/blocks": "^7.0.20",
80
+ "@storybook/react": "^7.0.20",
81
+ "@storybook/react-vite": "^7.0.20",
82
82
  "@storybook/testing-library": "^0.1.0",
83
- "@types/node": "^20.2.5",
84
- "@types/react": "^18.2.7",
83
+ "@types/node": "^20.3.0",
84
+ "@types/react": "^18.2.11",
85
85
  "@types/react-dom": "^18.2.4",
86
- "@typescript-eslint/eslint-plugin": "^5.59.7",
87
- "@typescript-eslint/parser": "^5.59.7",
86
+ "@typescript-eslint/eslint-plugin": "^5.59.9",
87
+ "@typescript-eslint/parser": "^5.59.9",
88
88
  "@vitejs/plugin-react": "^4.0.0",
89
- "eslint": "^8.41.0",
89
+ "eslint": "^8.42.0",
90
90
  "eslint-plugin-mui-path-imports": "^0.0.15",
91
91
  "prop-types": "^15.8.1",
92
92
  "react": "^18.2.0",
@@ -97,10 +97,10 @@
97
97
  "rollup-plugin-dts": "^5.3.0",
98
98
  "rollup-plugin-peer-deps-external": "^2.2.4",
99
99
  "size-limit": "^8.2.4",
100
- "storybook": "^7.0.18",
100
+ "storybook": "^7.0.20",
101
101
  "storybook-dark-mode": "^3.0.0",
102
- "tslib": "^2.5.2",
103
- "typescript": "^5.0.4",
102
+ "tslib": "^2.5.3",
103
+ "typescript": "^5.1.3",
104
104
  "vite": "^4.3.9"
105
105
  },
106
106
  "peerDependencies": {
@@ -113,7 +113,7 @@
113
113
  },
114
114
  "dependencies": {
115
115
  "@tanstack/match-sorter-utils": "8.8.4",
116
- "@tanstack/react-table": "8.9.1",
116
+ "@tanstack/react-table": "8.9.2",
117
117
  "@tanstack/react-virtual": "3.0.0-beta.54",
118
118
  "highlight-words": "1.2.2"
119
119
  }
@@ -24,6 +24,7 @@ export const MaterialReactTable = <TData extends Record<string, any> = {}>({
24
24
  enableColumnResizing = false,
25
25
  enableDensityToggle = true,
26
26
  enableExpandAll = true,
27
+ enableExpanding,
27
28
  enableFilterMatchHighlighting = true,
28
29
  enableFilters = true,
29
30
  enableFullScreenToggle = true,
@@ -122,6 +123,7 @@ export const MaterialReactTable = <TData extends Record<string, any> = {}>({
122
123
  enableColumnResizing={enableColumnResizing}
123
124
  enableDensityToggle={enableDensityToggle}
124
125
  enableExpandAll={enableExpandAll}
126
+ enableExpanding={enableExpanding}
125
127
  enableFilterMatchHighlighting={enableFilterMatchHighlighting}
126
128
  enableFilters={enableFilters}
127
129
  enableFullScreenToggle={enableFullScreenToggle}
@@ -200,7 +200,6 @@ export const MRT_TableBody = ({
200
200
  : (rowOrVirtualRow as MRT_Row);
201
201
  const props = {
202
202
  columnVirtualizer,
203
- key: row.id,
204
203
  measureElement: rowVirtualizer?.measureElement,
205
204
  numRows: rows.length,
206
205
  row,
@@ -214,9 +213,9 @@ export const MRT_TableBody = ({
214
213
  : undefined,
215
214
  };
216
215
  return memoMode === 'rows' ? (
217
- <Memo_MRT_TableBodyRow {...props} />
216
+ <Memo_MRT_TableBodyRow key={row.id} {...props} />
218
217
  ) : (
219
- <MRT_TableBodyRow {...props} />
218
+ <MRT_TableBodyRow key={row.id} {...props} />
220
219
  );
221
220
  })}
222
221
  </>
@@ -111,7 +111,6 @@ export const MRT_TableBodyRow = ({
111
111
  : (cellOrVirtualCell as MRT_Cell);
112
112
  const props = {
113
113
  cell,
114
- key: cell.id,
115
114
  measureElement: columnVirtualizer?.measureElement,
116
115
  numRows,
117
116
  rowIndex,
@@ -127,9 +126,9 @@ export const MRT_TableBodyRow = ({
127
126
  !draggingRow &&
128
127
  editingCell?.id !== cell.id &&
129
128
  editingRow?.id !== row.id ? (
130
- <Memo_MRT_TableBodyCell {...props} />
129
+ <Memo_MRT_TableBodyCell key={cell.id} {...props} />
131
130
  ) : (
132
- <MRT_TableBodyCell {...props} />
131
+ <MRT_TableBodyCell key={cell.id} {...props} />
133
132
  );
134
133
  })}
135
134
  {virtualPaddingRight ? (
@@ -200,7 +200,11 @@ export const getDefaultColumnFilterFn = <
200
200
  columnDef: MRT_ColumnDef<TData>,
201
201
  ): MRT_FilterOption => {
202
202
  if (columnDef.filterVariant === 'multi-select') return 'arrIncludesSome';
203
- if (columnDef.filterVariant === 'range') return 'betweenInclusive';
203
+ if (
204
+ columnDef.filterVariant === 'range' ||
205
+ columnDef.filterVariant === 'range-slider'
206
+ )
207
+ return 'betweenInclusive';
204
208
  if (
205
209
  columnDef.filterVariant === 'select' ||
206
210
  columnDef.filterVariant === 'checkbox'
@@ -1,8 +1,9 @@
1
1
  import Collapse from '@mui/material/Collapse';
2
2
  import { MRT_FilterRangeFields } from '../inputs/MRT_FilterRangeFields';
3
3
  import { MRT_FilterTextField } from '../inputs/MRT_FilterTextField';
4
- import { type MRT_Header, type MRT_TableInstance } from '../types';
5
4
  import { MRT_FilterCheckbox } from '../inputs/MRT_FilterCheckbox';
5
+ import { MRT_FilterRangeSlider } from '../inputs/MRT_FilterRangeSlider';
6
+ import { type MRT_Header, type MRT_TableInstance } from '../types';
6
7
 
7
8
  interface Props {
8
9
  header: MRT_Header;
@@ -19,6 +20,8 @@ export const MRT_TableHeadCellFilterContainer = ({ header, table }: Props) => {
19
20
  <Collapse in={showColumnFilters} mountOnEnter unmountOnExit>
20
21
  {columnDef.filterVariant === 'checkbox' ? (
21
22
  <MRT_FilterCheckbox column={column} table={table} />
23
+ ) : columnDef.filterVariant === 'range-slider' ? (
24
+ <MRT_FilterRangeSlider header={header} table={table} />
22
25
  ) : columnDef.filterVariant === 'range' ||
23
26
  ['between', 'betweenInclusive', 'inNumberRange'].includes(
24
27
  columnDef._filterFn,
@@ -9,7 +9,7 @@ interface Props {
9
9
 
10
10
  export const MRT_FilterRangeFields = ({ header, table }: Props) => {
11
11
  return (
12
- <Box sx={{ display: 'grid', gridTemplateColumns: '6fr 6fr', gap: '1rem' }}>
12
+ <Box sx={{ display: 'grid', gridTemplateColumns: '1fr 1fr', gap: '1rem' }}>
13
13
  <MRT_FilterTextField header={header} rangeFilterIndex={0} table={table} />
14
14
  <MRT_FilterTextField header={header} rangeFilterIndex={1} table={table} />
15
15
  </Box>
@@ -0,0 +1,134 @@
1
+ import { FormHelperText, Slider, SliderProps, Stack } from '@mui/material';
2
+ import { type MRT_TableInstance, type MRT_Header } from '../types';
3
+ import { useEffect, useRef, useState } from 'react';
4
+
5
+ interface Props {
6
+ header: MRT_Header;
7
+ table: MRT_TableInstance;
8
+ }
9
+
10
+ export const MRT_FilterRangeSlider = ({ header, table }: Props) => {
11
+ const {
12
+ options: {
13
+ localization,
14
+ muiTableHeadCellFilterSliderProps,
15
+ enableColumnFilterModes,
16
+ },
17
+ refs: { filterInputRefs },
18
+ } = table;
19
+ const { column } = header;
20
+ const { columnDef } = column;
21
+
22
+ const currentFilterOption = columnDef._filterFn;
23
+
24
+ const showChangeModeButton =
25
+ enableColumnFilterModes && columnDef.enableColumnFilterModes !== false;
26
+
27
+ const mTableHeadCellFilterTextFieldProps =
28
+ muiTableHeadCellFilterSliderProps instanceof Function
29
+ ? muiTableHeadCellFilterSliderProps({
30
+ column,
31
+ table,
32
+ })
33
+ : muiTableHeadCellFilterSliderProps;
34
+
35
+ const mcTableHeadCellFilterTextFieldProps =
36
+ columnDef.muiTableHeadCellFilterSliderProps instanceof Function
37
+ ? columnDef.muiTableHeadCellFilterSliderProps({
38
+ column,
39
+ table,
40
+ })
41
+ : columnDef.muiTableHeadCellFilterSliderProps;
42
+
43
+ const sliderProps = {
44
+ ...mTableHeadCellFilterTextFieldProps,
45
+ ...mcTableHeadCellFilterTextFieldProps,
46
+ } as SliderProps;
47
+
48
+ const [min, max] =
49
+ sliderProps.min !== undefined && sliderProps.max !== undefined
50
+ ? [sliderProps.min, sliderProps.max]
51
+ : column.getFacetedMinMaxValues() ?? [0, 0];
52
+ const [filterValues, setFilterValues] = useState([min, max]);
53
+ const columnFilterValue = column.getFilterValue();
54
+
55
+ const isMounted = useRef(false);
56
+
57
+ useEffect(() => {
58
+ if (isMounted.current) {
59
+ if (columnFilterValue === undefined) {
60
+ setFilterValues([min, max]);
61
+ } else if (Array.isArray(columnFilterValue)) {
62
+ if (columnFilterValue[0] <= min && columnFilterValue[1] >= max) {
63
+ column.setFilterValue(undefined);
64
+ } else {
65
+ setFilterValues(columnFilterValue);
66
+ }
67
+ }
68
+ }
69
+ isMounted.current = true;
70
+ }, [column.getFilterValue()]);
71
+
72
+ return (
73
+ <Stack>
74
+ <Slider
75
+ disableSwap
76
+ min={min}
77
+ max={max}
78
+ onChange={(_event, value) => {
79
+ setFilterValues(value as [number, number]);
80
+ }}
81
+ onChangeCommitted={(_event, value) => {
82
+ column.setFilterValue(value as [number, number]);
83
+ }}
84
+ value={filterValues}
85
+ valueLabelDisplay="auto"
86
+ {...sliderProps}
87
+ slotProps={{
88
+ input: {
89
+ ref: (node) => {
90
+ if (node) {
91
+ filterInputRefs.current[`${column.id}-0`] = node;
92
+ // @ts-ignore
93
+ if (sliderProps?.slotProps?.input?.ref) {
94
+ //@ts-ignore
95
+ sliderProps.slotProps.input.ref = node;
96
+ }
97
+ }
98
+ },
99
+ },
100
+ }}
101
+ sx={(theme) => ({
102
+ m: 'auto',
103
+ mt: !showChangeModeButton ? '10px' : '6px',
104
+ px: '4px',
105
+ width: 'calc(100% - 8px)',
106
+ ...(sliderProps?.sx instanceof Function
107
+ ? sliderProps.sx(theme)
108
+ : (sliderProps?.sx as any)),
109
+ })}
110
+ />
111
+ {showChangeModeButton ? (
112
+ <FormHelperText
113
+ sx={{
114
+ m: '-3px -6px',
115
+ fontSize: '0.75rem',
116
+ lineHeight: '0.8rem',
117
+ whiteSpace: 'nowrap',
118
+ }}
119
+ >
120
+ {localization.filterMode.replace(
121
+ '{filterType}',
122
+ // @ts-ignore
123
+ localization[
124
+ `filter${
125
+ currentFilterOption?.charAt(0)?.toUpperCase() +
126
+ currentFilterOption?.slice(1)
127
+ }`
128
+ ],
129
+ )}
130
+ </FormHelperText>
131
+ ) : null}
132
+ </Stack>
133
+ );
134
+ };
@@ -5,6 +5,7 @@ import {
5
5
  useEffect,
6
6
  useRef,
7
7
  useState,
8
+ useMemo,
8
9
  } from 'react';
9
10
  import Box from '@mui/material/Box';
10
11
  import Checkbox from '@mui/material/Checkbox';
@@ -102,6 +103,24 @@ export const MRT_FilterTextField = ({
102
103
  (allowedColumnFilterOptions === undefined ||
103
104
  !!allowedColumnFilterOptions?.length);
104
105
 
106
+ const facetedUniqueValues = column.getFacetedUniqueValues();
107
+
108
+ const filterSelectOptions = useMemo(
109
+ () =>
110
+ columnDef.filterSelectOptions ??
111
+ ((isSelectFilter || isMultiSelectFilter) && facetedUniqueValues
112
+ ? Array.from(facetedUniqueValues.keys()).sort((a, b) =>
113
+ a.localeCompare(b),
114
+ )
115
+ : undefined),
116
+ [
117
+ columnDef.filterSelectOptions,
118
+ facetedUniqueValues,
119
+ isMultiSelectFilter,
120
+ isSelectFilter,
121
+ ],
122
+ );
123
+
105
124
  const [anchorEl, setAnchorEl] = useState<null | HTMLElement>(null);
106
125
  const [filterValue, setFilterValue] = useState<string | string[]>(() =>
107
126
  isMultiSelectFilter
@@ -298,7 +317,7 @@ export const MRT_FilterTextField = ({
298
317
  ) : (
299
318
  <Box sx={{ display: 'flex', flexWrap: 'wrap', gap: '2px' }}>
300
319
  {(selected as string[])?.map((value) => {
301
- const selectedValue = columnDef.filterSelectOptions?.find(
320
+ const selectedValue = filterSelectOptions?.find(
302
321
  (option) =>
303
322
  option instanceof Object
304
323
  ? option.value === value
@@ -350,7 +369,7 @@ export const MRT_FilterTextField = ({
350
369
  </MenuItem>
351
370
  )}
352
371
  {textFieldProps.children ??
353
- columnDef?.filterSelectOptions?.map(
372
+ filterSelectOptions?.map(
354
373
  (option: string | { text: string; value: string }) => {
355
374
  let value: string;
356
375
  let text: string;
@@ -380,7 +399,9 @@ export const MRT_FilterTextField = ({
380
399
  sx={{ mr: '0.5rem' }}
381
400
  />
382
401
  )}
383
- {text}
402
+ {text}{' '}
403
+ {!columnDef.filterSelectOptions &&
404
+ `(${facetedUniqueValues.get(value)})`}
384
405
  </MenuItem>
385
406
  );
386
407
  },
@@ -137,9 +137,16 @@ export const MRT_FilterOptionMenu = <TData extends Record<string, any> = {}>({
137
137
  const { columnDef } = column ?? {};
138
138
  const currentFilterValue = column?.getFilterValue();
139
139
 
140
- const allowedColumnFilterOptions =
140
+ let allowedColumnFilterOptions =
141
141
  columnDef?.columnFilterModeOptions ?? columnFilterModeOptions;
142
142
 
143
+ if (columnDef?.filterVariant === 'range-slider') {
144
+ allowedColumnFilterOptions = [
145
+ ...rangeModes,
146
+ ...(allowedColumnFilterOptions ?? []),
147
+ ].filter((option) => rangeModes.includes(option));
148
+ }
149
+
143
150
  const internalFilterOptions = useMemo(
144
151
  () =>
145
152
  mrtFilterOptions(localization).filter((filterOption) =>
@@ -2,7 +2,9 @@ import { useEffect, useMemo, useRef, useState } from 'react';
2
2
  import {
3
3
  getCoreRowModel,
4
4
  getExpandedRowModel,
5
+ getFacetedMinMaxValues,
5
6
  getFacetedRowModel,
7
+ getFacetedUniqueValues,
6
8
  getFilteredRowModel,
7
9
  getGroupedRowModel,
8
10
  getPaginationRowModel,
@@ -271,12 +273,32 @@ export const MRT_TableRoot: any = <TData extends Record<string, any> = {}>(
271
273
  const table = {
272
274
  ...useReactTable({
273
275
  getCoreRowModel: getCoreRowModel(),
274
- getExpandedRowModel: getExpandedRowModel(),
275
- getFacetedRowModel: getFacetedRowModel(),
276
- getFilteredRowModel: getFilteredRowModel(),
277
- getGroupedRowModel: getGroupedRowModel(),
278
- getPaginationRowModel: getPaginationRowModel(),
279
- getSortedRowModel: getSortedRowModel(),
276
+ getExpandedRowModel:
277
+ props.enableExpanding || props.enableGrouping
278
+ ? getExpandedRowModel()
279
+ : undefined,
280
+ getFacetedMinMaxValues: props.enableFacetedValues
281
+ ? getFacetedMinMaxValues()
282
+ : undefined,
283
+ getFacetedRowModel: props.enableFacetedValues
284
+ ? getFacetedRowModel()
285
+ : undefined,
286
+ getFacetedUniqueValues: props.enableFacetedValues
287
+ ? getFacetedUniqueValues()
288
+ : undefined,
289
+ getFilteredRowModel:
290
+ props.enableColumnFilters ||
291
+ props.enableGlobalFilter ||
292
+ props.enableFilters
293
+ ? getFilteredRowModel()
294
+ : undefined,
295
+ getGroupedRowModel: props.enableGrouping
296
+ ? getGroupedRowModel()
297
+ : undefined,
298
+ getPaginationRowModel: props.enablePagination
299
+ ? getPaginationRowModel()
300
+ : undefined,
301
+ getSortedRowModel: props.enableSorting ? getSortedRowModel() : undefined,
280
302
  onColumnOrderChange: setColumnOrder,
281
303
  onGroupingChange: setGrouping,
282
304
  getSubRows: (row) => row?.subRows,