material-react-table 1.12.1 → 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.
@@ -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 TableProps } from '@mui/material/Table';
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?: 'text' | 'select' | 'multi-select' | 'range' | 'checkbox';
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 { TableProps } from '@mui/material/Table';
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?: 'text' | 'select' | 'multi-select' | 'range' | 'checkbox';
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
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "1.12.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.",
@@ -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,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,
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 TableProps } from '@mui/material/Table';
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?: 'text' | 'select' | 'multi-select' | 'range' | 'checkbox';
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: {