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.
- package/dist/cjs/index.js +264 -161
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/types/MaterialReactTable.d.ts +1 -1
- package/dist/cjs/types/inputs/MRT_FilterRangeSlider.d.ts +7 -0
- package/dist/cjs/types/types.d.ts +12 -2
- package/dist/esm/material-react-table.esm.js +268 -167
- package/dist/esm/material-react-table.esm.js.map +1 -1
- package/dist/esm/types/MaterialReactTable.d.ts +1 -1
- package/dist/esm/types/inputs/MRT_FilterRangeSlider.d.ts +7 -0
- package/dist/esm/types/types.d.ts +12 -2
- package/dist/index.d.ts +14 -10
- package/locales/cs.esm.js +89 -91
- package/locales/cs.js +89 -91
- package/locales/da.esm.js +89 -90
- package/locales/da.js +89 -90
- package/locales/de.esm.js +89 -90
- package/locales/de.js +89 -90
- package/locales/en.esm.js +89 -90
- package/locales/en.js +89 -90
- package/locales/es.esm.js +89 -90
- package/locales/es.js +89 -90
- package/locales/fa.esm.js +89 -90
- package/locales/fa.js +89 -90
- package/locales/fi.esm.js +89 -91
- package/locales/fi.js +89 -91
- package/locales/fr.esm.js +89 -90
- package/locales/fr.js +89 -90
- package/locales/hu.esm.js +89 -90
- package/locales/hu.js +89 -90
- package/locales/id.esm.js +89 -91
- package/locales/id.js +89 -91
- package/locales/it.esm.js +89 -90
- package/locales/it.js +89 -90
- package/locales/ja.esm.js +89 -90
- package/locales/ja.js +89 -90
- package/locales/nl.esm.js +89 -90
- package/locales/nl.js +89 -90
- package/locales/pl.esm.js +89 -90
- package/locales/pl.js +89 -90
- package/locales/pt-BR.esm.js +89 -90
- package/locales/pt-BR.js +89 -90
- package/locales/pt.esm.js +89 -90
- package/locales/pt.js +89 -90
- package/locales/ro.esm.js +89 -90
- package/locales/ro.js +89 -90
- package/locales/ru.esm.js +89 -90
- package/locales/ru.js +89 -90
- package/locales/sk.esm.js +89 -91
- package/locales/sk.js +89 -91
- package/locales/sr-Cyrl-RS.esm.js +89 -90
- package/locales/sr-Cyrl-RS.js +89 -90
- package/locales/sr-Latn-RS.esm.js +89 -90
- package/locales/sr-Latn-RS.js +89 -90
- package/locales/sv.esm.js +89 -90
- package/locales/sv.js +89 -90
- package/locales/tr.esm.js +89 -90
- package/locales/tr.js +89 -90
- package/locales/uk.esm.js +89 -90
- package/locales/uk.js +89 -90
- package/locales/vi.esm.js +89 -90
- package/locales/vi.js +89 -90
- package/locales/zh-Hans.esm.js +89 -89
- package/locales/zh-Hans.js +89 -89
- package/locales/zh-Hant.esm.js +89 -89
- package/locales/zh-Hant.js +89 -89
- package/package.json +23 -23
- package/src/MaterialReactTable.tsx +2 -0
- package/src/body/MRT_TableBody.tsx +2 -3
- package/src/body/MRT_TableBodyRow.tsx +2 -3
- package/src/column.utils.ts +5 -1
- package/src/head/MRT_TableHeadCellFilterContainer.tsx +4 -1
- package/src/inputs/MRT_FilterRangeFields.tsx +1 -1
- package/src/inputs/MRT_FilterRangeSlider.tsx +134 -0
- package/src/inputs/MRT_FilterTextField.tsx +24 -3
- package/src/menus/MRT_FilterOptionMenu.tsx +8 -1
- package/src/table/MRT_TableRoot.tsx +28 -6
- package/src/types.ts +22 -2
package/locales/zh-Hant.js
CHANGED
@@ -3,95 +3,95 @@
|
|
3
3
|
Object.defineProperty(exports, '__esModule', { value: true });
|
4
4
|
|
5
5
|
const MRT_Localization_ZH_HANT = {
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
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.
|
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.
|
64
|
-
"@babel/preset-react": "^7.22.
|
65
|
-
"@emotion/react": "^11.11.
|
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.
|
69
|
+
"@mui/material": "^5.13.4",
|
70
70
|
"@rollup/plugin-babel": "^6.0.3",
|
71
|
-
"@rollup/plugin-node-resolve": "^15.0
|
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.
|
75
|
-
"@storybook/addon-essentials": "^7.0.
|
76
|
-
"@storybook/addon-interactions": "^7.0.
|
77
|
-
"@storybook/addon-links": "^7.0.
|
78
|
-
"@storybook/addon-storysource": "^7.0.
|
79
|
-
"@storybook/blocks": "^7.0.
|
80
|
-
"@storybook/react": "^7.0.
|
81
|
-
"@storybook/react-vite": "^7.0.
|
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.
|
84
|
-
"@types/react": "^18.2.
|
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.
|
87
|
-
"@typescript-eslint/parser": "^5.59.
|
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.
|
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.
|
100
|
+
"storybook": "^7.0.20",
|
101
101
|
"storybook-dark-mode": "^3.0.0",
|
102
|
-
"tslib": "^2.5.
|
103
|
-
"typescript": "^5.
|
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.
|
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 ? (
|
package/src/column.utils.ts
CHANGED
@@ -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 (
|
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: '
|
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 =
|
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
|
-
|
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
|
-
|
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:
|
275
|
-
|
276
|
-
|
277
|
-
|
278
|
-
|
279
|
-
|
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,
|