material-react-table 0.7.6 → 0.8.0-alpha.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/MaterialReactTable.d.ts +13 -15
- package/dist/body/MRT_TableBody.d.ts +0 -1
- package/dist/body/MRT_TableBodyCell.d.ts +1 -0
- package/dist/body/MRT_TableBodyRow.d.ts +0 -1
- package/dist/buttons/MRT_CopyButton.d.ts +2 -1
- package/dist/enums.d.ts +2 -2
- package/dist/filtersFNs.d.ts +31 -30
- package/dist/footer/MRT_TableFooter.d.ts +0 -1
- package/dist/head/MRT_TableHead.d.ts +0 -1
- package/dist/inputs/MRT_FilterRangeFields.d.ts +8 -0
- package/dist/inputs/MRT_FilterTextField.d.ts +1 -0
- package/dist/localization.d.ts +6 -2
- package/dist/material-react-table.cjs.development.js +372 -402
- package/dist/material-react-table.cjs.development.js.map +1 -1
- package/dist/material-react-table.cjs.production.min.js +1 -1
- package/dist/material-react-table.cjs.production.min.js.map +1 -1
- package/dist/material-react-table.esm.js +375 -405
- package/dist/material-react-table.esm.js.map +1 -1
- package/dist/table/MRT_Table.d.ts +0 -1
- package/dist/toolbar/MRT_ToolbarTop.d.ts +1 -0
- package/dist/utils.d.ts +1 -1
- package/package.json +24 -24
- package/src/MaterialReactTable.tsx +17 -24
- package/src/body/MRT_TableBody.tsx +3 -11
- package/src/body/MRT_TableBodyCell.tsx +102 -51
- package/src/body/MRT_TableBodyRow.tsx +21 -30
- package/src/buttons/MRT_ColumnPinningButtons.tsx +28 -40
- package/src/buttons/MRT_CopyButton.tsx +3 -2
- package/src/buttons/MRT_EditActionButtons.tsx +1 -2
- package/src/buttons/MRT_ExpandAllButton.tsx +1 -2
- package/src/enums.ts +2 -2
- package/src/filtersFNs.ts +71 -81
- package/src/footer/MRT_TableFooter.tsx +6 -16
- package/src/footer/MRT_TableFooterCell.tsx +5 -7
- package/src/footer/MRT_TableFooterRow.tsx +5 -8
- package/src/head/MRT_TableHead.tsx +5 -16
- package/src/head/MRT_TableHeadCell.tsx +98 -39
- package/src/head/MRT_TableHeadRow.tsx +8 -15
- package/src/inputs/MRT_EditCellTextField.tsx +2 -2
- package/src/inputs/MRT_FilterRangeFields.tsx +41 -0
- package/src/inputs/MRT_FilterTextField.tsx +73 -41
- package/src/inputs/MRT_SelectCheckbox.tsx +16 -17
- package/src/localization.ts +13 -5
- package/src/menus/MRT_ColumnActionMenu.tsx +7 -6
- package/src/menus/MRT_FilterOptionMenu.tsx +36 -33
- package/src/menus/MRT_ShowHideColumnsMenu.tsx +1 -1
- package/src/menus/MRT_ShowHideColumnsMenuItems.tsx +3 -5
- package/src/table/MRT_Table.tsx +5 -16
- package/src/table/MRT_TableContainer.tsx +7 -78
- package/src/table/MRT_TableRoot.tsx +51 -51
- package/src/toolbar/MRT_LinearProgressBar.tsx +5 -2
- package/src/toolbar/MRT_ToolbarAlertBanner.tsx +3 -2
- package/src/toolbar/MRT_ToolbarTop.tsx +4 -6
|
@@ -1,19 +1,21 @@
|
|
|
1
1
|
import React, { FC, MouseEvent } from 'react';
|
|
2
2
|
import {
|
|
3
|
+
Box,
|
|
4
|
+
Collapse,
|
|
5
|
+
Divider,
|
|
6
|
+
IconButton,
|
|
3
7
|
TableCell,
|
|
4
8
|
TableSortLabel,
|
|
5
|
-
|
|
6
|
-
Collapse,
|
|
9
|
+
Theme,
|
|
7
10
|
Tooltip,
|
|
8
|
-
Box,
|
|
9
|
-
IconButton,
|
|
10
11
|
alpha,
|
|
11
|
-
|
|
12
|
+
lighten,
|
|
12
13
|
} from '@mui/material';
|
|
13
14
|
import { MRT_FilterTextField } from '../inputs/MRT_FilterTextField';
|
|
14
15
|
import { MRT_ToggleColumnActionMenuButton } from '../buttons/MRT_ToggleColumnActionMenuButton';
|
|
15
16
|
import type { MRT_Header, MRT_TableInstance } from '..';
|
|
16
|
-
import
|
|
17
|
+
import MRT_FilterRangeFields from '../inputs/MRT_FilterRangeFields';
|
|
18
|
+
import { MRT_FILTER_OPTION } from '../enums';
|
|
17
19
|
|
|
18
20
|
interface Props {
|
|
19
21
|
header: MRT_Header;
|
|
@@ -34,7 +36,7 @@ export const MRT_TableHeadCell: FC<Props> = ({ header, tableInstance }) => {
|
|
|
34
36
|
setShowFilters,
|
|
35
37
|
} = tableInstance;
|
|
36
38
|
|
|
37
|
-
const { isDensePadding, showFilters } = getState();
|
|
39
|
+
const { currentFilterFns, isDensePadding, showFilters } = getState();
|
|
38
40
|
|
|
39
41
|
const { column } = header;
|
|
40
42
|
|
|
@@ -49,7 +51,6 @@ export const MRT_TableHeadCell: FC<Props> = ({ header, tableInstance }) => {
|
|
|
49
51
|
: column.muiTableHeadCellProps;
|
|
50
52
|
|
|
51
53
|
const tableCellProps = {
|
|
52
|
-
...header.getHeaderProps(),
|
|
53
54
|
...mTableHeadCellProps,
|
|
54
55
|
...mcTableHeadCellProps,
|
|
55
56
|
};
|
|
@@ -62,7 +63,7 @@ export const MRT_TableHeadCell: FC<Props> = ({ header, tableInstance }) => {
|
|
|
62
63
|
|
|
63
64
|
const filterFn = getState()?.currentFilterFns?.[header.id];
|
|
64
65
|
|
|
65
|
-
const filterTooltip = !!column.
|
|
66
|
+
const filterTooltip = !!column.getFilterValue()
|
|
66
67
|
? localization.filteringByColumn
|
|
67
68
|
.replace('{column}', String(column.header))
|
|
68
69
|
.replace(
|
|
@@ -74,7 +75,16 @@ export const MRT_TableHeadCell: FC<Props> = ({ header, tableInstance }) => {
|
|
|
74
75
|
`filter${filterFn.charAt(0).toUpperCase() + filterFn.slice(1)}`
|
|
75
76
|
],
|
|
76
77
|
)
|
|
77
|
-
.replace(
|
|
78
|
+
.replace(
|
|
79
|
+
'{filterValue}',
|
|
80
|
+
`"${
|
|
81
|
+
Array.isArray(column.getFilterValue())
|
|
82
|
+
? (column.getFilterValue() as [string, string]).join(
|
|
83
|
+
`" ${localization.and} "`,
|
|
84
|
+
)
|
|
85
|
+
: (column.getFilterValue() as string)
|
|
86
|
+
}"`,
|
|
87
|
+
)
|
|
78
88
|
.replace('" "', '')
|
|
79
89
|
: localization.showHideFilters;
|
|
80
90
|
|
|
@@ -84,21 +94,51 @@ export const MRT_TableHeadCell: FC<Props> = ({ header, tableInstance }) => {
|
|
|
84
94
|
tableInstance,
|
|
85
95
|
}) ?? column.header;
|
|
86
96
|
|
|
97
|
+
const getIsLastLeftPinnedColumn = () => {
|
|
98
|
+
return (
|
|
99
|
+
column.getIsPinned() === 'left' &&
|
|
100
|
+
tableInstance.getLeftLeafHeaders().length - 1 === column.getPinnedIndex()
|
|
101
|
+
);
|
|
102
|
+
};
|
|
103
|
+
|
|
104
|
+
const getIsFirstRightPinnedColumn = () => {
|
|
105
|
+
return column.getIsPinned() === 'right' && column.getPinnedIndex() === 0;
|
|
106
|
+
};
|
|
107
|
+
|
|
108
|
+
const getTotalRight = () => {
|
|
109
|
+
return (
|
|
110
|
+
(tableInstance.getRightLeafHeaders().length -
|
|
111
|
+
1 -
|
|
112
|
+
column.getPinnedIndex()) *
|
|
113
|
+
150
|
|
114
|
+
);
|
|
115
|
+
};
|
|
116
|
+
|
|
87
117
|
return (
|
|
88
118
|
<TableCell
|
|
89
119
|
align={column.columnDefType === 'group' ? 'center' : 'left'}
|
|
120
|
+
colSpan={header.colSpan}
|
|
90
121
|
{...tableCellProps}
|
|
91
|
-
//@ts-ignore
|
|
92
122
|
sx={(theme: Theme) => ({
|
|
93
|
-
backgroundColor:
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
123
|
+
backgroundColor:
|
|
124
|
+
column.getIsPinned() && column.columnDefType !== 'group'
|
|
125
|
+
? alpha(lighten(theme.palette.background.default, 0.04), 0.95)
|
|
126
|
+
: 'inherit',
|
|
127
|
+
backgroundImage: 'inherit',
|
|
128
|
+
boxShadow: getIsLastLeftPinnedColumn()
|
|
129
|
+
? `4px 0 4px -2px ${alpha(theme.palette.common.black, 0.1)}`
|
|
130
|
+
: getIsFirstRightPinnedColumn()
|
|
131
|
+
? `-4px 0 4px -2px ${alpha(theme.palette.common.black, 0.1)}`
|
|
132
|
+
: undefined,
|
|
98
133
|
fontWeight: 'bold',
|
|
99
134
|
height: '100%',
|
|
100
|
-
|
|
101
|
-
|
|
135
|
+
left:
|
|
136
|
+
column.getIsPinned() === 'left'
|
|
137
|
+
? `${column.getStart('left')}px`
|
|
138
|
+
: undefined,
|
|
139
|
+
maxWidth: `min(${column.getSize()}px, fit-content)`,
|
|
140
|
+
minWidth: `max(${column.getSize()}px, ${column.minSize}px)`,
|
|
141
|
+
overflow: 'visible',
|
|
102
142
|
p: isDensePadding
|
|
103
143
|
? column.columnDefType === 'display'
|
|
104
144
|
? '0 0.5rem'
|
|
@@ -106,20 +146,28 @@ export const MRT_TableHeadCell: FC<Props> = ({ header, tableInstance }) => {
|
|
|
106
146
|
: column.columnDefType === 'display'
|
|
107
147
|
? '0.5rem 0.75rem'
|
|
108
148
|
: '1rem',
|
|
149
|
+
pb: column.columnDefType === 'display' ? 0 : undefined,
|
|
150
|
+
position:
|
|
151
|
+
column.getIsPinned() && column.columnDefType !== 'group'
|
|
152
|
+
? 'sticky'
|
|
153
|
+
: undefined,
|
|
109
154
|
pt:
|
|
110
155
|
column.columnDefType === 'display'
|
|
111
156
|
? 0
|
|
112
157
|
: isDensePadding
|
|
113
158
|
? '0.75rem'
|
|
114
159
|
: '1.25rem',
|
|
115
|
-
|
|
116
|
-
|
|
160
|
+
right:
|
|
161
|
+
column.getIsPinned() === 'right' ? `${getTotalRight()}px` : undefined,
|
|
117
162
|
transition: `all ${enableColumnResizing ? 0 : '0.2s'} ease-in-out`,
|
|
118
163
|
verticalAlign: 'text-top',
|
|
119
|
-
width: header.
|
|
120
|
-
zIndex: column.getIsResizing()
|
|
121
|
-
|
|
122
|
-
|
|
164
|
+
width: header.getSize(),
|
|
165
|
+
zIndex: column.getIsResizing()
|
|
166
|
+
? 3
|
|
167
|
+
: column.getIsPinned() && column.columnDefType !== 'group'
|
|
168
|
+
? 2
|
|
169
|
+
: 1,
|
|
170
|
+
...(tableCellProps?.sx as any),
|
|
123
171
|
})}
|
|
124
172
|
>
|
|
125
173
|
{header.isPlaceholder ? null : column.columnDefType === 'display' ? (
|
|
@@ -163,7 +211,7 @@ export const MRT_TableHeadCell: FC<Props> = ({ header, tableInstance }) => {
|
|
|
163
211
|
)}
|
|
164
212
|
{column.columnDefType === 'data' &&
|
|
165
213
|
enableColumnFilters &&
|
|
166
|
-
!!column.
|
|
214
|
+
!!column.getCanFilter() && (
|
|
167
215
|
<Tooltip arrow placement="top" title={filterTooltip}>
|
|
168
216
|
<IconButton
|
|
169
217
|
disableRipple
|
|
@@ -174,7 +222,7 @@ export const MRT_TableHeadCell: FC<Props> = ({ header, tableInstance }) => {
|
|
|
174
222
|
size="small"
|
|
175
223
|
sx={{
|
|
176
224
|
m: 0,
|
|
177
|
-
opacity: !!column.
|
|
225
|
+
opacity: !!column.getFilterValue() ? 0.8 : 0,
|
|
178
226
|
p: '2px',
|
|
179
227
|
transition: 'all 0.2s ease-in-out',
|
|
180
228
|
'&:hover': {
|
|
@@ -183,7 +231,7 @@ export const MRT_TableHeadCell: FC<Props> = ({ header, tableInstance }) => {
|
|
|
183
231
|
},
|
|
184
232
|
}}
|
|
185
233
|
>
|
|
186
|
-
{showFilters && !column.
|
|
234
|
+
{showFilters && !column.getFilterValue() ? (
|
|
187
235
|
<FilterAltOff />
|
|
188
236
|
) : (
|
|
189
237
|
<FilterAltIcon />
|
|
@@ -204,7 +252,7 @@ export const MRT_TableHeadCell: FC<Props> = ({ header, tableInstance }) => {
|
|
|
204
252
|
<Divider
|
|
205
253
|
flexItem
|
|
206
254
|
orientation="vertical"
|
|
207
|
-
onDoubleClick={() =>
|
|
255
|
+
onDoubleClick={() => column.resetSize()}
|
|
208
256
|
sx={(theme: Theme) => ({
|
|
209
257
|
borderRadius: '2px',
|
|
210
258
|
borderRightWidth: '2px',
|
|
@@ -225,21 +273,32 @@ export const MRT_TableHeadCell: FC<Props> = ({ header, tableInstance }) => {
|
|
|
225
273
|
opacity: 1,
|
|
226
274
|
},
|
|
227
275
|
})}
|
|
228
|
-
{...
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
276
|
+
{...{
|
|
277
|
+
onMouseDown: header.getResizeHandler,
|
|
278
|
+
onTouchStart: header.getResizeHandler,
|
|
279
|
+
}}
|
|
280
|
+
style={{
|
|
281
|
+
transform: column.getIsResizing()
|
|
282
|
+
? `translateX(${getState().columnSizingInfo.deltaOffset}px)`
|
|
283
|
+
: 'none',
|
|
284
|
+
}}
|
|
236
285
|
/>
|
|
237
286
|
)}
|
|
238
287
|
</Box>
|
|
239
288
|
)}
|
|
240
|
-
{column.columnDefType === 'data' && column.
|
|
241
|
-
<Collapse in={showFilters}>
|
|
242
|
-
|
|
289
|
+
{column.columnDefType === 'data' && column.getCanFilter() && (
|
|
290
|
+
<Collapse in={showFilters} mountOnEnter unmountOnExit>
|
|
291
|
+
{currentFilterFns[column.id] === MRT_FILTER_OPTION.BETWEEN ? (
|
|
292
|
+
<MRT_FilterRangeFields
|
|
293
|
+
header={header}
|
|
294
|
+
tableInstance={tableInstance}
|
|
295
|
+
/>
|
|
296
|
+
) : (
|
|
297
|
+
<MRT_FilterTextField
|
|
298
|
+
header={header}
|
|
299
|
+
tableInstance={tableInstance}
|
|
300
|
+
/>
|
|
301
|
+
)}
|
|
243
302
|
</Collapse>
|
|
244
303
|
)}
|
|
245
304
|
</TableCell>
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import React, {
|
|
2
|
-
import { alpha, TableRow } from '@mui/material';
|
|
1
|
+
import React, { FC } from 'react';
|
|
2
|
+
import { alpha, lighten, TableRow } from '@mui/material';
|
|
3
3
|
import { MRT_TableHeadCell } from './MRT_TableHeadCell';
|
|
4
4
|
import type { MRT_Header, MRT_HeaderGroup, MRT_TableInstance } from '..';
|
|
5
5
|
|
|
@@ -13,26 +13,19 @@ export const MRT_TableHeadRow: FC<Props> = ({ headerGroup, tableInstance }) => {
|
|
|
13
13
|
options: { muiTableHeadRowProps },
|
|
14
14
|
} = tableInstance;
|
|
15
15
|
|
|
16
|
-
const
|
|
16
|
+
const tableRowProps =
|
|
17
17
|
muiTableHeadRowProps instanceof Function
|
|
18
18
|
? muiTableHeadRowProps({ headerGroup, tableInstance })
|
|
19
19
|
: muiTableHeadRowProps;
|
|
20
20
|
|
|
21
|
-
const tableRowProps = {
|
|
22
|
-
...headerGroup?.getHeaderGroupProps(),
|
|
23
|
-
...mTableHeadRowProps,
|
|
24
|
-
};
|
|
25
|
-
|
|
26
21
|
return (
|
|
27
22
|
<TableRow
|
|
28
23
|
{...tableRowProps}
|
|
29
|
-
sx={(theme) =>
|
|
30
|
-
(
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
} as CSSProperties)
|
|
35
|
-
}
|
|
24
|
+
sx={(theme) => ({
|
|
25
|
+
boxShadow: `4px 0 8px ${alpha(theme.palette.common.black, 0.1)}`,
|
|
26
|
+
backgroundColor: lighten(theme.palette.background.default, 0.04),
|
|
27
|
+
...(tableRowProps?.sx as any),
|
|
28
|
+
})}
|
|
36
29
|
>
|
|
37
30
|
{headerGroup.headers.map((header: MRT_Header, index) => (
|
|
38
31
|
<MRT_TableHeadCell
|
|
@@ -27,7 +27,7 @@ export const MRT_EditCellTextField: FC<Props> = ({ cell, tableInstance }) => {
|
|
|
27
27
|
setCurrentEditingRow,
|
|
28
28
|
} = tableInstance;
|
|
29
29
|
|
|
30
|
-
const [value, setValue] = useState(cell.
|
|
30
|
+
const [value, setValue] = useState(cell.getValue());
|
|
31
31
|
|
|
32
32
|
const { column, row } = cell;
|
|
33
33
|
|
|
@@ -39,7 +39,7 @@ export const MRT_EditCellTextField: FC<Props> = ({ cell, tableInstance }) => {
|
|
|
39
39
|
|
|
40
40
|
const handleBlur = (event: FocusEvent<HTMLInputElement>) => {
|
|
41
41
|
if (getState().currentEditingRow) {
|
|
42
|
-
row.
|
|
42
|
+
row._valuesCache[column.id] = value;
|
|
43
43
|
setCurrentEditingRow({ ...getState().currentEditingRow } as MRT_Row);
|
|
44
44
|
}
|
|
45
45
|
setCurrentEditingCell(null);
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import React, { FC } from 'react';
|
|
2
|
+
import { Box } from '@mui/material';
|
|
3
|
+
import { MRT_FilterTextField } from './MRT_FilterTextField';
|
|
4
|
+
import { MRT_Header, MRT_TableInstance } from '..';
|
|
5
|
+
|
|
6
|
+
interface Props {
|
|
7
|
+
header: MRT_Header;
|
|
8
|
+
tableInstance: MRT_TableInstance;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
const MRT_FilterRangeFields: FC<Props> = ({ header, tableInstance }) => {
|
|
12
|
+
const {
|
|
13
|
+
options: { localization },
|
|
14
|
+
} = tableInstance;
|
|
15
|
+
|
|
16
|
+
return (
|
|
17
|
+
<Box sx={{ display: 'grid', gridTemplateColumns: '6fr auto 5fr' }}>
|
|
18
|
+
<MRT_FilterTextField
|
|
19
|
+
header={header}
|
|
20
|
+
inputIndex={0}
|
|
21
|
+
tableInstance={tableInstance}
|
|
22
|
+
/>
|
|
23
|
+
<Box
|
|
24
|
+
sx={{
|
|
25
|
+
width: '100%',
|
|
26
|
+
minWidth: '5ch',
|
|
27
|
+
textAlign: 'center',
|
|
28
|
+
}}
|
|
29
|
+
>
|
|
30
|
+
{localization.to}
|
|
31
|
+
</Box>
|
|
32
|
+
<MRT_FilterTextField
|
|
33
|
+
header={header}
|
|
34
|
+
inputIndex={1}
|
|
35
|
+
tableInstance={tableInstance}
|
|
36
|
+
/>
|
|
37
|
+
</Box>
|
|
38
|
+
);
|
|
39
|
+
};
|
|
40
|
+
|
|
41
|
+
export default MRT_FilterRangeFields;
|
|
@@ -21,10 +21,15 @@ import { MRT_FILTER_OPTION } from '../enums';
|
|
|
21
21
|
|
|
22
22
|
interface Props {
|
|
23
23
|
header: MRT_Header;
|
|
24
|
+
inputIndex?: number;
|
|
24
25
|
tableInstance: MRT_TableInstance;
|
|
25
26
|
}
|
|
26
27
|
|
|
27
|
-
export const MRT_FilterTextField: FC<Props> = ({
|
|
28
|
+
export const MRT_FilterTextField: FC<Props> = ({
|
|
29
|
+
header,
|
|
30
|
+
inputIndex,
|
|
31
|
+
tableInstance,
|
|
32
|
+
}) => {
|
|
28
33
|
const {
|
|
29
34
|
getState,
|
|
30
35
|
options: {
|
|
@@ -57,14 +62,22 @@ export const MRT_FilterTextField: FC<Props> = ({ header, tableInstance }) => {
|
|
|
57
62
|
...mcTableHeadCellFilterTextFieldProps,
|
|
58
63
|
} as TextFieldProps;
|
|
59
64
|
|
|
60
|
-
const [filterValue, setFilterValue] = useState<string>(
|
|
61
|
-
|
|
65
|
+
const [filterValue, setFilterValue] = useState<string>(() =>
|
|
66
|
+
inputIndex !== undefined
|
|
67
|
+
? (column.getFilterValue() as [string, string])?.[inputIndex] ?? ''
|
|
68
|
+
: (column.getFilterValue() as string) ?? '',
|
|
62
69
|
);
|
|
63
70
|
|
|
64
|
-
const
|
|
71
|
+
const handleChangeDebounced = useCallback(
|
|
65
72
|
debounce(
|
|
66
73
|
(event: ChangeEvent<HTMLInputElement>) =>
|
|
67
|
-
|
|
74
|
+
inputIndex !== undefined
|
|
75
|
+
? column.setFilterValue((old: [string, string]) => {
|
|
76
|
+
const newFilterValues = old ?? ['', ''];
|
|
77
|
+
newFilterValues[inputIndex] = event.target.value;
|
|
78
|
+
return newFilterValues;
|
|
79
|
+
})
|
|
80
|
+
: column.setFilterValue(event.target.value ?? undefined),
|
|
68
81
|
150,
|
|
69
82
|
),
|
|
70
83
|
[],
|
|
@@ -76,15 +89,23 @@ export const MRT_FilterTextField: FC<Props> = ({ header, tableInstance }) => {
|
|
|
76
89
|
|
|
77
90
|
const handleClear = () => {
|
|
78
91
|
setFilterValue('');
|
|
79
|
-
|
|
92
|
+
if (inputIndex !== undefined) {
|
|
93
|
+
column.setFilterValue((old: [string | undefined, string | undefined]) => {
|
|
94
|
+
const newFilterValues = old ?? ['', ''];
|
|
95
|
+
newFilterValues[inputIndex] = undefined;
|
|
96
|
+
return newFilterValues;
|
|
97
|
+
});
|
|
98
|
+
} else {
|
|
99
|
+
column.setFilterValue(undefined);
|
|
100
|
+
}
|
|
80
101
|
};
|
|
81
102
|
|
|
82
103
|
const handleClearFilterChip = () => {
|
|
83
104
|
setFilterValue('');
|
|
84
|
-
column.
|
|
105
|
+
column.setFilterValue(undefined);
|
|
85
106
|
setCurrentFilterFns((prev) => ({
|
|
86
107
|
...prev,
|
|
87
|
-
[header.id]: MRT_FILTER_OPTION.
|
|
108
|
+
[header.id]: MRT_FILTER_OPTION.FUZZY,
|
|
88
109
|
}));
|
|
89
110
|
};
|
|
90
111
|
|
|
@@ -92,7 +113,9 @@ export const MRT_FilterTextField: FC<Props> = ({ header, tableInstance }) => {
|
|
|
92
113
|
return <>{column.Filter?.({ header, tableInstance })}</>;
|
|
93
114
|
}
|
|
94
115
|
|
|
95
|
-
const filterId = `mrt-${idPrefix}-${header.id}-filter-text-field
|
|
116
|
+
const filterId = `mrt-${idPrefix}-${header.id}-filter-text-field${
|
|
117
|
+
inputIndex ?? ''
|
|
118
|
+
}`;
|
|
96
119
|
const filterFn = currentFilterFns?.[header.id];
|
|
97
120
|
const isSelectFilter = !!column.filterSelectOptions;
|
|
98
121
|
const filterChipLabel =
|
|
@@ -105,10 +128,14 @@ export const MRT_FilterTextField: FC<Props> = ({ header, tableInstance }) => {
|
|
|
105
128
|
`filter${filterFn.charAt(0).toUpperCase() + filterFn.slice(1)}`
|
|
106
129
|
]
|
|
107
130
|
: '';
|
|
108
|
-
const filterPlaceholder =
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
131
|
+
const filterPlaceholder =
|
|
132
|
+
inputIndex === undefined
|
|
133
|
+
? localization.filterByColumn?.replace('{column}', String(column.header))
|
|
134
|
+
: inputIndex === 0
|
|
135
|
+
? localization.min
|
|
136
|
+
: inputIndex === 1
|
|
137
|
+
? localization.max
|
|
138
|
+
: '';
|
|
112
139
|
|
|
113
140
|
return (
|
|
114
141
|
<>
|
|
@@ -124,48 +151,53 @@ export const MRT_FilterTextField: FC<Props> = ({ header, tableInstance }) => {
|
|
|
124
151
|
title: filterPlaceholder,
|
|
125
152
|
}}
|
|
126
153
|
helperText={
|
|
127
|
-
|
|
128
|
-
{
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
154
|
+
!inputIndex ? (
|
|
155
|
+
<label htmlFor={filterId}>
|
|
156
|
+
{filterFn instanceof Function
|
|
157
|
+
? localization.filterMode.replace(
|
|
158
|
+
'{filterType}',
|
|
159
|
+
// @ts-ignore
|
|
160
|
+
localization[
|
|
161
|
+
`filter${
|
|
162
|
+
filterFn.name.charAt(0).toUpperCase() +
|
|
163
|
+
filterFn.name.slice(1)
|
|
164
|
+
}`
|
|
165
|
+
] ?? '',
|
|
166
|
+
) ?? ''
|
|
167
|
+
: localization.filterMode.replace(
|
|
168
|
+
'{filterType}',
|
|
169
|
+
// @ts-ignore
|
|
170
|
+
localization[
|
|
171
|
+
`filter${
|
|
172
|
+
filterFn.charAt(0).toUpperCase() + filterFn.slice(1)
|
|
173
|
+
}`
|
|
174
|
+
],
|
|
175
|
+
)}
|
|
176
|
+
</label>
|
|
177
|
+
) : null
|
|
149
178
|
}
|
|
150
179
|
FormHelperTextProps={{
|
|
151
|
-
sx: {
|
|
180
|
+
sx: {
|
|
181
|
+
fontSize: '0.6rem',
|
|
182
|
+
lineHeight: '0.8rem',
|
|
183
|
+
whiteSpace: 'nowrap',
|
|
184
|
+
},
|
|
152
185
|
}}
|
|
153
186
|
label={isSelectFilter && !filterValue ? filterPlaceholder : undefined}
|
|
154
187
|
margin="none"
|
|
155
188
|
placeholder={
|
|
156
|
-
filterPlaceholder
|
|
157
|
-
// filterChipLabel || isSelectFilter ? undefined : filterPlaceholder
|
|
189
|
+
filterChipLabel || isSelectFilter ? undefined : filterPlaceholder
|
|
158
190
|
}
|
|
159
191
|
onChange={(event: ChangeEvent<HTMLInputElement>) => {
|
|
160
192
|
setFilterValue(event.target.value);
|
|
161
|
-
|
|
193
|
+
handleChangeDebounced(event);
|
|
162
194
|
}}
|
|
163
195
|
onClick={(e: MouseEvent<HTMLInputElement>) => e.stopPropagation()}
|
|
164
196
|
select={isSelectFilter}
|
|
165
197
|
value={filterValue ?? ''}
|
|
166
198
|
variant="standard"
|
|
167
199
|
InputProps={{
|
|
168
|
-
startAdornment: !isSelectFilter && (
|
|
200
|
+
startAdornment: !isSelectFilter && !inputIndex && (
|
|
169
201
|
<InputAdornment position="start">
|
|
170
202
|
<Tooltip arrow title={localization.changeFilterMode}>
|
|
171
203
|
<span>
|
|
@@ -217,7 +249,7 @@ export const MRT_FilterTextField: FC<Props> = ({ header, tableInstance }) => {
|
|
|
217
249
|
sx={{
|
|
218
250
|
m: '-0.25rem',
|
|
219
251
|
p: 0,
|
|
220
|
-
minWidth: !filterChipLabel ? '
|
|
252
|
+
minWidth: !filterChipLabel ? '6rem' : 'auto',
|
|
221
253
|
width: 'calc(100% + 0.5rem)',
|
|
222
254
|
mt: isSelectFilter && !filterValue ? '-1rem' : undefined,
|
|
223
255
|
'& .MuiSelect-icon': {
|
|
@@ -17,9 +17,7 @@ export const MRT_SelectCheckbox: FC<Props> = ({
|
|
|
17
17
|
getRowModel,
|
|
18
18
|
getSelectedRowModel,
|
|
19
19
|
getState,
|
|
20
|
-
getToggleAllRowsSelectedProps,
|
|
21
20
|
options: {
|
|
22
|
-
isLoading,
|
|
23
21
|
localization,
|
|
24
22
|
muiSelectCheckboxProps,
|
|
25
23
|
onSelectChange,
|
|
@@ -27,18 +25,18 @@ export const MRT_SelectCheckbox: FC<Props> = ({
|
|
|
27
25
|
},
|
|
28
26
|
} = tableInstance;
|
|
29
27
|
|
|
30
|
-
const { isDensePadding } = getState();
|
|
28
|
+
const { isDensePadding, isLoading } = getState();
|
|
31
29
|
|
|
32
30
|
const handleSelectChange = (event: ChangeEvent<HTMLInputElement>) => {
|
|
33
31
|
if (selectAll) {
|
|
34
|
-
|
|
32
|
+
tableInstance.getToggleAllRowsSelectedHandler()(event as any);
|
|
35
33
|
onSelectAllChange?.({
|
|
36
34
|
event,
|
|
37
35
|
selectedRows: event.target.checked ? getRowModel().flatRows : [],
|
|
38
36
|
tableInstance,
|
|
39
37
|
});
|
|
40
38
|
} else if (row) {
|
|
41
|
-
row?.
|
|
39
|
+
row?.getToggleSelectedHandler()(event as any);
|
|
42
40
|
onSelectChange?.({
|
|
43
41
|
event,
|
|
44
42
|
row,
|
|
@@ -52,20 +50,11 @@ export const MRT_SelectCheckbox: FC<Props> = ({
|
|
|
52
50
|
}
|
|
53
51
|
};
|
|
54
52
|
|
|
55
|
-
const
|
|
53
|
+
const checkboxProps =
|
|
56
54
|
muiSelectCheckboxProps instanceof Function
|
|
57
55
|
? muiSelectCheckboxProps({ isSelectAll: !!selectAll, row, tableInstance })
|
|
58
56
|
: muiSelectCheckboxProps;
|
|
59
57
|
|
|
60
|
-
const rtSelectCheckboxProps = selectAll
|
|
61
|
-
? getToggleAllRowsSelectedProps()
|
|
62
|
-
: row?.getToggleSelectedProps();
|
|
63
|
-
|
|
64
|
-
const checkboxProps = {
|
|
65
|
-
...rtSelectCheckboxProps,
|
|
66
|
-
...mTableBodyRowSelectCheckboxProps,
|
|
67
|
-
};
|
|
68
|
-
|
|
69
58
|
return (
|
|
70
59
|
<Tooltip
|
|
71
60
|
arrow
|
|
@@ -76,20 +65,30 @@ export const MRT_SelectCheckbox: FC<Props> = ({
|
|
|
76
65
|
}
|
|
77
66
|
>
|
|
78
67
|
<Checkbox
|
|
68
|
+
checked={
|
|
69
|
+
selectAll
|
|
70
|
+
? tableInstance.getIsAllRowsSelected()
|
|
71
|
+
: row?.getIsSelected()
|
|
72
|
+
}
|
|
79
73
|
disabled={isLoading}
|
|
74
|
+
indeterminate={
|
|
75
|
+
selectAll
|
|
76
|
+
? tableInstance.getIsSomeRowsSelected()
|
|
77
|
+
: row?.getIsSomeSelected()
|
|
78
|
+
}
|
|
80
79
|
inputProps={{
|
|
81
80
|
'aria-label': selectAll
|
|
82
81
|
? localization.toggleSelectAll
|
|
83
82
|
: localization.toggleSelectRow,
|
|
84
83
|
}}
|
|
84
|
+
onChange={handleSelectChange}
|
|
85
85
|
size={isDensePadding ? 'small' : 'medium'}
|
|
86
86
|
{...checkboxProps}
|
|
87
87
|
sx={{
|
|
88
88
|
height: isDensePadding ? '1.75rem' : '2.25rem',
|
|
89
89
|
width: isDensePadding ? '1.75rem' : '2.25rem',
|
|
90
|
+
...checkboxProps?.sx,
|
|
90
91
|
}}
|
|
91
|
-
onChange={handleSelectChange}
|
|
92
|
-
title={undefined}
|
|
93
92
|
/>
|
|
94
93
|
</Tooltip>
|
|
95
94
|
);
|