material-react-table 0.40.3 → 0.40.6

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.
@@ -216,9 +216,16 @@ export declare type MRT_ColumnDef<TData extends Record<string, any> = {}> = Omit
216
216
  table: MRT_TableInstance<TData>;
217
217
  column: MRT_Column<TData>;
218
218
  }) => TableCellProps);
219
- renderColumnFilterModeMenuItems?: ({ table, column, }: {
219
+ renderColumnActionsMenuItems?: ({ closeMenu, column, table, }: {
220
+ closeMenu: () => void;
221
+ column: MRT_Column<TData>;
220
222
  table: MRT_TableInstance<TData>;
223
+ }) => ReactNode[];
224
+ renderColumnFilterModeMenuItems?: ({ column, internalFilterOptions, onSelectFilterMode, table, }: {
221
225
  column: MRT_Column<TData>;
226
+ internalFilterOptions: MRT_InternalFilterOption[];
227
+ onSelectFilterMode: (filterMode: MRT_FilterOption) => void;
228
+ table: MRT_TableInstance<TData>;
222
229
  }) => ReactNode[];
223
230
  sortingFn?: MRT_SortingFn;
224
231
  };
@@ -470,12 +477,17 @@ export declare type MaterialReactTableProps<TData extends Record<string, any> =
470
477
  renderBottomToolbarCustomActions?: ({ table, }: {
471
478
  table: MRT_TableInstance<TData>;
472
479
  }) => ReactNode;
480
+ renderColumnActionsMenuItems?: ({ column, closeMenu, table, }: {
481
+ column: MRT_Column<TData>;
482
+ closeMenu: () => void;
483
+ table: MRT_TableInstance<TData>;
484
+ }) => ReactNode[];
473
485
  renderColumnFilterModeMenuItems?: ({ column, internalFilterOptions, onSelectFilterMode, table, }: {
474
486
  column: MRT_Column<TData>;
475
487
  internalFilterOptions: MRT_InternalFilterOption[];
476
488
  onSelectFilterMode: (filterMode: MRT_FilterOption) => void;
477
489
  table: MRT_TableInstance<TData>;
478
- }) => ReactNode;
490
+ }) => ReactNode[];
479
491
  renderDetailPanel?: ({ row, table, }: {
480
492
  row: MRT_Row<TData>;
481
493
  table: MRT_TableInstance<TData>;
package/dist/cjs/index.js CHANGED
@@ -390,7 +390,7 @@ const mrtFilterOptions = (localization) => [
390
390
  },
391
391
  ];
392
392
  const MRT_FilterOptionMenu = ({ anchorEl, header, onSelect, setAnchorEl, table, }) => {
393
- var _a, _b;
393
+ var _a, _b, _c, _d;
394
394
  const { getState, options: { enabledGlobalFilterOptions, columnFilterModeOptions, localization, renderColumnFilterModeMenuItems, renderGlobalFilterModeMenuItems, }, setColumnFilterFns, setGlobalFilterFn, } = table;
395
395
  const { globalFilterFn, density } = getState();
396
396
  const { column } = header !== null && header !== void 0 ? header : {};
@@ -424,8 +424,13 @@ const MRT_FilterOptionMenu = ({ anchorEl, header, onSelect, setAnchorEl, table,
424
424
  const filterOption = !!header && columnDef ? columnDef._filterFn : globalFilterFn;
425
425
  return (React__default["default"].createElement(material.Menu, { anchorEl: anchorEl, anchorOrigin: { vertical: 'center', horizontal: 'right' }, onClose: () => setAnchorEl(null), open: !!anchorEl, MenuListProps: {
426
426
  dense: density === 'compact',
427
- } }, (_b = (header && column
428
- ? renderColumnFilterModeMenuItems === null || renderColumnFilterModeMenuItems === void 0 ? void 0 : renderColumnFilterModeMenuItems({
427
+ } }, (_d = (header && column && columnDef
428
+ ? (_c = (_b = columnDef.renderColumnFilterModeMenuItems) === null || _b === void 0 ? void 0 : _b.call(columnDef, {
429
+ column: column,
430
+ internalFilterOptions,
431
+ onSelectFilterMode: handleSelectFilterMode,
432
+ table,
433
+ })) !== null && _c !== void 0 ? _c : renderColumnFilterModeMenuItems === null || renderColumnFilterModeMenuItems === void 0 ? void 0 : renderColumnFilterModeMenuItems({
429
434
  column: column,
430
435
  internalFilterOptions,
431
436
  onSelectFilterMode: handleSelectFilterMode,
@@ -435,7 +440,7 @@ const MRT_FilterOptionMenu = ({ anchorEl, header, onSelect, setAnchorEl, table,
435
440
  internalFilterOptions,
436
441
  onSelectFilterMode: handleSelectFilterMode,
437
442
  table,
438
- }))) !== null && _b !== void 0 ? _b : internalFilterOptions.map(({ option, label, divider, symbol }, index) => (React__default["default"].createElement(material.MenuItem, { divider: divider, key: index, onClick: () => handleSelectFilterMode(option), selected: option === filterOption, sx: {
443
+ }))) !== null && _d !== void 0 ? _d : internalFilterOptions.map(({ option, label, divider, symbol }, index) => (React__default["default"].createElement(material.MenuItem, { divider: divider, key: index, onClick: () => handleSelectFilterMode(option), selected: option === filterOption, sx: {
439
444
  alignItems: 'center',
440
445
  display: 'flex',
441
446
  gap: '2ch',
@@ -731,8 +736,8 @@ const commonListItemStyles = {
731
736
  alignItems: 'center',
732
737
  };
733
738
  const MRT_ColumnActionMenu = ({ anchorEl, header, setAnchorEl, table, }) => {
734
- var _a, _b, _c, _d, _e, _f, _g;
735
- const { getState, toggleAllColumnsVisible, setColumnOrder, options: { enableColumnFilterModes, enableColumnFilters, enableColumnResizing, enableGrouping, enableHiding, enablePinning, enableSorting, columnFilterModeOptions, icons: { ArrowRightIcon, ClearAllIcon, ViewColumnIcon, DynamicFeedIcon, FilterListIcon, FilterListOffIcon, PushPinIcon, SortIcon, RestartAltIcon, VisibilityOffIcon, }, localization, }, refs: { filterInputRefs }, setShowFilters, } = table;
739
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k;
740
+ const { getState, toggleAllColumnsVisible, setColumnOrder, options: { columnFilterModeOptions, enableColumnFilterModes, enableColumnFilters, enableColumnResizing, enableGrouping, enableHiding, enablePinning, enableSorting, icons: { ArrowRightIcon, ClearAllIcon, ViewColumnIcon, DynamicFeedIcon, FilterListIcon, FilterListOffIcon, PushPinIcon, SortIcon, RestartAltIcon, VisibilityOffIcon, }, localization, renderColumnActionsMenuItems, }, refs: { filterInputRefs }, setShowFilters, } = table;
736
741
  const { column } = header;
737
742
  const { columnDef } = column;
738
743
  const { columnSizing, columnVisibility, density } = getState();
@@ -797,25 +802,32 @@ const MRT_ColumnActionMenu = ({ anchorEl, header, setAnchorEl, table, }) => {
797
802
  !!(allowedColumnFilterOptions === null || allowedColumnFilterOptions === void 0 ? void 0 : allowedColumnFilterOptions.length));
798
803
  return (React__default["default"].createElement(material.Menu, { anchorEl: anchorEl, open: !!anchorEl, onClose: () => setAnchorEl(null), MenuListProps: {
799
804
  dense: density === 'compact',
800
- } },
801
- enableSorting &&
802
- column.getCanSort() && [
803
- React__default["default"].createElement(material.MenuItem, { disabled: !column.getIsSorted(), key: 0, onClick: handleClearSort, sx: commonMenuItemStyles },
804
- React__default["default"].createElement(material.Box, { sx: commonListItemStyles },
805
- React__default["default"].createElement(material.ListItemIcon, null,
806
- React__default["default"].createElement(ClearAllIcon, null)),
807
- localization.clearSort)),
808
- React__default["default"].createElement(material.MenuItem, { disabled: column.getIsSorted() === 'asc', key: 1, onClick: handleSortAsc, sx: commonMenuItemStyles },
809
- React__default["default"].createElement(material.Box, { sx: commonListItemStyles },
810
- React__default["default"].createElement(material.ListItemIcon, null,
811
- React__default["default"].createElement(SortIcon, { style: { transform: 'rotate(180deg) scaleX(-1)' } })), (_b = localization.sortByColumnAsc) === null || _b === void 0 ? void 0 :
812
- _b.replace('{column}', String(columnDef.header)))),
813
- React__default["default"].createElement(material.MenuItem, { divider: enableColumnFilters || enableGrouping || enableHiding, key: 2, disabled: column.getIsSorted() === 'desc', onClick: handleSortDesc, sx: commonMenuItemStyles },
814
- React__default["default"].createElement(material.Box, { sx: commonListItemStyles },
815
- React__default["default"].createElement(material.ListItemIcon, null,
816
- React__default["default"].createElement(SortIcon, null)), (_c = localization.sortByColumnDesc) === null || _c === void 0 ? void 0 :
817
- _c.replace('{column}', String(columnDef.header)))),
818
- ],
805
+ } }, (_d = (_c = (_b = columnDef.renderColumnActionsMenuItems) === null || _b === void 0 ? void 0 : _b.call(columnDef, {
806
+ closeMenu: () => setAnchorEl(null),
807
+ column,
808
+ table,
809
+ })) !== null && _c !== void 0 ? _c : renderColumnActionsMenuItems === null || renderColumnActionsMenuItems === void 0 ? void 0 : renderColumnActionsMenuItems({
810
+ closeMenu: () => setAnchorEl(null),
811
+ column,
812
+ table,
813
+ })) !== null && _d !== void 0 ? _d : (enableSorting &&
814
+ column.getCanSort() && [
815
+ React__default["default"].createElement(material.MenuItem, { disabled: !column.getIsSorted(), key: 0, onClick: handleClearSort, sx: commonMenuItemStyles },
816
+ React__default["default"].createElement(material.Box, { sx: commonListItemStyles },
817
+ React__default["default"].createElement(material.ListItemIcon, null,
818
+ React__default["default"].createElement(ClearAllIcon, null)),
819
+ localization.clearSort)),
820
+ React__default["default"].createElement(material.MenuItem, { disabled: column.getIsSorted() === 'asc', key: 1, onClick: handleSortAsc, sx: commonMenuItemStyles },
821
+ React__default["default"].createElement(material.Box, { sx: commonListItemStyles },
822
+ React__default["default"].createElement(material.ListItemIcon, null,
823
+ React__default["default"].createElement(SortIcon, { style: { transform: 'rotate(180deg) scaleX(-1)' } })), (_e = localization.sortByColumnAsc) === null || _e === void 0 ? void 0 :
824
+ _e.replace('{column}', String(columnDef.header)))),
825
+ React__default["default"].createElement(material.MenuItem, { divider: enableColumnFilters || enableGrouping || enableHiding, key: 2, disabled: column.getIsSorted() === 'desc', onClick: handleSortDesc, sx: commonMenuItemStyles },
826
+ React__default["default"].createElement(material.Box, { sx: commonListItemStyles },
827
+ React__default["default"].createElement(material.ListItemIcon, null,
828
+ React__default["default"].createElement(SortIcon, null)), (_f = localization.sortByColumnDesc) === null || _f === void 0 ? void 0 :
829
+ _f.replace('{column}', String(columnDef.header)))),
830
+ ]),
819
831
  enableColumnFilters &&
820
832
  column.getCanFilter() &&
821
833
  [
@@ -827,8 +839,8 @@ const MRT_ColumnActionMenu = ({ anchorEl, header, setAnchorEl, table, }) => {
827
839
  React__default["default"].createElement(material.MenuItem, { divider: enableGrouping || enableHiding, key: 1, onClick: handleFilterByColumn, sx: commonMenuItemStyles },
828
840
  React__default["default"].createElement(material.Box, { sx: commonListItemStyles },
829
841
  React__default["default"].createElement(material.ListItemIcon, null,
830
- React__default["default"].createElement(FilterListIcon, null)), (_d = localization.filterByColumn) === null || _d === void 0 ? void 0 :
831
- _d.replace('{column}', String(columnDef.header))),
842
+ React__default["default"].createElement(FilterListIcon, null)), (_g = localization.filterByColumn) === null || _g === void 0 ? void 0 :
843
+ _g.replace('{column}', String(columnDef.header))),
832
844
  showFilterModeSubMenu && (React__default["default"].createElement(material.IconButton, { onClick: handleOpenFilterModeMenu, onMouseEnter: handleOpenFilterModeMenu, size: "small", sx: { p: 0 } },
833
845
  React__default["default"].createElement(ArrowRightIcon, null)))),
834
846
  showFilterModeSubMenu && (React__default["default"].createElement(MRT_FilterOptionMenu, { anchorEl: filterMenuAnchorEl, header: header, key: 2, onSelect: handleFilterByColumn, setAnchorEl: setFilterMenuAnchorEl, table: table })),
@@ -838,8 +850,8 @@ const MRT_ColumnActionMenu = ({ anchorEl, header, setAnchorEl, table, }) => {
838
850
  React__default["default"].createElement(material.MenuItem, { divider: enablePinning, key: 0, onClick: handleGroupByColumn, sx: commonMenuItemStyles },
839
851
  React__default["default"].createElement(material.Box, { sx: commonListItemStyles },
840
852
  React__default["default"].createElement(material.ListItemIcon, null,
841
- React__default["default"].createElement(DynamicFeedIcon, null)), (_e = localization[column.getIsGrouped() ? 'ungroupByColumn' : 'groupByColumn']) === null || _e === void 0 ? void 0 :
842
- _e.replace('{column}', String(columnDef.header)))),
853
+ React__default["default"].createElement(DynamicFeedIcon, null)), (_h = localization[column.getIsGrouped() ? 'ungroupByColumn' : 'groupByColumn']) === null || _h === void 0 ? void 0 :
854
+ _h.replace('{column}', String(columnDef.header)))),
843
855
  ],
844
856
  enablePinning &&
845
857
  column.getCanPin() && [
@@ -871,14 +883,14 @@ const MRT_ColumnActionMenu = ({ anchorEl, header, setAnchorEl, table, }) => {
871
883
  React__default["default"].createElement(material.MenuItem, { disabled: columnDef.enableHiding === false, key: 0, onClick: handleHideColumn, sx: commonMenuItemStyles },
872
884
  React__default["default"].createElement(material.Box, { sx: commonListItemStyles },
873
885
  React__default["default"].createElement(material.ListItemIcon, null,
874
- React__default["default"].createElement(VisibilityOffIcon, null)), (_f = localization.hideColumn) === null || _f === void 0 ? void 0 :
875
- _f.replace('{column}', String(columnDef.header)))),
886
+ React__default["default"].createElement(VisibilityOffIcon, null)), (_j = localization.hideColumn) === null || _j === void 0 ? void 0 :
887
+ _j.replace('{column}', String(columnDef.header)))),
876
888
  React__default["default"].createElement(material.MenuItem, { disabled: !Object.values(columnVisibility).filter((visible) => !visible)
877
889
  .length, key: 1, onClick: handleShowAllColumns, sx: commonMenuItemStyles },
878
890
  React__default["default"].createElement(material.Box, { sx: commonListItemStyles },
879
891
  React__default["default"].createElement(material.ListItemIcon, null,
880
- React__default["default"].createElement(ViewColumnIcon, null)), (_g = localization.showAllColumns) === null || _g === void 0 ? void 0 :
881
- _g.replace('{column}', String(columnDef.header))),
892
+ React__default["default"].createElement(ViewColumnIcon, null)), (_k = localization.showAllColumns) === null || _k === void 0 ? void 0 :
893
+ _k.replace('{column}', String(columnDef.header))),
882
894
  React__default["default"].createElement(material.IconButton, { onClick: handleOpenShowHideColumnsMenu, onMouseEnter: handleOpenShowHideColumnsMenu, size: "small", sx: { p: 0 } },
883
895
  React__default["default"].createElement(ArrowRightIcon, null))),
884
896
  React__default["default"].createElement(MRT_ShowHideColumnsMenu, { anchorEl: showHideColumnsMenuAnchorEl, isSubMenu: true, key: 2, setAnchorEl: setShowHideColumnsMenuAnchorEl, table: table }),
@@ -1499,9 +1511,14 @@ const MRT_FilterTextField = ({ header, rangeFilterIndex, table, }) => {
1499
1511
  value = option.value;
1500
1512
  text = option.text;
1501
1513
  }
1502
- return (React__default["default"].createElement(material.MenuItem, { key: value, value: value },
1514
+ return (React__default["default"].createElement(material.MenuItem, { key: value, sx: {
1515
+ display: 'flex',
1516
+ m: 0,
1517
+ alignItems: 'center',
1518
+ gap: '0.5rem',
1519
+ }, value: value },
1503
1520
  isMultiSelectFilter && (React__default["default"].createElement(material.Checkbox, { checked: ((_a = column.getFilterValue()) !== null && _a !== void 0 ? _a : []).includes(value), sx: { mr: '0.5rem' } })),
1504
- React__default["default"].createElement(material.ListItemText, null, text)));
1521
+ text));
1505
1522
  })),
1506
1523
  React__default["default"].createElement(MRT_FilterOptionMenu, { anchorEl: anchorEl, header: header, setAnchorEl: setAnchorEl, table: table })));
1507
1524
  };
@@ -1522,8 +1539,7 @@ const MRT_TableHeadCellFilterContainer = ({ header, table, }) => {
1522
1539
 
1523
1540
  const MRT_TableHeadCellFilterLabel = ({ header, table }) => {
1524
1541
  var _a, _b, _c;
1525
- const { getState, options: { icons: { FilterAltIcon }, localization, }, } = table;
1526
- const { columnFilterFns } = getState();
1542
+ const { options: { icons: { FilterAltIcon }, localization, }, } = table;
1527
1543
  const { column } = header;
1528
1544
  const { columnDef } = column;
1529
1545
  const isRangeFilter = [
@@ -1531,7 +1547,7 @@ const MRT_TableHeadCellFilterLabel = ({ header, table }) => {
1531
1547
  'betweenInclusive',
1532
1548
  'inNumberRange',
1533
1549
  ].includes(columnDef._filterFn);
1534
- const currentFilterOption = columnFilterFns === null || columnFilterFns === void 0 ? void 0 : columnFilterFns[header.id];
1550
+ const currentFilterOption = columnDef._filterFn;
1535
1551
  const filterTooltip = localization.filteringByColumn
1536
1552
  .replace('{column}', String(columnDef.header))
1537
1553
  .replace('{filterType}',
@@ -2130,7 +2146,7 @@ const MRT_TableBodyRow = ({ row, rowIndex, table, virtualRow, }) => {
2130
2146
  };
2131
2147
 
2132
2148
  const MRT_TableBody = ({ table, tableContainerRef }) => {
2133
- const { getRowModel, getPrePaginationRowModel, getState, options: { enableGlobalFilterRankedResults, enablePagination, enableRowVirtualization, muiTableBodyProps, virtualizerProps, virtualizerInstanceRef, }, } = table;
2149
+ const { getRowModel, getPrePaginationRowModel, getState, options: { enableGlobalFilterRankedResults, enablePagination, enableRowVirtualization, manualFiltering, manualSorting, muiTableBodyProps, virtualizerInstanceRef, virtualizerProps, }, } = table;
2134
2150
  const { globalFilter, pagination, sorting } = getState();
2135
2151
  const tableBodyProps = muiTableBodyProps instanceof Function
2136
2152
  ? muiTableBodyProps({ table })
@@ -2141,6 +2157,8 @@ const MRT_TableBody = ({ table, tableContainerRef }) => {
2141
2157
  const rows = React.useMemo(() => {
2142
2158
  if (enableGlobalFilterRankedResults &&
2143
2159
  globalFilter &&
2160
+ !manualFiltering &&
2161
+ !manualSorting &&
2144
2162
  !Object.values(sorting).some(Boolean)) {
2145
2163
  const rankedRows = getPrePaginationRowModel().rows.sort((a, b) => rankGlobalFuzzy(a, b));
2146
2164
  if (enablePagination) {
@@ -2161,11 +2179,9 @@ const MRT_TableBody = ({ table, tableContainerRef }) => {
2161
2179
  const virtualizer = enableRowVirtualization
2162
2180
  ? reactVirtual.useVirtual(Object.assign({ size: rows.length, parentRef: tableContainerRef, overscan: 15 }, vProps))
2163
2181
  : {};
2164
- React.useEffect(() => {
2165
- if (virtualizerInstanceRef) {
2166
- virtualizerInstanceRef.current = virtualizer;
2167
- }
2168
- }, [virtualizer]);
2182
+ if (virtualizerInstanceRef) {
2183
+ virtualizerInstanceRef.current = virtualizer;
2184
+ }
2169
2185
  // const virtualizer: Virtualizer = enableRowVirtualization
2170
2186
  // ? useVirtualizer({
2171
2187
  // count: rows.length,
@@ -2415,6 +2431,7 @@ const MRT_TableRoot = (props) => {
2415
2431
  props.displayColumnDefOptions,
2416
2432
  props.editingMode,
2417
2433
  props.enableColumnDragging,
2434
+ props.enableColumnFilterModes,
2418
2435
  props.enableColumnOrdering,
2419
2436
  props.enableEditing,
2420
2437
  props.enableExpandAll,
@@ -2472,11 +2489,9 @@ const MRT_TableRoot = (props) => {
2472
2489
  tableContainerRef,
2473
2490
  topToolbarRef,
2474
2491
  }, setColumnFilterFns: (_w = props.onFilterFnsChange) !== null && _w !== void 0 ? _w : setColumnFilterFns, setDensity: (_x = props.onDensityChange) !== null && _x !== void 0 ? _x : setDensity, setDraggingColumn: (_y = props.onDraggingColumnChange) !== null && _y !== void 0 ? _y : setDraggingColumn, setDraggingRow: (_z = props.onDraggingRowChange) !== null && _z !== void 0 ? _z : setDraggingRow, setEditingCell: (_0 = props.onEditingCellChange) !== null && _0 !== void 0 ? _0 : setEditingCell, setEditingRow: (_1 = props.onEditingRowChange) !== null && _1 !== void 0 ? _1 : setEditingRow, setGlobalFilterFn: (_2 = props.onGlobalFilterFnChange) !== null && _2 !== void 0 ? _2 : setGlobalFilterFn, setHoveredColumn: (_3 = props.onHoveredColumnChange) !== null && _3 !== void 0 ? _3 : setHoveredColumn, setHoveredRow: (_4 = props.onHoveredRowChange) !== null && _4 !== void 0 ? _4 : setHoveredRow, setIsFullScreen: (_5 = props.onIsFullScreenChange) !== null && _5 !== void 0 ? _5 : setIsFullScreen, setShowAlertBanner: (_6 = props.onShowAlertBannerChange) !== null && _6 !== void 0 ? _6 : setShowAlertBanner, setShowFilters: (_7 = props.onShowFiltersChange) !== null && _7 !== void 0 ? _7 : setShowFilters, setShowGlobalFilter: (_8 = props.onShowGlobalFilterChange) !== null && _8 !== void 0 ? _8 : setShowGlobalFilter });
2475
- React.useEffect(() => {
2476
- if (props.tableInstanceRef) {
2477
- props.tableInstanceRef.current = table;
2478
- }
2479
- }, [table]);
2492
+ if (props.tableInstanceRef) {
2493
+ props.tableInstanceRef.current = table;
2494
+ }
2480
2495
  return (React__default["default"].createElement(React__default["default"].Fragment, null,
2481
2496
  React__default["default"].createElement(material.Dialog, { PaperComponent: material.Box, TransitionComponent: material.Grow, disablePortal: true, fullScreen: true, keepMounted: false, onClose: () => setIsFullScreen(false), open: isFullScreen, transitionDuration: 400 },
2482
2497
  React__default["default"].createElement(MRT_TablePaper, { table: table })),