@economic/taco 2.45.0-alpha.7 → 2.45.0-alpha.9

Sign up to get free protection for your applications and to get access to all the features.
Files changed (76) hide show
  1. package/dist/components/Alert/Alert.d.ts +1 -1
  2. package/dist/components/Icon/components/Experiment.d.ts +3 -0
  3. package/dist/components/Icon/components/index.d.ts +1 -1
  4. package/dist/components/Input/Input.d.ts +1 -1
  5. package/dist/components/Menu/components/Item.d.ts +1 -1
  6. package/dist/components/Menu/components/Link.d.ts +1 -1
  7. package/dist/components/Navigation2/components/Link.d.ts +1 -1
  8. package/dist/components/Select2/components/Option.d.ts +2 -2
  9. package/dist/components/Select2/components/Search.d.ts +1 -1
  10. package/dist/components/Table3/features/useEditingState.d.ts +1 -1
  11. package/dist/components/Table3/features/useTableEditing.d.ts +2 -2
  12. package/dist/components/Tag/Tag.d.ts +1 -1
  13. package/dist/esm/index.css +10 -2
  14. package/dist/esm/packages/taco/src/components/Alert/Alert.js +2 -0
  15. package/dist/esm/packages/taco/src/components/Alert/Alert.js.map +1 -1
  16. package/dist/esm/packages/taco/src/components/Banner/util.js +5 -0
  17. package/dist/esm/packages/taco/src/components/Banner/util.js.map +1 -1
  18. package/dist/esm/packages/taco/src/components/Combobox/useCombobox.js +3 -1
  19. package/dist/esm/packages/taco/src/components/Combobox/useCombobox.js.map +1 -1
  20. package/dist/esm/packages/taco/src/components/Datepicker/useDatepicker.js +1 -0
  21. package/dist/esm/packages/taco/src/components/Datepicker/useDatepicker.js.map +1 -1
  22. package/dist/esm/packages/taco/src/components/Icon/components/Experiment.js +20 -0
  23. package/dist/esm/packages/taco/src/components/Icon/components/Experiment.js.map +1 -0
  24. package/dist/esm/packages/taco/src/components/Icon/components/index.js +2 -0
  25. package/dist/esm/packages/taco/src/components/Icon/components/index.js.map +1 -1
  26. package/dist/esm/packages/taco/src/components/Menu/components/Content.js +1 -1
  27. package/dist/esm/packages/taco/src/components/Menu/components/Content.js.map +1 -1
  28. package/dist/esm/packages/taco/src/components/Table3/components/Columns/Cell/EditingControlCell.js +10 -4
  29. package/dist/esm/packages/taco/src/components/Table3/components/Columns/Cell/EditingControlCell.js.map +1 -1
  30. package/dist/esm/packages/taco/src/components/Table3/components/Editing/Alert.js +3 -1
  31. package/dist/esm/packages/taco/src/components/Table3/components/Editing/Alert.js.map +1 -1
  32. package/dist/esm/packages/taco/src/components/Table3/features/useEditingState.js +16 -8
  33. package/dist/esm/packages/taco/src/components/Table3/features/useEditingState.js.map +1 -1
  34. package/dist/esm/packages/taco/src/components/Table3/features/useTableEditing.js +47 -30
  35. package/dist/esm/packages/taco/src/components/Table3/features/useTableEditing.js.map +1 -1
  36. package/dist/esm/packages/taco/src/components/Table3/listeners/useTableEditingListener.js +5 -8
  37. package/dist/esm/packages/taco/src/components/Table3/listeners/useTableEditingListener.js.map +1 -1
  38. package/dist/esm/packages/taco/src/components/Table3/useTable3.js +3 -4
  39. package/dist/esm/packages/taco/src/components/Table3/useTable3.js.map +1 -1
  40. package/dist/esm/packages/taco/src/hooks/useGlobalKeyDown.js +2 -2
  41. package/dist/esm/packages/taco/src/hooks/useGlobalKeyDown.js.map +1 -1
  42. package/dist/esm/packages/taco/src/hooks/useLazyEffect.js +1 -1
  43. package/dist/esm/packages/taco/src/hooks/useLazyEffect.js.map +1 -1
  44. package/dist/esm/packages/taco/src/primitives/BubbleSelect.js +1 -1
  45. package/dist/esm/packages/taco/src/primitives/BubbleSelect.js.map +1 -1
  46. package/dist/esm/packages/taco/src/primitives/Button.js +1 -6
  47. package/dist/esm/packages/taco/src/primitives/Button.js.map +1 -1
  48. package/dist/esm/packages/taco/src/primitives/Table/Core/components/Body/EmptyStateBody.js +9 -2
  49. package/dist/esm/packages/taco/src/primitives/Table/Core/components/Body/EmptyStateBody.js.map +1 -1
  50. package/dist/esm/packages/taco/src/primitives/Table/useTableManager/features/useTableServerLoading.js +1 -0
  51. package/dist/esm/packages/taco/src/primitives/Table/useTableManager/features/useTableServerLoading.js.map +1 -1
  52. package/dist/esm/packages/taco/src/primitives/Table/useTableManager/listeners/useTableFontSizeListener.js +2 -1
  53. package/dist/esm/packages/taco/src/primitives/Table/useTableManager/listeners/useTableFontSizeListener.js.map +1 -1
  54. package/dist/esm/packages/taco/src/primitives/Table/useTableManager/util/dataTypes.js +6 -2
  55. package/dist/esm/packages/taco/src/primitives/Table/useTableManager/util/dataTypes.js.map +1 -1
  56. package/dist/esm/packages/taco/src/primitives/Table/useTableManager/util/search.js +7 -1
  57. package/dist/esm/packages/taco/src/primitives/Table/useTableManager/util/search.js.map +1 -1
  58. package/dist/esm/packages/taco/src/primitives/Table/useTableManager/util/setup.js +8 -3
  59. package/dist/esm/packages/taco/src/primitives/Table/useTableManager/util/setup.js.map +1 -1
  60. package/dist/esm/packages/taco/src/types.js.map +1 -1
  61. package/dist/esm/packages/taco/src/utils/dom.js +12 -1
  62. package/dist/esm/packages/taco/src/utils/dom.js.map +1 -1
  63. package/dist/esm/packages/taco/src/utils/keyboard.js +5 -2
  64. package/dist/esm/packages/taco/src/utils/keyboard.js.map +1 -1
  65. package/dist/esm/packages/taco/src/utils/tailwind.js +2 -0
  66. package/dist/esm/packages/taco/src/utils/tailwind.js.map +1 -1
  67. package/dist/hooks/useGlobalKeyDown.d.ts +1 -1
  68. package/dist/index.css +10 -2
  69. package/dist/primitives/Table/useTableManager/util/dataTypes.d.ts +1 -1
  70. package/dist/taco.cjs.development.js +170 -79
  71. package/dist/taco.cjs.development.js.map +1 -1
  72. package/dist/taco.cjs.production.min.js +1 -1
  73. package/dist/taco.cjs.production.min.js.map +1 -1
  74. package/dist/types.d.ts +1 -1
  75. package/dist/utils/keyboard.d.ts +1 -1
  76. package/package.json +2 -2
@@ -45,6 +45,7 @@ var compact = _interopDefault(require('lodash/compact'));
45
45
  var pullAt = _interopDefault(require('lodash/pullAt'));
46
46
  var omit = _interopDefault(require('lodash/omit'));
47
47
  var setWith = _interopDefault(require('lodash/setWith'));
48
+ var _ = _interopDefault(require('lodash'));
48
49
  var TabsPrimitive = require('@radix-ui/react-tabs');
49
50
  var Joyride = require('react-joyride');
50
51
  var Joyride__default = _interopDefault(Joyride);
@@ -59,6 +60,8 @@ const getColorByState = state => {
59
60
  return 'yellow';
60
61
  case 'error':
61
62
  return 'red';
63
+ case 'experiment':
64
+ return 'purple';
62
65
  case 'success':
63
66
  return 'green';
64
67
  default:
@@ -1615,6 +1618,22 @@ function IconExpenses(props, svgRef) {
1615
1618
  }
1616
1619
  var Expenses = /*#__PURE__*/React.forwardRef(IconExpenses);
1617
1620
 
1621
+ function IconExperiment(props, svgRef) {
1622
+ return /*#__PURE__*/React.createElement("svg", Object.assign({
1623
+ fill: "none",
1624
+ xmlns: "http://www.w3.org/2000/svg",
1625
+ viewBox: "0 0 20 20",
1626
+ ref: svgRef
1627
+ }, props), /*#__PURE__*/React.createElement("path", {
1628
+ fillRule: "evenodd",
1629
+ clipRule: "evenodd",
1630
+ d: "M8.962 9.26V5.313h2.843V9.28c0 .376.796 1.24 1.049 1.511L14.5 12.5c-.507.218-3.166-1.19-4.341-.211C7.159 14.789 6 13 6.5 12c.316-.632 2.462-1.803 2.462-2.74zm.24-4.469a.762.762 0 00-.752.772v3.696a.61.61 0 01-.177.43l-2.592 2.6c-.911.913-.281 2.502.992 2.502h7.154c1.25 0 1.89-1.538 1.027-2.466l-2.446-2.63a.61.61 0 01-.162-.415V5.563a.762.762 0 00-.752-.772H9.202z",
1631
+ fill: "currentColor",
1632
+ stroke: "currentColor"
1633
+ }));
1634
+ }
1635
+ var Experiment = /*#__PURE__*/React.forwardRef(IconExperiment);
1636
+
1618
1637
  function IconExportToExcel(props, svgRef) {
1619
1638
  return /*#__PURE__*/React.createElement("svg", Object.assign({
1620
1639
  xmlns: "http://www.w3.org/2000/svg",
@@ -3672,6 +3691,7 @@ const icons = {
3672
3691
  envelope: Envelope,
3673
3692
  'expand-view': ExpandView,
3674
3693
  expenses: Expenses,
3694
+ experiment: Experiment,
3675
3695
  'export-to-excel': ExportToExcel,
3676
3696
  'export-to-pdf': ExportToPdf,
3677
3697
  export: Export,
@@ -3879,6 +3899,8 @@ const getIconName = state => {
3879
3899
  return 'warning';
3880
3900
  case 'error':
3881
3901
  return 'close';
3902
+ case 'experiment':
3903
+ return 'experiment';
3882
3904
  case 'success':
3883
3905
  return 'tick';
3884
3906
  default:
@@ -4214,6 +4236,11 @@ const getBannerIcon = type => {
4214
4236
  icon: "close",
4215
4237
  color: "red"
4216
4238
  });
4239
+ case 'experiment':
4240
+ return /*#__PURE__*/React__default.createElement(BadgeIcon, {
4241
+ icon: "experiment",
4242
+ color: "purple"
4243
+ });
4217
4244
  case 'warning':
4218
4245
  return /*#__PURE__*/React__default.createElement(BadgeIcon, {
4219
4246
  icon: "warning",
@@ -4306,6 +4333,9 @@ function isElementTriggeredFromContainer(element, container) {
4306
4333
  return true;
4307
4334
  }
4308
4335
  const elementInDocument = document.querySelector(escapedSelector);
4336
+ if (elementInDocument === container) {
4337
+ return true;
4338
+ }
4309
4339
  // if the element does exist, see if it is itself connected to somethng that was triggered from the container
4310
4340
  if (elementInDocument) {
4311
4341
  return isElementTriggeredFromContainer(elementInDocument, container);
@@ -4328,7 +4358,15 @@ function isElementInteractive(element) {
4328
4358
  if (!element) {
4329
4359
  return false;
4330
4360
  }
4331
- return ['A', 'BUTTON', 'INPUT', 'TEXTAREA', 'SELECT', 'LABEL', 'OPTION'].includes(element.tagName) && !element.hidden && !element.disabled && !element.readOnly;
4361
+ const interactiveElements = ['A', 'BUTTON', 'INPUT', 'TEXTAREA', 'SELECT', 'LABEL', 'OPTION'];
4362
+ const isInteractive = interactiveElements.includes(element.tagName) && !element.hidden && !element.disabled && !element.readOnly;
4363
+ // sometimes buttons contain content like an icon, and we can't rely on pointer events being disabled
4364
+ // so search for a focusable parent
4365
+ if (!isInteractive) {
4366
+ const focusableParent = element.closest(FOCUSABLE_ELEMENTS.join(','));
4367
+ return focusableParent ? interactiveElements.includes(focusableParent.tagName) : false;
4368
+ }
4369
+ return isInteractive;
4332
4370
  }
4333
4371
  function isElementInsideTable3OrReport(element) {
4334
4372
  return !!(element !== null && element !== void 0 && element.closest('[data-taco^=table]'));
@@ -4359,9 +4397,12 @@ function shouldTriggerShortcut(event, key) {
4359
4397
  }
4360
4398
  return event.key.toLowerCase() === keyOptions.key.toLowerCase();
4361
4399
  }
4362
- function createShortcutKeyDownHandler(key, handler, stopPropagation = true) {
4400
+ function createShortcutKeyDownHandler(key, handler, stopPropagation = true, element) {
4363
4401
  return function (event) {
4364
- if (event.target !== event.currentTarget && isElementInteractive(event.target) && !isPressingMetaKey(event)) {
4402
+ const dialog = document.querySelector('[role="dialog"]');
4403
+ const isOutsideDialog = element && dialog && !dialog.contains(element);
4404
+ if (event.target !== event.currentTarget && isElementInteractive(event.target) && !isPressingMetaKey(event) || isOutsideDialog // Avoid triggering shortcut if dialog is open and element is outside the dialog
4405
+ ) {
4365
4406
  return;
4366
4407
  }
4367
4408
  const condition = shouldTriggerShortcut(event, key);
@@ -4382,11 +4423,11 @@ const isMacOs = () => {
4382
4423
  return (_window = window) === null || _window === void 0 ? void 0 : _window.navigator.userAgent.includes('Mac');
4383
4424
  };
4384
4425
 
4385
- const useGlobalKeyDown = (shortcut, handler) => {
4426
+ const useGlobalKeyDown = (shortcut, handler, element) => {
4386
4427
  React__default.useEffect(() => {
4387
4428
  let handleKeyDown;
4388
4429
  if (shortcut) {
4389
- handleKeyDown = createShortcutKeyDownHandler(shortcut, handler, false);
4430
+ handleKeyDown = createShortcutKeyDownHandler(shortcut, handler, false, element);
4390
4431
  document.addEventListener('keydown', handleKeyDown);
4391
4432
  }
4392
4433
  return () => {
@@ -4409,13 +4450,8 @@ const Button = /*#__PURE__*/React.forwardRef(function Button(props, ref) {
4409
4450
  useGlobalKeyDown(shortcut, event => {
4410
4451
  var _internalRef$current;
4411
4452
  event === null || event === void 0 ? void 0 : event.preventDefault();
4412
- const dialog = document.querySelector('[role="dialog"]');
4413
- // Don't trigger the click on the button if it is outside of the dialog
4414
- if (dialog && !(dialog !== null && dialog !== void 0 && dialog.contains(internalRef.current))) {
4415
- return;
4416
- }
4417
4453
  (_internalRef$current = internalRef.current) === null || _internalRef$current === void 0 ? void 0 : _internalRef$current.click();
4418
- });
4454
+ }, internalRef.current);
4419
4455
  const Tag = props.href ? 'a' : 'button';
4420
4456
  return /*#__PURE__*/React.createElement(Tag, Object.assign({}, otherProps, {
4421
4457
  href: disabled ? undefined : props.href,
@@ -6042,7 +6078,9 @@ const useCombobox = ({
6042
6078
  const isComboboxChangeEvent = event => {
6043
6079
  return !event.isTrusted; // this makes sure we only take our own custom event, and not the browser default blur on tab.
6044
6080
  };
6045
- if (isComboboxChangeEvent(event)) {
6081
+ // Only trigger onChange if this is our custom event (not a browser blur event)
6082
+ // or if the input was cleared.
6083
+ if (isComboboxChangeEvent(event) || event.target.value === '' && !inline) {
6046
6084
  onChange(event);
6047
6085
  }
6048
6086
  }
@@ -6385,6 +6423,7 @@ const useDatepicker = ({
6385
6423
  setInternalValue(event.target.value);
6386
6424
  };
6387
6425
  const handleChange = date => {
6426
+ // Update both the input value and calendar view date when selecting a date
6388
6427
  setInputValueByRef(inputRef.current, format(date, formatting.date), 'focusout');
6389
6428
  };
6390
6429
  const handleKeyDown = event => {
@@ -8299,7 +8338,7 @@ const Content$8 = /*#__PURE__*/React.forwardRef(function MenuContent(props, ref)
8299
8338
  var _childrenRefs$current, _childrenRefs$current2;
8300
8339
  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();
8301
8340
  }, 1);
8302
- }));
8341
+ }, true, childrenRefs.current[index].current));
8303
8342
  }
8304
8343
  });
8305
8344
  shortcuts.forEach(handler => document.addEventListener('keydown', handler));
@@ -9950,9 +9989,13 @@ const dataTypes = {
9950
9989
  if (value === undefined) {
9951
9990
  return '';
9952
9991
  }
9953
- return new Intl.NumberFormat(options === null || options === void 0 ? void 0 : (_options$localization2 = options.localization) === null || _options$localization2 === void 0 ? void 0 : _options$localization2.locale, {
9992
+ const formatter = new Intl.NumberFormat(options === null || options === void 0 ? void 0 : (_options$localization2 = options.localization) === null || _options$localization2 === void 0 ? void 0 : _options$localization2.locale, {
9954
9993
  minimumFractionDigits: 2
9955
- }).format(Number(value));
9994
+ });
9995
+ const decimalSeperator = formatter.format(1.1).substring(1, 2);
9996
+ const localisedValue = formatter.format(Number(value));
9997
+ const localisedValueWithoutThousandsSeperator = decimalSeperator === '.' ? localisedValue.replace(',', '') : localisedValue.replace('.', '');
9998
+ return [localisedValue, localisedValueWithoutThousandsSeperator];
9956
9999
  }
9957
10000
  }
9958
10001
  };
@@ -10100,7 +10143,13 @@ function isMatched(searchQuery, cellValue, dataType, localization) {
10100
10143
  const cellDisplayValue = dataTypeProperties.getDisplayValue(cellValue, {
10101
10144
  localization
10102
10145
  });
10103
- if (cellDisplayValue !== undefined && isWeakContains(cellDisplayValue, searchQuery)) {
10146
+ if (Array.isArray(cellDisplayValue)) {
10147
+ for (const displayValue of cellDisplayValue) {
10148
+ if (isWeakContains(displayValue, searchQuery)) {
10149
+ return true;
10150
+ }
10151
+ }
10152
+ } else if (cellDisplayValue !== undefined && isWeakContains(cellDisplayValue, searchQuery)) {
10104
10153
  return true;
10105
10154
  }
10106
10155
  }
@@ -10398,10 +10447,15 @@ function processChildren(child, columns, defaultSizing, defaultSorting, defaultV
10398
10447
  column.cell = info => renderer(info.getValue(), info.row.original);
10399
10448
  } else if (dataTypeProperties.getDisplayValue) {
10400
10449
  const dataTypeRenderer = value => {
10401
- var _dataTypeProperties$g, _dataTypeProperties$g2;
10402
- return (_dataTypeProperties$g = (_dataTypeProperties$g2 = dataTypeProperties.getDisplayValue) === null || _dataTypeProperties$g2 === void 0 ? void 0 : _dataTypeProperties$g2.call(dataTypeProperties, value, {
10450
+ var _dataTypeProperties$g;
10451
+ const displayValue = (_dataTypeProperties$g = dataTypeProperties.getDisplayValue) === null || _dataTypeProperties$g === void 0 ? void 0 : _dataTypeProperties$g.call(dataTypeProperties, value, {
10403
10452
  localization
10404
- })) !== null && _dataTypeProperties$g !== void 0 ? _dataTypeProperties$g : value;
10453
+ });
10454
+ if (Array.isArray(displayValue)) {
10455
+ var _displayValue$;
10456
+ return (_displayValue$ = displayValue[0]) !== null && _displayValue$ !== void 0 ? _displayValue$ : value;
10457
+ }
10458
+ return displayValue !== null && displayValue !== void 0 ? displayValue : value;
10405
10459
  };
10406
10460
  column.cell = info => dataTypeRenderer(info.getValue());
10407
10461
  column.meta.renderer = dataTypeRenderer;
@@ -11453,6 +11507,7 @@ function useTableServerLoading(loadPage, loadAll, pageSize = DEFAULT_PAGE_SIZE)
11453
11507
  const _temp = function () {
11454
11508
  if (typeof loadPage === 'function') {
11455
11509
  return Promise.resolve(loadPage(...args)).then(function () {
11510
+ setLoadedStatus(exports.TableServerLoadAllState.Incomplete);
11456
11511
  setReady(true);
11457
11512
  });
11458
11513
  }
@@ -11573,7 +11628,7 @@ function useLazyEffect(effect, deps) {
11573
11628
  const readyRef = React__default.useRef(false);
11574
11629
  React__default.useEffect(() => {
11575
11630
  if (readyRef.current) {
11576
- effect();
11631
+ return effect();
11577
11632
  } else {
11578
11633
  readyRef.current = true;
11579
11634
  }
@@ -11615,7 +11670,8 @@ function useTableFontSizeListener(table) {
11615
11670
  table.setColumnSizing(sizes => {
11616
11671
  return Object.fromEntries(Object.entries(sizes).map(([columnName, prevColumnSize]) => {
11617
11672
  var _column$columnDef$min;
11618
- const column = table.getColumn(columnName);
11673
+ // table.getColumn(columName) throw error in strict dev mode. Related thread: https://github.com/TanStack/table/discussions/5505
11674
+ const column = table.getAllColumns().find(x => x.id === columnName);
11619
11675
  if (isInternalColumn(columnName)) {
11620
11676
  var _column$getSize;
11621
11677
  return [columnName, (_column$getSize = column === null || column === void 0 ? void 0 : column.getSize()) !== null && _column$getSize !== void 0 ? _column$getSize : prevColumnSize];
@@ -13936,22 +13992,29 @@ const MemoedFooter = /*#__PURE__*/React__default.memo(function MemoedFooter(prop
13936
13992
  });
13937
13993
 
13938
13994
  function EmptyStateBody(props) {
13995
+ var _ref$current, _ref$current$parentNo;
13939
13996
  const {
13940
13997
  emptyState: Placeholder,
13941
13998
  isReady,
13942
13999
  reason,
13943
14000
  ...attributes
13944
14001
  } = props;
14002
+ const ref = React__default.useRef(null);
13945
14003
  if (!isReady) {
13946
14004
  return /*#__PURE__*/React__default.createElement("tbody", Object.assign({}, attributes, {
13947
14005
  className: "!auto-rows-fr"
13948
14006
  }));
13949
14007
  }
13950
14008
  return /*#__PURE__*/React__default.createElement("tbody", Object.assign({}, attributes, {
13951
- className: "!auto-rows-fr"
14009
+ ref: ref,
14010
+ className: "!auto-rows-fr",
14011
+ "data-taco": "empty-state"
13952
14012
  }), /*#__PURE__*/React__default.createElement("tr", {
13953
- className: "!auto-rows-fr"
14013
+ className: "!auto-rows-fr "
13954
14014
  }, /*#__PURE__*/React__default.createElement("td", {
14015
+ style: {
14016
+ maxWidth: ref === null || ref === void 0 ? void 0 : (_ref$current = ref.current) === null || _ref$current === void 0 ? void 0 : (_ref$current$parentNo = _ref$current.parentNode) === null || _ref$current$parentNo === void 0 ? void 0 : _ref$current$parentNo.clientWidth
14017
+ },
13955
14018
  className: "col-span-full !border-0 !p-0 hover:!bg-white"
13956
14019
  }, Placeholder ? /*#__PURE__*/React__default.createElement(Placeholder, {
13957
14020
  reason: reason
@@ -15631,7 +15694,7 @@ const BubbleSelect = props => {
15631
15694
  if (prevValue !== value && setValue) {
15632
15695
  if (Array.isArray(value)) {
15633
15696
  value.forEach(v => {
15634
- const option = select.querySelector(`option[value='${v}']`);
15697
+ const option = select.querySelector(`option[value='${CSS.escape(v)}']`);
15635
15698
  if (option) {
15636
15699
  option.selected = true;
15637
15700
  }
@@ -18657,16 +18720,13 @@ function isTableScrolled(ref) {
18657
18720
  function useTableEditingListener(table, tableRef, scrollToIndex) {
18658
18721
  const tableMeta = table.options.meta;
18659
18722
  const localization = useLocalization();
18660
- // save when the row changes
18661
- // store the last row active index, otherwise everytime tableMeta.editing.saveChanges changes the hook runs again
18662
- const lastRowActiveIndexRef = React__default.useRef(tableMeta.rowActive.rowActiveIndex);
18663
18723
  useLazyEffect(() => {
18664
- if (tableMeta.rowActive.rowActiveIndex !== lastRowActiveIndexRef.current) {
18665
- lastRowActiveIndexRef.current = tableMeta.rowActive.rowActiveIndex;
18666
- if (tableMeta.editing.isEditing && lastRowActiveIndexRef.current !== undefined) {
18667
- tableMeta.editing.saveChanges(table);
18724
+ return () => {
18725
+ if (tableMeta.editing.isEditing && tableMeta.rowActive.rowActiveIndex !== undefined) {
18726
+ var _table$getRowModel$ro;
18727
+ tableMeta.editing.saveChanges(table, (_table$getRowModel$ro = table.getRowModel().rows[tableMeta.rowActive.rowActiveIndex]) === null || _table$getRowModel$ro === void 0 ? void 0 : _table$getRowModel$ro.id);
18668
18728
  }
18669
- }
18729
+ };
18670
18730
  }, [tableMeta.rowActive.rowActiveIndex]);
18671
18731
  // show a warning if the user navigates away without triggering save, such as using the browser back/forward button
18672
18732
  const hasChanges = tableMeta.editing.hasChanges();
@@ -18881,6 +18941,7 @@ function usePendingChangesState(handleSave, handleChange, rowIdentityAccessor, v
18881
18941
  const _temp9 = _forOf(Object.keys(changes), function (rowId) {
18882
18942
  const status = getRowStatus(rowId);
18883
18943
  return _catch(function () {
18944
+ var _changes$rowId;
18884
18945
  function _temp8(_result) {
18885
18946
  return _exit ? _result : Promise.resolve(handleSave(changeSet)).then(function () {
18886
18947
  // cleanup changes, we don't need them after saving
@@ -18892,14 +18953,15 @@ function usePendingChangesState(handleSave, handleChange, rowIdentityAccessor, v
18892
18953
  }, DELAY_BEFORE_REMOVING_SAVE_STATUS);
18893
18954
  });
18894
18955
  }
18956
+ const rowChanges = (_changes$rowId = changes[rowId]) !== null && _changes$rowId !== void 0 ? _changes$rowId : {};
18895
18957
  // don't try to save if - already saving, or there are known errors
18896
- if (status === 'saving' || status === 'errored') {
18958
+ if (!Object.keys(rowChanges).length || status === 'saving' || status === 'errored') {
18897
18959
  return;
18898
18960
  }
18899
18961
  setRowStatus(rowId, 'saving');
18900
18962
  const changeSet = {
18901
18963
  ...state.changes.originals[rowId],
18902
- ...changes[rowId]
18964
+ ...rowChanges
18903
18965
  };
18904
18966
  // if we had to create a temporary id, delete it first - it's our data, not theirs
18905
18967
  if (isTemporaryRow(changeSet[rowIdentityAccessor])) {
@@ -18962,7 +19024,7 @@ function usePendingChangesState(handleSave, handleChange, rowIdentityAccessor, v
18962
19024
  return Promise.reject(e);
18963
19025
  }
18964
19026
  };
18965
- const onCellChanged = function (cell, rowIndex, shouldRunUpdaters = true) {
19027
+ const onCellChanged = function (cell, rowIndex, nextValue, shouldRunUpdaters = true) {
18966
19028
  try {
18967
19029
  function _temp6() {
18968
19030
  var _state$changes$errors11;
@@ -19004,7 +19066,7 @@ function usePendingChangesState(handleSave, handleChange, rowIdentityAccessor, v
19004
19066
  }
19005
19067
  // create a projection of the next state, so we can act against it
19006
19068
  const nextChanges = {
19007
- ...state.changes.rows[cell.row.id],
19069
+ ...changes,
19008
19070
  ...updatesForOtherCells
19009
19071
  };
19010
19072
  const nextMoveReasons = {
@@ -19013,10 +19075,11 @@ function usePendingChangesState(handleSave, handleChange, rowIdentityAccessor, v
19013
19075
  const nextCellErrors = {
19014
19076
  ...((_state$changes$errors11 = state.changes.errors[cell.row.id]) === null || _state$changes$errors11 === void 0 ? void 0 : _state$changes$errors11.cells)
19015
19077
  };
19016
- // run validation
19078
+ // run validation - if there are changes, and if there is an original stored
19017
19079
  let validationErrors = {};
19018
19080
  const _temp3 = function () {
19019
- if (validator) {
19081
+ if (validator && Object.keys(nextChanges).length && state.changes.originals[cell.row.id]) {
19082
+ // merge with the original so we get a full row
19020
19083
  const nextRowValue = {
19021
19084
  ...state.changes.originals[cell.row.id],
19022
19085
  ...changes,
@@ -19029,8 +19092,13 @@ function usePendingChangesState(handleSave, handleChange, rowIdentityAccessor, v
19029
19092
  }();
19030
19093
  return _temp3 && _temp3.then ? _temp3.then(_temp4) : _temp4(_temp3);
19031
19094
  }
19032
- const changes = state.changes.rows[cell.row.id];
19033
- if (!changes) {
19095
+ const changes = nextValue !== undefined ? {
19096
+ ...state.changes.rows[cell.row.id],
19097
+ [cell.column.id]: nextValue
19098
+ } : {
19099
+ ...state.changes.rows[cell.row.id]
19100
+ };
19101
+ if (!Object.keys(changes).length) {
19034
19102
  return Promise.resolve();
19035
19103
  }
19036
19104
  let updatesForOtherCells = {};
@@ -19242,32 +19310,46 @@ function usePendingChangesState(handleSave, handleChange, rowIdentityAccessor, v
19242
19310
  function useTableEditing(isEnabled = false, handleSave, handleChange, handleCreate, rowIdentityAccessor, validator) {
19243
19311
  const createRow = function (table, scrollToIndex, row) {
19244
19312
  try {
19245
- if (!handleCreate) {
19246
- return Promise.resolve();
19247
- }
19248
- const tableMeta = table.options.meta;
19249
- return Promise.resolve(tableMeta.editing.saveChanges(table)).then(function (saved) {
19250
- if (!saved) {
19251
- return;
19252
- }
19313
+ let _exit = false;
19314
+ function _temp2(_result) {
19315
+ if (_exit) return _result;
19253
19316
  const changeset = row !== null && row !== void 0 ? row : handleCreate();
19254
19317
  try {
19255
19318
  if (changeset) {
19256
- const rowId = pendingChangesFns.insertTemporaryRow(changeset);
19257
- window.requestAnimationFrame(() => {
19258
- table.getRow(rowId).pin('bottom');
19259
- // set the active row to the new row before toggling editing on
19260
- const temporaryRows = tableMeta.editing.temporaryRows;
19261
- const nextRowIndex = temporaryRows.length ? tableMeta.length + 1 : tableMeta.length;
19262
- tableMeta.rowActive.setRowActiveIndex(nextRowIndex);
19263
- window.requestAnimationFrame(() => toggleEditing(true, table, scrollToIndex));
19264
- setLastFocusedCellIndex(undefined);
19319
+ const newRowId = pendingChangesFns.insertTemporaryRow(changeset);
19320
+ // reset before changing row otherwise the cell changes and validation might run
19321
+ setLastFocusedCellIndex(undefined);
19322
+ // set the active row to the new row before toggling editing on
19323
+ const temporaryRows = tableMeta.editing.temporaryRows;
19324
+ const nextRowIndex = temporaryRows.length ? tableMeta.length + 1 : tableMeta.length;
19325
+ tableMeta.rowActive.setRowActiveIndex(nextRowIndex);
19326
+ // wait until set states have run
19327
+ requestAnimationFrame(() => {
19328
+ toggleEditing(true, table, scrollToIndex, false);
19329
+ _.delay(() => {
19330
+ requestAnimationFrame(() => table.getRow(newRowId).pin('bottom'));
19331
+ }, 350);
19265
19332
  });
19266
19333
  }
19267
19334
  } catch (error) {
19268
19335
  console.error(error);
19269
19336
  }
19270
- });
19337
+ }
19338
+ if (!handleCreate) {
19339
+ return Promise.resolve();
19340
+ }
19341
+ const tableMeta = table.options.meta;
19342
+ const _temp = function () {
19343
+ if (tableMeta.rowActive.rowActiveIndex !== undefined) {
19344
+ var _table$getRowModel$ro2;
19345
+ return Promise.resolve(tableMeta.editing.saveChanges(table, (_table$getRowModel$ro2 = table.getRowModel().rows[tableMeta.rowActive.rowActiveIndex]) === null || _table$getRowModel$ro2 === void 0 ? void 0 : _table$getRowModel$ro2.id)).then(function (saved) {
19346
+ if (!saved) {
19347
+ _exit = true;
19348
+ }
19349
+ });
19350
+ }
19351
+ }();
19352
+ return Promise.resolve(_temp && _temp.then ? _temp.then(_temp2) : _temp2(_temp));
19271
19353
  } catch (e) {
19272
19354
  return Promise.reject(e);
19273
19355
  }
@@ -19281,24 +19363,26 @@ function useTableEditing(isEnabled = false, handleSave, handleChange, handleCrea
19281
19363
  // store the last focused cell, so that up/down arrow key navigation remains in the same column
19282
19364
  const [lastFocusedCellIndex, setLastFocusedCellIndex] = React__default.useState(undefined);
19283
19365
  const pendingChangesFns = usePendingChangesState(handleSave, handleChange, rowIdentityAccessor, validator);
19284
- function toggleEditing(enabled, table, scrollToIndex) {
19285
- var _tableMeta$rowActive$, _table$getRowModel$ro;
19286
- if (!enabled) {
19287
- // save
19288
- pendingChangesFns.saveChanges(table);
19366
+ function toggleEditing(enabled, table, scrollToIndex, doSave = true) {
19367
+ const tableMeta = table.options.meta;
19368
+ if (enabled) {
19369
+ var _tableMeta$rowActive$, _table$getRowModel$ro;
19370
+ const index = (_tableMeta$rowActive$ = tableMeta.rowActive.rowActiveIndex) !== null && _tableMeta$rowActive$ !== void 0 ? _tableMeta$rowActive$ : 0;
19371
+ if (tableMeta.rowActive.rowActiveIndex === undefined) {
19372
+ tableMeta.rowActive.setRowActiveIndex(index);
19373
+ }
19374
+ if (!isTemporaryRow((_table$getRowModel$ro = table.getRowModel().rows[index]) === null || _table$getRowModel$ro === void 0 ? void 0 : _table$getRowModel$ro.id)) {
19375
+ scrollToIndex(index);
19376
+ }
19377
+ } else if (!enabled) {
19289
19378
  // reset detailed mode
19290
19379
  toggleDetailedMode(false);
19291
19380
  // reset the last index back to the first focusable element, when editing gets turned off
19292
19381
  setLastFocusedCellIndex(undefined);
19293
19382
  }
19294
- const tableMeta = table.options.meta;
19295
- const index = (_tableMeta$rowActive$ = tableMeta.rowActive.rowActiveIndex) !== null && _tableMeta$rowActive$ !== void 0 ? _tableMeta$rowActive$ : 0;
19296
- if (tableMeta.rowActive.rowActiveIndex === undefined) {
19297
- tableMeta.rowActive.setRowActiveIndex(index);
19298
- }
19299
19383
  setEditing(enabled);
19300
- if (!isTemporaryRow((_table$getRowModel$ro = table.getRowModel().rows[index]) === null || _table$getRowModel$ro === void 0 ? void 0 : _table$getRowModel$ro.id)) {
19301
- scrollToIndex(index);
19384
+ if (doSave) {
19385
+ pendingChangesFns.saveChanges(table);
19302
19386
  }
19303
19387
  }
19304
19388
  return {
@@ -19570,20 +19654,26 @@ function EditingControlCell(props) {
19570
19654
  if (nextValue !== value) {
19571
19655
  tableMeta.editing.setCellValue(cell, nextValue);
19572
19656
  if (hasNonTextControl) {
19573
- tableMeta.editing.onCellChanged(cell, rowIndex);
19657
+ requestAnimationFrame(() => tableMeta.editing.onCellChanged(cell, rowIndex, nextValue));
19574
19658
  }
19575
19659
  }
19576
19660
  };
19577
- const handleBlur = () => {
19661
+ function blur() {
19578
19662
  tableMeta.editing.toggleDetailedMode(false);
19579
- tableMeta.editing.onCellChanged(cell, rowIndex, !hasNonTextControl);
19663
+ tableMeta.editing.onCellChanged(cell, rowIndex, undefined, !hasNonTextControl);
19664
+ }
19665
+ const handleBlur = event => {
19666
+ if (isElementInsideOrTriggeredFromContainer(event.relatedTarget, event.currentTarget)) {
19667
+ return;
19668
+ }
19669
+ blur();
19580
19670
  };
19581
19671
  // ensure that blur runs when the cell gets unmounted (when vertically arrow key navigating)
19582
19672
  React__default.useEffect(() => {
19583
19673
  const ref = cellRef.current;
19584
19674
  return () => {
19585
19675
  if (document.activeElement === ref || isElementInsideOrTriggeredFromContainer(document.activeElement, ref)) {
19586
- handleBlur();
19676
+ blur();
19587
19677
  }
19588
19678
  };
19589
19679
  }, []);
@@ -20007,14 +20097,13 @@ function useTable3(props, ref) {
20007
20097
  hasChanges: editing.hasChanges(rowId),
20008
20098
  hasErrors: editing.hasRowErrors(rowId),
20009
20099
  onDiscard: () => {
20100
+ editing.discardChanges(rowId, table);
20010
20101
  if (editing.temporaryRows.length) {
20011
- tableMeta.rowActive.setRowActiveIndex(undefined);
20012
- setTimeout(() => {
20102
+ requestAnimationFrame(() => {
20013
20103
  var _editing$createRowBut;
20014
20104
  return (_editing$createRowBut = editing.createRowButtonRef.current) === null || _editing$createRowBut === void 0 ? void 0 : _editing$createRowBut.focus();
20015
- }, 50);
20105
+ });
20016
20106
  }
20017
- editing.discardChanges(rowId, table);
20018
20107
  },
20019
20108
  onEditingSave: function () {
20020
20109
  try {
@@ -20080,7 +20169,9 @@ function Alert$1(props) {
20080
20169
  // generate links to each invalid row, to go into the error message
20081
20170
  const links = [];
20082
20171
  const visibleColumns = table.getVisibleFlatColumns().map(c => c.id);
20083
- const rowIdentityColumn = tableMeta.rowIdentityAccessor && visibleColumns.includes(String(tableMeta.rowIdentityAccessor)) ? table.getColumn(String(tableMeta.rowIdentityAccessor)) : undefined;
20172
+ const rowIdentityColumn = tableMeta.rowIdentityAccessor && visibleColumns.includes(String(tableMeta.rowIdentityAccessor)) ?
20173
+ // table.getColumn(columName) throw error in strict dev mode. Related thread: https://github.com/TanStack/table/discussions/5505
20174
+ table.getAllColumns().find(x => x.id === String(tableMeta.rowIdentityAccessor)) : undefined;
20084
20175
  pendingChangesWithErrors.forEach((pendingChangeWithError, index) => {
20085
20176
  // if appropriate, concatenate the item with the text "and"
20086
20177
  if (pendingChangesWithErrors.length > 1 && index === pendingChangesWithErrors.length - 1) {