material-react-table 1.12.1 → 1.13.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/cjs/index.js +130 -12
- 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 +133 -15
- 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 +13 -3
- package/package.json +1 -1
- package/src/MaterialReactTable.tsx +2 -0
- 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 +145 -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
@@ -3,7 +3,7 @@ import { MRT_FilterFns } from './filterFns';
|
|
3
3
|
import { MRT_SortingFns } from './sortingFns';
|
4
4
|
import { type MaterialReactTableProps } from './types';
|
5
5
|
export { MRT_AggregationFns, MRT_FilterFns, MRT_SortingFns };
|
6
|
-
export declare const MaterialReactTable: <TData extends Record<string, any> = {}>({ aggregationFns, autoResetExpanded, columnResizeMode, defaultColumn, defaultDisplayColumn, editingMode, enableBottomToolbar, enableColumnActions, enableColumnFilters, enableColumnOrdering, enableColumnResizing, enableDensityToggle, enableExpandAll, enableFilterMatchHighlighting, enableFilters, enableFullScreenToggle, enableGlobalFilter, enableGlobalFilterRankedResults, enableGrouping, enableHiding, enableMultiRowSelection, enableMultiSort, enablePagination, enablePinning, enableRowSelection, enableSelectAll, enableSorting, enableStickyHeader, enableTableFooter, enableTableHead, enableToolbarInternalActions, enableTopToolbar, filterFns, icons, layoutMode, localization, manualFiltering, manualGrouping, manualPagination, manualSorting, positionActionsColumn, positionExpandColumn, positionGlobalFilter, positionPagination, positionToolbarAlertBanner, positionToolbarDropZone, rowNumberMode, selectAllMode, sortingFns, ...rest }: MaterialReactTableProps<TData>) => import("react/jsx-runtime").JSX.Element;
|
6
|
+
export declare const MaterialReactTable: <TData extends Record<string, any> = {}>({ aggregationFns, autoResetExpanded, columnResizeMode, defaultColumn, defaultDisplayColumn, editingMode, enableBottomToolbar, enableColumnActions, enableColumnFilters, enableColumnOrdering, enableColumnResizing, enableDensityToggle, enableExpandAll, enableExpanding, enableFilterMatchHighlighting, enableFilters, enableFullScreenToggle, enableGlobalFilter, enableGlobalFilterRankedResults, enableGrouping, enableHiding, enableMultiRowSelection, enableMultiSort, enablePagination, enablePinning, enableRowSelection, enableSelectAll, enableSorting, enableStickyHeader, enableTableFooter, enableTableHead, enableToolbarInternalActions, enableTopToolbar, filterFns, icons, layoutMode, localization, manualFiltering, manualGrouping, manualPagination, manualSorting, positionActionsColumn, positionExpandColumn, positionGlobalFilter, positionPagination, positionToolbarAlertBanner, positionToolbarDropZone, rowNumberMode, selectAllMode, sortingFns, ...rest }: MaterialReactTableProps<TData>) => import("react/jsx-runtime").JSX.Element;
|
7
7
|
/**
|
8
8
|
* @deprecated Use named exports instead of default export (will be removed in v2)
|
9
9
|
* @example import { MaterialReactTable } from 'material-react-table';
|
@@ -0,0 +1,7 @@
|
|
1
|
+
import { type MRT_TableInstance, type MRT_Header } from '../types';
|
2
|
+
interface Props {
|
3
|
+
header: MRT_Header;
|
4
|
+
table: MRT_TableInstance;
|
5
|
+
}
|
6
|
+
export declare const MRT_FilterRangeSlider: ({ header, table }: Props) => import("react/jsx-runtime").JSX.Element;
|
7
|
+
export {};
|
@@ -8,13 +8,14 @@ import { type LinearProgressProps } from '@mui/material/LinearProgress';
|
|
8
8
|
import { type PaperProps } from '@mui/material/Paper';
|
9
9
|
import { type RadioProps } from '@mui/material/Radio';
|
10
10
|
import { type SkeletonProps } from '@mui/material/Skeleton';
|
11
|
-
import { type
|
11
|
+
import { type SliderProps } from '@mui/material';
|
12
12
|
import { type TableBodyProps } from '@mui/material/TableBody';
|
13
13
|
import { type TableCellProps } from '@mui/material/TableCell';
|
14
14
|
import { type TableContainerProps } from '@mui/material/TableContainer';
|
15
15
|
import { type TableFooterProps } from '@mui/material/TableFooter';
|
16
16
|
import { type TableHeadProps } from '@mui/material/TableHead';
|
17
17
|
import { type TablePaginationProps } from '@mui/material/TablePagination';
|
18
|
+
import { type TableProps } from '@mui/material/Table';
|
18
19
|
import { type TableRowProps } from '@mui/material/TableRow';
|
19
20
|
import { type TextFieldProps } from '@mui/material/TextField';
|
20
21
|
import { type ToolbarProps } from '@mui/material/Toolbar';
|
@@ -295,7 +296,7 @@ export type MRT_ColumnDef<TData extends Record<string, any> = {}> = Omit<ColumnD
|
|
295
296
|
text: string;
|
296
297
|
value: any;
|
297
298
|
})[];
|
298
|
-
filterVariant?: '
|
299
|
+
filterVariant?: 'checkbox' | 'multi-select' | 'range' | 'range-slider' | 'select' | 'text';
|
299
300
|
/**
|
300
301
|
* footer must be a string. If you want custom JSX to render the footer, you can also specify a `Footer` option. (Capital F)
|
301
302
|
*/
|
@@ -353,6 +354,10 @@ export type MRT_ColumnDef<TData extends Record<string, any> = {}> = Omit<ColumnD
|
|
353
354
|
column: MRT_Column<TData>;
|
354
355
|
rangeFilterIndex?: number;
|
355
356
|
}) => TextFieldProps);
|
357
|
+
muiTableHeadCellFilterSliderProps?: SliderProps | ((props: {
|
358
|
+
table: MRT_TableInstance<TData>;
|
359
|
+
column: MRT_Column<TData>;
|
360
|
+
}) => TextFieldProps);
|
356
361
|
muiTableHeadCellProps?: TableCellProps | ((props: {
|
357
362
|
table: MRT_TableInstance<TData>;
|
358
363
|
column: MRT_Column<TData>;
|
@@ -463,6 +468,7 @@ export type MaterialReactTableProps<TData extends Record<string, any> = {}> = Pr
|
|
463
468
|
enableDensityToggle?: boolean;
|
464
469
|
enableEditing?: boolean | ((row: MRT_Row<TData>) => boolean);
|
465
470
|
enableExpandAll?: boolean;
|
471
|
+
enableFacetedValues?: boolean;
|
466
472
|
enableFilterMatchHighlighting?: boolean;
|
467
473
|
enableFullScreenToggle?: boolean;
|
468
474
|
enableGlobalFilterModes?: boolean;
|
@@ -601,6 +607,10 @@ export type MaterialReactTableProps<TData extends Record<string, any> = {}> = Pr
|
|
601
607
|
column: MRT_Column<TData>;
|
602
608
|
rangeFilterIndex?: number;
|
603
609
|
}) => TextFieldProps);
|
610
|
+
muiTableHeadCellFilterSliderProps?: SliderProps | ((props: {
|
611
|
+
table: MRT_TableInstance<TData>;
|
612
|
+
column: MRT_Column<TData>;
|
613
|
+
}) => TextFieldProps);
|
604
614
|
muiTableHeadCellProps?: TableCellProps | ((props: {
|
605
615
|
table: MRT_TableInstance<TData>;
|
606
616
|
column: MRT_Column<TData>;
|
package/dist/index.d.ts
CHANGED
@@ -9,13 +9,14 @@ import { LinearProgressProps } from '@mui/material/LinearProgress';
|
|
9
9
|
import { PaperProps } from '@mui/material/Paper';
|
10
10
|
import { RadioProps } from '@mui/material/Radio';
|
11
11
|
import { SkeletonProps } from '@mui/material/Skeleton';
|
12
|
-
import {
|
12
|
+
import { SliderProps } from '@mui/material';
|
13
13
|
import { TableBodyProps } from '@mui/material/TableBody';
|
14
14
|
import { TableCellProps } from '@mui/material/TableCell';
|
15
15
|
import { TableContainerProps } from '@mui/material/TableContainer';
|
16
16
|
import { TableFooterProps } from '@mui/material/TableFooter';
|
17
17
|
import { TableHeadProps } from '@mui/material/TableHead';
|
18
18
|
import { TablePaginationProps } from '@mui/material/TablePagination';
|
19
|
+
import { TableProps } from '@mui/material/Table';
|
19
20
|
import { TableRowProps } from '@mui/material/TableRow';
|
20
21
|
import { TextFieldProps } from '@mui/material/TextField';
|
21
22
|
import { ToolbarProps } from '@mui/material/Toolbar';
|
@@ -406,7 +407,7 @@ type MRT_ColumnDef<TData extends Record<string, any> = {}> = Omit<ColumnDef<TDat
|
|
406
407
|
text: string;
|
407
408
|
value: any;
|
408
409
|
})[];
|
409
|
-
filterVariant?: '
|
410
|
+
filterVariant?: 'checkbox' | 'multi-select' | 'range' | 'range-slider' | 'select' | 'text';
|
410
411
|
/**
|
411
412
|
* footer must be a string. If you want custom JSX to render the footer, you can also specify a `Footer` option. (Capital F)
|
412
413
|
*/
|
@@ -464,6 +465,10 @@ type MRT_ColumnDef<TData extends Record<string, any> = {}> = Omit<ColumnDef<TDat
|
|
464
465
|
column: MRT_Column<TData>;
|
465
466
|
rangeFilterIndex?: number;
|
466
467
|
}) => TextFieldProps);
|
468
|
+
muiTableHeadCellFilterSliderProps?: SliderProps | ((props: {
|
469
|
+
table: MRT_TableInstance<TData>;
|
470
|
+
column: MRT_Column<TData>;
|
471
|
+
}) => TextFieldProps);
|
467
472
|
muiTableHeadCellProps?: TableCellProps | ((props: {
|
468
473
|
table: MRT_TableInstance<TData>;
|
469
474
|
column: MRT_Column<TData>;
|
@@ -574,6 +579,7 @@ type MaterialReactTableProps<TData extends Record<string, any> = {}> = Prettify<
|
|
574
579
|
enableDensityToggle?: boolean;
|
575
580
|
enableEditing?: boolean | ((row: MRT_Row<TData>) => boolean);
|
576
581
|
enableExpandAll?: boolean;
|
582
|
+
enableFacetedValues?: boolean;
|
577
583
|
enableFilterMatchHighlighting?: boolean;
|
578
584
|
enableFullScreenToggle?: boolean;
|
579
585
|
enableGlobalFilterModes?: boolean;
|
@@ -712,6 +718,10 @@ type MaterialReactTableProps<TData extends Record<string, any> = {}> = Prettify<
|
|
712
718
|
column: MRT_Column<TData>;
|
713
719
|
rangeFilterIndex?: number;
|
714
720
|
}) => TextFieldProps);
|
721
|
+
muiTableHeadCellFilterSliderProps?: SliderProps | ((props: {
|
722
|
+
table: MRT_TableInstance<TData>;
|
723
|
+
column: MRT_Column<TData>;
|
724
|
+
}) => TextFieldProps);
|
715
725
|
muiTableHeadCellProps?: TableCellProps | ((props: {
|
716
726
|
table: MRT_TableInstance<TData>;
|
717
727
|
column: MRT_Column<TData>;
|
@@ -865,7 +875,7 @@ declare const MRT_SortingFns: {
|
|
865
875
|
basic: _tanstack_react_table.SortingFn<any>;
|
866
876
|
};
|
867
877
|
|
868
|
-
declare const MaterialReactTable: <TData extends Record<string, any> = {}>({ aggregationFns, autoResetExpanded, columnResizeMode, defaultColumn, defaultDisplayColumn, editingMode, enableBottomToolbar, enableColumnActions, enableColumnFilters, enableColumnOrdering, enableColumnResizing, enableDensityToggle, enableExpandAll, enableFilterMatchHighlighting, enableFilters, enableFullScreenToggle, enableGlobalFilter, enableGlobalFilterRankedResults, enableGrouping, enableHiding, enableMultiRowSelection, enableMultiSort, enablePagination, enablePinning, enableRowSelection, enableSelectAll, enableSorting, enableStickyHeader, enableTableFooter, enableTableHead, enableToolbarInternalActions, enableTopToolbar, filterFns, icons, layoutMode, localization, manualFiltering, manualGrouping, manualPagination, manualSorting, positionActionsColumn, positionExpandColumn, positionGlobalFilter, positionPagination, positionToolbarAlertBanner, positionToolbarDropZone, rowNumberMode, selectAllMode, sortingFns, ...rest }: MaterialReactTableProps<TData>) => react_jsx_runtime.JSX.Element;
|
878
|
+
declare const MaterialReactTable: <TData extends Record<string, any> = {}>({ aggregationFns, autoResetExpanded, columnResizeMode, defaultColumn, defaultDisplayColumn, editingMode, enableBottomToolbar, enableColumnActions, enableColumnFilters, enableColumnOrdering, enableColumnResizing, enableDensityToggle, enableExpandAll, enableExpanding, enableFilterMatchHighlighting, enableFilters, enableFullScreenToggle, enableGlobalFilter, enableGlobalFilterRankedResults, enableGrouping, enableHiding, enableMultiRowSelection, enableMultiSort, enablePagination, enablePinning, enableRowSelection, enableSelectAll, enableSorting, enableStickyHeader, enableTableFooter, enableTableHead, enableToolbarInternalActions, enableTopToolbar, filterFns, icons, layoutMode, localization, manualFiltering, manualGrouping, manualPagination, manualSorting, positionActionsColumn, positionExpandColumn, positionGlobalFilter, positionPagination, positionToolbarAlertBanner, positionToolbarDropZone, rowNumberMode, selectAllMode, sortingFns, ...rest }: MaterialReactTableProps<TData>) => react_jsx_runtime.JSX.Element;
|
869
879
|
|
870
880
|
interface Props$i<TData extends Record<string, any> = {}> {
|
871
881
|
table: MRT_TableInstance<TData>;
|
package/package.json
CHANGED
@@ -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}
|
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,145 @@
|
|
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
|
+
let [min, max] =
|
49
|
+
sliderProps.min !== undefined && sliderProps.max !== undefined
|
50
|
+
? [sliderProps.min, sliderProps.max]
|
51
|
+
: column.getFacetedMinMaxValues() ?? [0, 0];
|
52
|
+
|
53
|
+
// column.getFacetedMinMaxValues() seems to return an array of arrays for the min value
|
54
|
+
// under some conditions, so check for that and take the first array value if that happens.
|
55
|
+
// To be a bit defensive, implement the same check for max, just in case.
|
56
|
+
if (Array.isArray(min)) {
|
57
|
+
min = min[0]
|
58
|
+
}
|
59
|
+
if (Array.isArray(max)) {
|
60
|
+
max = max[0]
|
61
|
+
}
|
62
|
+
|
63
|
+
const [filterValues, setFilterValues] = useState([min, max]);
|
64
|
+
const columnFilterValue = column.getFilterValue();
|
65
|
+
|
66
|
+
const isMounted = useRef(false);
|
67
|
+
|
68
|
+
useEffect(() => {
|
69
|
+
if (isMounted.current) {
|
70
|
+
if (columnFilterValue === undefined) {
|
71
|
+
setFilterValues([min, max]);
|
72
|
+
} else if (Array.isArray(columnFilterValue)) {
|
73
|
+
if (columnFilterValue[0] <= min && columnFilterValue[1] >= max) {
|
74
|
+
column.setFilterValue(undefined);
|
75
|
+
} else {
|
76
|
+
setFilterValues(columnFilterValue);
|
77
|
+
}
|
78
|
+
}
|
79
|
+
}
|
80
|
+
isMounted.current = true;
|
81
|
+
}, [column.getFilterValue()]);
|
82
|
+
|
83
|
+
return (
|
84
|
+
<Stack>
|
85
|
+
<Slider
|
86
|
+
disableSwap
|
87
|
+
min={min}
|
88
|
+
max={max}
|
89
|
+
onChange={(_event, value) => {
|
90
|
+
setFilterValues(value as [number, number]);
|
91
|
+
}}
|
92
|
+
onChangeCommitted={(_event, value) => {
|
93
|
+
column.setFilterValue(value as [number, number]);
|
94
|
+
}}
|
95
|
+
value={filterValues}
|
96
|
+
valueLabelDisplay="auto"
|
97
|
+
{...sliderProps}
|
98
|
+
slotProps={{
|
99
|
+
input: {
|
100
|
+
ref: (node) => {
|
101
|
+
if (node) {
|
102
|
+
filterInputRefs.current[`${column.id}-0`] = node;
|
103
|
+
// @ts-ignore
|
104
|
+
if (sliderProps?.slotProps?.input?.ref) {
|
105
|
+
//@ts-ignore
|
106
|
+
sliderProps.slotProps.input.ref = node;
|
107
|
+
}
|
108
|
+
}
|
109
|
+
},
|
110
|
+
},
|
111
|
+
}}
|
112
|
+
sx={(theme) => ({
|
113
|
+
m: 'auto',
|
114
|
+
mt: !showChangeModeButton ? '10px' : '6px',
|
115
|
+
px: '4px',
|
116
|
+
width: 'calc(100% - 8px)',
|
117
|
+
...(sliderProps?.sx instanceof Function
|
118
|
+
? sliderProps.sx(theme)
|
119
|
+
: (sliderProps?.sx as any)),
|
120
|
+
})}
|
121
|
+
/>
|
122
|
+
{showChangeModeButton ? (
|
123
|
+
<FormHelperText
|
124
|
+
sx={{
|
125
|
+
m: '-3px -6px',
|
126
|
+
fontSize: '0.75rem',
|
127
|
+
lineHeight: '0.8rem',
|
128
|
+
whiteSpace: 'nowrap',
|
129
|
+
}}
|
130
|
+
>
|
131
|
+
{localization.filterMode.replace(
|
132
|
+
'{filterType}',
|
133
|
+
// @ts-ignore
|
134
|
+
localization[
|
135
|
+
`filter${
|
136
|
+
currentFilterOption?.charAt(0)?.toUpperCase() +
|
137
|
+
currentFilterOption?.slice(1)
|
138
|
+
}`
|
139
|
+
],
|
140
|
+
)}
|
141
|
+
</FormHelperText>
|
142
|
+
) : null}
|
143
|
+
</Stack>
|
144
|
+
);
|
145
|
+
};
|
@@ -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,
|
package/src/types.ts
CHANGED
@@ -13,13 +13,14 @@ import { type LinearProgressProps } from '@mui/material/LinearProgress';
|
|
13
13
|
import { type PaperProps } from '@mui/material/Paper';
|
14
14
|
import { type RadioProps } from '@mui/material/Radio';
|
15
15
|
import { type SkeletonProps } from '@mui/material/Skeleton';
|
16
|
-
import { type
|
16
|
+
import { type SliderProps } from '@mui/material';
|
17
17
|
import { type TableBodyProps } from '@mui/material/TableBody';
|
18
18
|
import { type TableCellProps } from '@mui/material/TableCell';
|
19
19
|
import { type TableContainerProps } from '@mui/material/TableContainer';
|
20
20
|
import { type TableFooterProps } from '@mui/material/TableFooter';
|
21
21
|
import { type TableHeadProps } from '@mui/material/TableHead';
|
22
22
|
import { type TablePaginationProps } from '@mui/material/TablePagination';
|
23
|
+
import { type TableProps } from '@mui/material/Table';
|
23
24
|
import { type TableRowProps } from '@mui/material/TableRow';
|
24
25
|
import { type TextFieldProps } from '@mui/material/TextField';
|
25
26
|
import { type ToolbarProps } from '@mui/material/Toolbar';
|
@@ -389,7 +390,13 @@ export type MRT_ColumnDef<TData extends Record<string, any> = {}> =
|
|
389
390
|
enableFilterMatchHighlighting?: boolean;
|
390
391
|
filterFn?: MRT_FilterFn<TData>;
|
391
392
|
filterSelectOptions?: (string | { text: string; value: any })[];
|
392
|
-
filterVariant?:
|
393
|
+
filterVariant?:
|
394
|
+
| 'checkbox'
|
395
|
+
| 'multi-select'
|
396
|
+
| 'range'
|
397
|
+
| 'range-slider'
|
398
|
+
| 'select'
|
399
|
+
| 'text';
|
393
400
|
/**
|
394
401
|
* footer must be a string. If you want custom JSX to render the footer, you can also specify a `Footer` option. (Capital F)
|
395
402
|
*/
|
@@ -463,6 +470,12 @@ export type MRT_ColumnDef<TData extends Record<string, any> = {}> =
|
|
463
470
|
column: MRT_Column<TData>;
|
464
471
|
rangeFilterIndex?: number;
|
465
472
|
}) => TextFieldProps);
|
473
|
+
muiTableHeadCellFilterSliderProps?:
|
474
|
+
| SliderProps
|
475
|
+
| ((props: {
|
476
|
+
table: MRT_TableInstance<TData>;
|
477
|
+
column: MRT_Column<TData>;
|
478
|
+
}) => TextFieldProps);
|
466
479
|
muiTableHeadCellProps?:
|
467
480
|
| TableCellProps
|
468
481
|
| ((props: {
|
@@ -646,6 +659,7 @@ export type MaterialReactTableProps<TData extends Record<string, any> = {}> =
|
|
646
659
|
enableDensityToggle?: boolean;
|
647
660
|
enableEditing?: boolean | ((row: MRT_Row<TData>) => boolean);
|
648
661
|
enableExpandAll?: boolean;
|
662
|
+
enableFacetedValues?: boolean;
|
649
663
|
enableFilterMatchHighlighting?: boolean;
|
650
664
|
enableFullScreenToggle?: boolean;
|
651
665
|
enableGlobalFilterModes?: boolean;
|
@@ -820,6 +834,12 @@ export type MaterialReactTableProps<TData extends Record<string, any> = {}> =
|
|
820
834
|
column: MRT_Column<TData>;
|
821
835
|
rangeFilterIndex?: number;
|
822
836
|
}) => TextFieldProps);
|
837
|
+
muiTableHeadCellFilterSliderProps?:
|
838
|
+
| SliderProps
|
839
|
+
| ((props: {
|
840
|
+
table: MRT_TableInstance<TData>;
|
841
|
+
column: MRT_Column<TData>;
|
842
|
+
}) => TextFieldProps);
|
823
843
|
muiTableHeadCellProps?:
|
824
844
|
| TableCellProps
|
825
845
|
| ((props: {
|