material-react-table 1.0.0-beta.6 → 1.0.0-beta.9

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.
@@ -6,7 +6,8 @@ interface Props<TData extends Record<string, any> = {}> {
6
6
  header?: MRT_Header<TData>;
7
7
  onSelect?: () => void;
8
8
  setAnchorEl: (anchorEl: HTMLElement | null) => void;
9
+ setFilterValue?: (filterValue: any) => void;
9
10
  table: MRT_TableInstance<TData>;
10
11
  }
11
- export declare const MRT_FilterOptionMenu: <TData extends Record<string, any> = {}>({ anchorEl, header, onSelect, setAnchorEl, table, }: Props<TData>) => JSX.Element;
12
+ export declare const MRT_FilterOptionMenu: <TData extends Record<string, any> = {}>({ anchorEl, header, onSelect, setAnchorEl, setFilterValue, table, }: Props<TData>) => JSX.Element;
12
13
  export {};
@@ -467,6 +467,9 @@ export declare type MaterialReactTableProps<TData extends Record<string, any> =
467
467
  positionPagination?: 'bottom' | 'top' | 'both';
468
468
  positionToolbarAlertBanner?: 'bottom' | 'top' | 'none';
469
469
  positionToolbarDropZone?: 'bottom' | 'top' | 'none' | 'both';
470
+ renderBottomToolbar?: ({ table, }: {
471
+ table: MRT_TableInstance<TData>;
472
+ }) => ReactNode | ReactNode[];
470
473
  renderBottomToolbarCustomActions?: ({ table, }: {
471
474
  table: MRT_TableInstance<TData>;
472
475
  }) => ReactNode;
@@ -503,6 +506,9 @@ export declare type MaterialReactTableProps<TData extends Record<string, any> =
503
506
  renderToolbarInternalActions?: ({ table, }: {
504
507
  table: MRT_TableInstance<TData>;
505
508
  }) => ReactNode;
509
+ renderTopToolbar?: ({ table, }: {
510
+ table: MRT_TableInstance<TData>;
511
+ }) => ReactNode | ReactNode[];
506
512
  renderTopToolbarCustomActions?: ({ table, }: {
507
513
  table: MRT_TableInstance<TData>;
508
514
  }) => ReactNode;
@@ -1,4 +1,4 @@
1
- import React, { useMemo, useRef, useState, useCallback, Fragment, useEffect, memo, useLayoutEffect } from 'react';
1
+ import React, { useMemo, useRef, useState, useCallback, Fragment, memo, useEffect, useLayoutEffect } from 'react';
2
2
  import { aggregationFns, filterFns, sortingFns, useReactTable, getCoreRowModel, getExpandedRowModel, getFacetedRowModel, getFilteredRowModel, getGroupedRowModel, getPaginationRowModel, getSortedRowModel } from '@tanstack/react-table';
3
3
  import { ArrowRight, Cancel, CheckBox, ClearAll, Close, DensityLarge, DensityMedium, DensitySmall, DragHandle, DynamicFeed, Edit, ExpandLess, ExpandMore, FilterAlt, FilterAltOff, FilterList, FilterListOff, FullscreenExit, Fullscreen, KeyboardDoubleArrowDown, MoreHoriz, MoreVert, PushPin, RestartAlt, Save, Search, SearchOff, Sort, ViewColumn, VisibilityOff } from '@mui/icons-material';
4
4
  import { rankItem, rankings, compareItems } from '@tanstack/match-sorter-utils';
@@ -385,7 +385,7 @@ const mrtFilterOptions = (localization) => [
385
385
  divider: false,
386
386
  },
387
387
  ];
388
- const MRT_FilterOptionMenu = ({ anchorEl, header, onSelect, setAnchorEl, table, }) => {
388
+ const MRT_FilterOptionMenu = ({ anchorEl, header, onSelect, setAnchorEl, setFilterValue, table, }) => {
389
389
  var _a, _b, _c, _d;
390
390
  const { getState, options: { columnFilterModeOptions, globalFilterModeOptions, localization, renderColumnFilterModeMenuItems, renderGlobalFilterModeMenuItems, }, setColumnFilterFns, setGlobalFilterFn, } = table;
391
391
  const { globalFilterFn, density } = getState();
@@ -404,11 +404,19 @@ const MRT_FilterOptionMenu = ({ anchorEl, header, onSelect, setAnchorEl, table,
404
404
  if (['empty', 'notEmpty'].includes(option)) {
405
405
  column.setFilterValue(' ');
406
406
  }
407
- else if (option === 'between') {
407
+ else if ((columnDef === null || columnDef === void 0 ? void 0 : columnDef.filterVariant) === 'multi-select' ||
408
+ ['arrIncludesSome', 'arrIncludesAll', 'arrIncludes'].includes(option)) {
409
+ column.setFilterValue([]);
410
+ setFilterValue === null || setFilterValue === void 0 ? void 0 : setFilterValue([]);
411
+ }
412
+ else if ((columnDef === null || columnDef === void 0 ? void 0 : columnDef.filterVariant) === 'range' ||
413
+ ['between', 'betweenInclusive', 'inNumberRange'].includes(option)) {
408
414
  column.setFilterValue(['', '']);
415
+ setFilterValue === null || setFilterValue === void 0 ? void 0 : setFilterValue('');
409
416
  }
410
417
  else {
411
418
  column.setFilterValue('');
419
+ setFilterValue === null || setFilterValue === void 0 ? void 0 : setFilterValue('');
412
420
  }
413
421
  }
414
422
  else {
@@ -1072,7 +1080,7 @@ const MRT_GlobalFilterTextField = ({ table, }) => {
1072
1080
  textFieldProps.inputRef = inputRef;
1073
1081
  }
1074
1082
  } })),
1075
- React.createElement(MRT_FilterOptionMenu, { anchorEl: anchorEl, setAnchorEl: setAnchorEl, table: table })));
1083
+ React.createElement(MRT_FilterOptionMenu, { anchorEl: anchorEl, setAnchorEl: setAnchorEl, table: table, onSelect: handleClear })));
1076
1084
  };
1077
1085
 
1078
1086
  const MRT_LinearProgressBar = ({ isTopToolbar, table }) => {
@@ -1209,13 +1217,13 @@ const MRT_ToggleGlobalFilterButton = (_a) => {
1209
1217
  var _b;
1210
1218
  var { table } = _a, rest = __rest(_a, ["table"]);
1211
1219
  const { getState, options: { icons: { SearchIcon, SearchOffIcon }, localization, }, refs: { searchInputRef }, setShowGlobalFilter, } = table;
1212
- const { showGlobalFilter } = getState();
1220
+ const { globalFilter, showGlobalFilter } = getState();
1213
1221
  const handleToggleSearch = () => {
1214
1222
  setShowGlobalFilter(!showGlobalFilter);
1215
1223
  queueMicrotask(() => { var _a; return (_a = searchInputRef.current) === null || _a === void 0 ? void 0 : _a.focus(); });
1216
1224
  };
1217
1225
  return (React.createElement(Tooltip, { arrow: true, title: (_b = rest === null || rest === void 0 ? void 0 : rest.title) !== null && _b !== void 0 ? _b : localization.showHideSearch },
1218
- React.createElement(IconButton, Object.assign({ onClick: handleToggleSearch }, rest, { title: undefined }), showGlobalFilter ? React.createElement(SearchOffIcon, null) : React.createElement(SearchIcon, null))));
1226
+ React.createElement(IconButton, Object.assign({ disabled: !!globalFilter, onClick: handleToggleSearch }, rest, { title: undefined }), showGlobalFilter ? React.createElement(SearchOffIcon, null) : React.createElement(SearchIcon, null))));
1219
1227
  };
1220
1228
 
1221
1229
  const MRT_ToolbarInternalButtons = ({ table }) => {
@@ -1486,9 +1494,6 @@ const MRT_FilterTextField = ({ header, rangeFilterIndex, table, }) => {
1486
1494
  const handleFilterMenuOpen = (event) => {
1487
1495
  setAnchorEl(event.currentTarget);
1488
1496
  };
1489
- useEffect(() => {
1490
- handleClear();
1491
- }, [columnDef._filterFn]);
1492
1497
  if (columnDef.Filter) {
1493
1498
  return React.createElement(React.Fragment, null, (_e = columnDef.Filter) === null || _e === void 0 ? void 0 : _e.call(columnDef, { column, header, table }));
1494
1499
  }
@@ -1578,7 +1583,7 @@ const MRT_FilterTextField = ({ header, rangeFilterIndex, table, }) => {
1578
1583
  isMultiSelectFilter && (React.createElement(Checkbox, { checked: ((_a = column.getFilterValue()) !== null && _a !== void 0 ? _a : []).includes(value), sx: { mr: '0.5rem' } })),
1579
1584
  text));
1580
1585
  })),
1581
- React.createElement(MRT_FilterOptionMenu, { anchorEl: anchorEl, header: header, setAnchorEl: setAnchorEl, table: table })));
1586
+ React.createElement(MRT_FilterOptionMenu, { anchorEl: anchorEl, header: header, setAnchorEl: setAnchorEl, table: table, setFilterValue: setFilterValue })));
1582
1587
  };
1583
1588
 
1584
1589
  const MRT_FilterRangeFields = ({ header, table }) => {
@@ -1600,11 +1605,8 @@ const MRT_TableHeadCellFilterLabel = ({ header, table }) => {
1600
1605
  const { options: { icons: { FilterAltIcon }, localization, }, } = table;
1601
1606
  const { column } = header;
1602
1607
  const { columnDef } = column;
1603
- const isRangeFilter = [
1604
- 'between',
1605
- 'betweenInclusive',
1606
- 'inNumberRange',
1607
- ].includes(columnDef._filterFn);
1608
+ const isRangeFilter = columnDef.filterVariant === 'range' ||
1609
+ ['between', 'betweenInclusive', 'inNumberRange'].includes(columnDef._filterFn);
1608
1610
  const currentFilterOption = columnDef._filterFn;
1609
1611
  const filterTooltip = localization.filteringByColumn
1610
1612
  .replace('{column}', String(columnDef.header))
@@ -1616,8 +1618,8 @@ const MRT_TableHeadCellFilterLabel = ({ header, table }) => {
1616
1618
  ? column.getFilterValue().join(`" ${isRangeFilter ? localization.and : localization.or} "`)
1617
1619
  : column.getFilterValue()}"`)
1618
1620
  .replace('" "', '');
1619
- return (React.createElement(Grow, { unmountOnExit: true, in: (!!column.getFilterValue() && isRangeFilter) ||
1620
- (!isRangeFilter && // @ts-ignore
1621
+ return (React.createElement(Grow, { unmountOnExit: true, in: (!!column.getFilterValue() && !isRangeFilter) ||
1622
+ (isRangeFilter && // @ts-ignore
1621
1623
  (!!((_b = column.getFilterValue()) === null || _b === void 0 ? void 0 : _b[0]) || !!((_c = column.getFilterValue()) === null || _c === void 0 ? void 0 : _c[1]))) },
1622
1624
  React.createElement("span", null,
1623
1625
  React.createElement(Tooltip, { arrow: true, placement: "top", title: filterTooltip },
@@ -2301,11 +2303,11 @@ const MRT_TableFooter = ({ table }) => {
2301
2303
  ? muiTableFooterProps({ table })
2302
2304
  : muiTableFooterProps;
2303
2305
  const stickFooter = (isFullScreen || enableStickyFooter) && enableStickyFooter !== false;
2304
- return (React.createElement(TableFooter, Object.assign({}, tableFooterProps, { sx: (theme) => (Object.assign({ position: stickFooter ? 'sticky' : undefined, bottom: stickFooter ? 0 : undefined, opacity: stickFooter ? 0.95 : undefined, outline: stickFooter
2306
+ return (React.createElement(TableFooter, Object.assign({}, tableFooterProps, { sx: (theme) => (Object.assign({ backgroundColor: lighten(theme.palette.background.default, 0.06), bottom: stickFooter ? 0 : undefined, opacity: stickFooter ? 0.95 : undefined, outline: stickFooter
2305
2307
  ? theme.palette.mode === 'light'
2306
2308
  ? `1px solid ${theme.palette.grey[300]}`
2307
2309
  : `1px solid ${theme.palette.grey[700]}`
2308
- : undefined }, ((tableFooterProps === null || tableFooterProps === void 0 ? void 0 : tableFooterProps.sx) instanceof Function
2310
+ : undefined, position: stickFooter ? 'sticky' : undefined }, ((tableFooterProps === null || tableFooterProps === void 0 ? void 0 : tableFooterProps.sx) instanceof Function
2309
2311
  ? tableFooterProps === null || tableFooterProps === void 0 ? void 0 : tableFooterProps.sx(theme)
2310
2312
  : tableFooterProps === null || tableFooterProps === void 0 ? void 0 : tableFooterProps.sx))) }), getFooterGroups().map((footerGroup) => (React.createElement(MRT_TableFooterRow, { footerGroup: footerGroup, key: footerGroup.id, table: table })))));
2311
2313
  };
@@ -2359,18 +2361,9 @@ const MRT_TableContainer = ({ table }) => {
2359
2361
  };
2360
2362
 
2361
2363
  const MRT_TablePaper = ({ table }) => {
2362
- const { getState, options: { enableBottomToolbar, enableTopToolbar, muiTablePaperProps }, refs: { tablePaperRef }, } = table;
2364
+ var _a, _b;
2365
+ const { getState, options: { enableBottomToolbar, enableTopToolbar, muiTablePaperProps, renderBottomToolbar, renderTopToolbar, }, refs: { tablePaperRef }, } = table;
2363
2366
  const { isFullScreen } = getState();
2364
- useEffect(() => {
2365
- if (typeof window !== 'undefined') {
2366
- if (isFullScreen) {
2367
- document.body.style.height = '100vh';
2368
- }
2369
- else {
2370
- document.body.style.height = 'auto';
2371
- }
2372
- }
2373
- }, [isFullScreen]);
2374
2367
  const tablePaperProps = muiTablePaperProps instanceof Function
2375
2368
  ? muiTablePaperProps({ table })
2376
2369
  : muiTablePaperProps;
@@ -2382,10 +2375,17 @@ const MRT_TablePaper = ({ table }) => {
2382
2375
  }
2383
2376
  }, sx: (theme) => (Object.assign({ transition: 'all 0.2s ease-in-out' }, ((tablePaperProps === null || tablePaperProps === void 0 ? void 0 : tablePaperProps.sx) instanceof Function
2384
2377
  ? tablePaperProps === null || tablePaperProps === void 0 ? void 0 : tablePaperProps.sx(theme)
2385
- : tablePaperProps === null || tablePaperProps === void 0 ? void 0 : tablePaperProps.sx))), style: Object.assign(Object.assign({}, tablePaperProps === null || tablePaperProps === void 0 ? void 0 : tablePaperProps.style), { height: isFullScreen ? '100vh' : undefined, margin: isFullScreen ? '0' : undefined, maxHeight: isFullScreen ? '100vh' : undefined, maxWidth: isFullScreen ? '100vw' : undefined, padding: isFullScreen ? '0' : undefined, width: isFullScreen ? '100vw' : undefined }) }),
2386
- enableTopToolbar && React.createElement(MRT_TopToolbar, { table: table }),
2387
- React.createElement(MRT_TableContainer, { table: table }),
2388
- enableBottomToolbar && React.createElement(MRT_BottomToolbar, { table: table })));
2378
+ : tablePaperProps === null || tablePaperProps === void 0 ? void 0 : tablePaperProps.sx))), style: Object.assign(Object.assign({}, tablePaperProps === null || tablePaperProps === void 0 ? void 0 : tablePaperProps.style), (isFullScreen
2379
+ ? {
2380
+ height: '100vh',
2381
+ margin: 0,
2382
+ maxHeight: '100vh',
2383
+ maxWidth: '100vw',
2384
+ padding: 0,
2385
+ width: '100vw',
2386
+ }
2387
+ : {})) }), (_a = (enableTopToolbar && (renderTopToolbar === null || renderTopToolbar === void 0 ? void 0 : renderTopToolbar({ table })))) !== null && _a !== void 0 ? _a : (React.createElement(MRT_TopToolbar, { table: table })),
2388
+ React.createElement(MRT_TableContainer, { table: table }), (_b = (enableBottomToolbar && (renderBottomToolbar === null || renderBottomToolbar === void 0 ? void 0 : renderBottomToolbar({ table })))) !== null && _b !== void 0 ? _b : (React.createElement(MRT_BottomToolbar, { table: table }))));
2389
2389
  };
2390
2390
 
2391
2391
  const MRT_EditRowModal = ({ open, row, table, }) => {
@@ -2540,6 +2540,22 @@ const MRT_TableRoot = (props) => {
2540
2540
  if (props.tableInstanceRef) {
2541
2541
  props.tableInstanceRef.current = table;
2542
2542
  }
2543
+ const initialBodyHeight = useRef();
2544
+ useEffect(() => {
2545
+ if (typeof window !== 'undefined') {
2546
+ initialBodyHeight.current = document.body.style.height;
2547
+ }
2548
+ }, []);
2549
+ useEffect(() => {
2550
+ if (typeof window !== 'undefined') {
2551
+ if (table.getState().isFullScreen) {
2552
+ document.body.style.height = '100vh';
2553
+ }
2554
+ else {
2555
+ document.body.style.height = initialBodyHeight.current;
2556
+ }
2557
+ }
2558
+ }, [table.getState().isFullScreen]);
2543
2559
  return (React.createElement(React.Fragment, null,
2544
2560
  React.createElement(Dialog, { PaperComponent: Box, TransitionComponent: Grow, disablePortal: true, fullScreen: true, keepMounted: false, onClose: () => table.setIsFullScreen(false), open: table.getState().isFullScreen, transitionDuration: 400 },
2545
2561
  React.createElement(MRT_TablePaper, { table: table })),