@economic/taco 2.33.1 → 2.34.1

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 (80) hide show
  1. package/dist/components/Icon/components/DocumentSigned.d.ts +3 -0
  2. package/dist/components/Icon/components/Home2.d.ts +3 -0
  3. package/dist/components/Icon/components/Id.d.ts +3 -0
  4. package/dist/components/Icon/components/MastercardOs.d.ts +3 -0
  5. package/dist/components/Icon/components/NovemberFirst.d.ts +3 -0
  6. package/dist/components/Icon/components/index.d.ts +1 -1
  7. package/dist/components/Input/Input.d.ts +1 -1
  8. package/dist/components/Menu/components/Item.d.ts +1 -1
  9. package/dist/components/Menu/components/Link.d.ts +1 -1
  10. package/dist/components/Navigation2/components/Link.d.ts +1 -1
  11. package/dist/components/Select2/components/Option.d.ts +2 -2
  12. package/dist/components/Select2/components/Search.d.ts +1 -1
  13. package/dist/components/Table3/components/Columns/Internal/EditingActionsMenu.d.ts +1 -0
  14. package/dist/components/Table3/features/useTableEditing.d.ts +0 -1
  15. package/dist/components/Table3/listeners/useTableEditingListener.d.ts +3 -1
  16. package/dist/components/Tag/Tag.d.ts +1 -1
  17. package/dist/esm/index.css +4 -4
  18. package/dist/esm/packages/taco/src/components/Combobox/useCombobox.js +4 -5
  19. package/dist/esm/packages/taco/src/components/Combobox/useCombobox.js.map +1 -1
  20. package/dist/esm/packages/taco/src/components/Icon/components/DocumentSigned.js +19 -0
  21. package/dist/esm/packages/taco/src/components/Icon/components/DocumentSigned.js.map +1 -0
  22. package/dist/esm/packages/taco/src/components/Icon/components/Home2.js +19 -0
  23. package/dist/esm/packages/taco/src/components/Icon/components/Home2.js.map +1 -0
  24. package/dist/esm/packages/taco/src/components/Icon/components/Id.js +19 -0
  25. package/dist/esm/packages/taco/src/components/Icon/components/Id.js.map +1 -0
  26. package/dist/esm/packages/taco/src/components/Icon/components/MastercardOs.js +23 -0
  27. package/dist/esm/packages/taco/src/components/Icon/components/MastercardOs.js.map +1 -0
  28. package/dist/esm/packages/taco/src/components/Icon/components/NovemberFirst.js +20 -0
  29. package/dist/esm/packages/taco/src/components/Icon/components/NovemberFirst.js.map +1 -0
  30. package/dist/esm/packages/taco/src/components/Icon/components/index.js +10 -0
  31. package/dist/esm/packages/taco/src/components/Icon/components/index.js.map +1 -1
  32. package/dist/esm/packages/taco/src/components/Input/Input.js +5 -0
  33. package/dist/esm/packages/taco/src/components/Input/Input.js.map +1 -1
  34. package/dist/esm/packages/taco/src/components/Menu/components/Trigger.js +9 -7
  35. package/dist/esm/packages/taco/src/components/Menu/components/Trigger.js.map +1 -1
  36. package/dist/esm/packages/taco/src/components/Select2/Select2.js +3 -1
  37. package/dist/esm/packages/taco/src/components/Select2/Select2.js.map +1 -1
  38. package/dist/esm/packages/taco/src/components/Table3/Table3.js +1 -7
  39. package/dist/esm/packages/taco/src/components/Table3/Table3.js.map +1 -1
  40. package/dist/esm/packages/taco/src/components/Table3/components/Columns/Cell/Editing/RowMoveIndicator.js +1 -1
  41. package/dist/esm/packages/taco/src/components/Table3/components/Columns/Cell/Editing/RowMoveIndicator.js.map +1 -1
  42. package/dist/esm/packages/taco/src/components/Table3/components/Columns/Cell/EditingControlCell.js +3 -1
  43. package/dist/esm/packages/taco/src/components/Table3/components/Columns/Cell/EditingControlCell.js.map +1 -1
  44. package/dist/esm/packages/taco/src/components/Table3/components/Columns/Internal/EditingActionsMenu.js +9 -1
  45. package/dist/esm/packages/taco/src/components/Table3/components/Columns/Internal/EditingActionsMenu.js.map +1 -1
  46. package/dist/esm/packages/taco/src/components/Table3/components/Row/Row.js +1 -1
  47. package/dist/esm/packages/taco/src/components/Table3/components/Row/Row.js.map +1 -1
  48. package/dist/esm/packages/taco/src/components/Table3/features/useTableEditing.js +1 -13
  49. package/dist/esm/packages/taco/src/components/Table3/features/useTableEditing.js.map +1 -1
  50. package/dist/esm/packages/taco/src/components/Table3/listeners/useTableEditingListener.js +16 -1
  51. package/dist/esm/packages/taco/src/components/Table3/listeners/useTableEditingListener.js.map +1 -1
  52. package/dist/esm/packages/taco/src/components/Table3/useTable3.js +3 -2
  53. package/dist/esm/packages/taco/src/components/Table3/useTable3.js.map +1 -1
  54. package/dist/esm/packages/taco/src/primitives/Table/Core/Table.js +2 -1
  55. package/dist/esm/packages/taco/src/primitives/Table/Core/Table.js.map +1 -1
  56. package/dist/esm/packages/taco/src/primitives/Table/Core/components/Body/Body.js +21 -1
  57. package/dist/esm/packages/taco/src/primitives/Table/Core/components/Body/Body.js.map +1 -1
  58. package/dist/esm/packages/taco/src/primitives/Table/Core/components/Row/BuiltIns/DisplayRow.js +1 -2
  59. package/dist/esm/packages/taco/src/primitives/Table/Core/components/Row/BuiltIns/DisplayRow.js.map +1 -1
  60. package/dist/esm/packages/taco/src/primitives/Table/Core/components/Toolbar/components/Filters/components/Filter.js +12 -3
  61. package/dist/esm/packages/taco/src/primitives/Table/Core/components/Toolbar/components/Filters/components/Filter.js.map +1 -1
  62. package/dist/esm/packages/taco/src/primitives/Table/Core/components/Toolbar/components/Filters/components/FilterComparator.js +3 -47
  63. package/dist/esm/packages/taco/src/primitives/Table/Core/components/Toolbar/components/Filters/components/FilterComparator.js.map +1 -1
  64. package/dist/esm/packages/taco/src/primitives/Table/Core/components/Toolbar/components/Filters/util.js +44 -1
  65. package/dist/esm/packages/taco/src/primitives/Table/Core/components/Toolbar/components/Filters/util.js.map +1 -1
  66. package/dist/esm/packages/taco/src/primitives/Table/Core/features/useTableRenderer.js +1 -1
  67. package/dist/esm/packages/taco/src/primitives/Table/Core/features/useTableRenderer.js.map +1 -1
  68. package/dist/esm/packages/taco/src/primitives/Table/useTableManager/features/useTableRowActive.js +5 -5
  69. package/dist/esm/packages/taco/src/primitives/Table/useTableManager/features/useTableRowActive.js.map +1 -1
  70. package/dist/esm/packages/taco/src/utils/dom.js +4 -1
  71. package/dist/esm/packages/taco/src/utils/dom.js.map +1 -1
  72. package/dist/index.css +4 -4
  73. package/dist/primitives/Table/Core/components/Body/Body.d.ts +2 -0
  74. package/dist/primitives/Table/Core/components/Toolbar/components/Filters/util.d.ts +2 -1
  75. package/dist/taco.cjs.development.js +221 -97
  76. package/dist/taco.cjs.development.js.map +1 -1
  77. package/dist/taco.cjs.production.min.js +1 -1
  78. package/dist/taco.cjs.production.min.js.map +1 -1
  79. package/dist/utils/dom.d.ts +1 -0
  80. package/package.json +2 -2
@@ -1239,6 +1239,21 @@ function IconDocumentRejectedRequest(props, svgRef) {
1239
1239
  }
1240
1240
  var DocumentRejectedRequest = /*#__PURE__*/React.forwardRef(IconDocumentRejectedRequest);
1241
1241
 
1242
+ function IconDocumentSigned(props, svgRef) {
1243
+ return /*#__PURE__*/React.createElement("svg", Object.assign({
1244
+ fill: "none",
1245
+ xmlns: "http://www.w3.org/2000/svg",
1246
+ viewBox: "0 0 24 24",
1247
+ ref: svgRef
1248
+ }, props), /*#__PURE__*/React.createElement("path", {
1249
+ fillRule: "evenodd",
1250
+ clipRule: "evenodd",
1251
+ d: "M14.293 2.293A1 1 0 0013.586 2H5.75A1.75 1.75 0 004 3.75v16.5c0 .966.784 1.75 1.75 1.75h12.5A1.75 1.75 0 0020 20.25V8.414a1 1 0 00-.293-.707l-5.414-5.414zM5.75 3.5H13v3.75l.006.144A1.75 1.75 0 0014.75 9h3.75v11.25l-.007.057a.25.25 0 01-.243.193H5.75l-.057-.007a.25.25 0 01-.193-.243V3.75l.007-.057A.25.25 0 015.75 3.5zm8.75 1.121V7.25a.25.25 0 00.193.243l.057.007h2.63L14.5 4.621zm-6.693 9.425C8.183 12.37 9.194 11 10.43 11c1.547 0 1.796 1.624 1 3.337a6.972 6.972 0 01-1.424 2.009l-.156.148.138-.007.17-.017c1.058-.13 1.702-.687 2.014-1.725l.044-.16.026-.08c.239-.613 1.208-.407 1.13.292a10.03 10.03 0 00-.074 1.205l.006.168.084-.093.202-.245c.451-.532.863-.748 1.332-.404.185.135.278.313.343.543l.019.072.033.156.064.387.087-.088.147-.16.172-.202.197-.242.22-.284.23-.312.057-.067a.59.59 0 01.898.758l-.133.182-.252.334-.127.162c-.665.834-1.147 1.225-1.605 1.266-.419.037-.725-.198-.889-.556a1.83 1.83 0 01-.128-.403l-.016-.081-.08.09-.093.096c-.583.591-1.13.773-1.585.251l-.068-.084-.054-.08a1.31 1.31 0 01-.128-.29l-.011-.04-.098.082-.152.112c-.568.398-1.28.616-2.126.645l-.2.003-.167-.005a1.862 1.862 0 01-.843-.253l-.016-.01-.077.046-.256.137a6.378 6.378 0 01-.8.342l-.222.072-.078.018a.59.59 0 01-.267-1.145 5.16 5.16 0 00.806-.324l.15-.08-.043-.116-.056-.188c-.133-.511-.144-1.121-.036-1.775l.031-.17.038-.181zm2.617-.347c.422-.975.323-1.52.004-1.52-.545 0-1.255 1.006-1.502 2.273-.09.462-.108.86-.061 1.178l.025.14.082-.07.197-.186a5.84 5.84 0 001.1-1.488l.091-.185.064-.142z",
1252
+ fill: "currentColor"
1253
+ }));
1254
+ }
1255
+ var DocumentSigned = /*#__PURE__*/React.forwardRef(IconDocumentSigned);
1256
+
1242
1257
  function IconDocumentSplit(props, svgRef) {
1243
1258
  return /*#__PURE__*/React.createElement("svg", Object.assign({
1244
1259
  xmlns: "http://www.w3.org/2000/svg",
@@ -1763,6 +1778,21 @@ function IconHeightTall(props, svgRef) {
1763
1778
  }
1764
1779
  var HeightTall = /*#__PURE__*/React.forwardRef(IconHeightTall);
1765
1780
 
1781
+ function IconHome2(props, svgRef) {
1782
+ return /*#__PURE__*/React.createElement("svg", Object.assign({
1783
+ fill: "none",
1784
+ xmlns: "http://www.w3.org/2000/svg",
1785
+ viewBox: "0 0 24 24",
1786
+ ref: svgRef
1787
+ }, props), /*#__PURE__*/React.createElement("path", {
1788
+ fillRule: "evenodd",
1789
+ clipRule: "evenodd",
1790
+ d: "M11.116 2.823a1.25 1.25 0 011.768 0L17.25 7.19V6a.75.75 0 011.5 0v2.69l2.78 2.78a.75.75 0 01-1.06 1.06l-2.994-2.993-.013-.013L12 4.061l-8.47 8.47a.75.75 0 01-1.06-1.061l8.646-8.647zm1.768 3.25l7 7c.234.235.366.553.366.884v6.293c0 .69-.56 1.25-1.25 1.25h-4c-.69 0-1.25-.56-1.25-1.25V16.5h-3.5v3.75c0 .69-.56 1.25-1.25 1.25H5c-.69 0-1.25-.56-1.25-1.25v-6.293c0-.332.132-.65.366-.884l7-7a1.25 1.25 0 011.768 0zM12 7.311l-6.75 6.75V20h3.5v-3.75c0-.69.56-1.25 1.25-1.25h4c.69 0 1.25.56 1.25 1.25V20h3.5v-5.94L12 7.31z",
1791
+ fill: "currentColor"
1792
+ }));
1793
+ }
1794
+ var Home2 = /*#__PURE__*/React.forwardRef(IconHome2);
1795
+
1766
1796
  function IconHome(props, svgRef) {
1767
1797
  return /*#__PURE__*/React.createElement("svg", Object.assign({
1768
1798
  xmlns: "http://www.w3.org/2000/svg",
@@ -1776,6 +1806,21 @@ function IconHome(props, svgRef) {
1776
1806
  }
1777
1807
  var Home = /*#__PURE__*/React.forwardRef(IconHome);
1778
1808
 
1809
+ function IconId(props, svgRef) {
1810
+ return /*#__PURE__*/React.createElement("svg", Object.assign({
1811
+ fill: "none",
1812
+ xmlns: "http://www.w3.org/2000/svg",
1813
+ viewBox: "0 0 24 24",
1814
+ ref: svgRef
1815
+ }, props), /*#__PURE__*/React.createElement("path", {
1816
+ fillRule: "evenodd",
1817
+ clipRule: "evenodd",
1818
+ d: "M20.25 5c.966 0 1.75.784 1.75 1.75v10.5A1.75 1.75 0 0120.25 19H3.75A1.75 1.75 0 012 17.25V6.75C2 5.784 2.784 5 3.75 5h16.5zm0 1.5H3.75a.25.25 0 00-.243.193L3.5 6.75v10.5a.25.25 0 00.193.243l.057.007h16.5a.25.25 0 00.243-.193l.007-.057V6.75a.25.25 0 00-.193-.243L20.25 6.5zm-9.268 7.993c-.316-1.81-1.31-2.714-2.982-2.714-1.673 0-2.667.905-2.982 2.714a1.204 1.204 0 001.184 1.41h3.595a1.204 1.204 0 001.185-1.41zM8 8c.76 0 1.374.77 1.374 1.718 0 .949-.615 1.718-1.374 1.718-.759 0-1.374-.77-1.374-1.718C6.626 8.769 7.24 8 8 8zm11 .75a.75.75 0 00-.75-.75h-6a.75.75 0 000 1.5h6a.75.75 0 00.75-.75zM18.25 14a.75.75 0 010 1.5h-4.5a.75.75 0 010-1.5h4.5zm.75-2.25a.75.75 0 00-.75-.75h-4.5a.75.75 0 000 1.5h4.5a.75.75 0 00.75-.75z",
1819
+ fill: "currentColor"
1820
+ }));
1821
+ }
1822
+ var Id = /*#__PURE__*/React.forwardRef(IconId);
1823
+
1779
1824
  function IconImages(props, svgRef) {
1780
1825
  return /*#__PURE__*/React.createElement("svg", Object.assign({
1781
1826
  xmlns: "http://www.w3.org/2000/svg",
@@ -2266,6 +2311,25 @@ function IconMarket(props, svgRef) {
2266
2311
  }
2267
2312
  var Market = /*#__PURE__*/React.forwardRef(IconMarket);
2268
2313
 
2314
+ function IconMastercardOs(props, svgRef) {
2315
+ return /*#__PURE__*/React.createElement("svg", Object.assign({
2316
+ fill: "none",
2317
+ xmlns: "http://www.w3.org/2000/svg",
2318
+ viewBox: "0 0 24 24",
2319
+ ref: svgRef
2320
+ }, props), /*#__PURE__*/React.createElement("path", {
2321
+ d: "M14.698 7.314H9.286v9.66h5.412v-9.66z",
2322
+ fill: "#FF5A00"
2323
+ }), /*#__PURE__*/React.createElement("path", {
2324
+ d: "M9.646 12.144c0-1.963.929-3.704 2.354-4.83A6.178 6.178 0 008.185 6C4.766 6 2 8.748 2 12.144s2.766 6.143 6.185 6.143A6.178 6.178 0 0012 16.973a6.117 6.117 0 01-2.354-4.83z",
2325
+ fill: "#EB001B"
2326
+ }), /*#__PURE__*/React.createElement("path", {
2327
+ d: "M22 12.144c0 3.396-2.766 6.143-6.185 6.143A6.178 6.178 0 0112 16.973a6.095 6.095 0 002.354-4.83A6.146 6.146 0 0012 7.315 6.168 6.168 0 0115.813 6C19.233 6 22 8.766 22 12.144z",
2328
+ fill: "#F79E1B"
2329
+ }));
2330
+ }
2331
+ var MastercardOs = /*#__PURE__*/React.forwardRef(IconMastercardOs);
2332
+
2269
2333
  function IconMatchAmount(props, svgRef) {
2270
2334
  return /*#__PURE__*/React.createElement("svg", Object.assign({
2271
2335
  xmlns: "http://www.w3.org/2000/svg",
@@ -2435,6 +2499,22 @@ function IconNote(props, svgRef) {
2435
2499
  }
2436
2500
  var Note = /*#__PURE__*/React.forwardRef(IconNote);
2437
2501
 
2502
+ function IconNovemberFirst(props, svgRef) {
2503
+ return /*#__PURE__*/React.createElement("svg", Object.assign({
2504
+ fill: "none",
2505
+ xmlns: "http://www.w3.org/2000/svg",
2506
+ viewBox: "0 0 24 24",
2507
+ ref: svgRef
2508
+ }, props), /*#__PURE__*/React.createElement("path", {
2509
+ d: "M21.484 8.828C19.73 3.592 14.065.768 8.829 2.519 3.592 4.271.767 9.936 2.519 15.172c1.752 5.237 7.418 8.06 12.655 6.308a9.997 9.997 0 006.31-12.653z",
2510
+ fill: "#0D2840"
2511
+ }), /*#__PURE__*/React.createElement("path", {
2512
+ d: "M13.977 7.263v5.445l-4.14-5.445H7.264l.78 1.156v7.686h1.919v-5.619l4.28 5.62H15.9V7.262h-1.922z",
2513
+ fill: "#2CD7B3"
2514
+ }));
2515
+ }
2516
+ var NovemberFirst = /*#__PURE__*/React.forwardRef(IconNovemberFirst);
2517
+
2438
2518
  function IconNumbers(props, svgRef) {
2439
2519
  return /*#__PURE__*/React.createElement("svg", Object.assign({
2440
2520
  fill: "none",
@@ -3486,6 +3566,7 @@ const icons = {
3486
3566
  'document-preview': DocumentPreview,
3487
3567
  'document-received': DocumentReceived,
3488
3568
  'document-rejected-request': DocumentRejectedRequest,
3569
+ 'document-signed': DocumentSigned,
3489
3570
  'document-split': DocumentSplit,
3490
3571
  'document-time': DocumentTime,
3491
3572
  document: Document,
@@ -3525,7 +3606,9 @@ const icons = {
3525
3606
  'height-medium': HeightMedium,
3526
3607
  'height-short': HeightShort,
3527
3608
  'height-tall': HeightTall,
3609
+ home2: Home2,
3528
3610
  home: Home,
3611
+ id: Id,
3529
3612
  images: Images,
3530
3613
  import: Import,
3531
3614
  'inbox-einvoicing': InboxEinvoicing,
@@ -3562,6 +3645,7 @@ const icons = {
3562
3645
  'log-out': LogOut,
3563
3646
  log: Log,
3564
3647
  market: Market,
3648
+ 'mastercard-os': MastercardOs,
3565
3649
  'match-amount': MatchAmount,
3566
3650
  'match-entries': MatchEntries,
3567
3651
  menu: Menu,
@@ -3575,6 +3659,7 @@ const icons = {
3575
3659
  'note-follow-up': NoteFollowUp,
3576
3660
  'note-read': NoteRead,
3577
3661
  note: Note,
3662
+ 'november-first': NovemberFirst,
3578
3663
  numbers: Numbers,
3579
3664
  'partner-api': PartnerApi,
3580
3665
  'payment-paid': PaymentPaid,
@@ -4122,6 +4207,9 @@ function isElementInteractive(element) {
4122
4207
  }
4123
4208
  return ['A', 'BUTTON', 'INPUT', 'TEXTAREA', 'SELECT', 'LABEL', 'OPTION'].includes(element.tagName) && !element.hidden && !element.disabled && !element.readOnly;
4124
4209
  }
4210
+ function isElementInsideTable3OrReport(element) {
4211
+ return !!(element !== null && element !== void 0 && element.closest('[data-taco^=table]'));
4212
+ }
4125
4213
 
4126
4214
  function isPressingMetaKey(event) {
4127
4215
  return isMacOs() ? event.metaKey : event.ctrlKey;
@@ -5214,6 +5302,11 @@ const InputWithoutDeprecatedFeatures = /*#__PURE__*/React.forwardRef(function In
5214
5302
  event.preventDefault();
5215
5303
  const position = event.key === 'End' ? event.currentTarget.value.length : 0;
5216
5304
  event.currentTarget.setSelectionRange(position, position);
5305
+ // Necessary for ensuring the cursor is scrolled into view when using Home/End keys on Windows
5306
+ if (internalRef.current) {
5307
+ const scrollPosition = event.key === 'End' ? internalRef.current.scrollWidth : 0;
5308
+ internalRef.current.scrollLeft = scrollPosition;
5309
+ }
5217
5310
  }
5218
5311
  }
5219
5312
  if (typeof onKeyDown === 'function') {
@@ -5823,9 +5916,7 @@ const useCombobox = ({
5823
5916
  }
5824
5917
  };
5825
5918
  const handleInputKeyDown = event => {
5826
- var _inputRef$current;
5827
5919
  event.persist();
5828
- const insideTheTable = !!((_inputRef$current = inputRef.current) !== null && _inputRef$current !== void 0 && _inputRef$current.closest('table, [role="rowgroup"]'));
5829
5920
  if (!event.ctrlKey && !event.metaKey) {
5830
5921
  switch (event.key) {
5831
5922
  case 'Backspace':
@@ -5847,7 +5938,7 @@ const useCombobox = ({
5847
5938
  }
5848
5939
  case 'Enter':
5849
5940
  {
5850
- if (insideTheTable) {
5941
+ if (isElementInsideTable3OrReport(event.currentTarget)) {
5851
5942
  event.preventDefault();
5852
5943
  if (inline && !open) {
5853
5944
  setOpen(true);
@@ -5865,7 +5956,7 @@ const useCombobox = ({
5865
5956
  if (open) {
5866
5957
  event.preventDefault();
5867
5958
  } else {
5868
- if (!inline && buttonRef.current && !insideTheTable) {
5959
+ if (!inline && buttonRef.current && !isElementInsideTable3OrReport(event.currentTarget)) {
5869
5960
  buttonRef.current.click();
5870
5961
  }
5871
5962
  }
@@ -5885,7 +5976,7 @@ const useCombobox = ({
5885
5976
  listRef.current.dispatchEvent(createCustomKeyboardEvent(event));
5886
5977
  }
5887
5978
  if (inline && !open) {
5888
- if ((event.key === 'ArrowUp' || event.key === 'ArrowDown') && !insideTheTable) {
5979
+ if ((event.key === 'ArrowUp' || event.key === 'ArrowDown') && !isElementInsideTable3OrReport(event.currentTarget)) {
5889
5980
  event.preventDefault();
5890
5981
  const initialIndex = event.key === 'ArrowUp' ? data.length - 1 : 0;
5891
5982
  setCurrentIndex(currentIndex !== undefined ? currentIndex : initialIndex);
@@ -8194,12 +8285,13 @@ const Link$1 = /*#__PURE__*/React.forwardRef(function MenuLink(props, ref) {
8194
8285
  const Trigger$6 = /*#__PURE__*/React.forwardRef(function MenuTrigger(props, ref) {
8195
8286
  const menu = useCurrentMenu();
8196
8287
  const internalRef = useMergedRef(ref);
8197
- const preventArrowDownShortcut = event => {
8198
- var _internalRef$current;
8199
- const isRenderedInTable = !!((_internalRef$current = internalRef.current) !== null && _internalRef$current !== void 0 && _internalRef$current.closest('tbody'));
8200
- if (isRenderedInTable && event.key === 'ArrowDown') {
8201
- var _internalRef$current2, _internalRef$current3;
8202
- internalRef === null || internalRef === void 0 ? void 0 : (_internalRef$current2 = internalRef.current) === null || _internalRef$current2 === void 0 ? void 0 : (_internalRef$current3 = _internalRef$current2.parentNode) === null || _internalRef$current3 === void 0 ? void 0 : _internalRef$current3.dispatchEvent(createCustomKeyboardEvent(event));
8288
+ const handleKeyDown = event => {
8289
+ if (event.key === 'ArrowDown') {
8290
+ if (isElementInsideTable3OrReport(event.currentTarget)) {
8291
+ var _event$currentTarget$;
8292
+ event.preventDefault();
8293
+ (_event$currentTarget$ = event.currentTarget.parentNode) === null || _event$currentTarget$ === void 0 ? void 0 : _event$currentTarget$.dispatchEvent(createCustomKeyboardEvent(event));
8294
+ }
8203
8295
  }
8204
8296
  };
8205
8297
  React.useEffect(() => {
@@ -8210,7 +8302,7 @@ const Trigger$6 = /*#__PURE__*/React.forwardRef(function MenuTrigger(props, ref)
8210
8302
  return /*#__PURE__*/React.createElement(DropdownMenuPrimitive.Trigger, Object.assign({}, props, {
8211
8303
  asChild: true,
8212
8304
  ref: internalRef,
8213
- onKeyDown: preventArrowDownShortcut
8305
+ onKeyDown: handleKeyDown
8214
8306
  }));
8215
8307
  });
8216
8308
 
@@ -10437,11 +10529,11 @@ function useTableRowActive(isEnabled = false, initialRowActiveIndex) {
10437
10529
  const [rowActiveIndex, setRowActiveIndex] = React__default.useState(initialRowActiveIndex);
10438
10530
  const [rowHoverIndex, setRowHoverIndex] = React__default.useState(undefined);
10439
10531
  const [isHoverStatePaused, setHoverStatePaused] = useIsHoverStatePaused();
10440
- const move = (direction, length, scrollToIndex) => setRowActiveIndex(currentIndex => {
10441
- const nextIndex = currentIndex !== undefined ? getNextIndex(direction, currentIndex, length) : 0;
10442
- setTimeout(() => scrollToIndex(nextIndex), 1);
10443
- return nextIndex;
10444
- });
10532
+ const move = (direction, length, scrollToIndex) => {
10533
+ const nextIndex = rowActiveIndex !== undefined ? getNextIndex(direction, rowActiveIndex, length) : 0;
10534
+ scrollToIndex(nextIndex);
10535
+ setTimeout(() => setRowActiveIndex(nextIndex), 50);
10536
+ };
10445
10537
  const onKeyDown = React__default.useCallback((event, length, scrollToIndex) => {
10446
10538
  if (!isEnabled || event.defaultPrevented) {
10447
10539
  return;
@@ -11663,7 +11755,7 @@ function useTableRenderer(renderers, table, tableRef, defaultRowActiveIndex) {
11663
11755
  } = useRowHeightVirtualisation(table);
11664
11756
  // row groups
11665
11757
  const rangeExtractor = useRowGroupVirtualisation(table);
11666
- // account for thead and tfoot in the scroll area
11758
+ // account for thead and tfoot in the scroll area - both are always medium row height
11667
11759
  const scrollPaddingStart = ROW_HEIGHT_ESTIMATES.medium;
11668
11760
  // column groups offset the bottom padding :shrug:, multiplying by 1.5 ensures the bottom padding remains
11669
11761
  // consistent when there are groups and when there aren't. 1.5 is relatively arbitrary, but it gives alignment
@@ -12421,7 +12513,7 @@ const DisplayRow = /*#__PURE__*/React__default.memo(function DisplayRow(props) {
12421
12513
  const handleClickCapture = React__default.useCallback(() => {
12422
12514
  // do this in the next frame, otherwise it remounts the row and prevents row actions on hover from being clickable
12423
12515
  requestAnimationFrame(() => tableMeta.rowActive.setRowActiveIndex(index));
12424
- }, []);
12516
+ }, [index]);
12425
12517
  // row active
12426
12518
  if (tableMeta.rowActive.isEnabled) {
12427
12519
  attributes['data-row-active'] = tableMeta.rowActive.rowActiveIndex === index ? true : undefined;
@@ -12434,7 +12526,6 @@ const DisplayRow = /*#__PURE__*/React__default.memo(function DisplayRow(props) {
12434
12526
  }
12435
12527
  // row drag
12436
12528
  if (tableMeta.rowDrag.isEnabled) {
12437
- attributes.draggable = true;
12438
12529
  attributes['aria-grabbed'] = !!tableMeta.rowDrag.dragging[row.id];
12439
12530
  }
12440
12531
  // row drop
@@ -13121,6 +13212,7 @@ function Body(props) {
13121
13212
  enableHorizontalArrowKeyNavigation = false,
13122
13213
  scrollToIndex,
13123
13214
  table,
13215
+ tableElement,
13124
13216
  ...attributes
13125
13217
  } = props;
13126
13218
  const ref = React__default.useRef(null);
@@ -13138,12 +13230,30 @@ function Body(props) {
13138
13230
  return;
13139
13231
  }
13140
13232
  tableMeta.rowActive.setHoverStatePaused(true);
13141
- const focusedElement = event.shiftKey || event.key === 'ArrowLeft' ? focusManager.focusPrevious() : focusManager.focusNext();
13233
+ const isMetaKeyPressed = isPressingMetaKey(event);
13234
+ let focusedElement;
13235
+ switch (event.key) {
13236
+ case 'ArrowLeft':
13237
+ focusedElement = isMetaKeyPressed ? focusManager.focusFirst() : focusManager.focusPrevious();
13238
+ break;
13239
+ case 'ArrowRight':
13240
+ focusedElement = isMetaKeyPressed ? focusManager.focusLast() : focusManager.focusNext();
13241
+ // Scrolls table all the way to the right
13242
+ if (isMetaKeyPressed && tableElement) {
13243
+ tableElement.scrollLeft = tableElement.scrollWidth;
13244
+ }
13245
+ break;
13246
+ default:
13247
+ focusedElement = event.shiftKey ? focusManager.focusPrevious() : focusManager.focusNext();
13248
+ break;
13249
+ }
13142
13250
  if (focusedElement) {
13143
13251
  // override default behaviour, since we're handling focus internally now
13144
13252
  event.preventDefault();
13145
13253
  return;
13146
13254
  }
13255
+ // The code below only executes when focusedElement was undefined/null. This happens only when arrow-left/shift+tab
13256
+ // is pressed on the first cell or arrow-right/tab is pressed on the last cell.
13147
13257
  if (event.shiftKey || event.key === 'ArrowLeft') {
13148
13258
  if (!isFirstRow) {
13149
13259
  // there are no previous elements to focus, go up a row or go outside the table
@@ -15223,6 +15333,8 @@ const Select2 = /*#__PURE__*/React__default.forwardRef(function Select2(props, r
15223
15333
  var _listboxRef$current;
15224
15334
  if (open) {
15225
15335
  event.preventDefault();
15336
+ } else if (isElementInsideTable3OrReport(event.currentTarget)) {
15337
+ return;
15226
15338
  } else if (!event.ctrlKey && !event.metaKey && (event.key === 'ArrowDown' || /^[a-z0-9]$/i.test(event.key))) {
15227
15339
  setOpen(true);
15228
15340
  }
@@ -15639,6 +15751,46 @@ function sortByHeader(a, b) {
15639
15751
  function isEmptyFilter(filter) {
15640
15752
  return !filter.value.hasOwnProperty('value'); // eslint-disable-line no-prototype-builtins
15641
15753
  }
15754
+ function guessComparatorsBasedOnControl(column) {
15755
+ var _column$columnDef$met;
15756
+ const columnMeta = (_column$columnDef$met = column === null || column === void 0 ? void 0 : column.columnDef.meta) !== null && _column$columnDef$met !== void 0 ? _column$columnDef$met : {};
15757
+ if (Array.isArray(columnMeta.filters)) {
15758
+ return columnMeta.filters;
15759
+ }
15760
+ if (typeof columnMeta.control === 'function') {
15761
+ const renderedControl = columnMeta.control({
15762
+ onBlur: () => undefined,
15763
+ onFocus: () => undefined,
15764
+ setValue: () => undefined,
15765
+ value: undefined,
15766
+ disabled: false,
15767
+ readOnly: false,
15768
+ ref: undefined
15769
+ });
15770
+ if ( /*#__PURE__*/React__default.isValidElement(renderedControl)) {
15771
+ const {
15772
+ props,
15773
+ type
15774
+ } = renderedControl;
15775
+ if (type.displayName === 'Select2') {
15776
+ if (props.multiple) {
15777
+ return [exports.TableFilterComparator.HasAnyOf, exports.TableFilterComparator.HasAllOf, exports.TableFilterComparator.IsEqualTo, exports.TableFilterComparator.HasNoneOf, exports.TableFilterComparator.IsEmpty, exports.TableFilterComparator.IsNotEmpty];
15778
+ }
15779
+ return [exports.TableFilterComparator.IsEqualTo, exports.TableFilterComparator.IsNotEqualTo, exports.TableFilterComparator.IsEmpty, exports.TableFilterComparator.IsNotEmpty];
15780
+ }
15781
+ }
15782
+ }
15783
+ if (columnMeta.dataType === 'number') {
15784
+ return [exports.TableFilterComparator.IsEqualTo, exports.TableFilterComparator.IsNotEqualTo, exports.TableFilterComparator.IsGreaterThan, exports.TableFilterComparator.IsLessThan, exports.TableFilterComparator.IsBetween, exports.TableFilterComparator.IsEmpty, exports.TableFilterComparator.IsNotEmpty];
15785
+ }
15786
+ if (columnMeta.control === 'datepicker' || columnMeta.dataType === 'datetime') {
15787
+ return [exports.TableFilterComparator.IsEqualTo, exports.TableFilterComparator.IsNotEqualTo, exports.TableFilterComparator.IsBetween, exports.TableFilterComparator.IsLessThan, exports.TableFilterComparator.IsGreaterThan, exports.TableFilterComparator.IsEmpty, exports.TableFilterComparator.IsNotEmpty, exports.TableFilterComparator.IsLessThanOrEqualTo, exports.TableFilterComparator.IsGreaterThanOrEqualTo];
15788
+ }
15789
+ if (columnMeta.control === 'switch') {
15790
+ return [exports.TableFilterComparator.IsEqualTo];
15791
+ }
15792
+ return [exports.TableFilterComparator.Contains, exports.TableFilterComparator.DoesNotContain, exports.TableFilterComparator.IsEqualTo, exports.TableFilterComparator.IsNotEqualTo, exports.TableFilterComparator.IsEmpty, exports.TableFilterComparator.IsNotEmpty];
15793
+ }
15642
15794
 
15643
15795
  const FilterColumn = /*#__PURE__*/React__default.forwardRef((props, ref) => {
15644
15796
  const {
@@ -15692,11 +15844,6 @@ function FilterComparator(props) {
15692
15844
  texts
15693
15845
  } = useLocalization();
15694
15846
  const validComparators = guessComparatorsBasedOnControl(column);
15695
- React__default.useEffect(() => {
15696
- if (value === undefined || !validComparators.includes(value)) {
15697
- handleChange === null || handleChange === void 0 ? void 0 : handleChange(validComparators[0]);
15698
- }
15699
- }, [validComparators]);
15700
15847
  return /*#__PURE__*/React__default.createElement(Select2, Object.assign({}, attributes, {
15701
15848
  className: "!w-32 flex-shrink-0",
15702
15849
  disabled: !column,
@@ -15707,49 +15854,9 @@ function FilterComparator(props) {
15707
15854
  value: comparator
15708
15855
  }, getComparatorText(comparator, texts, column)))));
15709
15856
  }
15710
- function guessComparatorsBasedOnControl(column) {
15711
- var _column$columnDef$met;
15712
- const columnMeta = (_column$columnDef$met = column === null || column === void 0 ? void 0 : column.columnDef.meta) !== null && _column$columnDef$met !== void 0 ? _column$columnDef$met : {};
15713
- if (Array.isArray(columnMeta.filters)) {
15714
- return columnMeta.filters;
15715
- }
15716
- if (typeof columnMeta.control === 'function') {
15717
- const renderedControl = columnMeta.control({
15718
- onBlur: () => undefined,
15719
- onFocus: () => undefined,
15720
- setValue: () => undefined,
15721
- value: undefined,
15722
- disabled: false,
15723
- readOnly: false,
15724
- ref: undefined
15725
- });
15726
- if ( /*#__PURE__*/React__default.isValidElement(renderedControl)) {
15727
- const {
15728
- props,
15729
- type
15730
- } = renderedControl;
15731
- if (type.displayName === 'Select2') {
15732
- if (props.multiple) {
15733
- return [exports.TableFilterComparator.HasAnyOf, exports.TableFilterComparator.HasAllOf, exports.TableFilterComparator.IsEqualTo, exports.TableFilterComparator.HasNoneOf, exports.TableFilterComparator.IsEmpty, exports.TableFilterComparator.IsNotEmpty];
15734
- }
15735
- return [exports.TableFilterComparator.IsEqualTo, exports.TableFilterComparator.IsNotEqualTo, exports.TableFilterComparator.IsEmpty, exports.TableFilterComparator.IsNotEmpty];
15736
- }
15737
- }
15738
- }
15739
- if (columnMeta.dataType === 'number') {
15740
- return [exports.TableFilterComparator.IsEqualTo, exports.TableFilterComparator.IsNotEqualTo, exports.TableFilterComparator.IsGreaterThan, exports.TableFilterComparator.IsLessThan, exports.TableFilterComparator.IsBetween, exports.TableFilterComparator.IsEmpty, exports.TableFilterComparator.IsNotEmpty];
15741
- }
15742
- if (columnMeta.control === 'datepicker' || columnMeta.dataType === 'datetime') {
15743
- return [exports.TableFilterComparator.IsEqualTo, exports.TableFilterComparator.IsNotEqualTo, exports.TableFilterComparator.IsBetween, exports.TableFilterComparator.IsLessThan, exports.TableFilterComparator.IsGreaterThan, exports.TableFilterComparator.IsEmpty, exports.TableFilterComparator.IsNotEmpty, exports.TableFilterComparator.IsLessThanOrEqualTo, exports.TableFilterComparator.IsGreaterThanOrEqualTo];
15744
- }
15745
- if (columnMeta.control === 'switch') {
15746
- return [exports.TableFilterComparator.IsEqualTo];
15747
- }
15748
- return [exports.TableFilterComparator.Contains, exports.TableFilterComparator.DoesNotContain, exports.TableFilterComparator.IsEqualTo, exports.TableFilterComparator.IsNotEqualTo, exports.TableFilterComparator.IsEmpty, exports.TableFilterComparator.IsNotEmpty];
15749
- }
15750
15857
  function getComparatorText(comparator, texts, column) {
15751
- var _column$columnDef, _column$columnDef$met2;
15752
- 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';
15858
+ var _column$columnDef, _column$columnDef$met;
15859
+ const isDate = (column === null || column === void 0 ? void 0 : (_column$columnDef = column.columnDef) === null || _column$columnDef === void 0 ? void 0 : (_column$columnDef$met = _column$columnDef.meta) === null || _column$columnDef$met === void 0 ? void 0 : _column$columnDef$met.control) === 'datepicker';
15753
15860
  switch (comparator) {
15754
15861
  case exports.TableFilterComparator.Contains:
15755
15862
  return texts.table.filters.comparators.contains;
@@ -15925,14 +16032,22 @@ function Filter$1(props) {
15925
16032
  }
15926
16033
  } = filter;
15927
16034
  const handleChangeColumn = columnId => {
15928
- var _previousColumn$colum, _nextColumn$columnDef;
16035
+ var _previousColumn$colum, _previousColumn$colum2, _nextColumn$columnDef;
15929
16036
  const previousColumn = allColumns.find(column => column.id === id);
15930
16037
  const nextColumn = allColumns.find(column => column.id === columnId);
15931
16038
  // UX requirement: if old column data type is the same as next column data type,
15932
16039
  // then we applying the same filter value for the next column,
15933
16040
  // but when data types are different, we're reseting comparator ans value for the next column
15934
- const value = (previousColumn === null || previousColumn === void 0 ? void 0 : (_previousColumn$colum = previousColumn.columnDef.meta) === null || _previousColumn$colum === void 0 ? void 0 : _previousColumn$colum.dataType) === (nextColumn === null || nextColumn === void 0 ? void 0 : (_nextColumn$columnDef = nextColumn.columnDef.meta) === null || _nextColumn$columnDef === void 0 ? void 0 : _nextColumn$columnDef.dataType) ? filter.value : {
15935
- comparator: exports.TableFilterComparator.Contains,
16041
+ if (previousColumn !== null && previousColumn !== void 0 && (_previousColumn$colum = previousColumn.columnDef.meta) !== null && _previousColumn$colum !== void 0 && _previousColumn$colum.dataType && (previousColumn === null || previousColumn === void 0 ? void 0 : (_previousColumn$colum2 = previousColumn.columnDef.meta) === null || _previousColumn$colum2 === void 0 ? void 0 : _previousColumn$colum2.dataType) === (nextColumn === null || nextColumn === void 0 ? void 0 : (_nextColumn$columnDef = nextColumn.columnDef.meta) === null || _nextColumn$columnDef === void 0 ? void 0 : _nextColumn$columnDef.dataType)) {
16042
+ handleChange(position, {
16043
+ id: columnId,
16044
+ value: filter.value
16045
+ });
16046
+ return;
16047
+ }
16048
+ const validComparators = guessComparatorsBasedOnControl(nextColumn);
16049
+ const value = {
16050
+ comparator: validComparators[0],
15936
16051
  value: undefined
15937
16052
  };
15938
16053
  handleChange(position, {
@@ -16242,9 +16357,10 @@ function TableGrid(props) {
16242
16357
  key: props.id,
16243
16358
  header: props,
16244
16359
  scrollToIndex: table.renderer.scrollToIndex
16245
- }))))))), table.instance.getRowModel().rows.length ? ( /*#__PURE__*/React__default.createElement(React__default.Fragment, null, /*#__PURE__*/React__default.createElement(Body, {
16360
+ }))))))), table.instance.getCoreRowModel().rows.length ? ( /*#__PURE__*/React__default.createElement(React__default.Fragment, null, /*#__PURE__*/React__default.createElement(Body, {
16246
16361
  enableHorizontalArrowKeyNavigation: enableHorizontalArrowKeyNavigation,
16247
16362
  table: table.instance,
16363
+ tableElement: table.ref.current,
16248
16364
  scrollToIndex: table.renderer.scrollToIndex,
16249
16365
  style: table.renderer.style
16250
16366
  }, table.renderer.rows), table.meta.footer.isEnabled ? /*#__PURE__*/React__default.createElement(Foot, {
@@ -17752,7 +17868,7 @@ const useTableRowCreation = (data, tableRef) => {
17752
17868
  };
17753
17869
  };
17754
17870
 
17755
- function useTableEditingListener(table) {
17871
+ function useTableEditingListener(table, tableRef) {
17756
17872
  const tableMeta = table.options.meta;
17757
17873
  const saveChanges = () => {
17758
17874
  requestAnimationFrame(() => {
@@ -17794,6 +17910,20 @@ function useTableEditingListener(table) {
17794
17910
  window.removeEventListener('beforeunload', showUnsavedChangesWarning);
17795
17911
  };
17796
17912
  }, [tableMeta.editing.isEditing, hasChanges]);
17913
+ React__default.useEffect(() => {
17914
+ const onClickOutside = event => {
17915
+ if (tableMeta.editing.isEditing) {
17916
+ var _event$target$getAttr, _event$target;
17917
+ const element = (_event$target$getAttr = (_event$target = event.target) === null || _event$target === void 0 ? void 0 : _event$target.getAttribute('data-taco')) !== null && _event$target$getAttr !== void 0 ? _event$target$getAttr : '';
17918
+ const insideTable = isElementInsideOrTriggeredFromContainer(event.target, tableRef.current) || element === 'backdrop';
17919
+ if (!insideTable) {
17920
+ saveChanges();
17921
+ }
17922
+ }
17923
+ };
17924
+ document.addEventListener('click', onClickOutside);
17925
+ return () => document.removeEventListener('click', onClickOutside);
17926
+ }, [saveChanges, tableMeta.editing.isEditing]);
17797
17927
  }
17798
17928
 
17799
17929
  function willRowMove(cell, change, rowIndex) {
@@ -17872,15 +18002,6 @@ function useTableEditing(isEnabled = false, handleSave, validator) {
17872
18002
  // changes are saved as soon as the active row changes, so in most cases this will only contain the active row's changes
17873
18003
  // but not always - if validation or server requests fail when saving, those rows remain until the failure is resolved
17874
18004
  const pendingChangesFns = usePendingChanges(isEnabled, handleSave, validator);
17875
- // if focus leaves the table in any way, trigger a save
17876
- const handleBlur = React__default.useCallback(event => {
17877
- // custom event from datepicker, and it doesn't have the relatedTarget property set.
17878
- const isClosingDatepicker = dateFns.isDate(event.detail);
17879
- if (event.relatedTarget !== event.currentTarget && !isElementInsideOrTriggeredFromContainer(event.relatedTarget, event.currentTarget) && !isClosingDatepicker) {
17880
- pendingChangesFns.saveChanges();
17881
- }
17882
- }, [pendingChangesFns.saveChanges]);
17883
- // TODO: using useGlobalKeyDown prevents trigger when focused on inputs, but it's more "proper"
17884
18005
  useGlobalKeyDown(isEnabled && isEditing ? {
17885
18006
  key: 's',
17886
18007
  meta: true,
@@ -17897,8 +18018,7 @@ function useTableEditing(isEnabled = false, handleSave, validator) {
17897
18018
  toggleEditing: isEnabled ? toggleEditing : () => undefined,
17898
18019
  lastFocusedCellIndex,
17899
18020
  setLastFocusedCellIndex,
17900
- ...pendingChangesFns,
17901
- handleBlur: isEnabled && isEditing ? handleBlur : () => undefined
18021
+ ...pendingChangesFns
17902
18022
  };
17903
18023
  }
17904
18024
  function usePendingChanges(isEnabled, handleSave, validator) {
@@ -18222,7 +18342,7 @@ function RowMoveIndicator(props) {
18222
18342
  if (cellRef.current) {
18223
18343
  if (isActiveRow && !!moveReason) {
18224
18344
  var _cellRef$current$pare;
18225
- const firstChild = (_cellRef$current$pare = cellRef.current.parentElement) === null || _cellRef$current$pare === void 0 ? void 0 : _cellRef$current$pare.querySelector('td');
18345
+ const firstChild = (_cellRef$current$pare = cellRef.current.parentElement) === null || _cellRef$current$pare === void 0 ? void 0 : _cellRef$current$pare.querySelector(`td[data-taco="cell-control"]`);
18226
18346
  if (cellRef.current === firstChild) {
18227
18347
  var _cellRef$current$pare2;
18228
18348
  setShow(true);
@@ -18477,6 +18597,7 @@ function EditingControlCell(props) {
18477
18597
  const cellAttributes = {
18478
18598
  ...getCellAttributes(cell, index, isHighlighted),
18479
18599
  'data-cell-editing-invalid': error ? true : undefined,
18600
+ 'data-taco': 'cell-control',
18480
18601
  onFocus: handleFocus,
18481
18602
  ref: cellRef,
18482
18603
  tabIndex: -1
@@ -18575,7 +18696,7 @@ const MemoedEditingCell = /*#__PURE__*/React__default.memo(function MemoedEditin
18575
18696
  return;
18576
18697
  }
18577
18698
  // toggle into detailed mode when actually inputting something
18578
- if (/^[a-z0-9]$/i.test(event.key) || event.key === 'Backspace') {
18699
+ if (!isPressingMetaKey(event) && (/^[a-z0-9]$/i.test(event.key) || event.key === 'Backspace')) {
18579
18700
  toggleDetailedMode(true);
18580
18701
  }
18581
18702
  };
@@ -18674,16 +18795,24 @@ function EditingActionMenu(props) {
18674
18795
  hasErrors,
18675
18796
  onClear: handleClear,
18676
18797
  onExit: handleExit,
18677
- onSave: handleSave
18798
+ onSave: handleSave,
18799
+ isLastRow
18678
18800
  } = props;
18679
18801
  const {
18680
18802
  texts
18681
18803
  } = useLocalization();
18804
+ const handleKeyDown = event => {
18805
+ // normally we handle this on change of active row, but when tabbing out of the last row the active row state stays on the last one.
18806
+ if (isLastRow && hasChanges && event.key === 'Tab') {
18807
+ handleSave();
18808
+ }
18809
+ };
18682
18810
  return /*#__PURE__*/React__default.createElement(IconButton, {
18683
18811
  appearance: "transparent",
18684
18812
  "aria-label": texts.table3.editing.actions.tooltip,
18685
18813
  className: "group-[[data-row-editing-status]]/row:hidden",
18686
18814
  icon: "more",
18815
+ onKeyDown: handleKeyDown,
18687
18816
  menu: menuProps => ( /*#__PURE__*/React__default.createElement(Menu$1, Object.assign({}, menuProps), /*#__PURE__*/React__default.createElement(Menu$1.Content, null, /*#__PURE__*/React__default.createElement(Menu$1.Item, {
18688
18817
  icon: "tick",
18689
18818
  disabled: !hasChanges || hasErrors,
@@ -18783,7 +18912,7 @@ function Row$2(props) {
18783
18912
  if (tableMeta.editing.isEditing && isActiveRow) {
18784
18913
  var _event$target$closest, _event$target$closest2;
18785
18914
  const cellIndex = Number((_event$target$closest = (_event$target$closest2 = event.target.closest('td')) === null || _event$target$closest2 === void 0 ? void 0 : _event$target$closest2.getAttribute('data-cell-index')) !== null && _event$target$closest !== void 0 ? _event$target$closest : undefined);
18786
- if (!isNaN(cellIndex) && tableMeta.editing.lastFocusedCellIndex !== cellIndex) {
18915
+ if (!isNaN(cellIndex)) {
18787
18916
  tableMeta.editing.setLastFocusedCellIndex(Number(cellIndex));
18788
18917
  }
18789
18918
  }
@@ -18813,7 +18942,8 @@ function useTable3(props, ref) {
18813
18942
  hasErrors: editing.hasRowErrors(rowId),
18814
18943
  onClear: () => editing.resetChanges(rowId),
18815
18944
  onSave: () => editing.saveChanges(rowId),
18816
- onExit: () => editing.toggleEditing(false)
18945
+ onExit: () => editing.toggleEditing(false),
18946
+ isLastRow: table.meta.rowActive.rowActiveIndex === table.meta.length - 1
18817
18947
  }))] : props.rowActions
18818
18948
  };
18819
18949
  const meta = {
@@ -18821,7 +18951,7 @@ function useTable3(props, ref) {
18821
18951
  };
18822
18952
  const table = useTable(extendedProps, ref, RENDERERS$1, meta);
18823
18953
  // listeners
18824
- useTableEditingListener(table.instance);
18954
+ useTableEditingListener(table.instance, table.ref);
18825
18955
  React__default.useEffect(() => {
18826
18956
  if (table.ref.current) {
18827
18957
  table.ref.current.instance.toggleEditing = enabled => table.meta.editing.toggleEditing(enabled !== null && enabled !== void 0 ? enabled : editing => !editing);
@@ -19010,15 +19140,9 @@ Group$5.displayName = 'Table3Group';
19010
19140
  const BaseTable3 = /*#__PURE__*/fixedForwardRef(function BaseTable3(props, ref) {
19011
19141
  var _table3$meta$editing, _table3$meta$editing2;
19012
19142
  const table3 = useTable3(props, ref);
19013
- const handleBlur = event => {
19014
- if (table3.meta.editing.isEditing) {
19015
- table3.meta.editing.handleBlur(event);
19016
- }
19017
- };
19018
19143
  const gridAttributes = {
19019
19144
  'data-table-editing-mode': (_table3$meta$editing = table3.meta.editing) !== null && _table3$meta$editing !== void 0 && _table3$meta$editing.isEditing ? (_table3$meta$editing2 = table3.meta.editing) !== null && _table3$meta$editing2 !== void 0 && _table3$meta$editing2.isDetailedMode ? 'detailed' : 'normal' : undefined,
19020
- enableHorizontalArrowKeyNavigation: table3.meta.editing.isEditing,
19021
- onBlur: handleBlur
19145
+ enableHorizontalArrowKeyNavigation: table3.meta.editing.isEditing
19022
19146
  };
19023
19147
  const hasValidationErrors = table3.meta.editing.hasErrors(table3.instance, table3.ref);
19024
19148
  return /*#__PURE__*/React__default.createElement(Table, null, /*#__PURE__*/React__default.createElement(Table.Toolbar, {