material-react-table 0.38.3 → 0.40.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (50) hide show
  1. package/dist/cjs/MaterialReactTable.d.ts +26 -4
  2. package/dist/cjs/body/MRT_EditRowModal.d.ts +1 -0
  3. package/dist/cjs/body/MRT_TableBodyRow.d.ts +1 -0
  4. package/dist/cjs/buttons/MRT_ColumnPinningButtons.d.ts +1 -0
  5. package/dist/cjs/buttons/MRT_EditActionButtons.d.ts +1 -0
  6. package/dist/cjs/buttons/MRT_FullScreenToggleButton.d.ts +1 -0
  7. package/dist/cjs/buttons/MRT_ShowHideColumnsButton.d.ts +1 -0
  8. package/dist/cjs/buttons/MRT_ToggleDensePaddingButton.d.ts +1 -0
  9. package/dist/cjs/buttons/MRT_ToggleFiltersButton.d.ts +1 -0
  10. package/dist/cjs/buttons/MRT_ToggleGlobalFilterButton.d.ts +1 -0
  11. package/dist/cjs/column.utils.d.ts +1 -0
  12. package/dist/cjs/index.js +68 -43
  13. package/dist/cjs/index.js.map +1 -1
  14. package/dist/cjs/inputs/MRT_EditCellTextField.d.ts +1 -0
  15. package/dist/cjs/inputs/MRT_GlobalFilterTextField.d.ts +1 -0
  16. package/dist/cjs/menus/MRT_FilterOptionMenu.d.ts +3 -7
  17. package/dist/cjs/menus/MRT_ShowHideColumnsMenu.d.ts +1 -0
  18. package/dist/cjs/table/MRT_TableRoot.d.ts +1 -0
  19. package/dist/esm/MaterialReactTable.d.ts +26 -4
  20. package/dist/esm/body/MRT_EditRowModal.d.ts +1 -0
  21. package/dist/esm/body/MRT_TableBodyRow.d.ts +1 -0
  22. package/dist/esm/buttons/MRT_ColumnPinningButtons.d.ts +1 -0
  23. package/dist/esm/buttons/MRT_EditActionButtons.d.ts +1 -0
  24. package/dist/esm/buttons/MRT_FullScreenToggleButton.d.ts +1 -0
  25. package/dist/esm/buttons/MRT_ShowHideColumnsButton.d.ts +1 -0
  26. package/dist/esm/buttons/MRT_ToggleDensePaddingButton.d.ts +1 -0
  27. package/dist/esm/buttons/MRT_ToggleFiltersButton.d.ts +1 -0
  28. package/dist/esm/buttons/MRT_ToggleGlobalFilterButton.d.ts +1 -0
  29. package/dist/esm/column.utils.d.ts +1 -0
  30. package/dist/esm/inputs/MRT_EditCellTextField.d.ts +1 -0
  31. package/dist/esm/inputs/MRT_GlobalFilterTextField.d.ts +1 -0
  32. package/dist/esm/material-react-table.esm.js +68 -43
  33. package/dist/esm/material-react-table.esm.js.map +1 -1
  34. package/dist/esm/menus/MRT_FilterOptionMenu.d.ts +3 -7
  35. package/dist/esm/menus/MRT_ShowHideColumnsMenu.d.ts +1 -0
  36. package/dist/esm/table/MRT_TableRoot.d.ts +1 -0
  37. package/dist/index.d.ts +28 -5
  38. package/package.json +2 -2
  39. package/src/MaterialReactTable.tsx +42 -7
  40. package/src/body/MRT_TableBody.tsx +1 -0
  41. package/src/body/MRT_TableBodyCell.tsx +6 -4
  42. package/src/body/MRT_TableBodyCellValue.tsx +10 -11
  43. package/src/body/MRT_TableBodyRow.tsx +14 -3
  44. package/src/column.utils.ts +1 -1
  45. package/src/head/MRT_TableHeadCellFilterContainer.tsx +3 -2
  46. package/src/inputs/MRT_FilterTextField.tsx +5 -8
  47. package/src/inputs/MRT_GlobalFilterTextField.tsx +2 -2
  48. package/src/menus/MRT_ColumnActionMenu.tsx +3 -3
  49. package/src/menus/MRT_FilterOptionMenu.tsx +50 -33
  50. package/src/table/MRT_TableRoot.tsx +18 -13
@@ -1,11 +1,7 @@
1
- import type { MRT_Header, MRT_TableInstance } from '..';
1
+ /// <reference types="react" />
2
+ import type { MRT_Header, MRT_InternalFilterOption, MRT_TableInstance } from '..';
2
3
  import { MRT_Localization } from '../localization';
3
- export declare const internalFilterOptions: (localization: MRT_Localization) => {
4
- option: string;
5
- symbol: string;
6
- label: string;
7
- divider: boolean;
8
- }[];
4
+ export declare const mrtFilterOptions: (localization: MRT_Localization) => MRT_InternalFilterOption[];
9
5
  interface Props<TData extends Record<string, any> = {}> {
10
6
  anchorEl: HTMLElement | null;
11
7
  header?: MRT_Header;
@@ -1,3 +1,4 @@
1
+ /// <reference types="react" />
1
2
  import type { MRT_TableInstance } from '..';
2
3
  interface Props<TData extends Record<string, any> = {}> {
3
4
  anchorEl: HTMLElement | null;
@@ -1,2 +1,3 @@
1
+ /// <reference types="react" />
1
2
  import type { MaterialReactTableProps } from '..';
2
3
  export declare const MRT_TableRoot: <TData extends Record<string, any> = {}>(props: MaterialReactTableProps<TData>) => JSX.Element;
package/dist/index.d.ts CHANGED
@@ -1,3 +1,4 @@
1
+ /// <reference types="react" />
1
2
  import { MutableRefObject, Dispatch, SetStateAction, ReactNode, DragEvent } from 'react';
2
3
  import { ButtonProps, TextFieldProps, TableCellProps, IconButtonProps, ToolbarProps, LinearProgressProps, CheckboxProps, SkeletonProps, TableBodyProps, TableRowProps, TableContainerProps, TableFooterProps, TableHeadProps, TablePaginationProps, PaperProps, TableProps, ChipProps, AlertProps } from '@mui/material';
3
4
  import { Row, Table, TableState, ColumnDef, DeepKeys, Column, Header, HeaderGroup, Cell, SortingFn, FilterFn, TableOptions, OnChangeFn } from '@tanstack/react-table';
@@ -345,7 +346,7 @@ declare type MRT_ColumnDef<TData extends Record<string, any> = {}> = Omit<Column
345
346
  enableClickToCopy?: boolean;
346
347
  enableColumnActions?: boolean;
347
348
  enableColumnDragging?: boolean;
348
- enableColumnFilterChangeMode?: boolean;
349
+ enableColumnFilterModes?: boolean;
349
350
  enableColumnOrdering?: boolean;
350
351
  enableEditing?: boolean;
351
352
  filterFn?: MRT_FilterFn<TData>;
@@ -407,6 +408,10 @@ declare type MRT_ColumnDef<TData extends Record<string, any> = {}> = Omit<Column
407
408
  table: MRT_TableInstance<TData>;
408
409
  column: MRT_Column<TData>;
409
410
  }) => TableCellProps);
411
+ renderColumnFilterModeMenuItems?: ({ table, column, }: {
412
+ table: MRT_TableInstance<TData>;
413
+ column: MRT_Column<TData>;
414
+ }) => ReactNode[];
410
415
  sortingFn?: MRT_SortingFn;
411
416
  };
412
417
  declare type MRT_DefinedColumnDef<TData extends Record<string, any> = {}> = Omit<MRT_ColumnDef<TData>, 'id'> & {
@@ -440,6 +445,12 @@ declare type MRT_SortingOption = LiteralUnion<string & keyof typeof MRT_SortingF
440
445
  declare type MRT_SortingFn<TData extends Record<string, any> = {}> = SortingFn<TData> | MRT_SortingOption;
441
446
  declare type MRT_FilterOption = LiteralUnion<string & keyof typeof MRT_FilterFns>;
442
447
  declare type MRT_FilterFn<TData extends Record<string, any> = {}> = FilterFn<TData> | MRT_FilterOption;
448
+ declare type MRT_InternalFilterOption = {
449
+ option: string;
450
+ symbol: string;
451
+ label: string;
452
+ divider: boolean;
453
+ };
443
454
  declare type MRT_DisplayColumnIds = 'mrt-row-actions' | 'mrt-row-drag' | 'mrt-row-expand' | 'mrt-row-numbers' | 'mrt-row-select';
444
455
  /**
445
456
  * `columns` and `data` props are the only required props, but there are over 150 other optional props.
@@ -463,13 +474,13 @@ declare type MaterialReactTableProps<TData extends Record<string, any> = {}> = O
463
474
  enableClickToCopy?: boolean;
464
475
  enableColumnActions?: boolean;
465
476
  enableColumnDragging?: boolean;
466
- enableColumnFilterChangeMode?: boolean;
477
+ enableColumnFilterModes?: boolean;
467
478
  enableColumnOrdering?: boolean;
468
479
  enableDensityToggle?: boolean;
469
480
  enableEditing?: boolean;
470
481
  enableExpandAll?: boolean;
471
482
  enableFullScreenToggle?: boolean;
472
- enableGlobalFilterChangeMode?: boolean;
483
+ enableGlobalFilterModes?: boolean;
473
484
  enableGlobalFilterRankedResults?: boolean;
474
485
  enablePagination?: boolean;
475
486
  enableRowActions?: boolean;
@@ -651,10 +662,21 @@ declare type MaterialReactTableProps<TData extends Record<string, any> = {}> = O
651
662
  renderBottomToolbarCustomActions?: ({ table, }: {
652
663
  table: MRT_TableInstance<TData>;
653
664
  }) => ReactNode;
665
+ renderColumnFilterModeMenuItems?: ({ column, internalFilterOptions, onSelectFilterMode, table, }: {
666
+ column: MRT_Column<TData>;
667
+ internalFilterOptions: MRT_InternalFilterOption[];
668
+ onSelectFilterMode: (filterMode: MRT_FilterOption) => void;
669
+ table: MRT_TableInstance<TData>;
670
+ }) => ReactNode;
654
671
  renderDetailPanel?: ({ row, table, }: {
655
672
  row: MRT_Row<TData>;
656
673
  table: MRT_TableInstance<TData>;
657
674
  }) => ReactNode;
675
+ renderGlobalFilterModeMenuItems?: ({ internalFilterOptions, onSelectFilterMode, table, }: {
676
+ internalFilterOptions: MRT_InternalFilterOption[];
677
+ onSelectFilterMode: (filterMode: MRT_FilterOption) => void;
678
+ table: MRT_TableInstance<TData>;
679
+ }) => ReactNode[];
658
680
  renderRowActionMenuItems?: ({ closeMenu, row, table, }: {
659
681
  closeMenu: () => void;
660
682
  row: MRT_Row<TData>;
@@ -675,11 +697,12 @@ declare type MaterialReactTableProps<TData extends Record<string, any> = {}> = O
675
697
  rowNumberMode?: 'original' | 'static';
676
698
  selectAllMode?: 'all' | 'page';
677
699
  state?: Partial<MRT_TableState<TData>>;
700
+ tableInstanceRef?: MutableRefObject<MRT_TableInstance<TData> | null>;
678
701
  virtualizerProps?: Partial<Options<HTMLDivElement>> | (({ table, }: {
679
702
  table: MRT_TableInstance<TData>;
680
703
  }) => Partial<Options<HTMLDivElement>>);
681
704
  };
682
- declare const _default: <TData extends Record<string, any> = {}>({ aggregationFns, autoResetExpanded, columnResizeMode, defaultColumn, editingMode, enableBottomToolbar, enableColumnActions, enableColumnFilterChangeMode, enableColumnFilters, enableColumnOrdering, enableColumnResizing, enableDensityToggle, enableExpandAll, enableFilters, enableFullScreenToggle, enableGlobalFilter, enableGlobalFilterChangeMode, enableGlobalFilterRankedResults, enableGrouping, enableHiding, enableMultiRowSelection, enableMultiSort, enablePagination, enablePinning, enableRowSelection, enableSelectAll, enableSorting, enableStickyHeader, enableTableFooter, enableTableHead, enableToolbarInternalActions, enableTopToolbar, filterFns, icons, localization, positionActionsColumn, positionExpandColumn, positionGlobalFilter, positionPagination, positionToolbarAlertBanner, positionToolbarDropZone, rowNumberMode, selectAllMode, sortingFns, ...rest }: MaterialReactTableProps<TData>) => JSX.Element;
705
+ declare const _default: <TData extends Record<string, any> = {}>({ aggregationFns, autoResetExpanded, columnResizeMode, defaultColumn, editingMode, enableBottomToolbar, enableColumnActions, enableColumnFilterModes, enableColumnFilters, enableColumnOrdering, enableColumnResizing, enableDensityToggle, enableExpandAll, enableFilters, enableFullScreenToggle, enableGlobalFilter, enableGlobalFilterModes, enableGlobalFilterRankedResults, enableGrouping, enableHiding, enableMultiRowSelection, enableMultiSort, enablePagination, enablePinning, enableRowSelection, enableSelectAll, enableSorting, enableStickyHeader, enableTableFooter, enableTableHead, enableToolbarInternalActions, enableTopToolbar, filterFns, icons, localization, positionActionsColumn, positionExpandColumn, positionGlobalFilter, positionPagination, positionToolbarAlertBanner, positionToolbarDropZone, rowNumberMode, selectAllMode, sortingFns, ...rest }: MaterialReactTableProps<TData>) => JSX.Element;
683
706
 
684
707
  interface Props$6<TData extends Record<string, any> = {}> {
685
708
  cell: MRT_Cell<TData>;
@@ -718,4 +741,4 @@ interface Props<TData extends Record<string, any> = {}> extends IconButtonProps
718
741
  }
719
742
  declare const MRT_ToggleGlobalFilterButton: <TData extends Record<string, any> = {}>({ table, ...rest }: Props<TData>) => JSX.Element;
720
743
 
721
- export { MRT_Cell, MRT_Column, MRT_ColumnDef, MRT_CopyButton, MRT_DefinedColumnDef, MRT_DisplayColumnIds, MRT_FilterFn, MRT_FilterOption, MRT_FullScreenToggleButton, MRT_GlobalFilterTextField, MRT_Header, MRT_HeaderGroup, MRT_Icons, MRT_Localization, MRT_Row, MRT_RowModel, MRT_ShowHideColumnsButton, MRT_SortingFn, MRT_SortingOption, MRT_TableInstance, MRT_TableState, MRT_ToggleDensePaddingButton, MRT_ToggleFiltersButton, MRT_ToggleGlobalFilterButton, MaterialReactTableProps, _default as default };
744
+ export { MRT_Cell, MRT_Column, MRT_ColumnDef, MRT_CopyButton, MRT_DefinedColumnDef, MRT_DisplayColumnIds, MRT_FilterFn, MRT_FilterOption, MRT_FullScreenToggleButton, MRT_GlobalFilterTextField, MRT_Header, MRT_HeaderGroup, MRT_Icons, MRT_InternalFilterOption, MRT_Localization, MRT_Row, MRT_RowModel, MRT_ShowHideColumnsButton, MRT_SortingFn, MRT_SortingOption, MRT_TableInstance, MRT_TableState, MRT_ToggleDensePaddingButton, MRT_ToggleFiltersButton, MRT_ToggleGlobalFilterButton, MaterialReactTableProps, _default as default };
package/package.json CHANGED
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "0.38.3",
2
+ "version": "0.40.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.",
@@ -78,7 +78,7 @@
78
78
  "react": "^18.2.0",
79
79
  "react-dom": "^18.2.0",
80
80
  "react-is": "^18.2.0",
81
- "rollup": "^2.78.0",
81
+ "rollup": "^2.78.1",
82
82
  "rollup-plugin-dts": "^4.2.2",
83
83
  "rollup-plugin-peer-deps-external": "^2.2.4",
84
84
  "size-limit": "^8.0.1",
@@ -260,7 +260,7 @@ export type MRT_ColumnDef<TData extends Record<string, any> = {}> = Omit<
260
260
  enableClickToCopy?: boolean;
261
261
  enableColumnActions?: boolean;
262
262
  enableColumnDragging?: boolean;
263
- enableColumnFilterChangeMode?: boolean;
263
+ enableColumnFilterModes?: boolean;
264
264
  enableColumnOrdering?: boolean;
265
265
  enableEditing?: boolean;
266
266
  filterFn?: MRT_FilterFn<TData>;
@@ -362,6 +362,13 @@ export type MRT_ColumnDef<TData extends Record<string, any> = {}> = Omit<
362
362
  table: MRT_TableInstance<TData>;
363
363
  column: MRT_Column<TData>;
364
364
  }) => TableCellProps);
365
+ renderColumnFilterModeMenuItems?: ({
366
+ table,
367
+ column,
368
+ }: {
369
+ table: MRT_TableInstance<TData>;
370
+ column: MRT_Column<TData>;
371
+ }) => ReactNode[];
365
372
  sortingFn?: MRT_SortingFn;
366
373
  };
367
374
 
@@ -432,6 +439,13 @@ export type MRT_FilterFn<TData extends Record<string, any> = {}> =
432
439
  | FilterFn<TData>
433
440
  | MRT_FilterOption;
434
441
 
442
+ export type MRT_InternalFilterOption = {
443
+ option: string;
444
+ symbol: string;
445
+ label: string;
446
+ divider: boolean;
447
+ };
448
+
435
449
  export type MRT_DisplayColumnIds =
436
450
  | 'mrt-row-actions'
437
451
  | 'mrt-row-drag'
@@ -472,13 +486,13 @@ export type MaterialReactTableProps<TData extends Record<string, any> = {}> =
472
486
  enableClickToCopy?: boolean;
473
487
  enableColumnActions?: boolean;
474
488
  enableColumnDragging?: boolean;
475
- enableColumnFilterChangeMode?: boolean;
489
+ enableColumnFilterModes?: boolean;
476
490
  enableColumnOrdering?: boolean;
477
491
  enableDensityToggle?: boolean;
478
492
  enableEditing?: boolean;
479
493
  enableExpandAll?: boolean;
480
494
  enableFullScreenToggle?: boolean;
481
- enableGlobalFilterChangeMode?: boolean;
495
+ enableGlobalFilterModes?: boolean;
482
496
  enableGlobalFilterRankedResults?: boolean;
483
497
  enablePagination?: boolean;
484
498
  enableRowActions?: boolean;
@@ -768,6 +782,17 @@ export type MaterialReactTableProps<TData extends Record<string, any> = {}> =
768
782
  }: {
769
783
  table: MRT_TableInstance<TData>;
770
784
  }) => ReactNode;
785
+ renderColumnFilterModeMenuItems?: ({
786
+ column,
787
+ internalFilterOptions,
788
+ onSelectFilterMode,
789
+ table,
790
+ }: {
791
+ column: MRT_Column<TData>;
792
+ internalFilterOptions: MRT_InternalFilterOption[];
793
+ onSelectFilterMode: (filterMode: MRT_FilterOption) => void;
794
+ table: MRT_TableInstance<TData>;
795
+ }) => ReactNode;
771
796
  renderDetailPanel?: ({
772
797
  row,
773
798
  table,
@@ -775,6 +800,15 @@ export type MaterialReactTableProps<TData extends Record<string, any> = {}> =
775
800
  row: MRT_Row<TData>;
776
801
  table: MRT_TableInstance<TData>;
777
802
  }) => ReactNode;
803
+ renderGlobalFilterModeMenuItems?: ({
804
+ internalFilterOptions,
805
+ onSelectFilterMode,
806
+ table,
807
+ }: {
808
+ internalFilterOptions: MRT_InternalFilterOption[];
809
+ onSelectFilterMode: (filterMode: MRT_FilterOption) => void;
810
+ table: MRT_TableInstance<TData>;
811
+ }) => ReactNode[];
778
812
  renderRowActionMenuItems?: ({
779
813
  closeMenu,
780
814
  row,
@@ -807,6 +841,7 @@ export type MaterialReactTableProps<TData extends Record<string, any> = {}> =
807
841
  rowNumberMode?: 'original' | 'static';
808
842
  selectAllMode?: 'all' | 'page';
809
843
  state?: Partial<MRT_TableState<TData>>;
844
+ tableInstanceRef?: MutableRefObject<MRT_TableInstance<TData> | null>;
810
845
  virtualizerProps?:
811
846
  | Partial<VirtualizerOptions<HTMLDivElement>>
812
847
  | (({
@@ -831,7 +866,7 @@ export default <TData extends Record<string, any> = {}>({
831
866
  editingMode = 'modal',
832
867
  enableBottomToolbar = true,
833
868
  enableColumnActions = true,
834
- enableColumnFilterChangeMode = false,
869
+ enableColumnFilterModes = false,
835
870
  enableColumnFilters = true,
836
871
  enableColumnOrdering = false,
837
872
  enableColumnResizing = false,
@@ -840,7 +875,7 @@ export default <TData extends Record<string, any> = {}>({
840
875
  enableFilters = true,
841
876
  enableFullScreenToggle = true,
842
877
  enableGlobalFilter = true,
843
- enableGlobalFilterChangeMode = false,
878
+ enableGlobalFilterModes = false,
844
879
  enableGlobalFilterRankedResults = true,
845
880
  enableGrouping = false,
846
881
  enableHiding = true,
@@ -878,7 +913,7 @@ export default <TData extends Record<string, any> = {}>({
878
913
  editingMode={editingMode}
879
914
  enableBottomToolbar={enableBottomToolbar}
880
915
  enableColumnActions={enableColumnActions}
881
- enableColumnFilterChangeMode={enableColumnFilterChangeMode}
916
+ enableColumnFilterModes={enableColumnFilterModes}
882
917
  enableColumnFilters={enableColumnFilters}
883
918
  enableColumnOrdering={enableColumnOrdering}
884
919
  enableColumnResizing={enableColumnResizing}
@@ -887,7 +922,7 @@ export default <TData extends Record<string, any> = {}>({
887
922
  enableFilters={enableFilters}
888
923
  enableFullScreenToggle={enableFullScreenToggle}
889
924
  enableGlobalFilter={enableGlobalFilter}
890
- enableGlobalFilterChangeMode={enableGlobalFilterChangeMode}
925
+ enableGlobalFilterModes={enableGlobalFilterModes}
891
926
  enableGlobalFilterRankedResults={enableGlobalFilterRankedResults}
892
927
  enableGrouping={enableGrouping}
893
928
  enableHiding={enableHiding}
@@ -124,6 +124,7 @@ export const MRT_TableBody: FC<Props> = ({ table, tableContainerRef }) => {
124
124
  enableRowVirtualization ? rowOrVirtualRow.index : rowIndex
125
125
  }
126
126
  table={table}
127
+ virtualRow={enableRowVirtualization ? rowOrVirtualRow : null}
127
128
  />
128
129
  );
129
130
  },
@@ -109,7 +109,8 @@ export const MRT_TableBodyCell: FC<Props> = ({
109
109
  [isLoading, showSkeletons],
110
110
  );
111
111
 
112
- const handleDoubleClick = (_event: MouseEvent<HTMLTableCellElement>) => {
112
+ const handleDoubleClick = (event: MouseEvent<HTMLTableCellElement>) => {
113
+ tableCellProps?.onDoubleClick?.(event);
113
114
  if (
114
115
  (enableEditing || columnDef.enableEditing) &&
115
116
  columnDef.enableEditing !== false &&
@@ -143,7 +144,8 @@ export const MRT_TableBodyCell: FC<Props> = ({
143
144
  );
144
145
  };
145
146
 
146
- const handleDragEnter = (_e: DragEvent) => {
147
+ const handleDragEnter = (e: DragEvent<HTMLTableCellElement>) => {
148
+ tableCellProps?.onDragEnter?.(e);
147
149
  if (enableGrouping && hoveredColumn?.id === 'drop-zone') {
148
150
  setHoveredColumn(null);
149
151
  }
@@ -179,9 +181,9 @@ export const MRT_TableBodyCell: FC<Props> = ({
179
181
 
180
182
  return (
181
183
  <TableCell
182
- onDoubleClick={handleDoubleClick}
183
- onDragEnter={handleDragEnter}
184
184
  {...tableCellProps}
185
+ onDragEnter={handleDragEnter}
186
+ onDoubleClick={handleDoubleClick}
185
187
  sx={(theme) => ({
186
188
  backgroundColor: column.getIsPinned()
187
189
  ? alpha(lighten(theme.palette.background.default, 0.04), 0.95)
@@ -12,8 +12,8 @@ export const MRT_TableBodyCellValue: FC<Props> = ({ cell, table }) => {
12
12
 
13
13
  return (
14
14
  <>
15
- {cell.getIsAggregated() && column.columnDef.aggregationFn
16
- ? columnDef.AggregatedCell?.({
15
+ {cell.getIsAggregated() && columnDef.AggregatedCell
16
+ ? columnDef.AggregatedCell({
17
17
  cell,
18
18
  column,
19
19
  row,
@@ -21,15 +21,14 @@ export const MRT_TableBodyCellValue: FC<Props> = ({ cell, table }) => {
21
21
  })
22
22
  : row.getIsGrouped() && !cell.getIsGrouped()
23
23
  ? null
24
- : (cell.getIsGrouped() &&
25
- columnDef.GroupedCell?.({
26
- cell,
27
- column,
28
- row,
29
- table,
30
- })) ||
31
- (columnDef?.Cell?.({ cell, column, row, table }) ??
32
- cell.renderValue())}
24
+ : cell.getIsGrouped() && columnDef.GroupedCell
25
+ ? columnDef.GroupedCell({
26
+ cell,
27
+ column,
28
+ row,
29
+ table,
30
+ })
31
+ : columnDef?.Cell?.({ cell, column, row, table }) ?? cell.renderValue()}
33
32
  </>
34
33
  );
35
34
  };
@@ -8,9 +8,15 @@ interface Props {
8
8
  row: MRT_Row;
9
9
  rowIndex: number;
10
10
  table: MRT_TableInstance;
11
+ virtualRow?: any;
11
12
  }
12
13
 
13
- export const MRT_TableBodyRow: FC<Props> = ({ row, rowIndex, table }) => {
14
+ export const MRT_TableBodyRow: FC<Props> = ({
15
+ row,
16
+ rowIndex,
17
+ table,
18
+ virtualRow,
19
+ }) => {
14
20
  const theme = useTheme();
15
21
  const {
16
22
  getIsSomeColumnsPinned,
@@ -31,7 +37,7 @@ export const MRT_TableBodyRow: FC<Props> = ({ row, rowIndex, table }) => {
31
37
  }
32
38
  };
33
39
 
34
- const rowRef = useRef<HTMLTableRowElement>(null);
40
+ const rowRef = useRef<HTMLTableRowElement | null>(null);
35
41
 
36
42
  const draggingBorder =
37
43
  draggingRow?.id === row.id
@@ -52,7 +58,12 @@ export const MRT_TableBodyRow: FC<Props> = ({ row, rowIndex, table }) => {
52
58
  onDragEnter={handleDragEnter}
53
59
  hover
54
60
  selected={row.getIsSelected()}
55
- ref={rowRef}
61
+ ref={(node) => {
62
+ rowRef.current = node;
63
+ if (virtualRow?.measureRef) {
64
+ virtualRow.measureRef = node;
65
+ }
66
+ }}
56
67
  {...tableRowProps}
57
68
  sx={(theme) => ({
58
69
  backgroundColor: lighten(theme.palette.background.default, 0.06),
@@ -25,7 +25,7 @@ export const defaultDisplayColumnDefOptions = {
25
25
  enableSorting: false,
26
26
  } as Partial<MRT_ColumnDef>;
27
27
 
28
- const getColumnId = <TData extends Record<string, any> = {}>(
28
+ export const getColumnId = <TData extends Record<string, any> = {}>(
29
29
  columnDef: MRT_ColumnDef<TData>,
30
30
  ): string =>
31
31
  columnDef.id ?? columnDef.accessorKey?.toString?.() ?? columnDef.header;
@@ -14,13 +14,14 @@ export const MRT_TableHeadCellFilterContainer: FC<Props> = ({
14
14
  table,
15
15
  }) => {
16
16
  const { getState } = table;
17
- const { columnFilterFns, showColumnFilters } = getState();
17
+ const { showColumnFilters } = getState();
18
18
  const { column } = header;
19
+ const { columnDef } = column;
19
20
 
20
21
  return (
21
22
  <Collapse in={showColumnFilters} mountOnEnter unmountOnExit>
22
23
  {['between', 'betweenInclusive', 'inNumberRange'].includes(
23
- columnFilterFns[column.id],
24
+ columnDef._filterFn,
24
25
  ) ? (
25
26
  <MRT_FilterRangeFields header={header} table={table} />
26
27
  ) : (
@@ -33,9 +33,8 @@ export const MRT_FilterTextField: FC<Props> = ({
33
33
  table,
34
34
  }) => {
35
35
  const {
36
- getState,
37
36
  options: {
38
- enableColumnFilterChangeMode,
37
+ enableColumnFilterModes,
39
38
  columnFilterModeOptions,
40
39
  icons: { FilterListIcon, CloseIcon },
41
40
  localization,
@@ -46,7 +45,6 @@ export const MRT_FilterTextField: FC<Props> = ({
46
45
  } = table;
47
46
  const { column } = header;
48
47
  const { columnDef } = column;
49
- const { columnFilterFns } = getState();
50
48
 
51
49
  const mTableHeadCellFilterTextFieldProps =
52
50
  muiTableHeadCellFilterTextFieldProps instanceof Function
@@ -78,8 +76,7 @@ export const MRT_FilterTextField: FC<Props> = ({
78
76
  const isTextboxFilter =
79
77
  columnDef.filterVariant === 'text' ||
80
78
  (!isSelectFilter && !isMultiSelectFilter);
81
-
82
- const currentFilterOption = columnFilterFns?.[header.id];
79
+ const currentFilterOption = columnDef._filterFn;
83
80
  const filterChipLabel = ['empty', 'notEmpty'].includes(currentFilterOption)
84
81
  ? //@ts-ignore
85
82
  localization[
@@ -99,8 +96,8 @@ export const MRT_FilterTextField: FC<Props> = ({
99
96
  const allowedColumnFilterOptions =
100
97
  columnDef?.columnFilterModeOptions ?? columnFilterModeOptions;
101
98
  const showChangeModeButton =
102
- enableColumnFilterChangeMode &&
103
- columnDef.enableColumnFilterChangeMode !== false &&
99
+ enableColumnFilterModes &&
100
+ columnDef.enableColumnFilterModes !== false &&
104
101
  !rangeFilterIndex &&
105
102
  (allowedColumnFilterOptions === undefined ||
106
103
  !!allowedColumnFilterOptions?.length);
@@ -299,7 +296,7 @@ export const MRT_FilterTextField: FC<Props> = ({
299
296
  }}
300
297
  sx={(theme) => ({
301
298
  p: 0,
302
- minWidth: !filterChipLabel ? '150px' : 'auto',
299
+ minWidth: !filterChipLabel ? '120px' : 'auto',
303
300
  width: '100%',
304
301
  '& .MuiSelect-icon': {
305
302
  mr: '1.5rem',
@@ -23,7 +23,7 @@ export const MRT_GlobalFilterTextField = <
23
23
  getState,
24
24
  setGlobalFilter,
25
25
  options: {
26
- enableGlobalFilterChangeMode,
26
+ enableGlobalFilterModes,
27
27
  icons: { SearchIcon, CloseIcon },
28
28
  localization,
29
29
  muiSearchTextFieldProps,
@@ -69,7 +69,7 @@ export const MRT_GlobalFilterTextField = <
69
69
  value={searchValue ?? ''}
70
70
  variant="standard"
71
71
  InputProps={{
72
- startAdornment: enableGlobalFilterChangeMode ? (
72
+ startAdornment: enableGlobalFilterModes ? (
73
73
  <InputAdornment position="start">
74
74
  <Tooltip arrow title={localization.changeSearchMode}>
75
75
  <IconButton
@@ -34,7 +34,7 @@ export const MRT_ColumnActionMenu: FC<Props> = ({
34
34
  toggleAllColumnsVisible,
35
35
  setColumnOrder,
36
36
  options: {
37
- enableColumnFilterChangeMode,
37
+ enableColumnFilterModes,
38
38
  enableColumnFilters,
39
39
  enableColumnResizing,
40
40
  enableGrouping,
@@ -138,8 +138,8 @@ export const MRT_ColumnActionMenu: FC<Props> = ({
138
138
  columnDef?.columnFilterModeOptions ?? columnFilterModeOptions;
139
139
 
140
140
  const showFilterModeSubMenu =
141
- enableColumnFilterChangeMode &&
142
- columnDef.enableColumnFilterChangeMode !== false &&
141
+ enableColumnFilterModes &&
142
+ columnDef.enableColumnFilterModes !== false &&
143
143
  !isSelectFilter &&
144
144
  (allowedColumnFilterOptions === undefined ||
145
145
  !!allowedColumnFilterOptions?.length);
@@ -1,16 +1,16 @@
1
1
  import React, { useMemo } from 'react';
2
2
  import { Box, Menu, MenuItem } from '@mui/material';
3
- import type { MRT_FilterOption, MRT_Header, MRT_TableInstance } from '..';
3
+ import type {
4
+ MRT_FilterOption,
5
+ MRT_Header,
6
+ MRT_InternalFilterOption,
7
+ MRT_TableInstance,
8
+ } from '..';
4
9
  import { MRT_Localization } from '../localization';
5
10
 
6
- export const internalFilterOptions = (
11
+ export const mrtFilterOptions = (
7
12
  localization: MRT_Localization,
8
- ): {
9
- option: string;
10
- symbol: string;
11
- label: string;
12
- divider: boolean;
13
- }[] => [
13
+ ): MRT_InternalFilterOption[] => [
14
14
  {
15
15
  option: 'fuzzy',
16
16
  symbol: '≈',
@@ -118,31 +118,33 @@ export const MRT_FilterOptionMenu = <TData extends Record<string, any> = {}>({
118
118
  enabledGlobalFilterOptions,
119
119
  columnFilterModeOptions,
120
120
  localization,
121
+ renderColumnFilterModeMenuItems,
122
+ renderGlobalFilterModeMenuItems,
121
123
  },
122
124
  setColumnFilterFns,
123
125
  setGlobalFilterFn,
124
126
  } = table;
125
- const { columnFilterFns, globalFilterFn, density } = getState();
127
+ const { globalFilterFn, density } = getState();
126
128
  const { column } = header ?? {};
127
129
  const { columnDef } = column ?? {};
128
130
 
129
131
  const allowedColumnFilterOptions =
130
132
  columnDef?.columnFilterModeOptions ?? columnFilterModeOptions;
131
133
 
132
- const filterOptions = useMemo(
134
+ const internalFilterOptions = useMemo(
133
135
  () =>
134
- internalFilterOptions(localization).filter((filterOption) =>
136
+ mrtFilterOptions(localization).filter((filterOption) =>
135
137
  columnDef
136
138
  ? allowedColumnFilterOptions === undefined ||
137
139
  allowedColumnFilterOptions?.includes(filterOption.option)
138
140
  : (!enabledGlobalFilterOptions ||
139
141
  enabledGlobalFilterOptions.includes(filterOption.option)) &&
140
- ['fuzzy', 'contains'].includes(filterOption.option),
142
+ ['fuzzy', 'contains', 'startsWith'].includes(filterOption.option),
141
143
  ),
142
144
  [],
143
145
  );
144
146
 
145
- const handleSelectFilterType = (option: MRT_FilterOption) => {
147
+ const handleSelectFilterMode = (option: MRT_FilterOption) => {
146
148
  if (header && column) {
147
149
  setColumnFilterFns((prev: { [key: string]: any }) => ({
148
150
  ...prev,
@@ -162,7 +164,8 @@ export const MRT_FilterOptionMenu = <TData extends Record<string, any> = {}>({
162
164
  onSelect?.();
163
165
  };
164
166
 
165
- const filterOption = !!header ? columnFilterFns[header.id] : globalFilterFn;
167
+ const filterOption =
168
+ !!header && columnDef ? columnDef._filterFn : globalFilterFn;
166
169
 
167
170
  return (
168
171
  <Menu
@@ -174,25 +177,39 @@ export const MRT_FilterOptionMenu = <TData extends Record<string, any> = {}>({
174
177
  dense: density === 'compact',
175
178
  }}
176
179
  >
177
- {filterOptions.map(({ option, label, divider, symbol }, index) => (
178
- <MenuItem
179
- divider={divider}
180
- key={index}
181
- onClick={() => handleSelectFilterType(option as MRT_FilterOption)}
182
- selected={option === filterOption}
183
- sx={{
184
- py: '6px',
185
- my: 0,
186
- alignItems: 'center',
187
- display: 'flex',
188
- gap: '2ch',
189
- }}
190
- value={option}
191
- >
192
- <Box sx={{ fontSize: '1.25rem', width: '2ch' }}>{symbol}</Box>
193
- {label}
194
- </MenuItem>
195
- ))}
180
+ {(header && column
181
+ ? renderColumnFilterModeMenuItems?.({
182
+ column: column as any,
183
+ internalFilterOptions,
184
+ onSelectFilterMode: handleSelectFilterMode,
185
+ table,
186
+ })
187
+ : renderGlobalFilterModeMenuItems?.({
188
+ internalFilterOptions,
189
+ onSelectFilterMode: handleSelectFilterMode,
190
+ table,
191
+ })) ??
192
+ internalFilterOptions.map(
193
+ ({ option, label, divider, symbol }, index) => (
194
+ <MenuItem
195
+ divider={divider}
196
+ key={index}
197
+ onClick={() => handleSelectFilterMode(option as MRT_FilterOption)}
198
+ selected={option === filterOption}
199
+ sx={{
200
+ alignItems: 'center',
201
+ display: 'flex',
202
+ gap: '2ch',
203
+ my: 0,
204
+ py: '6px',
205
+ }}
206
+ value={option}
207
+ >
208
+ <Box sx={{ fontSize: '1.25rem', width: '2ch' }}>{symbol}</Box>
209
+ {label}
210
+ </MenuItem>
211
+ ),
212
+ )}
196
213
  </Menu>
197
214
  );
198
215
  };