material-react-table 1.0.0-beta.10 → 1.0.0-beta.13

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.
@@ -186,9 +186,10 @@ export declare type MRT_ColumnDef<TData extends Record<string, any> = {}> = Omit
186
186
  row: MRT_Row<TData>;
187
187
  table: MRT_TableInstance<TData>;
188
188
  }) => ReactNode;
189
- Filter?: ({ column, header, table, }: {
189
+ Filter?: ({ column, header, rangeFilterIndex, table, }: {
190
190
  column: MRT_Column<TData>;
191
191
  header: MRT_Header<TData>;
192
+ rangeFilterIndex?: number;
192
193
  table: MRT_TableInstance<TData>;
193
194
  }) => ReactNode;
194
195
  Footer?: ReactNode | (({ column, footer, table, }: {
@@ -245,7 +246,7 @@ export declare type MRT_ColumnDef<TData extends Record<string, any> = {}> = Omit
245
246
  text: string;
246
247
  value: any;
247
248
  })[];
248
- filterVariant?: 'text' | 'select' | 'multi-select' | 'range';
249
+ filterVariant?: 'text' | 'select' | 'multi-select' | 'range' | 'checkbox';
249
250
  /**
250
251
  * footer must be a string. If you want custom JSX to render the footer, you can also specify a `Footer` option. (Capital F)
251
252
  */
@@ -276,9 +277,11 @@ export declare type MRT_ColumnDef<TData extends Record<string, any> = {}> = Omit
276
277
  row: MRT_Row<TData>;
277
278
  table: MRT_TableInstance<TData>;
278
279
  }) => TextFieldProps);
279
- muiTableBodyCellProps?: TableCellProps | (({ cell, table, }: {
280
- table: MRT_TableInstance<TData>;
280
+ muiTableBodyCellProps?: TableCellProps | (({ cell, column, row, table, }: {
281
281
  cell: MRT_Cell<TData>;
282
+ column: MRT_Column<TData>;
283
+ row: MRT_Row<TData>;
284
+ table: MRT_TableInstance<TData>;
282
285
  }) => TableCellProps);
283
286
  muiTableFooterCellProps?: TableCellProps | (({ table, column, }: {
284
287
  table: MRT_TableInstance<TData>;
@@ -292,6 +295,10 @@ export declare type MRT_ColumnDef<TData extends Record<string, any> = {}> = Omit
292
295
  table: MRT_TableInstance<TData>;
293
296
  column: MRT_Column<TData>;
294
297
  }) => IconButtonProps);
298
+ muiTableHeadCellFilterCheckboxProps?: CheckboxProps | (({ column, table, }: {
299
+ column: MRT_Column<TData>;
300
+ table: MRT_TableInstance<TData>;
301
+ }) => CheckboxProps);
295
302
  muiTableHeadCellFilterTextFieldProps?: TextFieldProps | (({ table, column, rangeFilterIndex, }: {
296
303
  table: MRT_TableInstance<TData>;
297
304
  column: MRT_Column<TData>;
@@ -488,6 +495,10 @@ export declare type MaterialReactTableProps<TData extends Record<string, any> =
488
495
  table: MRT_TableInstance<TData>;
489
496
  column: MRT_Column<TData>;
490
497
  }) => IconButtonProps);
498
+ muiTableHeadCellFilterCheckboxProps?: CheckboxProps | (({ column, table, }: {
499
+ column: MRT_Column<TData>;
500
+ table: MRT_TableInstance<TData>;
501
+ }) => CheckboxProps);
491
502
  muiTableHeadCellFilterTextFieldProps?: TextFieldProps | (({ table, column, rangeFilterIndex, }: {
492
503
  table: MRT_TableInstance<TData>;
493
504
  column: MRT_Column<TData>;
package/dist/cjs/index.js CHANGED
@@ -599,10 +599,11 @@ const getDefaultColumnOrderIds = (props) => [
599
599
  const getDefaultColumnFilterFn = (columnDef) => {
600
600
  if (columnDef.filterVariant === 'multi-select')
601
601
  return 'arrIncludesSome';
602
- if (columnDef.filterVariant === 'select')
603
- return 'equals';
604
602
  if (columnDef.filterVariant === 'range')
605
603
  return 'betweenInclusive';
604
+ if (columnDef.filterVariant === 'select' ||
605
+ columnDef.filterVariant === 'checkbox')
606
+ return 'equals';
606
607
  return 'fuzzy';
607
608
  };
608
609
  const getIsLastLeftPinnedColumn = (table, column) => {
@@ -1051,6 +1052,9 @@ const MRT_GlobalFilterTextField = ({ table, }) => {
1051
1052
  var _a;
1052
1053
  const { getState, setGlobalFilter, options: { enableGlobalFilterModes, icons: { SearchIcon, CloseIcon }, localization, muiSearchTextFieldProps, }, refs: { searchInputRef }, } = table;
1053
1054
  const { globalFilter, showGlobalFilter } = getState();
1055
+ const textFieldProps = muiSearchTextFieldProps instanceof Function
1056
+ ? muiSearchTextFieldProps({ table })
1057
+ : muiSearchTextFieldProps;
1054
1058
  const [anchorEl, setAnchorEl] = React.useState(null);
1055
1059
  const [searchValue, setSearchValue] = React.useState(globalFilter !== null && globalFilter !== void 0 ? globalFilter : '');
1056
1060
  const handleChangeDebounced = React.useCallback(material.debounce((event) => {
@@ -1068,9 +1072,11 @@ const MRT_GlobalFilterTextField = ({ table, }) => {
1068
1072
  setSearchValue('');
1069
1073
  setGlobalFilter(undefined);
1070
1074
  };
1071
- const textFieldProps = muiSearchTextFieldProps instanceof Function
1072
- ? muiSearchTextFieldProps({ table })
1073
- : muiSearchTextFieldProps;
1075
+ React.useEffect(() => {
1076
+ if (globalFilter === undefined) {
1077
+ handleClear();
1078
+ }
1079
+ }, [globalFilter]);
1074
1080
  return (React__default["default"].createElement(material.Collapse, { in: showGlobalFilter, orientation: "horizontal", unmountOnExit: true, mountOnEnter: true },
1075
1081
  React__default["default"].createElement(material.TextField, Object.assign({ placeholder: localization.search, onChange: handleChange, value: searchValue !== null && searchValue !== void 0 ? searchValue : '', variant: "standard", InputProps: {
1076
1082
  startAdornment: enableGlobalFilterModes ? (React__default["default"].createElement(material.InputAdornment, { position: "start" },
@@ -1460,8 +1466,10 @@ const MRT_FilterTextField = ({ header, rangeFilterIndex, table, }) => {
1460
1466
  });
1461
1467
  const handleChangeDebounced = React.useCallback(material.debounce((event) => {
1462
1468
  let value = textFieldProps.type === 'date'
1463
- ? new Date(event.target.value)
1464
- : event.target.value;
1469
+ ? event.target.valueAsDate
1470
+ : textFieldProps.type === 'number'
1471
+ ? event.target.valueAsNumber
1472
+ : event.target.value;
1465
1473
  if (isRangeFilter) {
1466
1474
  column.setFilterValue((old) => {
1467
1475
  const newFilterValues = old !== null && old !== void 0 ? old : ['', ''];
@@ -1503,8 +1511,13 @@ const MRT_FilterTextField = ({ header, rangeFilterIndex, table, }) => {
1503
1511
  const handleFilterMenuOpen = (event) => {
1504
1512
  setAnchorEl(event.currentTarget);
1505
1513
  };
1514
+ React.useEffect(() => {
1515
+ if (column.getFilterValue() === undefined) {
1516
+ handleClear();
1517
+ }
1518
+ }, [column.getFilterValue()]);
1506
1519
  if (columnDef.Filter) {
1507
- return React__default["default"].createElement(React__default["default"].Fragment, null, (_e = columnDef.Filter) === null || _e === void 0 ? void 0 : _e.call(columnDef, { column, header, table }));
1520
+ return (React__default["default"].createElement(React__default["default"].Fragment, null, (_e = columnDef.Filter) === null || _e === void 0 ? void 0 : _e.call(columnDef, { column, header, rangeFilterIndex, table })));
1508
1521
  }
1509
1522
  return (React__default["default"].createElement(React__default["default"].Fragment, null,
1510
1523
  React__default["default"].createElement(material.TextField, Object.assign({ fullWidth: true, inputProps: {
@@ -1519,7 +1532,7 @@ const MRT_FilterTextField = ({ header, rangeFilterIndex, table, }) => {
1519
1532
  localization[`filter${((_f = currentFilterOption === null || currentFilterOption === void 0 ? void 0 : currentFilterOption.charAt(0)) === null || _f === void 0 ? void 0 : _f.toUpperCase()) +
1520
1533
  (currentFilterOption === null || currentFilterOption === void 0 ? void 0 : currentFilterOption.slice(1))}`]))) : null, FormHelperTextProps: {
1521
1534
  sx: {
1522
- fontSize: '0.6rem',
1535
+ fontSize: '0.75rem',
1523
1536
  lineHeight: '0.8rem',
1524
1537
  whiteSpace: 'nowrap',
1525
1538
  },
@@ -1560,11 +1573,11 @@ const MRT_FilterTextField = ({ header, rangeFilterIndex, table, }) => {
1560
1573
  if (textFieldProps.inputRef) {
1561
1574
  textFieldProps.inputRef = inputRef;
1562
1575
  }
1563
- }, sx: (theme) => (Object.assign({ p: 0, minWidth: columnDef.filterVariant === 'range'
1564
- ? '90px'
1576
+ }, sx: (theme) => (Object.assign({ p: 0, minWidth: isRangeFilter
1577
+ ? '100px'
1565
1578
  : !filterChipLabel
1566
1579
  ? '120px'
1567
- : 'auto', width: '100%', '& .MuiSelect-icon': {
1580
+ : 'auto', width: '100%', '& .MuiSelect-icon': {
1568
1581
  mr: '1.5rem',
1569
1582
  } }, ((textFieldProps === null || textFieldProps === void 0 ? void 0 : textFieldProps.sx) instanceof Function
1570
1583
  ? textFieldProps.sx(theme)
@@ -1601,12 +1614,50 @@ const MRT_FilterRangeFields = ({ header, table }) => {
1601
1614
  React__default["default"].createElement(MRT_FilterTextField, { header: header, rangeFilterIndex: 1, table: table })));
1602
1615
  };
1603
1616
 
1617
+ const MRT_FilterCheckbox = ({ column, table }) => {
1618
+ var _a, _b, _c;
1619
+ const { getState, options: { localization, muiTableHeadCellFilterCheckboxProps }, } = table;
1620
+ const { density } = getState();
1621
+ const { columnDef } = column;
1622
+ const mTableHeadCellFilterCheckboxProps = muiTableHeadCellFilterCheckboxProps instanceof Function
1623
+ ? muiTableHeadCellFilterCheckboxProps({
1624
+ column,
1625
+ table,
1626
+ })
1627
+ : muiTableHeadCellFilterCheckboxProps;
1628
+ const mcTableHeadCellFilterCheckboxProps = columnDef.muiTableHeadCellFilterCheckboxProps instanceof Function
1629
+ ? columnDef.muiTableHeadCellFilterCheckboxProps({
1630
+ column,
1631
+ table,
1632
+ })
1633
+ : columnDef.muiTableHeadCellFilterCheckboxProps;
1634
+ const checkboxProps = Object.assign(Object.assign({}, mTableHeadCellFilterCheckboxProps), mcTableHeadCellFilterCheckboxProps);
1635
+ const filterLabel = (_a = localization.filterByColumn) === null || _a === void 0 ? void 0 : _a.replace('{column}', columnDef.header);
1636
+ return (React__default["default"].createElement(material.Tooltip, { arrow: true, enterDelay: 1000, enterNextDelay: 1000, title: (_b = checkboxProps === null || checkboxProps === void 0 ? void 0 : checkboxProps.title) !== null && _b !== void 0 ? _b : filterLabel },
1637
+ React__default["default"].createElement(material.FormControlLabel, { control: React__default["default"].createElement(material.Checkbox, Object.assign({ checked: column.getFilterValue() === 'true', indeterminate: column.getFilterValue() === undefined, color: column.getFilterValue() === undefined ? 'default' : 'primary', size: density === 'compact' ? 'small' : 'medium' }, checkboxProps, { onClick: (e) => {
1638
+ var _a;
1639
+ e.stopPropagation();
1640
+ (_a = checkboxProps === null || checkboxProps === void 0 ? void 0 : checkboxProps.onClick) === null || _a === void 0 ? void 0 : _a.call(checkboxProps, e);
1641
+ }, onChange: (e, checked) => {
1642
+ var _a;
1643
+ column.setFilterValue(column.getFilterValue() === undefined
1644
+ ? 'true'
1645
+ : column.getFilterValue() === 'true'
1646
+ ? 'false'
1647
+ : undefined);
1648
+ (_a = checkboxProps === null || checkboxProps === void 0 ? void 0 : checkboxProps.onChange) === null || _a === void 0 ? void 0 : _a.call(checkboxProps, e, checked);
1649
+ }, sx: (theme) => (Object.assign({ height: '2.5rem', width: '2.5rem' }, ((checkboxProps === null || checkboxProps === void 0 ? void 0 : checkboxProps.sx) instanceof Function
1650
+ ? checkboxProps.sx(theme)
1651
+ : checkboxProps === null || checkboxProps === void 0 ? void 0 : checkboxProps.sx))) })), disableTypography: true, label: (_c = checkboxProps.title) !== null && _c !== void 0 ? _c : filterLabel, sx: { color: 'text.secondary', mt: '-4px', fontWeight: 'normal' }, title: undefined })));
1652
+ };
1653
+
1604
1654
  const MRT_TableHeadCellFilterContainer = ({ header, table, }) => {
1605
1655
  const { getState } = table;
1606
1656
  const { showColumnFilters } = getState();
1607
1657
  const { column } = header;
1608
1658
  const { columnDef } = column;
1609
- return (React__default["default"].createElement(material.Collapse, { in: showColumnFilters, mountOnEnter: true, unmountOnExit: true }, ['between', 'betweenInclusive', 'inNumberRange'].includes(columnDef._filterFn) ? (React__default["default"].createElement(MRT_FilterRangeFields, { header: header, table: table })) : (React__default["default"].createElement(MRT_FilterTextField, { header: header, table: table }))));
1659
+ return (React__default["default"].createElement(material.Collapse, { in: showColumnFilters, mountOnEnter: true, unmountOnExit: true }, columnDef.filterVariant === 'checkbox' ? (React__default["default"].createElement(MRT_FilterCheckbox, { column: column, table: table })) : columnDef.filterVariant === 'range' ||
1660
+ ['between', 'betweenInclusive', 'inNumberRange'].includes(columnDef._filterFn) ? (React__default["default"].createElement(MRT_FilterRangeFields, { header: header, table: table })) : (React__default["default"].createElement(MRT_FilterTextField, { header: header, table: table }))));
1610
1661
  };
1611
1662
 
1612
1663
  const MRT_TableHeadCellFilterLabel = ({ header, table }) => {
@@ -2010,7 +2061,7 @@ const MRT_TableBodyCell = ({ cell, enableHover, rowIndex, rowRef, table, }) => {
2010
2061
  ? muiTableBodyCellProps({ cell, column, row, table })
2011
2062
  : muiTableBodyCellProps;
2012
2063
  const mcTableCellBodyProps = columnDef.muiTableBodyCellProps instanceof Function
2013
- ? columnDef.muiTableBodyCellProps({ cell, table })
2064
+ ? columnDef.muiTableBodyCellProps({ cell, column, row, table })
2014
2065
  : columnDef.muiTableBodyCellProps;
2015
2066
  const tableCellProps = Object.assign(Object.assign({}, mTableCellBodyProps), mcTableCellBodyProps);
2016
2067
  const skeletonProps = muiTableBodyCellSkeletonProps instanceof Function