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.
- package/README.md +20 -20
- package/dist/cjs/MaterialReactTable.d.ts +6 -0
- package/dist/cjs/index.js +49 -33
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/menus/MRT_FilterOptionMenu.d.ts +2 -1
- package/dist/esm/MaterialReactTable.d.ts +6 -0
- package/dist/esm/material-react-table.esm.js +50 -34
- package/dist/esm/material-react-table.esm.js.map +1 -1
- package/dist/esm/menus/MRT_FilterOptionMenu.d.ts +2 -1
- package/dist/index.d.ts +6 -0
- package/package.json +1 -1
- package/src/MaterialReactTable.tsx +10 -0
- package/src/buttons/MRT_ToggleGlobalFilterButton.tsx +7 -2
- package/src/footer/MRT_TableFooter.tsx +3 -2
- package/src/head/MRT_TableHeadCellFilterLabel.tsx +7 -7
- package/src/inputs/MRT_FilterTextField.tsx +1 -5
- package/src/inputs/MRT_GlobalFilterTextField.tsx +1 -0
- package/src/menus/MRT_FilterOptionMenu.tsx +18 -1
- package/src/table/MRT_TablePaper.tsx +24 -20
- package/src/table/MRT_TableRoot.tsx +19 -1
|
@@ -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,
|
|
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 (
|
|
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
|
-
(
|
|
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({
|
|
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
|
-
|
|
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),
|
|
2386
|
-
|
|
2387
|
-
|
|
2388
|
-
|
|
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 })),
|