@economic/taco 2.3.0 → 2.4.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 (83) hide show
  1. package/dist/components/Header/components/Agreement/types.d.ts +1 -1
  2. package/dist/components/Menu/Context.d.ts +2 -0
  3. package/dist/components/Menu/components/Item.d.ts +3 -2
  4. package/dist/components/Provider/Localization.d.ts +12 -0
  5. package/dist/components/Provider/Provider.d.ts +6 -1
  6. package/dist/components/Table2/types.d.ts +1 -1
  7. package/dist/components/Table3/Table3.d.ts +1 -1
  8. package/dist/components/Table3/components/toolbar/Filter/filters/components/Filter.d.ts +1 -2
  9. package/dist/components/Table3/components/toolbar/Filter/filters/components/FilterComparator.d.ts +4 -4
  10. package/dist/components/Table3/components/toolbar/Filter/filters/components/FilterValue.d.ts +1 -1
  11. package/dist/components/Table3/hooks/features/useColumnFreezing.d.ts +2 -1
  12. package/dist/components/Table3/hooks/features/useSettings.d.ts +2 -0
  13. package/dist/components/Table3/hooks/listeners/useSettingsStateListener.d.ts +2 -2
  14. package/dist/components/Table3/hooks/useTable.d.ts +2 -1
  15. package/dist/components/Table3/types.d.ts +24 -12
  16. package/dist/esm/packages/taco/src/components/Menu/Context.js.map +1 -1
  17. package/dist/esm/packages/taco/src/components/Menu/Menu.js +1 -0
  18. package/dist/esm/packages/taco/src/components/Menu/Menu.js.map +1 -1
  19. package/dist/esm/packages/taco/src/components/Menu/components/Content.js +32 -2
  20. package/dist/esm/packages/taco/src/components/Menu/components/Content.js.map +1 -1
  21. package/dist/esm/packages/taco/src/components/Menu/components/Item.js.map +1 -1
  22. package/dist/esm/packages/taco/src/components/Provider/Localization.js +13 -1
  23. package/dist/esm/packages/taco/src/components/Provider/Localization.js.map +1 -1
  24. package/dist/esm/packages/taco/src/components/Provider/Provider.js +11 -4
  25. package/dist/esm/packages/taco/src/components/Provider/Provider.js.map +1 -1
  26. package/dist/esm/packages/taco/src/components/Select2/components/Edit.js +12 -1
  27. package/dist/esm/packages/taco/src/components/Select2/components/Edit.js.map +1 -1
  28. package/dist/esm/packages/taco/src/components/Shortcut/Shortcut.js +1 -1
  29. package/dist/esm/packages/taco/src/components/Shortcut/Shortcut.js.map +1 -1
  30. package/dist/esm/packages/taco/src/components/Table2/types.js.map +1 -1
  31. package/dist/esm/packages/taco/src/components/Table3/Table3.js +2 -1
  32. package/dist/esm/packages/taco/src/components/Table3/Table3.js.map +1 -1
  33. package/dist/esm/packages/taco/src/components/Table3/components/columns/cell/DisplayCell.js +2 -2
  34. package/dist/esm/packages/taco/src/components/Table3/components/columns/cell/DisplayCell.js.map +1 -1
  35. package/dist/esm/packages/taco/src/components/Table3/components/columns/header/Menu.js +4 -19
  36. package/dist/esm/packages/taco/src/components/Table3/components/columns/header/Menu.js.map +1 -1
  37. package/dist/esm/packages/taco/src/components/Table3/components/columns/internal/Selection.js +8 -2
  38. package/dist/esm/packages/taco/src/components/Table3/components/columns/internal/Selection.js.map +1 -1
  39. package/dist/esm/packages/taco/src/components/Table3/components/toolbar/Filter/filters/Filters.js +4 -2
  40. package/dist/esm/packages/taco/src/components/Table3/components/toolbar/Filter/filters/Filters.js.map +1 -1
  41. package/dist/esm/packages/taco/src/components/Table3/components/toolbar/Filter/filters/components/Filter.js +2 -24
  42. package/dist/esm/packages/taco/src/components/Table3/components/toolbar/Filter/filters/components/Filter.js.map +1 -1
  43. package/dist/esm/packages/taco/src/components/Table3/components/toolbar/Filter/filters/components/FilterComparator.js +68 -17
  44. package/dist/esm/packages/taco/src/components/Table3/components/toolbar/Filter/filters/components/FilterComparator.js.map +1 -1
  45. package/dist/esm/packages/taco/src/components/Table3/components/toolbar/Filter/filters/components/FilterValue.js +31 -2
  46. package/dist/esm/packages/taco/src/components/Table3/components/toolbar/Filter/filters/components/FilterValue.js.map +1 -1
  47. package/dist/esm/packages/taco/src/components/Table3/components/toolbar/Filter/filters/components/Placeholder.js +1 -5
  48. package/dist/esm/packages/taco/src/components/Table3/components/toolbar/Filter/filters/components/Placeholder.js.map +1 -1
  49. package/dist/esm/packages/taco/src/components/Table3/components/toolbar/PrintButton/PrintIFrame.js +18 -25
  50. package/dist/esm/packages/taco/src/components/Table3/components/toolbar/PrintButton/PrintIFrame.js.map +1 -1
  51. package/dist/esm/packages/taco/src/components/Table3/components/toolbar/PrintButton/hooks/useParentStylesheets.js +5 -0
  52. package/dist/esm/packages/taco/src/components/Table3/components/toolbar/PrintButton/hooks/useParentStylesheets.js.map +1 -1
  53. package/dist/esm/packages/taco/src/components/Table3/components/toolbar/Search.js +3 -3
  54. package/dist/esm/packages/taco/src/components/Table3/components/toolbar/Search.js.map +1 -1
  55. package/dist/esm/packages/taco/src/components/Table3/components/toolbar/Toolbar.js +6 -2
  56. package/dist/esm/packages/taco/src/components/Table3/components/toolbar/Toolbar.js.map +1 -1
  57. package/dist/esm/packages/taco/src/components/Table3/hooks/features/useColumnFreezing.js +20 -16
  58. package/dist/esm/packages/taco/src/components/Table3/hooks/features/useColumnFreezing.js.map +1 -1
  59. package/dist/esm/packages/taco/src/components/Table3/hooks/features/useSettings.js +18 -0
  60. package/dist/esm/packages/taco/src/components/Table3/hooks/features/useSettings.js.map +1 -0
  61. package/dist/esm/packages/taco/src/components/Table3/hooks/listeners/useSettingsStateListener.js.map +1 -1
  62. package/dist/esm/packages/taco/src/components/Table3/hooks/useConvertChildrenToColumns.js +2 -4
  63. package/dist/esm/packages/taco/src/components/Table3/hooks/useConvertChildrenToColumns.js.map +1 -1
  64. package/dist/esm/packages/taco/src/components/Table3/hooks/useTable.js +18 -12
  65. package/dist/esm/packages/taco/src/components/Table3/hooks/useTable.js.map +1 -1
  66. package/dist/esm/packages/taco/src/components/Table3/types.js +7 -5
  67. package/dist/esm/packages/taco/src/components/Table3/types.js.map +1 -1
  68. package/dist/esm/packages/taco/src/components/Table3/util/filtering.js +24 -6
  69. package/dist/esm/packages/taco/src/components/Table3/util/filtering.js.map +1 -1
  70. package/dist/esm/packages/taco/src/hooks/useLocalStorage.js +34 -0
  71. package/dist/esm/packages/taco/src/hooks/useLocalStorage.js.map +1 -0
  72. package/dist/esm/packages/taco/src/hooks/useTacoSettings.js +9 -0
  73. package/dist/esm/packages/taco/src/hooks/useTacoSettings.js.map +1 -0
  74. package/dist/esm/packages/taco/src/index.js +1 -1
  75. package/dist/hooks/useLocalStorage.d.ts +1 -0
  76. package/dist/hooks/useTacoSettings.d.ts +1 -0
  77. package/dist/taco.cjs.development.js +358 -178
  78. package/dist/taco.cjs.development.js.map +1 -1
  79. package/dist/taco.cjs.production.min.js +1 -1
  80. package/dist/taco.cjs.production.min.js.map +1 -1
  81. package/package.json +2 -2
  82. package/types.json +11325 -10524
  83. package/dist/components/Table3/components/toolbar/Filter/filters/components/Comparator.d.ts +0 -11
@@ -4182,7 +4182,16 @@ const defaultLocalisationTexts = {
4182
4182
  isNoneOf: 'Is none of',
4183
4183
  isAllOf: 'Is all of',
4184
4184
  isEmpty: 'Is empty',
4185
- isNotEmpty: 'Is not empty'
4185
+ isNotEmpty: 'Is not empty',
4186
+ isBefore: 'Is before',
4187
+ isAfter: 'Is after',
4188
+ isOnOrBefore: 'Is on or before',
4189
+ isOnOrAfter: 'Is on or after',
4190
+ isLessThanOrEqualTo: 'Is less than or equal to',
4191
+ isGreaterThanOrEqualTo: 'Is greater than or equal to',
4192
+ hasAnyOf: 'Has any of',
4193
+ hasAllOf: 'Has all of',
4194
+ hasNoneOf: 'Has none of'
4186
4195
  },
4187
4196
  conditions: {
4188
4197
  and: 'And',
@@ -4249,6 +4258,9 @@ const defaultLocalisationTexts = {
4249
4258
  selectAllRows: 'Select all rows',
4250
4259
  expandRow: 'Expand current row',
4251
4260
  collapseRow: 'Collapse current row'
4261
+ },
4262
+ otherOptions: {
4263
+ tooltip: 'Other options'
4252
4264
  }
4253
4265
  },
4254
4266
  searchInput: {
@@ -7228,6 +7240,35 @@ const Content$8 = /*#__PURE__*/React.forwardRef(function MenuContent(props, ref)
7228
7240
  ...otherProps
7229
7241
  } = props;
7230
7242
  const className = cn('border border-transparent rounded block outline-none p-1 yt-shadow wcag-white', props.className);
7243
+ // attach refs to each child
7244
+ const childrenRefs = React.useRef([]);
7245
+ const childrenWithRefs = React.Children.toArray(props.children).filter(child => !!child) // remove falsey children
7246
+ .map((child, index) => {
7247
+ childrenRefs.current[index] = /*#__PURE__*/React.createRef();
7248
+ return /*#__PURE__*/React.cloneElement(child, {
7249
+ ref: childrenRefs.current[index]
7250
+ });
7251
+ });
7252
+ // register any shortcuts attached to children
7253
+ React.useEffect(() => {
7254
+ const shortcuts = [];
7255
+ childrenWithRefs.forEach((child, index) => {
7256
+ if (child.props.shortcut) {
7257
+ shortcuts.push(createShortcutKeyDownHandler(child.props.shortcut, event => {
7258
+ event.preventDefault();
7259
+ menu === null || menu === void 0 ? void 0 : menu.open();
7260
+ setTimeout(() => {
7261
+ var _childrenRefs$current, _childrenRefs$current2;
7262
+ return (_childrenRefs$current = childrenRefs.current[index]) === null || _childrenRefs$current === void 0 ? void 0 : (_childrenRefs$current2 = _childrenRefs$current.current) === null || _childrenRefs$current2 === void 0 ? void 0 : _childrenRefs$current2.click();
7263
+ }, 1);
7264
+ }));
7265
+ }
7266
+ });
7267
+ shortcuts.forEach(handler => document.addEventListener('keydown', handler));
7268
+ return () => {
7269
+ shortcuts.forEach(handler => document.removeEventListener('keydown', handler));
7270
+ };
7271
+ }, []);
7231
7272
  return /*#__PURE__*/React.createElement(DropdownMenuPrimitive.Portal, null, /*#__PURE__*/React.createElement(DropdownMenuPrimitive.Content, Object.assign({}, otherProps, {
7232
7273
  align: align,
7233
7274
  className: className,
@@ -7238,7 +7279,7 @@ const Content$8 = /*#__PURE__*/React.forwardRef(function MenuContent(props, ref)
7238
7279
  minWidth: menu === null || menu === void 0 ? void 0 : menu.minWidth
7239
7280
  },
7240
7281
  ref: internalRef
7241
- }), children));
7282
+ }), childrenWithRefs));
7242
7283
  });
7243
7284
 
7244
7285
  const replaceWithShortform = key => {
@@ -7249,7 +7290,7 @@ const replaceWithShortform = key => {
7249
7290
  return 'Del';
7250
7291
  case 'Space':
7251
7292
  case ' ':
7252
- return '';
7293
+ return 'Space';
7253
7294
  case 'ArrowLeft':
7254
7295
  return '◄';
7255
7296
  case 'ArrowRight':
@@ -7663,6 +7704,7 @@ const Menu$1 = /*#__PURE__*/React.forwardRef(function Menu(externalProps, ref) {
7663
7704
  registerIndentation: () => setIndented(true),
7664
7705
  minWidth,
7665
7706
  setMinWidth: width => setMinWidth(width),
7707
+ open: () => setOpen(true),
7666
7708
  close: () => setOpen(false)
7667
7709
  }), [indented, minWidth]);
7668
7710
  return /*#__PURE__*/React.createElement(MenuContext.Provider, {
@@ -8724,14 +8766,21 @@ const ToastProvider = ({
8724
8766
  };
8725
8767
  const useToast = () => React.useContext(ToastContext);
8726
8768
 
8769
+ const TacoContext = /*#__PURE__*/React.createContext({
8770
+ uniqueUserIdentifier: ''
8771
+ });
8727
8772
  const Provider = props => {
8728
8773
  const {
8729
8774
  children,
8730
- localization
8775
+ localization,
8776
+ settings
8731
8777
  } = props;
8778
+ const context = React.useMemo(() => settings, [JSON.stringify(settings)]);
8732
8779
  return /*#__PURE__*/React.createElement(LocalizationProvider, {
8733
8780
  localization: localization
8734
- }, /*#__PURE__*/React.createElement(TooltipPrimitive.Provider, null, /*#__PURE__*/React.createElement(ToastProvider, null, children)));
8781
+ }, /*#__PURE__*/React.createElement(TacoContext.Provider, {
8782
+ value: context
8783
+ }, /*#__PURE__*/React.createElement(TooltipPrimitive.Provider, null, /*#__PURE__*/React.createElement(ToastProvider, null, children))));
8735
8784
  };
8736
8785
 
8737
8786
  const SearchInput = /*#__PURE__*/React.forwardRef(function SearchInput({
@@ -9468,7 +9517,17 @@ const EditPopover = props => {
9468
9517
  setColor(initialColor);
9469
9518
  };
9470
9519
  const preventKeyDownPropagation = event => {
9471
- if (event.key !== 'Escape') {
9520
+ // Need to allow 'Escape', 'Tab', 'Shift + Tab' to support default focus and close behaviour of Radix Popover.
9521
+ if (event.key === 'Escape' || event.key === 'Tab' || event.key === 'Tab' && event.shiftKey) {
9522
+ return;
9523
+ } else {
9524
+ event.stopPropagation();
9525
+ }
9526
+ };
9527
+ const popoverContentKeyDown = event => {
9528
+ // Need to stop propagation of 'Tab', 'Shift + Tab' keys out of Popover content,
9529
+ // to avoid 'Tab' key execution on Option component and closing the dropdown.
9530
+ if (event.key === 'Tab' || event.key === 'Tab' && event.shiftKey) {
9472
9531
  event.stopPropagation();
9473
9532
  }
9474
9533
  };
@@ -9476,6 +9535,7 @@ const EditPopover = props => {
9476
9535
  onCloseAutoFocus: handleCloseAutoFocus,
9477
9536
  onInteractOutside: handleInteractOutside,
9478
9537
  onClick: event => event.stopPropagation(),
9538
+ onKeyDown: popoverContentKeyDown,
9479
9539
  placement: "right",
9480
9540
  tabIndex: -1,
9481
9541
  className: "focus:!shadow-none"
@@ -15699,20 +15759,6 @@ function isMenuAvailable(table, header) {
15699
15759
  const tableMeta = table.options.meta;
15700
15760
  return !!((_header$column$column = header.column.columnDef.meta) !== null && _header$column$column !== void 0 && _header$column$column.menu) || !!tableMeta.columnFreezing.isEnabled || !!table.options.enableHiding && !!header.column.getCanHide() || isGotoAvailable(table, header);
15701
15761
  }
15702
- function getInitialFrozenIndex(table) {
15703
- const tableMeta = table.options.meta;
15704
- let index = 0;
15705
- if (tableMeta.rowDrag.isEnabled) {
15706
- index++;
15707
- }
15708
- if (table.options.enableRowSelection) {
15709
- index++;
15710
- }
15711
- if (table.options.enableExpanding) {
15712
- index++;
15713
- }
15714
- return index;
15715
- }
15716
15762
  function Menu$3(props) {
15717
15763
  const {
15718
15764
  canFreeze,
@@ -15774,7 +15820,8 @@ function Menu$3(props) {
15774
15820
  if (handleGoto) {
15775
15821
  menuItems.push( /*#__PURE__*/React__default.createElement(Menu$1.Item, {
15776
15822
  icon: "move",
15777
- onClick: () => setPopover('goto')
15823
+ onClick: () => setPopover('goto'),
15824
+ shortcut: "g"
15778
15825
  }, texts.table3.columns.menu.gotoRow, "..."));
15779
15826
  }
15780
15827
  if (canHide) {
@@ -15786,10 +15833,8 @@ function Menu$3(props) {
15786
15833
  }, texts.table3.columns.menu.hideColumn));
15787
15834
  }
15788
15835
  if (canFreeze) {
15789
- const handleClick = () => {
15790
- tableMeta.columnFreezing.setFrozenColumnIndex(index);
15791
- };
15792
- const frozenIndex = index - getInitialFrozenIndex(table);
15836
+ const frozenIndex = index - tableMeta.columnFreezing.frozenInternalColumnCount;
15837
+ const handleClick = () => tableMeta.columnFreezing.setFrozenColumnIndex(frozenIndex);
15793
15838
  menuItems.push( /*#__PURE__*/React__default.createElement(Menu$1.Item, {
15794
15839
  icon: "column-freeze",
15795
15840
  onClick: handleClick
@@ -16073,10 +16118,10 @@ function DisplayCell(props) {
16073
16118
  }, [row.original, props.children, value]);
16074
16119
  const memoedHighlight = React__default.useMemo(() => {
16075
16120
  var _tableMeta$search$que;
16076
- if (!tableMeta.search.isHighlightingEnabled) {
16121
+ if (!tableMeta.search.isHighlightingEnabled || !columnMeta.enableSearch) {
16077
16122
  return false;
16078
16123
  }
16079
- if ((_tableMeta$search$que = tableMeta.search.query) !== null && _tableMeta$search$que !== void 0 && _tableMeta$search$que.length && columnMeta.enableSearch) {
16124
+ if ((_tableMeta$search$que = tableMeta.search.query) !== null && _tableMeta$search$que !== void 0 && _tableMeta$search$que.length) {
16080
16125
  return isCellHighlighted(tableMeta.search.query, value, memoedProps.children);
16081
16126
  }
16082
16127
  return false;
@@ -16607,11 +16652,13 @@ var Table3FilterComparator;
16607
16652
  Table3FilterComparator[Table3FilterComparator["IsGreaterThan"] = 4] = "IsGreaterThan";
16608
16653
  Table3FilterComparator[Table3FilterComparator["IsLessThan"] = 5] = "IsLessThan";
16609
16654
  Table3FilterComparator[Table3FilterComparator["IsBetween"] = 6] = "IsBetween";
16610
- Table3FilterComparator[Table3FilterComparator["IsOneOf"] = 7] = "IsOneOf";
16611
- Table3FilterComparator[Table3FilterComparator["IsNoneOf"] = 8] = "IsNoneOf";
16612
- Table3FilterComparator[Table3FilterComparator["IsAllOf"] = 9] = "IsAllOf";
16613
- Table3FilterComparator[Table3FilterComparator["IsEmpty"] = 10] = "IsEmpty";
16614
- Table3FilterComparator[Table3FilterComparator["IsNotEmpty"] = 11] = "IsNotEmpty";
16655
+ Table3FilterComparator[Table3FilterComparator["IsEmpty"] = 7] = "IsEmpty";
16656
+ Table3FilterComparator[Table3FilterComparator["IsNotEmpty"] = 8] = "IsNotEmpty";
16657
+ Table3FilterComparator[Table3FilterComparator["IsLessThanOrEqualTo"] = 9] = "IsLessThanOrEqualTo";
16658
+ Table3FilterComparator[Table3FilterComparator["IsGreaterThanOrEqualTo"] = 10] = "IsGreaterThanOrEqualTo";
16659
+ Table3FilterComparator[Table3FilterComparator["HasAnyOf"] = 11] = "HasAnyOf";
16660
+ Table3FilterComparator[Table3FilterComparator["HasAllOf"] = 12] = "HasAllOf";
16661
+ Table3FilterComparator[Table3FilterComparator["HasNoneOf"] = 13] = "HasNoneOf";
16615
16662
  })(Table3FilterComparator || (Table3FilterComparator = {}));
16616
16663
 
16617
16664
  const toLowerCase$1 = value => String(value !== null && value !== void 0 ? value : '').toLocaleLowerCase();
@@ -16673,6 +16720,24 @@ function columnFilterFn$1(value, filter) {
16673
16720
  return !isNaN(valueAsNumber) && filter.value !== undefined && valueAsNumber < filter.value;
16674
16721
  }
16675
16722
  }
16723
+ case Table3FilterComparator.IsLessThanOrEqualTo:
16724
+ {
16725
+ if (dateFns.isDate(value)) {
16726
+ return dateFns.isDate(filter.value) && (dateFns.isBefore(value, filter.value) || dateFns.isEqual(value, filter.value));
16727
+ } else {
16728
+ const valueAsNumber = parseInt(value);
16729
+ return !isNaN(valueAsNumber) && filter.value !== undefined && valueAsNumber <= filter.value;
16730
+ }
16731
+ }
16732
+ case Table3FilterComparator.IsGreaterThanOrEqualTo:
16733
+ {
16734
+ if (dateFns.isDate(value)) {
16735
+ return dateFns.isDate(filter.value) && (dateFns.isAfter(value, filter.value) || dateFns.isEqual(value, filter.value));
16736
+ } else {
16737
+ const valueAsNumber = parseInt(value);
16738
+ return !isNaN(valueAsNumber) && filter.value !== undefined && valueAsNumber >= filter.value;
16739
+ }
16740
+ }
16676
16741
  case Table3FilterComparator.IsBetween:
16677
16742
  {
16678
16743
  const [fromValue, toValue] = filter.value;
@@ -16696,11 +16761,11 @@ function columnFilterFn$1(value, filter) {
16696
16761
  return true;
16697
16762
  }
16698
16763
  }
16699
- case Table3FilterComparator.IsOneOf:
16700
- return Array.isArray(filter.value) ? filter.value.includes(value) : false;
16701
- case Table3FilterComparator.IsNoneOf:
16702
- return Array.isArray(filter.value) ? filter.value.includes(value) === false : false;
16703
- case Table3FilterComparator.IsAllOf:
16764
+ case Table3FilterComparator.HasAnyOf:
16765
+ return Array.isArray(filter.value) && Array.isArray(value) ? filter.value.some(item => value.includes(item)) : false;
16766
+ case Table3FilterComparator.HasNoneOf:
16767
+ return Array.isArray(filter.value) && Array.isArray(value) ? filter.value.every(item => value.includes(item) === false) : false;
16768
+ case Table3FilterComparator.HasAllOf:
16704
16769
  return Array.isArray(filter.value) && Array.isArray(value) ? filter.value.filter(v => value.includes(v)).length === filter.value.length : false;
16705
16770
  }
16706
16771
  return false;
@@ -16748,8 +16813,8 @@ function useCurrentRowListener(table) {
16748
16813
  }, [rows.length]);
16749
16814
  }
16750
16815
 
16751
- function getDefaultFrozenIndex(options, defaultFrozenIndex = -1) {
16752
- let index = defaultFrozenIndex;
16816
+ function getFrozenInternalColumnCount(options) {
16817
+ let index = 0;
16753
16818
  if (options.enableRowDrag) {
16754
16819
  index++;
16755
16820
  }
@@ -16759,7 +16824,7 @@ function getDefaultFrozenIndex(options, defaultFrozenIndex = -1) {
16759
16824
  if (options.enableRowExpansion) {
16760
16825
  index++;
16761
16826
  }
16762
- return index >= 0 ? index : undefined;
16827
+ return index;
16763
16828
  }
16764
16829
  /*
16765
16830
  Because of the desired behaviour of column freezing we use custom state and just an index.
@@ -16767,7 +16832,7 @@ If a frozen column is, for example, hidden, then the desired behaviour is that t
16767
16832
  If this behaviour were different we would just use the native column pinning functionality
16768
16833
  */
16769
16834
  function useColumnFreezing(defaultFrozenIndex, options) {
16770
- const [frozenColumnIndex, _setFrozenColumnIndex] = React__default.useState(getDefaultFrozenIndex(options, defaultFrozenIndex));
16835
+ const [frozenColumnIndex, _setFrozenColumnIndex] = React__default.useState(() => defaultFrozenIndex);
16771
16836
  const [horizontallyScrolled, setHorizontallyScrolled] = React__default.useState(false);
16772
16837
  const onScroll = event => {
16773
16838
  if (event.currentTarget.scrollLeft > 0 && !horizontallyScrolled) {
@@ -16776,11 +16841,13 @@ function useColumnFreezing(defaultFrozenIndex, options) {
16776
16841
  setHorizontallyScrolled(false);
16777
16842
  }
16778
16843
  };
16779
- const setFrozenColumnIndex = index => {
16780
- _setFrozenColumnIndex(index !== null && index !== void 0 ? index : getDefaultFrozenIndex(options));
16781
- };
16844
+ const frozenInternalColumnCount = React__default.useMemo(() => getFrozenInternalColumnCount(options), []);
16845
+ // we must set a value when undefined is explicitly set, otherwise nothing is saved to settings
16846
+ // and the next time the table loads it will fall back to the initial value even though the user changed it
16847
+ const setFrozenColumnIndex = index => _setFrozenColumnIndex(index !== null && index !== void 0 ? index : -1);
16782
16848
  return {
16783
16849
  isEnabled: options.enableColumnFreezing,
16850
+ frozenInternalColumnCount,
16784
16851
  frozenColumnIndex,
16785
16852
  setFrozenColumnIndex,
16786
16853
  horizontallyScrolled,
@@ -16788,6 +16855,7 @@ function useColumnFreezing(defaultFrozenIndex, options) {
16788
16855
  };
16789
16856
  }
16790
16857
  function useColumnFreezingStyle(tableId, table) {
16858
+ var _tableMeta$columnFree;
16791
16859
  const {
16792
16860
  columnOrder,
16793
16861
  columnSizing,
@@ -16795,9 +16863,10 @@ function useColumnFreezingStyle(tableId, table) {
16795
16863
  columnVisibility
16796
16864
  } = table.getState();
16797
16865
  const tableMeta = table.options.meta;
16866
+ const frozenColumnIndex = ((_tableMeta$columnFree = tableMeta.columnFreezing.frozenColumnIndex) !== null && _tableMeta$columnFree !== void 0 ? _tableMeta$columnFree : -1) + tableMeta.columnFreezing.frozenInternalColumnCount;
16798
16867
  const style = React__default.useMemo(() => {
16799
- if (tableMeta.columnFreezing.isEnabled && tableMeta.columnFreezing.frozenColumnIndex !== undefined) {
16800
- const visibleFrozenColumns = table.getVisibleLeafColumns().slice(0, tableMeta.columnFreezing.frozenColumnIndex + 1).map(column => column.id);
16868
+ if (tableMeta.columnFreezing.isEnabled && frozenColumnIndex !== undefined) {
16869
+ const visibleFrozenColumns = table.getVisibleLeafColumns().slice(0, frozenColumnIndex + 1).map(column => column.id);
16801
16870
  // if all frozen columns haven't had their size set yet, then abort
16802
16871
  if (visibleFrozenColumns.every(id => columnSizing[id] === undefined)) {
16803
16872
  return undefined;
@@ -16807,26 +16876,26 @@ function useColumnFreezingStyle(tableId, table) {
16807
16876
  offsets[columnId] = offset;
16808
16877
  return offset + columnSizing[columnId];
16809
16878
  }, 0);
16810
- const styles = [Object.values(offsets).map((offset, index) => `#${tableId} [role="row"] > :nth-child(${index + 1}) { left: ${offset}px }`).join('\n'), `#${tableId} [role="row"] > :not(:nth-child(n+${tableMeta.columnFreezing.frozenColumnIndex + 2})) {
16879
+ const styles = [Object.values(offsets).map((offset, index) => `#${tableId} [role="row"] > :nth-child(${index + 1}) { left: ${offset}px }`).join('\n'), `#${tableId} [role="row"] > :not(:nth-child(n+${frozenColumnIndex + 2})) {
16811
16880
  position: sticky;
16812
- z-index: 20;
16813
- }`, `#${tableId}[data-horizontally-scrolled="true"] [role="row"] > :nth-child(${tableMeta.columnFreezing.frozenColumnIndex + 1}) {
16881
+ z-index: 20;
16882
+ }`, `#${tableId}[data-horizontally-scrolled="true"] [role="row"] > :nth-child(${frozenColumnIndex + 1}) {
16814
16883
  box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), 6px 0px 6px rgb(0 0 0/8%), 1px 0px 0px #DDDDDD;
16815
16884
  }`];
16816
- const columnId = visibleFrozenColumns[tableMeta.columnFreezing.frozenColumnIndex];
16885
+ const columnId = visibleFrozenColumns[frozenColumnIndex];
16817
16886
  // frozenColumnIndex could not be in the visible frozen column so it is important to check if columnId
16818
16887
  // exists before checking if it is internal.
16819
16888
  //
16820
16889
  // only add a border to the edge column if it isn't an internal column
16821
16890
  if (columnId && !isInternalColumn$1(columnId)) {
16822
- styles.push(`#${tableId}[data-horizontally-scrolled="false"] [role="row"] > :nth-child(${tableMeta.columnFreezing.frozenColumnIndex + 1}) {
16891
+ styles.push(`#${tableId}[data-horizontally-scrolled="false"] [role="row"] > :nth-child(${frozenColumnIndex + 1}) {
16823
16892
  box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), 1px 0px 0px #DDDDDD;
16824
16893
  }`);
16825
16894
  }
16826
16895
  return styles.join('\n');
16827
16896
  }
16828
16897
  return undefined;
16829
- }, [columnOrder, columnSizing, columnSizingInfo, columnVisibility, tableMeta.columnFreezing.isEnabled, tableMeta.columnFreezing.frozenColumnIndex]);
16898
+ }, [columnOrder, columnSizing, columnSizingInfo, columnVisibility, tableMeta.columnFreezing.isEnabled, frozenColumnIndex]);
16830
16899
  return style;
16831
16900
  }
16832
16901
 
@@ -17666,7 +17735,12 @@ const Cell$4 = /*#__PURE__*/React__default.memo(function MemoedCell(context) {
17666
17735
  }
17667
17736
  tableMeta.rowSelection.lastSelectedRowIndex.current = rowIndex;
17668
17737
  };
17669
- return /*#__PURE__*/React__default.createElement(DisplayCell, Object.assign({}, context), /*#__PURE__*/React__default.createElement(Checkbox, {
17738
+ return /*#__PURE__*/React__default.createElement(DisplayCell, Object.assign({}, context), /*#__PURE__*/React__default.createElement(Tooltip, {
17739
+ title: /*#__PURE__*/React__default.createElement(React__default.Fragment, null, title, /*#__PURE__*/React__default.createElement(Shortcut, {
17740
+ className: "ml-2",
17741
+ keys: "Space"
17742
+ }))
17743
+ }, /*#__PURE__*/React__default.createElement(Checkbox, {
17670
17744
  "aria-label": title,
17671
17745
  className: "!mt-0",
17672
17746
  checked: isSelected,
@@ -17674,7 +17748,7 @@ const Cell$4 = /*#__PURE__*/React__default.memo(function MemoedCell(context) {
17674
17748
  // this is necessary to remove console spam from eslint
17675
17749
  onChange: () => false,
17676
17750
  tabIndex: isCurrentRow ? 0 : -1
17677
- }));
17751
+ })));
17678
17752
  } else {
17679
17753
  const className = cn('!mt-0', getRadioClassnames());
17680
17754
  const handleClick = event => {
@@ -17901,7 +17975,7 @@ function getSortingFn$1(dataType, customFnOrBuiltIn) {
17901
17975
  return customFnOrBuiltIn;
17902
17976
  }
17903
17977
  // some times we alias based on the type
17904
- if (dataType && dataType !== 'boolean') {
17978
+ if (dataType && dataType !== 'boolean' && dataType !== 'number') {
17905
17979
  return dataType;
17906
17980
  }
17907
17981
  // otherwise fall back to auto
@@ -17956,11 +18030,9 @@ function useConvertChildrenToColumns(props, options, editing) {
17956
18030
  control: child.props.control,
17957
18031
  dataType: child.props.dataType,
17958
18032
  enableOrdering: (_child$props$enableOr = child.props.enableOrdering) !== null && _child$props$enableOr !== void 0 ? _child$props$enableOr : true,
17959
- // react-table global filtering only samples from row 0 in a dataset for filtering and this
17960
- // leads to some columns being disabled if, e.g., a column in row 0 has an undefined value
17961
- // so we do not use the native enableGlobalFilter property and instead use our own enableSearch
17962
18033
  enableSearch: (_child$props$enableSe = child.props.enableSearch) !== null && _child$props$enableSe !== void 0 ? _child$props$enableSe : true,
17963
18034
  enableTruncate: (_child$props$enableTr = child.props.enableTruncate) !== null && _child$props$enableTr !== void 0 ? _child$props$enableTr : false,
18035
+ filters: child.props.filters,
17964
18036
  footer: child.props.footer,
17965
18037
  header: child.props.header,
17966
18038
  headerClassName: child.props.headerClassName,
@@ -18118,8 +18190,54 @@ function useRowActions$1(actionsForRow, actionsForRowLength = ACTIONS_ON_ROW_LEN
18118
18190
  };
18119
18191
  }
18120
18192
 
18193
+ const useLocalStorage = (key, initialValue) => {
18194
+ const [state, setState] = React__default.useState(() => {
18195
+ try {
18196
+ const localStorageValue = localStorage.getItem(key);
18197
+ if (typeof localStorageValue !== 'string') {
18198
+ localStorage.setItem(key, JSON.stringify(initialValue));
18199
+ return initialValue;
18200
+ } else {
18201
+ return JSON.parse(localStorageValue || 'null');
18202
+ }
18203
+ } catch {
18204
+ // If user is in private mode or has storage restriction
18205
+ // localStorage can throw. JSON.parse and JSON.stringify
18206
+ // can throw, too.
18207
+ return initialValue;
18208
+ }
18209
+ });
18210
+ React__default.useEffect(() => {
18211
+ try {
18212
+ const serializedState = JSON.stringify(state);
18213
+ localStorage.setItem(key, serializedState);
18214
+ } catch {
18215
+ // If user is in private mode or has storage restriction
18216
+ // localStorage can throw. Also JSON.stringify can throw.
18217
+ }
18218
+ }, [key, state]);
18219
+ const clear = () => localStorage.removeItem(key);
18220
+ return [state, setState, clear];
18221
+ };
18222
+
18223
+ function useTacoSettings() {
18224
+ return React__default.useContext(TacoContext);
18225
+ }
18226
+
18227
+ function useSettings(id, defaultSettings = {}, onChangeSettings) {
18228
+ const tacoSettings = useTacoSettings();
18229
+ const uniqueId = `taco.${tacoSettings.uniqueUserIdentifier}.table3.${id}.settings`;
18230
+ const [persistedSettings, setPersistedSettings] = useLocalStorage(uniqueId, defaultSettings);
18231
+ return React__default.useMemo(() => {
18232
+ if (onChangeSettings) {
18233
+ return [defaultSettings, onChangeSettings];
18234
+ }
18235
+ return [persistedSettings, setPersistedSettings];
18236
+ }, []);
18237
+ }
18238
+
18121
18239
  function useTable$2(props) {
18122
- var _ref, _props$defaultSetting, _props$defaultSetting2, _props$defaultSetting3, _props$defaultSetting4, _props$defaultSetting5, _props$defaultSetting6, _props$defaultSetting7, _props$defaultSetting8, _props$defaultSetting9, _props$length;
18240
+ var _ref, _defaultSettings$colu, _defaultSettings$rowH, _props$length;
18123
18241
  // options
18124
18242
  const options = useTablePreset(props);
18125
18243
  const tableOptions = {
@@ -18157,6 +18275,10 @@ function useTable$2(props) {
18157
18275
  return false;
18158
18276
  };
18159
18277
  tableOptions.getFilteredRowModel = reactTable$1.getFilteredRowModel();
18278
+ tableOptions.getColumnCanGlobalFilter = column => {
18279
+ var _column$columnDef$met;
18280
+ return (_column$columnDef$met = column.columnDef.meta.enableSearch) !== null && _column$columnDef$met !== void 0 ? _column$columnDef$met : true;
18281
+ };
18160
18282
  }
18161
18283
  // sorting
18162
18284
  if (options.enableSorting) {
@@ -18167,24 +18289,25 @@ function useTable$2(props) {
18167
18289
  tableOptions.getSortedRowModel = reactTable$1.getSortedRowModel();
18168
18290
  }
18169
18291
  }
18292
+ const [defaultSettings, setSettings] = useSettings(props.id, props.defaultSettings, props.onChangeSettings);
18170
18293
  // custom features
18171
18294
  const columnFreezing = useColumnFreezing( // temporarily see if deprecated frozenColumnCount is there
18172
- (_ref = (_props$defaultSetting = (_props$defaultSetting2 = props.defaultSettings) === null || _props$defaultSetting2 === void 0 ? void 0 : _props$defaultSetting2.columnFreezingIndex) !== null && _props$defaultSetting !== void 0 ? _props$defaultSetting : (_props$defaultSetting3 = props.defaultSettings) === null || _props$defaultSetting3 === void 0 ? void 0 : _props$defaultSetting3.frozenColumnCount) !== null && _ref !== void 0 ? _ref : props.defaultColumnFreezingIndex, options);
18295
+ (_ref = (_defaultSettings$colu = defaultSettings.columnFreezingIndex) !== null && _defaultSettings$colu !== void 0 ? _defaultSettings$colu : defaultSettings === null || defaultSettings === void 0 ? void 0 : defaultSettings.frozenColumnCount) !== null && _ref !== void 0 ? _ref : props.defaultColumnFreezingIndex, options);
18173
18296
  const columnOrdering = useColumnOrdering(options);
18174
18297
  const currentRow = useCurrentRow(props.defaultCurrentRowIndex);
18175
18298
  const editing = useEditing(options.enableEditing, props.onSave);
18176
- const fontSize = useFontSize(options.enableFontSize, (_props$defaultSetting4 = props.defaultSettings) === null || _props$defaultSetting4 === void 0 ? void 0 : _props$defaultSetting4.fontSize);
18299
+ const fontSize = useFontSize(options.enableFontSize, defaultSettings.fontSize);
18177
18300
  const hoverState = usePauseHoverState();
18178
- const printing = usePrinting(options.enablePrinting, props.loadAll, (_props$defaultSetting5 = props.defaultSettings) === null || _props$defaultSetting5 === void 0 ? void 0 : _props$defaultSetting5.showWarningWhenPrintingLargeDataset);
18301
+ const printing = usePrinting(options.enablePrinting, props.loadAll, defaultSettings.showWarningWhenPrintingLargeDataset);
18179
18302
  const rowActions = useRowActions$1(props.actionsForRow, props.actionsForRowLength);
18180
18303
  const rowClick = useRowClick(props.onRowClick);
18181
18304
  const rowDrag = useRowDrag(options.enableRowDrag);
18182
18305
  const rowDrop = useRowDrop(options.enableRowDrop, props.onRowDrop);
18183
18306
  const rowGoto = useRowGoto(options.enableRowGoto, props.onRowGoto);
18184
18307
  const rowHeight = useRowHeight(options.enableRowHeight, // temporarily see if deprecated rowDensity is there
18185
- (_props$defaultSetting6 = (_props$defaultSetting7 = props.defaultSettings) === null || _props$defaultSetting7 === void 0 ? void 0 : _props$defaultSetting7.rowHeight) !== null && _props$defaultSetting6 !== void 0 ? _props$defaultSetting6 : (_props$defaultSetting8 = props.defaultSettings) === null || _props$defaultSetting8 === void 0 ? void 0 : _props$defaultSetting8.rowDensity);
18308
+ (_defaultSettings$rowH = defaultSettings.rowHeight) !== null && _defaultSettings$rowH !== void 0 ? _defaultSettings$rowH : defaultSettings === null || defaultSettings === void 0 ? void 0 : defaultSettings.rowDensity);
18186
18309
  const rowSelection = useRowSelection();
18187
- const search = useSearch(options.enableSearch, (_props$defaultSetting9 = props.defaultSettings) === null || _props$defaultSetting9 === void 0 ? void 0 : _props$defaultSetting9.excludeUnmatchedRecordsInSearch, props.loadAll);
18310
+ const search = useSearch(options.enableSearch, defaultSettings.excludeUnmatchedRecordsInSearch, props.loadAll);
18188
18311
  // columns
18189
18312
  const {
18190
18313
  columns,
@@ -18194,13 +18317,13 @@ function useTable$2(props) {
18194
18317
  } = useConvertChildrenToColumns(props, options, editing);
18195
18318
  // built-in features
18196
18319
  const initialState = React__default.useMemo(() => {
18197
- var _props$defaultSetting10, _props$defaultSetting11, _props$defaultSetting12, _props$defaultSetting13, _props$defaultSetting14, _props$defaultSetting15, _props$defaultSetting16;
18320
+ var _defaultSettings$colu2, _defaultSettings$colu3;
18198
18321
  const sanitizeSortedColumns = column => columns.find(definedColumn => definedColumn.id === column.id);
18199
18322
  return {
18200
- columnOrder: ensureOrdering$1(columns, (_props$defaultSetting10 = props.defaultSettings) === null || _props$defaultSetting10 === void 0 ? void 0 : _props$defaultSetting10.columnOrder),
18201
- columnSizing: (_props$defaultSetting11 = (_props$defaultSetting12 = props.defaultSettings) === null || _props$defaultSetting12 === void 0 ? void 0 : _props$defaultSetting12.columnSizing) !== null && _props$defaultSetting11 !== void 0 ? _props$defaultSetting11 : defaultColumnSizing,
18202
- columnVisibility: (_props$defaultSetting13 = (_props$defaultSetting14 = props.defaultSettings) === null || _props$defaultSetting14 === void 0 ? void 0 : _props$defaultSetting14.columnVisibility) !== null && _props$defaultSetting13 !== void 0 ? _props$defaultSetting13 : defaultColumnVisibility,
18203
- sorting: (_props$defaultSetting15 = props.defaultSettings) !== null && _props$defaultSetting15 !== void 0 && _props$defaultSetting15.sorting ? (_props$defaultSetting16 = props.defaultSettings) === null || _props$defaultSetting16 === void 0 ? void 0 : _props$defaultSetting16.sorting.filter(sanitizeSortedColumns) : defaultSorting
18323
+ columnOrder: ensureOrdering$1(columns, defaultSettings.columnOrder),
18324
+ columnSizing: (_defaultSettings$colu2 = defaultSettings.columnSizing) !== null && _defaultSettings$colu2 !== void 0 ? _defaultSettings$colu2 : defaultColumnSizing,
18325
+ columnVisibility: (_defaultSettings$colu3 = defaultSettings.columnVisibility) !== null && _defaultSettings$colu3 !== void 0 ? _defaultSettings$colu3 : defaultColumnVisibility,
18326
+ sorting: defaultSettings.sorting ? defaultSettings.sorting.filter(sanitizeSortedColumns) : defaultSorting
18204
18327
  };
18205
18328
  }, []);
18206
18329
  const table = reactTable$1.useReactTable({
@@ -18234,7 +18357,7 @@ function useTable$2(props) {
18234
18357
  useEditingStateListener(table);
18235
18358
  useFilteringStateListener(table, props.onFilter);
18236
18359
  useRowSelectionListener$1(table, props.onRowSelect);
18237
- useSettingsStateListener$1(table, props.onChangeSettings);
18360
+ useSettingsStateListener$1(table, setSettings);
18238
18361
  useShortcutsListener(table, props.shortcuts);
18239
18362
  useServerLoadingListener(table, props.loadPage);
18240
18363
  useSortingStateListener(table, props.onSort);
@@ -18812,12 +18935,12 @@ function resetHighlightedColumnIndexes(enabled, value, table) {
18812
18935
  table.getRowModel().rows.forEach((row, rowIndex) => {
18813
18936
  columns.forEach((column, columnIndex) => {
18814
18937
  try {
18815
- var _column$columnDef$met, _format, _format2;
18816
- if ((_column$columnDef$met = column.columnDef.meta) !== null && _column$columnDef$met !== void 0 && _column$columnDef$met.enableSearch && row.original && globalFilterFn$1(
18938
+ var _format, _column$columnDef$met, _format2;
18939
+ if (row.original && globalFilterFn$1(
18817
18940
  // if it's a date, format it first
18818
18941
  dateFns.isDate(row.original[column.id]) ? (_format = format(row.original[column.id])) !== null && _format !== void 0 ? _format : '' :
18819
18942
  // if its marked as a date but isn't a date, try to format it
18820
- column.columnDef.meta.dataType === 'datetime' ? (_format2 = format(parseFromISOString(row.original[column.id]))) !== null && _format2 !== void 0 ? _format2 : '' :
18943
+ ((_column$columnDef$met = column.columnDef.meta) === null || _column$columnDef$met === void 0 ? void 0 : _column$columnDef$met.dataType) === 'datetime' ? (_format2 = format(parseFromISOString(row.original[column.id]))) !== null && _format2 !== void 0 ? _format2 : '' :
18821
18944
  // otherwise just string compare
18822
18945
  String(row.original[column.id]), value)) {
18823
18946
  indexes.push([rowIndex, columnIndex]);
@@ -18869,29 +18992,74 @@ function FilterColumn(props) {
18869
18992
 
18870
18993
  function FilterComparator(props) {
18871
18994
  const {
18995
+ column,
18872
18996
  onChange: handleChange,
18873
18997
  value,
18874
- validComparators,
18875
18998
  ...attributes
18876
18999
  } = props;
18877
19000
  const {
18878
19001
  texts
18879
19002
  } = useLocalization();
19003
+ const validComparators = guessComparatorsBasedOnControl$1(column);
18880
19004
  React__default.useEffect(() => {
18881
- if (value === undefined) {
19005
+ if (value === undefined || !validComparators.includes(value)) {
18882
19006
  handleChange === null || handleChange === void 0 ? void 0 : handleChange(validComparators[0]);
18883
19007
  }
18884
- }, []);
19008
+ }, [validComparators]);
18885
19009
  return /*#__PURE__*/React__default.createElement(Select2, Object.assign({}, attributes, {
18886
19010
  className: "!w-32 flex-shrink-0",
19011
+ disabled: !column,
18887
19012
  onChange: handleChange,
18888
19013
  value: value
18889
- }), validComparators.map(comp => /*#__PURE__*/React__default.createElement(Select2.Option, {
18890
- key: comp,
18891
- value: comp
18892
- }, getComparatorText$1(comp, texts))));
19014
+ }), validComparators.map(comparator => /*#__PURE__*/React__default.createElement(Select2.Option, {
19015
+ key: comparator,
19016
+ value: comparator
19017
+ }, getComparatorText$1(comparator, texts, column))));
19018
+ }
19019
+ function guessComparatorsBasedOnControl$1(column) {
19020
+ var _column$columnDef$met;
19021
+ const columnMeta = (_column$columnDef$met = column === null || column === void 0 ? void 0 : column.columnDef.meta) !== null && _column$columnDef$met !== void 0 ? _column$columnDef$met : {};
19022
+ if (Array.isArray(columnMeta.filters)) {
19023
+ return columnMeta.filters;
19024
+ }
19025
+ if (typeof columnMeta.control === 'function') {
19026
+ const renderedControl = columnMeta.control({
19027
+ onBlur: () => undefined,
19028
+ onFocus: () => undefined,
19029
+ setValue: () => undefined,
19030
+ value: undefined,
19031
+ disabled: false,
19032
+ readOnly: false,
19033
+ ref: undefined
19034
+ });
19035
+ if ( /*#__PURE__*/React__default.isValidElement(renderedControl)) {
19036
+ const {
19037
+ props,
19038
+ type
19039
+ } = renderedControl;
19040
+ if (type.displayName === 'Select2') {
19041
+ if (props.multiple) {
19042
+ return [Table3FilterComparator.HasAnyOf, Table3FilterComparator.HasAllOf, Table3FilterComparator.IsEqualTo, Table3FilterComparator.HasNoneOf, Table3FilterComparator.IsEmpty, Table3FilterComparator.IsNotEmpty];
19043
+ }
19044
+ return [Table3FilterComparator.IsEqualTo, Table3FilterComparator.IsNotEqualTo, Table3FilterComparator.IsEmpty, Table3FilterComparator.IsNotEmpty];
19045
+ }
19046
+ }
19047
+ }
19048
+ // @ts-expect-error -- we ignore it because it conflicts with Table2 also overridding ColumnMeta
19049
+ if (columnMeta.dataType === 'number') {
19050
+ return [Table3FilterComparator.IsEqualTo, Table3FilterComparator.IsNotEqualTo, Table3FilterComparator.IsGreaterThan, Table3FilterComparator.IsLessThan, Table3FilterComparator.IsBetween, Table3FilterComparator.IsEmpty, Table3FilterComparator.IsNotEmpty];
19051
+ }
19052
+ if (columnMeta.control === 'datepicker' || columnMeta.dataType === 'datetime') {
19053
+ return [Table3FilterComparator.IsEqualTo, Table3FilterComparator.IsNotEqualTo, Table3FilterComparator.IsBetween, Table3FilterComparator.IsLessThan, Table3FilterComparator.IsGreaterThan, Table3FilterComparator.IsEmpty, Table3FilterComparator.IsNotEmpty, Table3FilterComparator.IsLessThanOrEqualTo, Table3FilterComparator.IsGreaterThanOrEqualTo];
19054
+ }
19055
+ if (columnMeta.control === 'switch') {
19056
+ return [Table3FilterComparator.IsEqualTo];
19057
+ }
19058
+ return [Table3FilterComparator.Contains, Table3FilterComparator.DoesNotContain, Table3FilterComparator.IsEqualTo, Table3FilterComparator.IsNotEqualTo, Table3FilterComparator.IsEmpty, Table3FilterComparator.IsNotEmpty];
18893
19059
  }
18894
- const getComparatorText$1 = (comparator, texts) => {
19060
+ function getComparatorText$1(comparator, texts, column) {
19061
+ var _column$columnDef, _column$columnDef$met2;
19062
+ const isDate = (column === null || column === void 0 ? void 0 : (_column$columnDef = column.columnDef) === null || _column$columnDef === void 0 ? void 0 : (_column$columnDef$met2 = _column$columnDef.meta) === null || _column$columnDef$met2 === void 0 ? void 0 : _column$columnDef$met2.control) === 'datepicker';
18895
19063
  switch (comparator) {
18896
19064
  case Table3FilterComparator.Contains:
18897
19065
  return texts.table3.filters.comparators.contains;
@@ -18902,23 +19070,61 @@ const getComparatorText$1 = (comparator, texts) => {
18902
19070
  case Table3FilterComparator.IsNotEqualTo:
18903
19071
  return texts.table3.filters.comparators.isNotEqualTo;
18904
19072
  case Table3FilterComparator.IsGreaterThan:
18905
- return texts.table3.filters.comparators.isGreaterThan;
19073
+ return isDate ? texts.table3.filters.comparators.isAfter : texts.table3.filters.comparators.isGreaterThan;
18906
19074
  case Table3FilterComparator.IsLessThan:
18907
- return texts.table3.filters.comparators.isLessThan;
19075
+ return isDate ? texts.table3.filters.comparators.isBefore : texts.table3.filters.comparators.isLessThan;
18908
19076
  case Table3FilterComparator.IsBetween:
18909
19077
  return texts.table3.filters.comparators.isBetween;
18910
- case Table3FilterComparator.IsOneOf:
18911
- return texts.table3.filters.comparators.isOneOf;
18912
- case Table3FilterComparator.IsNoneOf:
18913
- return texts.table3.filters.comparators.isNoneOf;
18914
- case Table3FilterComparator.IsAllOf:
18915
- return texts.table3.filters.comparators.isAllOf;
18916
19078
  case Table3FilterComparator.IsEmpty:
18917
19079
  return texts.table3.filters.comparators.isEmpty;
18918
19080
  case Table3FilterComparator.IsNotEmpty:
18919
19081
  return texts.table3.filters.comparators.isNotEmpty;
19082
+ case Table3FilterComparator.IsLessThanOrEqualTo:
19083
+ return isDate ? texts.table3.filters.comparators.isOnOrBefore : texts.table3.filters.comparators.isLessThanOrEqualTo;
19084
+ case Table3FilterComparator.IsGreaterThanOrEqualTo:
19085
+ return isDate ? texts.table3.filters.comparators.isOnOrAfter : texts.table3.filters.comparators.isGreaterThanOrEqualTo;
19086
+ case Table3FilterComparator.HasAnyOf:
19087
+ return texts.table3.filters.comparators.hasAnyOf;
19088
+ case Table3FilterComparator.HasAllOf:
19089
+ return texts.table3.filters.comparators.hasAllOf;
19090
+ case Table3FilterComparator.HasNoneOf:
19091
+ return texts.table3.filters.comparators.hasNoneOf;
19092
+ default:
19093
+ return '';
18920
19094
  }
18921
- };
19095
+ }
19096
+
19097
+ function Placeholder(props) {
19098
+ const {
19099
+ allColumns,
19100
+ filters,
19101
+ onCreate: handleCreate,
19102
+ onRemove: handleRemove,
19103
+ position
19104
+ } = props;
19105
+ const {
19106
+ texts
19107
+ } = useLocalization();
19108
+ return /*#__PURE__*/React__default.createElement("div", {
19109
+ className: "flex gap-2"
19110
+ }, /*#__PURE__*/React__default.createElement("div", {
19111
+ className: "flex w-14 flex-shrink-0 items-center justify-end pr-2 text-right"
19112
+ }, position > 0 ? texts.table3.filters.conditions.and : texts.table3.filters.conditions.where), /*#__PURE__*/React__default.createElement(FilterColumn, {
19113
+ allColumns: allColumns,
19114
+ filters: filters,
19115
+ onChange: handleCreate,
19116
+ value: null
19117
+ }), /*#__PURE__*/React__default.createElement(FilterComparator, null), /*#__PURE__*/React__default.createElement(Input, {
19118
+ "aria-label": texts.table3.filters.emptyFilter.value,
19119
+ className: "flex-grow",
19120
+ disabled: true,
19121
+ value: texts.table3.filters.emptyFilter.value
19122
+ }), handleRemove ? /*#__PURE__*/React__default.createElement(IconButton, {
19123
+ appearance: "discrete",
19124
+ icon: "close",
19125
+ onClick: handleRemove
19126
+ }) : null);
19127
+ }
18922
19128
 
18923
19129
  function FilterValue(props) {
18924
19130
  const {
@@ -18927,6 +19133,9 @@ function FilterValue(props) {
18927
19133
  onChange: handleChange,
18928
19134
  value
18929
19135
  } = props;
19136
+ const {
19137
+ texts
19138
+ } = useLocalization();
18930
19139
  if (comparator === Table3FilterComparator.IsEmpty || comparator === Table3FilterComparator.IsNotEmpty) {
18931
19140
  return null;
18932
19141
  }
@@ -18934,6 +19143,14 @@ function FilterValue(props) {
18934
19143
  var _column$columnDef$met;
18935
19144
  const fromValue = Array.isArray(value) ? value[0] : undefined;
18936
19145
  const toValue = Array.isArray(value) ? value[1] : undefined;
19146
+ if (column === undefined) {
19147
+ return /*#__PURE__*/React__default.createElement(Input, {
19148
+ "aria-label": texts.table3.filters.emptyFilter.value,
19149
+ className: "flex-grow",
19150
+ disabled: true,
19151
+ value: texts.table3.filters.emptyFilter.value
19152
+ });
19153
+ }
18937
19154
  if (((_column$columnDef$met = column.columnDef.meta) === null || _column$columnDef$met === void 0 ? void 0 : _column$columnDef$met.dataType) === 'datetime') {
18938
19155
  return /*#__PURE__*/React__default.createElement("div", {
18939
19156
  className: "flex flex-grow items-center gap-2"
@@ -18962,6 +19179,7 @@ function FilterValue(props) {
18962
19179
  }));
18963
19180
  }
18964
19181
  return /*#__PURE__*/React__default.createElement(Control$1, {
19182
+ comparator: comparator,
18965
19183
  column: column,
18966
19184
  onChange: handleChange,
18967
19185
  value: value
@@ -18971,12 +19189,18 @@ function Control$1(props) {
18971
19189
  var _column$columnDef$met2, _column$columnDef$met3;
18972
19190
  const {
18973
19191
  column,
19192
+ comparator,
18974
19193
  onChange,
18975
19194
  value,
18976
19195
  ...attributes
18977
19196
  } = props;
18978
19197
  const controlRenderer = (_column$columnDef$met2 = column.columnDef.meta) === null || _column$columnDef$met2 === void 0 ? void 0 : _column$columnDef$met2.control;
18979
19198
  const dataType = (_column$columnDef$met3 = column.columnDef.meta) === null || _column$columnDef$met3 === void 0 ? void 0 : _column$columnDef$met3.dataType;
19199
+ React.useEffect(() => {
19200
+ if (controlRenderer === 'switch') {
19201
+ onChange(false);
19202
+ }
19203
+ }, []);
18980
19204
  if (typeof controlRenderer === 'function') {
18981
19205
  return controlRenderer({
18982
19206
  ...attributes,
@@ -18988,11 +19212,19 @@ function Control$1(props) {
18988
19212
  onChange: event => onChange(event.detail),
18989
19213
  value: value
18990
19214
  }));
18991
- } else if (controlRenderer === 'switch' || dataType === 'boolean') {
19215
+ } else if (controlRenderer === 'switch') {
18992
19216
  return /*#__PURE__*/React__default.createElement(Switch, Object.assign({}, attributes, {
19217
+ className: "m-1.5",
18993
19218
  checked: Boolean(value),
18994
19219
  onChange: onChange
18995
19220
  }));
19221
+ } else if ((controlRenderer === 'input' || controlRenderer === undefined) && dataType === 'number') {
19222
+ return /*#__PURE__*/React__default.createElement(Input, Object.assign({}, attributes, {
19223
+ className: cn(getInputAppearanceClassnames(), 'flex-grow'),
19224
+ type: "number",
19225
+ onChange: event => onChange(event.target.valueAsNumber),
19226
+ value: String(value !== null && value !== void 0 ? value : '')
19227
+ }));
18996
19228
  }
18997
19229
  return /*#__PURE__*/React__default.createElement(Input, Object.assign({}, attributes, {
18998
19230
  className: "flex-grow",
@@ -19060,8 +19292,8 @@ function Filter$1(props) {
19060
19292
  onChange: handleChangeColumn,
19061
19293
  value: id
19062
19294
  }), /*#__PURE__*/React__default.createElement(FilterComparator, {
19295
+ column: column,
19063
19296
  onChange: handleChangeComparator,
19064
- validComparators: guessComparatorsBasedOnControl$1(),
19065
19297
  value: comparator
19066
19298
  }), /*#__PURE__*/React__default.createElement(FilterValue, {
19067
19299
  column: column,
@@ -19075,63 +19307,6 @@ function Filter$1(props) {
19075
19307
  onClick: handleRemove
19076
19308
  }));
19077
19309
  }
19078
- function guessComparatorsBasedOnControl$1(instance, control) {
19079
- if ( /*#__PURE__*/React__default.isValidElement(instance)) {
19080
- const {
19081
- props,
19082
- type
19083
- } = instance;
19084
- if (type.displayName === 'Select2') {
19085
- if (props.multiple) {
19086
- return [Table3FilterComparator.IsOneOf, Table3FilterComparator.IsNoneOf, Table3FilterComparator.IsAllOf];
19087
- }
19088
- return [Table3FilterComparator.IsEqualTo, Table3FilterComparator.IsNotEqualTo];
19089
- }
19090
- }
19091
- switch (control) {
19092
- case 'datepicker':
19093
- return [Table3FilterComparator.IsEqualTo, Table3FilterComparator.IsNotEqualTo, Table3FilterComparator.IsGreaterThan, Table3FilterComparator.IsLessThan, Table3FilterComparator.IsBetween];
19094
- case 'switch':
19095
- return [Table3FilterComparator.IsEqualTo];
19096
- default:
19097
- return [Table3FilterComparator.Contains, Table3FilterComparator.DoesNotContain, Table3FilterComparator.IsEqualTo, Table3FilterComparator.IsNotEqualTo, Table3FilterComparator.IsEmpty, Table3FilterComparator.IsNotEmpty, Table3FilterComparator.IsGreaterThan, Table3FilterComparator.IsLessThan, Table3FilterComparator.IsBetween];
19098
- }
19099
- }
19100
-
19101
- function Placeholder(props) {
19102
- const {
19103
- allColumns,
19104
- filters,
19105
- onCreate: handleCreate,
19106
- onRemove: handleRemove,
19107
- position
19108
- } = props;
19109
- const {
19110
- texts
19111
- } = useLocalization();
19112
- return /*#__PURE__*/React__default.createElement("div", {
19113
- className: "flex gap-2"
19114
- }, /*#__PURE__*/React__default.createElement("div", {
19115
- className: "flex w-14 flex-shrink-0 items-center justify-end pr-2 text-right"
19116
- }, position > 0 ? texts.table3.filters.conditions.and : texts.table3.filters.conditions.where), /*#__PURE__*/React__default.createElement(FilterColumn, {
19117
- allColumns: allColumns,
19118
- filters: filters,
19119
- onChange: handleCreate,
19120
- value: null
19121
- }), /*#__PURE__*/React__default.createElement(FilterComparator, {
19122
- disabled: true,
19123
- validComparators: guessComparatorsBasedOnControl$1()
19124
- }), /*#__PURE__*/React__default.createElement(Input, {
19125
- "aria-label": texts.table3.filters.emptyFilter.value,
19126
- className: "flex-grow",
19127
- disabled: true,
19128
- value: texts.table3.filters.emptyFilter.value
19129
- }), handleRemove ? /*#__PURE__*/React__default.createElement(IconButton, {
19130
- appearance: "discrete",
19131
- icon: "close",
19132
- onClick: handleRemove
19133
- }) : null);
19134
- }
19135
19310
 
19136
19311
  function sortByHeader(a, b) {
19137
19312
  var _a$columnDef$meta, _a$columnDef$meta$hea, _a$columnDef$meta$hea2, _b$columnDef$meta;
@@ -19195,7 +19370,9 @@ function Filters(props) {
19195
19370
  //
19196
19371
  const handleApply = () => {
19197
19372
  table.setColumnFilters(filters.filter(f => {
19198
- if (f.value.comparator === Table3FilterComparator.IsEmpty || f.value.comparator === Table3FilterComparator.IsNotEmpty) {
19373
+ var _allColumns$find$colu;
19374
+ const controlRenderer = (_allColumns$find$colu = allColumns.find(c => c.id === f.id).columnDef.meta) === null || _allColumns$find$colu === void 0 ? void 0 : _allColumns$find$colu.control;
19375
+ if (f.value.comparator === Table3FilterComparator.IsEmpty || f.value.comparator === Table3FilterComparator.IsNotEmpty || controlRenderer === 'switch') {
19199
19376
  return true;
19200
19377
  }
19201
19378
  return !!f.value.value;
@@ -19400,6 +19577,11 @@ const PRINT_STYLES = `
19400
19577
  width: auto !important;
19401
19578
  }
19402
19579
 
19580
+ #root {
19581
+ /* chrome sometimes crops the bottom content of page and this padding will make sure that we see the whole content*/
19582
+ padding-bottom: 20px;
19583
+ }
19584
+
19403
19585
  [role="table"] {
19404
19586
  border-width: 0 !important;
19405
19587
  overflow-y: hidden !important;
@@ -19480,30 +19662,9 @@ function PrintIFrame({
19480
19662
  }) {
19481
19663
  const [contentRef, setContentRef] = React__default.useState(null);
19482
19664
  const [mountNode, setMountNode] = React__default.useState(null);
19665
+ const isFirefoxBrowser = React__default.useMemo(() => navigator.userAgent.toLowerCase().includes('firefox'), []);
19483
19666
  const iframeWindow = contentRef === null || contentRef === void 0 ? void 0 : contentRef.contentWindow;
19484
19667
  const stylesReady = useParentStylesheets(iframeWindow);
19485
- // Adds print events to the iframe window.
19486
- React__default.useEffect(() => {
19487
- if (iframeWindow === null || iframeWindow === undefined) {
19488
- return;
19489
- }
19490
- // Add print events to the window
19491
- if (onAfterPrint) {
19492
- iframeWindow.addEventListener('afterprint', onAfterPrint);
19493
- }
19494
- if (onBeforePrint) {
19495
- iframeWindow.addEventListener('beforeprint', onBeforePrint);
19496
- }
19497
- return () => {
19498
- // Remove print events from the window
19499
- if (onAfterPrint) {
19500
- iframeWindow.removeEventListener('afterprint', onAfterPrint);
19501
- }
19502
- if (onBeforePrint) {
19503
- iframeWindow.removeEventListener('beforeprint', onBeforePrint);
19504
- }
19505
- };
19506
- }, [iframeWindow]);
19507
19668
  // Calls print method when table has loaded in the iframe.
19508
19669
  React__default.useEffect(() => {
19509
19670
  let intervalId;
@@ -19514,7 +19675,8 @@ function PrintIFrame({
19514
19675
  intervalId = setInterval(function () {
19515
19676
  try {
19516
19677
  const tableWrapper = mountNode;
19517
- const hasTableRendered = !!tableWrapper.querySelector('[role="table"]');
19678
+ const table = tableWrapper.querySelector('[role="table"]');
19679
+ const hasTableRendered = !!table;
19518
19680
  if (hasTableRendered && intervalId) {
19519
19681
  var _contentRef$contentWi;
19520
19682
  clearInterval(intervalId);
@@ -19523,6 +19685,12 @@ function PrintIFrame({
19523
19685
  // Bug - Even though onBeforePrint is called before printing, the execution doesn't finish before
19524
19686
  // the print dialog shows up, which results into having a visible loading toast.
19525
19687
  onBeforePrint === null || onBeforePrint === void 0 ? void 0 : onBeforePrint();
19688
+ // By adding height to the tableWrapper, we make sure the content below absolutely positioned table
19689
+ // doesn't hide
19690
+ if (isFirefoxBrowser) {
19691
+ const tableHeight = `${table.offsetHeight}px`;
19692
+ tableWrapper.style.height = tableHeight;
19693
+ }
19526
19694
  contentRef === null || contentRef === void 0 ? void 0 : (_contentRef$contentWi = contentRef.contentWindow) === null || _contentRef$contentWi === void 0 ? void 0 : _contentRef$contentWi.print();
19527
19695
  // Calling the onAfterPrint method here as a fallback to do the cleanup, as certain browsers,
19528
19696
  // like Safari, do not trigger the beforeprint or afterprint events when a confirmation dialog
@@ -19561,6 +19729,11 @@ function PrintIFrame({
19561
19729
  tableWrapper.setAttribute('data-role', 'table-wrapper');
19562
19730
  // Adding h-fit class makes sure that table is rendered with the whole content.
19563
19731
  tableWrapper.classList.add('h-fit');
19732
+ tableWrapper.classList.add('[&>[role="table"]]:!h-fit');
19733
+ if (isFirefoxBrowser) {
19734
+ // Fix for firefox bug which adds page-long whitespace between page's top content and table
19735
+ tableWrapper.classList.add('[&>[role="table"]]:!absolute');
19736
+ }
19564
19737
  // Safari print preview assigns no width to the table when w-screen class is used.
19565
19738
  // By assigning table a big static width and hiding the horizontal scrollbar, the table on chrome
19566
19739
  // and safari will always take full page width.
@@ -19607,10 +19780,12 @@ function PrintIFrame({
19607
19780
  };
19608
19781
  // -top-60 -left-60 styles make sure that iframe is added outside of the viewport
19609
19782
  return /*#__PURE__*/React__default.createElement("iframe", {
19610
- ref: setContentRef,
19611
19783
  className: "fixed -left-60 -top-60 !h-0 !w-0",
19612
19784
  frameBorder: "0",
19613
- scrolling: "no"
19785
+ ref: setContentRef,
19786
+ scrolling: "no",
19787
+ // Temporary fix to support printing in firefox: Find another solution while upgrading React
19788
+ src: "javascript:void(0);"
19614
19789
  }, mountNode && stylesReady ? /*#__PURE__*/ReactDOM.createPortal( /*#__PURE__*/React__default.createElement(Table3, Object.assign({}, printTableProps)), mountNode) : null);
19615
19790
  }
19616
19791
 
@@ -19840,7 +20015,10 @@ function Toolbar(props) {
19840
20015
  }) : null, tableMeta.printing.isEnabled ? /*#__PURE__*/React__default.createElement(PrintButton, {
19841
20016
  table: table,
19842
20017
  tableProps: tableProps
19843
- }) : null, right, isMoreVisible(props) ? /*#__PURE__*/React__default.createElement(IconButton, {
20018
+ }) : null, right, isMoreVisible(props) ? /*#__PURE__*/React__default.createElement(Tooltip, {
20019
+ title: texts.table3.otherOptions.tooltip
20020
+ }, /*#__PURE__*/React__default.createElement(IconButton, {
20021
+ "aria-label": texts.table3.otherOptions.tooltip,
19844
20022
  icon: "more",
19845
20023
  menu: menuProps => /*#__PURE__*/React__default.createElement(Menu$1, Object.assign({}, menuProps), /*#__PURE__*/React__default.createElement(Menu$1.Content, {
19846
20024
  align: "end"
@@ -19855,7 +20033,7 @@ function Toolbar(props) {
19855
20033
  table: table
19856
20034
  })
19857
20035
  }, texts.table3.fontSize.tooltip) : null))
19858
- }) : null, tableMeta.search.isEnabled ? /*#__PURE__*/React__default.createElement(Search$3, {
20036
+ })) : null, tableMeta.search.isEnabled ? /*#__PURE__*/React__default.createElement(Search$3, {
19859
20037
  scrollToIndex: scrollToIndex,
19860
20038
  table: table
19861
20039
  }) : null));
@@ -20226,9 +20404,10 @@ const Table$1 = /*#__PURE__*/fixedForwardRef(function Table3(props, ref) {
20226
20404
  }, EmptyState ? /*#__PURE__*/React__default.createElement(EmptyState, null) : null)));
20227
20405
  });
20228
20406
  const Table3 = /*#__PURE__*/fixedForwardRef(function Table3(props, ref) {
20407
+ const stringifiedChildren = String(props.children);
20229
20408
  // we force a remount (using key) when the child columns change because there are too many places to add children as an effect
20230
20409
  // this is cheaper from a complexity perspective, and probably performance wise as well
20231
- const key = React__default.useMemo(() => String('tableKey_' + String(props.children)), [props.children]);
20410
+ const key = React__default.useMemo(() => String('tableKey_' + stringifiedChildren), [stringifiedChildren]);
20232
20411
  return /*#__PURE__*/React__default.createElement(Table$1, Object.assign({}, props, {
20233
20412
  key: key,
20234
20413
  ref: ref
@@ -21273,6 +21452,7 @@ exports.Table = Table;
21273
21452
  exports.Table2 = Table2;
21274
21453
  exports.Table3 = Table3;
21275
21454
  exports.Tabs = Tabs;
21455
+ exports.TacoContext = TacoContext;
21276
21456
  exports.Tag = Tag$1;
21277
21457
  exports.Textarea = Textarea;
21278
21458
  exports.Title = Title$3;