@economic/taco 2.9.2 → 2.10.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 (73) hide show
  1. package/dist/components/Button/Button.d.ts +1 -1
  2. package/dist/components/IconButton/IconButton.d.ts +2 -2
  3. package/dist/components/Provider/Localization.d.ts +6 -0
  4. package/dist/components/Table3/components/columns/header/Header.d.ts +6 -1
  5. package/dist/components/Table3/components/columns/header/Menu.d.ts +4 -0
  6. package/dist/components/Table3/hooks/features/useCurrentRow.d.ts +6 -5
  7. package/dist/components/Table3/hooks/useCssVars.d.ts +2 -1
  8. package/dist/components/Table3/hooks/useTable.d.ts +1 -0
  9. package/dist/components/Table3/types.d.ts +7 -0
  10. package/dist/esm/index.css +92 -16
  11. package/dist/esm/packages/taco/src/components/Button/util.js +5 -1
  12. package/dist/esm/packages/taco/src/components/Button/util.js.map +1 -1
  13. package/dist/esm/packages/taco/src/components/Menu/components/Content.js +1 -1
  14. package/dist/esm/packages/taco/src/components/Menu/components/Content.js.map +1 -1
  15. package/dist/esm/packages/taco/src/components/Provider/Localization.js +7 -1
  16. package/dist/esm/packages/taco/src/components/Provider/Localization.js.map +1 -1
  17. package/dist/esm/packages/taco/src/components/Table3/Table3.js +13 -6
  18. package/dist/esm/packages/taco/src/components/Table3/Table3.js.map +1 -1
  19. package/dist/esm/packages/taco/src/components/Table3/components/columns/cell/Cell.js +3 -2
  20. package/dist/esm/packages/taco/src/components/Table3/components/columns/cell/Cell.js.map +1 -1
  21. package/dist/esm/packages/taco/src/components/Table3/components/columns/cell/DisplayCell.js +5 -3
  22. package/dist/esm/packages/taco/src/components/Table3/components/columns/cell/DisplayCell.js.map +1 -1
  23. package/dist/esm/packages/taco/src/components/Table3/components/columns/cell/EditingCell.js +5 -3
  24. package/dist/esm/packages/taco/src/components/Table3/components/columns/cell/EditingCell.js.map +1 -1
  25. package/dist/esm/packages/taco/src/components/Table3/components/columns/cell/EditingControl.js +0 -1
  26. package/dist/esm/packages/taco/src/components/Table3/components/columns/cell/EditingControl.js.map +1 -1
  27. package/dist/esm/packages/taco/src/components/Table3/components/columns/cell/controls/TextareaControl.js +1 -1
  28. package/dist/esm/packages/taco/src/components/Table3/components/columns/cell/controls/TextareaControl.js.map +1 -1
  29. package/dist/esm/packages/taco/src/components/Table3/components/columns/header/Header.js +30 -6
  30. package/dist/esm/packages/taco/src/components/Table3/components/columns/header/Header.js.map +1 -1
  31. package/dist/esm/packages/taco/src/components/Table3/components/columns/header/Menu.js +36 -10
  32. package/dist/esm/packages/taco/src/components/Table3/components/columns/header/Menu.js.map +1 -1
  33. package/dist/esm/packages/taco/src/components/Table3/components/columns/internal/Actions.js +3 -3
  34. package/dist/esm/packages/taco/src/components/Table3/components/columns/internal/Actions.js.map +1 -1
  35. package/dist/esm/packages/taco/src/components/Table3/components/columns/internal/Drag.js +1 -1
  36. package/dist/esm/packages/taco/src/components/Table3/components/columns/internal/Drag.js.map +1 -1
  37. package/dist/esm/packages/taco/src/components/Table3/components/columns/internal/EditingActions.js +1 -1
  38. package/dist/esm/packages/taco/src/components/Table3/components/columns/internal/EditingActions.js.map +1 -1
  39. package/dist/esm/packages/taco/src/components/Table3/components/columns/internal/Expansion.js +2 -2
  40. package/dist/esm/packages/taco/src/components/Table3/components/columns/internal/Expansion.js.map +1 -1
  41. package/dist/esm/packages/taco/src/components/Table3/components/columns/internal/Selection.js +1 -1
  42. package/dist/esm/packages/taco/src/components/Table3/components/columns/internal/Selection.js.map +1 -1
  43. package/dist/esm/packages/taco/src/components/Table3/components/rows/Row.js +87 -40
  44. package/dist/esm/packages/taco/src/components/Table3/components/rows/Row.js.map +1 -1
  45. package/dist/esm/packages/taco/src/components/Table3/components/toolbar/PrintButton/PrintButton.js +10 -0
  46. package/dist/esm/packages/taco/src/components/Table3/components/toolbar/PrintButton/PrintButton.js.map +1 -1
  47. package/dist/esm/packages/taco/src/components/Table3/hooks/features/useCurrentRow.js +28 -2
  48. package/dist/esm/packages/taco/src/components/Table3/hooks/features/useCurrentRow.js.map +1 -1
  49. package/dist/esm/packages/taco/src/components/Table3/hooks/features/useRowClick.js +1 -1
  50. package/dist/esm/packages/taco/src/components/Table3/hooks/features/useRowClick.js.map +1 -1
  51. package/dist/esm/packages/taco/src/components/Table3/hooks/features/useRowSelection.js +5 -2
  52. package/dist/esm/packages/taco/src/components/Table3/hooks/features/useRowSelection.js.map +1 -1
  53. package/dist/esm/packages/taco/src/components/Table3/hooks/listeners/useCurrentRowListener.js +2 -1
  54. package/dist/esm/packages/taco/src/components/Table3/hooks/listeners/useCurrentRowListener.js.map +1 -1
  55. package/dist/esm/packages/taco/src/components/Table3/hooks/listeners/useEditingStateListener.js +8 -4
  56. package/dist/esm/packages/taco/src/components/Table3/hooks/listeners/useEditingStateListener.js.map +1 -1
  57. package/dist/esm/packages/taco/src/components/Table3/hooks/listeners/useShortcutsListener.js +1 -1
  58. package/dist/esm/packages/taco/src/components/Table3/hooks/listeners/useShortcutsListener.js.map +1 -1
  59. package/dist/esm/packages/taco/src/components/Table3/hooks/useConvertChildrenToColumns.js +2 -1
  60. package/dist/esm/packages/taco/src/components/Table3/hooks/useConvertChildrenToColumns.js.map +1 -1
  61. package/dist/esm/packages/taco/src/components/Table3/hooks/useCssVars.js +15 -2
  62. package/dist/esm/packages/taco/src/components/Table3/hooks/useCssVars.js.map +1 -1
  63. package/dist/esm/packages/taco/src/components/Table3/hooks/useTable.js +1 -0
  64. package/dist/esm/packages/taco/src/components/Table3/hooks/useTable.js.map +1 -1
  65. package/dist/esm/packages/taco/src/components/Table3/types.js.map +1 -1
  66. package/dist/index.css +92 -16
  67. package/dist/taco.cjs.development.js +272 -96
  68. package/dist/taco.cjs.development.js.map +1 -1
  69. package/dist/taco.cjs.production.min.js +1 -1
  70. package/dist/taco.cjs.production.min.js.map +1 -1
  71. package/dist/types.d.ts +1 -1
  72. package/package.json +2 -2
  73. package/types.json +5803 -5242
@@ -4024,10 +4024,14 @@ const getAppearanceClasses = (value, icon = false) => {
4024
4024
  case 'discrete':
4025
4025
  {
4026
4026
  if (icon) {
4027
- return `bg-transparent text-black enabled:hover:bg-grey-200/80 disabled:text-black/30`;
4027
+ return `bg-transparent text-black enabled:hover:bg-[#000]/[0.08] disabled:text-black/30`;
4028
4028
  }
4029
4029
  return `bg-transparent text-blue-500 enabled:hover:text-blue-700 disabled:text-blue-500/50`;
4030
4030
  }
4031
+ case 'transparent':
4032
+ {
4033
+ return `bg-transparent text-black enabled:hover:text-black enabled:hover:bg-[#000]/[0.08] disabled:text-black/30`;
4034
+ }
4031
4035
  default:
4032
4036
  return `wcag-grey-200 enabled:hover:wcag-grey-300 disabled:bg-grey-200/50 disabled:text-black/30`;
4033
4037
  }
@@ -4321,7 +4325,13 @@ const defaultLocalisationTexts = {
4321
4325
  freezeColumns: (count = 1) => count === 1 ? 'Freeze the first column' : `Freeze first ${count} columns`,
4322
4326
  gotoRow: 'Go to',
4323
4327
  hideColumn: 'Hide column',
4324
- unfreezeColumns: 'Unfreeze all columns'
4328
+ unfreezeColumns: 'Unfreeze all columns',
4329
+ sorting: 'Sorting',
4330
+ sortingOrder: {
4331
+ ascending: 'Ascending order',
4332
+ descending: 'Descending order',
4333
+ unsorted: 'No sorting'
4334
+ }
4325
4335
  },
4326
4336
  resize: {
4327
4337
  tooltip: 'Resize column'
@@ -7474,7 +7484,7 @@ const Content$8 = /*#__PURE__*/React.forwardRef(function MenuContent(props, ref)
7474
7484
  return () => {
7475
7485
  shortcuts.forEach(handler => document.removeEventListener('keydown', handler));
7476
7486
  };
7477
- }, []);
7487
+ }, [childrenWithRefs]);
7478
7488
  return /*#__PURE__*/React.createElement(DropdownMenuPrimitive.Portal, null, /*#__PURE__*/React.createElement(DropdownMenuPrimitive.Content, Object.assign({}, otherProps, {
7479
7489
  align: align,
7480
7490
  className: className,
@@ -15933,11 +15943,14 @@ function Menu$3(props) {
15933
15943
  const {
15934
15944
  canFreeze,
15935
15945
  canHide,
15946
+ canSort,
15936
15947
  index,
15937
15948
  menu,
15938
15949
  onGoto: handleGoto,
15939
15950
  onHide: handleHide,
15951
+ onSortToggle: handleSortToggle,
15940
15952
  scrollToIndex,
15953
+ sortDirection,
15941
15954
  table
15942
15955
  } = props;
15943
15956
  const tableMeta = table.options.meta;
@@ -15945,6 +15958,11 @@ function Menu$3(props) {
15945
15958
  texts
15946
15959
  } = useLocalization();
15947
15960
  const [popover, setPopover] = React__default.useState(undefined);
15961
+ const [sortDirectionState, setSortDirectionState] = React__default.useState(sortDirection);
15962
+ const handleSortMenuRadioGroupChange = newSortDirection => {
15963
+ setSortDirectionState(newSortDirection);
15964
+ handleSortToggle(newSortDirection);
15965
+ };
15948
15966
  let popoverElement;
15949
15967
  if (popover) {
15950
15968
  const handleClosePopover = () => setPopover(undefined);
@@ -15982,18 +16000,11 @@ function Menu$3(props) {
15982
16000
  }
15983
16001
  }
15984
16002
  }
15985
- const className = cn('-my-0.5 -mr-1 -ml-0.5 !h-6 !min-h-[theme(spacing.6)] !w-6 !min-w-[theme(spacing.6)] flex-shrink-0 justify-end', {
15986
- '!flex': !!popoverElement
16003
+ const className = cn('-my-0.5 -mr-1 -ml-0.5 !h-6 !min-h-[theme(spacing.6)] flex-shrink-0 justify-end !w-0 !min-w-0 !overflow-hidden', 'aria-expanded:!min-w-[theme(spacing.6)] aria-expanded:!w-6 aria-expanded:!overflow-auto', 'focus:!min-w-[theme(spacing.6)] focus:!w-6 focus:!overflow-auto', 'group-hover/column:!min-w-[theme(spacing.6)] group-hover/column:!w-6 group-hover/column:!overflow-auto', {
16004
+ '!w-6 !min-w-[theme(spacing.6)] !overflow-auto': !!popoverElement
15987
16005
  }, props.className);
15988
16006
  const memoedMenuItems = React__default.useMemo(() => {
15989
16007
  const menuItems = [];
15990
- if (handleGoto) {
15991
- menuItems.push( /*#__PURE__*/React__default.createElement(Menu$1.Item, {
15992
- icon: "move",
15993
- onClick: () => setPopover('goto'),
15994
- shortcut: "g"
15995
- }, texts.table3.columns.menu.gotoRow, "..."));
15996
- }
15997
16008
  if (canHide) {
15998
16009
  // we do this in the next tick, otherwise the menu closes and react throws a "state update on unmounted component" error
15999
16010
  const handleClick = event => setTimeout(() => handleHide(event), 1);
@@ -16002,6 +16013,30 @@ function Menu$3(props) {
16002
16013
  onClick: handleClick
16003
16014
  }, texts.table3.columns.menu.hideColumn));
16004
16015
  }
16016
+ // We rely on canSort value instead of onSort function's value because some columns might have sorting disabled,
16017
+ // so even though onSort is truthy, we don't want to show sorting menu.
16018
+ if (canSort) {
16019
+ menuItems.push( /*#__PURE__*/React__default.createElement(Menu$1.Item, {
16020
+ icon: "sort-by",
16021
+ subMenu: () => /*#__PURE__*/React__default.createElement(Menu$1.SubMenu, null, /*#__PURE__*/React__default.createElement(Menu$1.RadioGroup, {
16022
+ onChange: handleSortMenuRadioGroupChange,
16023
+ value: sortDirectionState
16024
+ }, /*#__PURE__*/React__default.createElement(Menu$1.RadioGroup.Item, {
16025
+ value: SORT_DIRECTION.ASC
16026
+ }, texts.table3.columns.menu.sortingOrder.ascending), /*#__PURE__*/React__default.createElement(Menu$1.RadioGroup.Item, {
16027
+ value: SORT_DIRECTION.DESC
16028
+ }, texts.table3.columns.menu.sortingOrder.descending), /*#__PURE__*/React__default.createElement(Menu$1.RadioGroup.Item, {
16029
+ value: false
16030
+ }, texts.table3.columns.menu.sortingOrder.unsorted)))
16031
+ }, texts.table3.columns.menu.sorting));
16032
+ }
16033
+ if (handleGoto) {
16034
+ menuItems.push( /*#__PURE__*/React__default.createElement(Menu$1.Item, {
16035
+ icon: "move",
16036
+ onClick: () => setPopover('goto'),
16037
+ shortcut: "g"
16038
+ }, texts.table3.columns.menu.gotoRow, "..."));
16039
+ }
16005
16040
  if (canFreeze) {
16006
16041
  const frozenIndex = index - tableMeta.columnFreezing.frozenInternalColumnCount;
16007
16042
  const handleClick = () => tableMeta.columnFreezing.setFrozenColumnIndex(frozenIndex);
@@ -16034,7 +16069,7 @@ function Menu$3(props) {
16034
16069
  return menuItems.map((item, key) => /*#__PURE__*/React__default.cloneElement(item, {
16035
16070
  key
16036
16071
  }));
16037
- }, [menu, index, canFreeze, canHide, handleGoto, tableMeta.columnFreezing.frozenColumnIndex]);
16072
+ }, [menu, index, canFreeze, canHide, canSort, handleGoto, handleSortToggle, sortDirection, tableMeta.columnFreezing.frozenColumnIndex]);
16038
16073
  return /*#__PURE__*/React__default.createElement(IconButton, {
16039
16074
  className: className,
16040
16075
  icon: "more",
@@ -16112,6 +16147,10 @@ function getSortAttributes(toggleSorting, sortDirection) {
16112
16147
  };
16113
16148
  }
16114
16149
 
16150
+ const SORT_DIRECTION = {
16151
+ ASC: 'asc',
16152
+ DESC: 'desc'
16153
+ };
16115
16154
  function Header$2(props) {
16116
16155
  const {
16117
16156
  children,
@@ -16123,11 +16162,19 @@ function Header$2(props) {
16123
16162
  const tableMeta = table.options.meta;
16124
16163
  const columnMeta = React__default.useMemo(() => column.columnDef.meta, []);
16125
16164
  const canSort = column.getCanSort();
16165
+ const hasGoto = isGotoAvailable(table, header);
16126
16166
  // passing header or column results in re-renders on scroll, so anything from those objects as memoed props
16167
+ const handleHide = React__default.useMemo(() => header.column.getToggleVisibilityHandler(), []);
16127
16168
  const handleResize = React__default.useMemo(() => header.getResizeHandler(), []);
16128
16169
  const handleSort = React__default.useMemo(() => header.column.getToggleSortingHandler(), []);
16129
- const handleHide = React__default.useMemo(() => header.column.getToggleVisibilityHandler(), []);
16130
- const hasGoto = isGotoAvailable(table, header);
16170
+ const handleSortToggle = React__default.useCallback(sortDirection => {
16171
+ // When sorting is not applied, sortDirection is false.
16172
+ if (sortDirection === false) {
16173
+ header.column.clearSorting();
16174
+ } else {
16175
+ header.column.toggleSorting(sortDirection === SORT_DIRECTION.DESC);
16176
+ }
16177
+ }, []);
16131
16178
  const sorting = table.getState().sorting;
16132
16179
  const filters = table.getState().columnFilters;
16133
16180
  const search = table.getState().globalFilter;
@@ -16148,6 +16195,7 @@ function Header$2(props) {
16148
16195
  id: header.id,
16149
16196
  index: header.index,
16150
16197
  isFrozen: isFrozenColumn(header, table),
16198
+ isPrinting: tableMeta.isPrinting,
16151
16199
  isResizing: column.getIsResizing(),
16152
16200
  length: table.getRowModel().rows.length,
16153
16201
  meta: columnMeta,
@@ -16155,6 +16203,7 @@ function Header$2(props) {
16155
16203
  onHide: handleHide,
16156
16204
  onResize: handleResize,
16157
16205
  onSort: handleSort,
16206
+ onSortToggle: handleSortToggle,
16158
16207
  scrollToIndex,
16159
16208
  sortDirection: column.getIsSorted(),
16160
16209
  table
@@ -16174,6 +16223,7 @@ const MemoedHeader = /*#__PURE__*/React__default.memo(function MemoedHeader(prop
16174
16223
  id,
16175
16224
  index,
16176
16225
  isFrozen,
16226
+ isPrinting,
16177
16227
  isResizing,
16178
16228
  length,
16179
16229
  meta,
@@ -16181,13 +16231,17 @@ const MemoedHeader = /*#__PURE__*/React__default.memo(function MemoedHeader(prop
16181
16231
  onHide: handleHide,
16182
16232
  onResize: handleResize,
16183
16233
  onSort: handleSort,
16234
+ onSortToggle: handleSortToggle,
16184
16235
  scrollToIndex,
16185
16236
  sortDirection,
16186
16237
  table
16187
16238
  } = props;
16188
- const className = cn('sticky top-0 border-b-2 font-bold h-10 box-content items-center group/column relative', '[[role="table"][data-resizing="true"]_&]:pointer-events-none', {
16239
+ const className = cn('sticky top-0 border-b-2 font-bold box-content group/column relative', '[[role="table"][data-resizing="true"]_&]:pointer-events-none', 'px-[var(--table3-cell-padding-x)]', {
16240
+ 'h-10 items-center': !isPrinting,
16241
+ 'pb-2': isPrinting,
16189
16242
  'cursor-pointer select-none': canSort,
16190
16243
  'hover:bg-grey-100': canSort || canResize || hasMenu,
16244
+ 'focus-within:bg-grey-100': hasMenu,
16191
16245
  '!pointer-events-all !bg-grey-100': isResizing,
16192
16246
  // z-indexes
16193
16247
  'z-10 hover:z-20': !isFrozen && !isResizing,
@@ -16221,13 +16275,16 @@ const MemoedHeader = /*#__PURE__*/React__default.memo(function MemoedHeader(prop
16221
16275
  title: String((_meta$tooltip = meta === null || meta === void 0 ? void 0 : meta.tooltip) !== null && _meta$tooltip !== void 0 ? _meta$tooltip : children),
16222
16276
  placement: "top"
16223
16277
  }, /*#__PURE__*/React__default.createElement("span", {
16224
- className: "truncate"
16278
+ className: cn({
16279
+ truncate: !isPrinting
16280
+ })
16225
16281
  }, children)), canSort ? /*#__PURE__*/React__default.createElement(SortIndicator, {
16226
16282
  direction: sortDirection
16227
16283
  }) : null, hasMenu ? /*#__PURE__*/React__default.createElement(Menu$3, {
16228
16284
  canFreeze: canFreeze,
16229
16285
  canHide: canHide,
16230
- className: cn('hidden group-hover/column:flex aria-expanded:!flex', {
16286
+ canSort: canSort,
16287
+ className: cn({
16231
16288
  'ml-auto': align !== 'right',
16232
16289
  'ml-2': align === 'right'
16233
16290
  }),
@@ -16235,7 +16292,9 @@ const MemoedHeader = /*#__PURE__*/React__default.memo(function MemoedHeader(prop
16235
16292
  menu: meta.menu,
16236
16293
  onGoto: handleGoto,
16237
16294
  onHide: handleHide,
16295
+ onSortToggle: handleSortToggle,
16238
16296
  scrollToIndex: scrollToIndex,
16297
+ sortDirection: sortDirection,
16239
16298
  table: table
16240
16299
  }) : null, canResize ? /*#__PURE__*/React__default.createElement(Resizer, {
16241
16300
  isResizing: isResizing,
@@ -16328,7 +16387,7 @@ const MemoedDisplayCell = /*#__PURE__*/React__default.memo(function MemoedDispla
16328
16387
  index,
16329
16388
  tableRef
16330
16389
  } = props;
16331
- const layoutClassName = cn('py-[var(--table3-row-padding)]', customClassName);
16390
+ const layoutClassName = cn('py-[var(--table3-cell-padding-y)] px-[var(--table3-cell-padding-x)] focus:outline-none', customClassName);
16332
16391
  const className = highlighted ? undefined : layoutClassName;
16333
16392
  const content = enableTruncate ? /*#__PURE__*/React__default.createElement("span", {
16334
16393
  className: "truncate"
@@ -16341,7 +16400,9 @@ const MemoedDisplayCell = /*#__PURE__*/React__default.memo(function MemoedDispla
16341
16400
  "data-align": align,
16342
16401
  "data-column-index": index,
16343
16402
  "data-highlighted": highlighted,
16344
- role: "cell"
16403
+ role: "cell",
16404
+ // cells must be focusable (but not included in tabbing - hence -1)
16405
+ tabIndex: -1
16345
16406
  }, highlighted ? /*#__PURE__*/React__default.createElement(Highlight, {
16346
16407
  className: layoutClassName,
16347
16408
  current: highlightedAsCurrent,
@@ -16359,7 +16420,7 @@ const Highlight = props => {
16359
16420
  ...attributes
16360
16421
  } = props;
16361
16422
  const ref = React__default.useRef(null);
16362
- const className = cn('h-full flex px-4 [justify-content:inherit] [text-align:inherit]', props.className, {
16423
+ const className = cn('h-full flex [justify-content:inherit] [text-align:inherit]', props.className, {
16363
16424
  // normal row
16364
16425
  'bg-blue-200/25': !current,
16365
16426
  // current row
@@ -16472,7 +16533,7 @@ const MemoedCell = /*#__PURE__*/React__default.memo(function MemoedCell(props) {
16472
16533
  var _ref, _button$props$tooltip;
16473
16534
  const tooltip = String((_ref = (_button$props$tooltip = button.props.tooltip) !== null && _button$props$tooltip !== void 0 ? _button$props$tooltip : button.props['aria-label']) !== null && _ref !== void 0 ? _ref : '');
16474
16535
  return /*#__PURE__*/React__default.cloneElement(button, {
16475
- appearance: 'discrete',
16536
+ appearance: 'transparent',
16476
16537
  key: index,
16477
16538
  tabIndex: isCurrentRow ? 0 : -1,
16478
16539
  tooltip: button.props.shortcut ? /*#__PURE__*/React__default.createElement(React__default.Fragment, null, tooltip, /*#__PURE__*/React__default.createElement(Shortcut, {
@@ -16481,7 +16542,7 @@ const MemoedCell = /*#__PURE__*/React__default.memo(function MemoedCell(props) {
16481
16542
  })) : tooltip
16482
16543
  });
16483
16544
  }), actionsInMenu.length ? /*#__PURE__*/React__default.createElement(IconButton, {
16484
- appearance: "discrete",
16545
+ appearance: "transparent",
16485
16546
  "aria-label": texts.table3.columns.actions.tooltip,
16486
16547
  icon: "more",
16487
16548
  tabIndex: isCurrentRow ? 0 : -1,
@@ -16517,7 +16578,7 @@ function createRowActionsColumn$1() {
16517
16578
  footer: Footer$4,
16518
16579
  meta: {
16519
16580
  align: 'right',
16520
- className: cn('!pt-[var(--table3-row-padding)] print:opacity-0 [[role="table"][data-editing="false"]_&]:group-[[data-current="true"]]/row:sticky [[role="table"][data-pause-hover="false"][data-editing="false"]_&]:group-hover/row:sticky right-0 !pl-1 !pr-1', 'shadow-[-6px_0px_6px_var(--table3-row-actions-shadow)]', 'group-[[data-current="true"][data-selected="false"]]/row:text-grey-200', 'group-[[data-selected="true"]]/row:text-blue-100', 'group-[[data-selected="false"]:hover]/row:text-grey-100'),
16581
+ className: cn('!pt-[var(--table3-cell-padding-y)] print:opacity-0 [[role="table"][data-editing="false"]_&]:group-[[data-current="true"]]/row:sticky [[role="table"][data-pause-hover="false"][data-editing="false"]_&]:group-hover/row:sticky right-0 !pl-1 !pr-1', 'shadow-[-6px_0px_6px_var(--table3-row-actions-shadow)]', 'group-[[data-current="true"][data-selected="false"]]/row:text-grey-200', 'group-[[data-selected="true"]]/row:text-blue-100', 'group-[[data-selected="false"]:hover]/row:text-grey-100'),
16521
16582
  enableOrdering: false,
16522
16583
  enableSearch: false,
16523
16584
  enableTruncate: false,
@@ -16652,7 +16713,7 @@ const useCssGrid = (table, isPrintTable = false) => {
16652
16713
  };
16653
16714
  };
16654
16715
 
16655
- function useCurrentRow(defaultCurrentRowIndex = 0) {
16716
+ function useCurrentRow(defaultCurrentRowIndex) {
16656
16717
  const [currentRowIndex, setCurrentRowIndex] = React__default.useState(defaultCurrentRowIndex);
16657
16718
  const move = (direction, length, scrollToIndex) => setCurrentRowIndex(currentIndex => {
16658
16719
  const nextIndex = currentIndex !== undefined ? getNextIndex$2(direction, currentIndex, length) : 0;
@@ -16661,7 +16722,13 @@ function useCurrentRow(defaultCurrentRowIndex = 0) {
16661
16722
  });
16662
16723
  const moveUp = (length, callback) => move(-1, length, callback);
16663
16724
  const moveDown = (length, callback) => move(1, length, callback);
16664
- const onKeyDown = React__default.useCallback((event, length, scrollToIndex) => {
16725
+ const focusFirstElementInCurrentRow = tableRef => {
16726
+ setTimeout(() => {
16727
+ var _tableRef$current, _tableRef$current$que;
16728
+ (_tableRef$current = tableRef.current) === null || _tableRef$current === void 0 ? void 0 : (_tableRef$current$que = _tableRef$current.querySelector('[data-taco="table2-body"] [role="row"] [role="cell"]:first-child')) === null || _tableRef$current$que === void 0 ? void 0 : _tableRef$current$que.focus();
16729
+ }, 1);
16730
+ };
16731
+ const onKeyDown = React__default.useCallback((event, length, scrollToIndex, isEditing, tableRef) => {
16665
16732
  if (event.defaultPrevented) {
16666
16733
  return;
16667
16734
  }
@@ -16674,6 +16741,9 @@ function useCurrentRow(defaultCurrentRowIndex = 0) {
16674
16741
  } else {
16675
16742
  moveUp(length, scrollToIndex);
16676
16743
  }
16744
+ if (!isEditing) {
16745
+ focusFirstElementInCurrentRow(tableRef);
16746
+ }
16677
16747
  return;
16678
16748
  } else if (event.key === 'ArrowDown') {
16679
16749
  event.preventDefault();
@@ -16684,12 +16754,29 @@ function useCurrentRow(defaultCurrentRowIndex = 0) {
16684
16754
  } else {
16685
16755
  moveDown(length, scrollToIndex);
16686
16756
  }
16757
+ if (!isEditing) {
16758
+ focusFirstElementInCurrentRow(tableRef);
16759
+ }
16687
16760
  return;
16688
16761
  }
16689
16762
  }, []);
16763
+ const onFocus = React__default.useCallback((event, length, scrollToIndex) => {
16764
+ if (event.isDefaultPrevented()) {
16765
+ return;
16766
+ }
16767
+ if (currentRowIndex === undefined && length > 0) {
16768
+ // do it in the next tick, otherwise it prevents internal focus from working
16769
+ // meaning you have to tab twice to get to the first focusable element
16770
+ setTimeout(() => {
16771
+ setCurrentRowIndex(0);
16772
+ scrollToIndex(0);
16773
+ }, 1);
16774
+ }
16775
+ }, [currentRowIndex, length]);
16690
16776
  return {
16691
16777
  currentRowIndex,
16692
16778
  setCurrentRowIndex,
16779
+ handleFocus: onFocus,
16693
16780
  handleKeyDown: onKeyDown
16694
16781
  };
16695
16782
  }
@@ -17072,7 +17159,8 @@ function useCurrentRowListener(table) {
17072
17159
  const meta = table.options.meta;
17073
17160
  const rows = table.getRowModel().rows;
17074
17161
  React__default.useEffect(() => {
17075
- if (meta.currentRow.currentRowIndex > rows.length) {
17162
+ const currentRowIndex = meta.currentRow.currentRowIndex;
17163
+ if (currentRowIndex !== undefined && currentRowIndex > rows.length) {
17076
17164
  meta.currentRow.setCurrentRowIndex(0);
17077
17165
  }
17078
17166
  }, [rows.length]);
@@ -17183,9 +17271,12 @@ function useRowSelection() {
17183
17271
  const rows = table.getRowModel().rows;
17184
17272
  const tableMeta = table.options.meta;
17185
17273
  if (event.key === ' ') {
17186
- var _rows$tableMeta$curre;
17187
17274
  event.preventDefault();
17188
- (_rows$tableMeta$curre = rows[tableMeta.currentRow.currentRowIndex]) === null || _rows$tableMeta$curre === void 0 ? void 0 : _rows$tableMeta$curre.toggleSelected();
17275
+ const currentRowIndex = tableMeta.currentRow.currentRowIndex;
17276
+ if (currentRowIndex !== undefined) {
17277
+ var _rows$currentRowIndex;
17278
+ (_rows$currentRowIndex = rows[currentRowIndex]) === null || _rows$currentRowIndex === void 0 ? void 0 : _rows$currentRowIndex.toggleSelected();
17279
+ }
17189
17280
  return;
17190
17281
  } else if ((event.ctrlKey || event.metaKey) && event.key === 'a') {
17191
17282
  event.preventDefault();
@@ -17208,7 +17299,7 @@ function useRowClick(onRowClick) {
17208
17299
  const tableMeta = table.options.meta;
17209
17300
  if (event.key === 'Enter') {
17210
17301
  event.preventDefault();
17211
- if (onRowClick) {
17302
+ if (onRowClick && tableMeta.currentRow.currentRowIndex !== undefined) {
17212
17303
  onRowClick(rows[tableMeta.currentRow.currentRowIndex].original);
17213
17304
  }
17214
17305
  return;
@@ -17462,7 +17553,7 @@ const MemoedCell$1 = /*#__PURE__*/React__default.memo(function MemoedCell(props)
17462
17553
  }
17463
17554
  if (isEditing && isCurrentRow) {
17464
17555
  content = /*#__PURE__*/React__default.createElement(React__default.Fragment, null, content, /*#__PURE__*/React__default.createElement(IconButton, {
17465
- appearance: "discrete",
17556
+ appearance: "transparent",
17466
17557
  "aria-label": texts.table3.editing.actions.tooltip,
17467
17558
  icon: "more",
17468
17559
  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, {
@@ -17780,7 +17871,7 @@ const TextareaControl = /*#__PURE__*/React__default.forwardRef(function Textarea
17780
17871
  resizeTextArea(e.target);
17781
17872
  };
17782
17873
  const textareaContainerClassName = cn('w-full', {
17783
- 'focus-within:absolute focus-within:left-0 focus-within:top-0 focus-within:z-20 focus-within:px-2 focus-within:pt-[var(--table3-row-padding)]': columnMeta === null || columnMeta === void 0 ? void 0 : columnMeta.enableTruncate
17874
+ 'focus-within:absolute focus-within:left-0 focus-within:top-0 focus-within:z-20 focus-within:px-[var(--table3-cell-padding-x)] focus-within:pt-[var(--table3-cell-padding-y)]': columnMeta === null || columnMeta === void 0 ? void 0 : columnMeta.enableTruncate
17784
17875
  });
17785
17876
  const handleTextareaKeyDown = event => {
17786
17877
  // By default Shift + Enter in textarea makes a new line, we want to keep this behaviour
@@ -17948,7 +18039,6 @@ const EditingControl = /*#__PURE__*/React__default.forwardRef(function Control(p
17948
18039
  }));
17949
18040
  } else if (controlRenderer === 'switch') {
17950
18041
  return /*#__PURE__*/React__default.createElement(Switch, Object.assign({}, attributes, {
17951
- className: "mx-2 mt-1.5",
17952
18042
  checked: Boolean(value),
17953
18043
  onChange: handleChange,
17954
18044
  ref: refCallback
@@ -17987,7 +18077,7 @@ function EditingCell$1(props) {
17987
18077
  }));
17988
18078
  }
17989
18079
  const MemoedEditingCell = /*#__PURE__*/React__default.memo(function MemoedEditingCell(props) {
17990
- var _tableMeta$editing$ge, _tableMeta$editing$ro, _rows$tableMeta$curre, _column$columnDef$met;
18080
+ var _tableMeta$editing$ge, _tableMeta$editing$ro, _rows$currentRowIndex, _column$columnDef$met;
17991
18081
  const {
17992
18082
  cell,
17993
18083
  column,
@@ -18039,7 +18129,8 @@ const MemoedEditingCell = /*#__PURE__*/React__default.memo(function MemoedEditin
18039
18129
  // row move indicator
18040
18130
  const moveReason = (_tableMeta$editing$ro = tableMeta.editing.rowMoveReason[cell.column.id]) !== null && _tableMeta$editing$ro !== void 0 ? _tableMeta$editing$ro : null;
18041
18131
  const rows = table.getRowModel().rows;
18042
- const isCurrentRow = ((_rows$tableMeta$curre = rows[tableMeta.currentRow.currentRowIndex]) === null || _rows$tableMeta$curre === void 0 ? void 0 : _rows$tableMeta$curre.id) === row.id;
18132
+ const currentRowIndex = tableMeta.currentRow.currentRowIndex;
18133
+ const isCurrentRow = currentRowIndex !== undefined && ((_rows$currentRowIndex = rows[currentRowIndex]) === null || _rows$currentRowIndex === void 0 ? void 0 : _rows$currentRowIndex.id) === row.id;
18043
18134
  const mountNode = React__default.useMemo(() => {
18044
18135
  if (moveReason) {
18045
18136
  var _cellRef$current2, _cellRef$current2$par;
@@ -18067,7 +18158,7 @@ const MemoedEditingCell = /*#__PURE__*/React__default.memo(function MemoedEditin
18067
18158
  return removeMoveReason;
18068
18159
  }, [value]);
18069
18160
  const controlRenderer = (_column$columnDef$met = column.columnDef.meta) === null || _column$columnDef$met === void 0 ? void 0 : _column$columnDef$met.control;
18070
- const className = cn('!px-[0.4375rem] py-[calc(var(--table3-row-padding)_-_0.06rem)]', {
18161
+ const className = cn('py-[calc(var(--table3-cell-padding-y)_-_0.06rem)]', {
18071
18162
  relative: (isCurrentRow || isHovered) && controlRenderer === 'textarea',
18072
18163
  // Need to set higher z-index, so that the current row textarea (in expanded state, when positioned absolute) overlaps rows below,
18073
18164
  // but at the same time it should not overlap the table headers which has z-10.
@@ -18087,6 +18178,7 @@ const MemoedEditingCell = /*#__PURE__*/React__default.memo(function MemoedEditin
18087
18178
  className: className,
18088
18179
  "data-align": columnMeta.align,
18089
18180
  "data-column-index": index,
18181
+ "data-editable": true,
18090
18182
  role: "cell",
18091
18183
  ref: cellRef
18092
18184
  }, /*#__PURE__*/React__default.createElement(EditingControl, {
@@ -18129,7 +18221,7 @@ function getRowMoveReason(table, rowIndex, rowValues, cell, newValue) {
18129
18221
  }
18130
18222
 
18131
18223
  function Cell$3(props) {
18132
- var _rows$tableMeta$curre;
18224
+ var _rows$currentRowIndex;
18133
18225
  const {
18134
18226
  column,
18135
18227
  row,
@@ -18141,7 +18233,8 @@ function Cell$3(props) {
18141
18233
  const rows = table.getRowModel().rows;
18142
18234
  const tableMeta = table.options.meta;
18143
18235
  const columnMeta = column.columnDef.meta;
18144
- const isCurrentRow = ((_rows$tableMeta$curre = rows[tableMeta.currentRow.currentRowIndex]) === null || _rows$tableMeta$curre === void 0 ? void 0 : _rows$tableMeta$curre.id) === row.id;
18236
+ const currentRowIndex = tableMeta.currentRow.currentRowIndex;
18237
+ const isCurrentRow = currentRowIndex !== undefined && ((_rows$currentRowIndex = rows[currentRowIndex]) === null || _rows$currentRowIndex === void 0 ? void 0 : _rows$currentRowIndex.id) === row.id;
18145
18238
  if (tableMeta.editing.isEditing && columnMeta.control && (isCurrentRow || isHoveredRow && !tableMeta.hoverState.isPaused)) {
18146
18239
  return /*#__PURE__*/React__default.createElement(EditingCell$1, Object.assign({}, props));
18147
18240
  }
@@ -18249,7 +18342,7 @@ function createRowSelectionColumn$1(hasDrag, hasExpansion) {
18249
18342
  footer: Footer$4,
18250
18343
  meta: {
18251
18344
  align: 'center',
18252
- className: cn('!pt-[var(--table3-row-padding)] !justify-end !p-0', {
18345
+ className: cn('!pt-[var(--table3-cell-padding-y)] !justify-end !p-0', {
18253
18346
  '!pr-0.5': hasExpansion,
18254
18347
  '!pr-3': !hasExpansion
18255
18348
  }),
@@ -18283,7 +18376,7 @@ function Header$4(context) {
18283
18376
  return /*#__PURE__*/React__default.createElement(Header$2, Object.assign({}, context), /*#__PURE__*/React__default.createElement(Tooltip, {
18284
18377
  title: title
18285
18378
  }, /*#__PURE__*/React__default.createElement(IconButton, {
18286
- appearance: "discrete",
18379
+ appearance: "transparent",
18287
18380
  icon: isSomeRowsExpanded ? 'chevron-down-double' : 'chevron-right-double',
18288
18381
  onClick: handleClick,
18289
18382
  tabIndex: -1,
@@ -18349,7 +18442,7 @@ function createRowExpansionColumn$1(expandedRowRenderer) {
18349
18442
  footer: Footer$4,
18350
18443
  meta: {
18351
18444
  align: 'center',
18352
- className: '!p-0 !pt-[var(--table3-row-padding)]',
18445
+ className: '!p-0 !pt-[var(--table3-cell-padding-y)]',
18353
18446
  enableOrdering: false,
18354
18447
  enableSearch: false,
18355
18448
  enableTruncate: false,
@@ -18425,7 +18518,7 @@ function createRowDragColumn(onRowDrag) {
18425
18518
  footer: Footer$4,
18426
18519
  meta: {
18427
18520
  align: 'center',
18428
- className: '!p-0 !pt-[var(--table3-row-padding)]',
18521
+ className: '!p-0 !pt-[var(--table3-cell-padding-y)]',
18429
18522
  enableOrdering: false,
18430
18523
  enableSearch: false,
18431
18524
  enableTruncate: false,
@@ -18467,7 +18560,7 @@ function useConvertChildrenToColumns(props, options, editing) {
18467
18560
  React__default.Children.toArray(props.children).filter(child => !!child) // remove falsey children
18468
18561
  .forEach(child => {
18469
18562
  if ( /*#__PURE__*/React__default.isValidElement(child) && child.props.accessor) {
18470
- var _child$props$enableRe, _child$props$enableFi, _child$props$enableSo, _child$props$enableHi, _child$props$enableOr, _child$props$enableSe, _child$props$enableTr;
18563
+ var _child$props$enableRe, _child$props$enableFi, _child$props$enableSo, _child$props$enableHi, _child$props$enableOr, _child$props$enablePr, _child$props$enableSe, _child$props$enableTr;
18471
18564
  if (child.props.defaultWidth) {
18472
18565
  defaultColumnSizing[child.props.accessor] = child.props.defaultWidth === 'grow' ? '1fr' : child.props.defaultWidth;
18473
18566
  }
@@ -18506,6 +18599,7 @@ function useConvertChildrenToColumns(props, options, editing) {
18506
18599
  control: child.props.control,
18507
18600
  dataType: child.props.dataType,
18508
18601
  enableOrdering: (_child$props$enableOr = child.props.enableOrdering) !== null && _child$props$enableOr !== void 0 ? _child$props$enableOr : true,
18602
+ enablePrinting: (_child$props$enablePr = child.props.enablePrinting) !== null && _child$props$enablePr !== void 0 ? _child$props$enablePr : true,
18509
18603
  enableSearch: (_child$props$enableSe = child.props.enableSearch) !== null && _child$props$enableSe !== void 0 ? _child$props$enableSe : true,
18510
18604
  enableTruncate: (_child$props$enableTr = child.props.enableTruncate) !== null && _child$props$enableTr !== void 0 ? _child$props$enableTr : false,
18511
18605
  filters: child.props.filters,
@@ -18560,7 +18654,7 @@ function useShortcutsListener(table, shortcuts) {
18560
18654
  const shortcutKeys = Object.keys(shortcuts !== null && shortcuts !== void 0 ? shortcuts : {});
18561
18655
  const globalHandlers = [];
18562
18656
  // convert the shortcut into the correct format to register it
18563
- if (shortcuts && shortcutKeys.length) {
18657
+ if (shortcuts && shortcutKeys.length && meta.currentRow.currentRowIndex !== undefined) {
18564
18658
  const currentRow = rows[meta.currentRow.currentRowIndex];
18565
18659
  shortcutKeys.forEach(key => {
18566
18660
  const handler = shortcuts[key];
@@ -18628,10 +18722,14 @@ function useEditingStateListener(table) {
18628
18722
  }, [meta.currentRow.currentRowIndex]);
18629
18723
  // save if editing gets toggled off
18630
18724
  React__default.useEffect(() => {
18631
- if (meta.editing.isEnabled && !meta.editing.isEditing) {
18632
- requestAnimationFrame(() => {
18633
- meta.editing.saveChangesIfNeeded();
18634
- });
18725
+ if (meta.editing.isEnabled) {
18726
+ if (!meta.editing.isEditing) {
18727
+ requestAnimationFrame(() => {
18728
+ meta.editing.saveChangesIfNeeded();
18729
+ });
18730
+ } else if (meta.currentRow.currentRowIndex === undefined) {
18731
+ meta.currentRow.setCurrentRowIndex(0);
18732
+ }
18635
18733
  }
18636
18734
  }, [meta.editing.isEditing]);
18637
18735
  }
@@ -18855,6 +18953,7 @@ function useTable$2(props) {
18855
18953
  enableFooter: options.enableFooter,
18856
18954
  fontSize,
18857
18955
  hoverState,
18956
+ isPrinting: props.id.endsWith('_print'),
18858
18957
  isUsingServer: !!props.loadPage,
18859
18958
  printing,
18860
18959
  rowActions: rowActions,
@@ -18882,12 +18981,56 @@ function useTable$2(props) {
18882
18981
  };
18883
18982
  }
18884
18983
 
18984
+ const FOCUS_MANAGER_OPTIONS = {
18985
+ tabbable: true
18986
+ };
18885
18987
  function Row$2(props) {
18988
+ const focusManager = focus.useFocusManager();
18886
18989
  const tableMeta = props.table.options.meta;
18887
18990
  const isCurrentRow = tableMeta.currentRow.currentRowIndex === props.index;
18888
18991
  const isDraggingRow = tableMeta.rowDrag.dragging[props.row.id];
18992
+ const isFirstRow = props.index === 0;
18889
18993
  // we use non-css hovered state to determine whether to render actions or not, for performance
18890
18994
  const [isHovered, setIsHovered] = React__default.useState(false);
18995
+ // tab behaviour is consistent across normal mode and edit mode, handle it here
18996
+ const handleKeyDown = event => {
18997
+ if (event.isDefaultPrevented() || event.isPropagationStopped()) {
18998
+ return;
18999
+ }
19000
+ if (event.key === 'Tab') {
19001
+ tableMeta.hoverState.pause(true);
19002
+ let focusedElement;
19003
+ if (event.shiftKey) {
19004
+ // looping backwards
19005
+ focusedElement = focusManager.focusPrevious(FOCUS_MANAGER_OPTIONS);
19006
+ if (focusedElement) {
19007
+ // override default behaviour, since we're handling focus internally now
19008
+ event.preventDefault();
19009
+ } else {
19010
+ // there are no previous elements to focus, go up a row or go outside the table
19011
+ if (!isFirstRow) {
19012
+ event.preventDefault();
19013
+ tableMeta.currentRow.setCurrentRowIndex(props.index - 1);
19014
+ setTimeout(() => focusManager.focusLast(FOCUS_MANAGER_OPTIONS), 1);
19015
+ }
19016
+ }
19017
+ } else {
19018
+ // looping forwards
19019
+ focusedElement = focusManager.focusNext(FOCUS_MANAGER_OPTIONS);
19020
+ if (focusedElement) {
19021
+ // override default behaviour, since we're handling focus internally now
19022
+ event.preventDefault();
19023
+ } else {
19024
+ // there are no next elements to focus, go down a row or go outside the table
19025
+ if (!props.isLastRow) {
19026
+ event.preventDefault();
19027
+ tableMeta.currentRow.setCurrentRowIndex(props.index + 1);
19028
+ setTimeout(() => focusManager.focusFirst(FOCUS_MANAGER_OPTIONS), 1);
19029
+ }
19030
+ }
19031
+ }
19032
+ }
19033
+ };
18891
19034
  // rows are heavily memoized because performance in our table is critical
18892
19035
  // be careful and selective about props that you pass to the row
18893
19036
  const memoedProps = {
@@ -18898,12 +19041,13 @@ function Row$2(props) {
18898
19041
  draggable: tableMeta.rowDrag.isEnabled,
18899
19042
  index: props.index,
18900
19043
  onClick: tableMeta.rowClick.handleClick,
18901
- onDrop: tableMeta.rowDrop.isEnabled ? tableMeta.rowDrop.handleDrop : undefined
19044
+ onDrop: tableMeta.rowDrop.isEnabled ? tableMeta.rowDrop.handleDrop : undefined,
19045
+ onKeyDown: handleKeyDown
18902
19046
  };
18903
19047
  let output = /*#__PURE__*/React__default.createElement(MemoedRow, Object.assign({}, props, memoedProps));
18904
19048
  if (tableMeta.editing.isEditing && (isCurrentRow || isHovered && !tableMeta.hoverState.isPaused)) {
18905
19049
  output = /*#__PURE__*/React__default.createElement(EditingRow, Object.assign({}, props, memoedProps, {
18906
- isLastRow: props.isLastRow,
19050
+ isFirstRow: isFirstRow,
18907
19051
  setCurrentRowIndex: tableMeta.currentRow.setCurrentRowIndex
18908
19052
  }));
18909
19053
  }
@@ -18943,79 +19087,80 @@ const unhoverPreviousRow = tableRef => {
18943
19087
  };
18944
19088
  function EditingRow(props) {
18945
19089
  const {
19090
+ isFirstRow,
18946
19091
  isLastRow,
19092
+ onKeyDown,
18947
19093
  setCurrentRowIndex,
18948
19094
  virtualiser,
18949
19095
  ...attributes
18950
19096
  } = props;
18951
19097
  const focusManager = focus.useFocusManager();
18952
- const focusManagerOptions = {
18953
- tabbable: true
18954
- };
18955
19098
  const tableMeta = props.table.options.meta;
18956
19099
  const handleClickCapture = event => {
18957
19100
  lastIndex = getColumnIndex(event.target);
18958
19101
  };
18959
19102
  const handleArrowLeftKey = event => {
18960
19103
  let focusedElement;
18961
- if (event.key === 'ArrowLeft' || event.key === 'Tab' && event.shiftKey) {
18962
- // Need to stop propagation because "Tab" will be handled twice(default browser and programmatic one)
18963
- // and will lead to looping focus. Also we still need to perform special behaviour when focus reaches the end of the row,
19104
+ if (event.key === 'ArrowLeft') {
19105
+ // We need to perform special behaviour when focus reaches the end of the row,
18964
19106
  // so we don't need default browser behaviour.
18965
19107
  event.stopPropagation();
18966
19108
  event.preventDefault();
18967
19109
  // "CTRL + ArrowLeft" or "META + ArrowLeft" should focus first focusable element of the row
18968
19110
  if (event.ctrlKey || event.metaKey) {
18969
19111
  event.target.blur();
18970
- focusedElement = focusManager.focusFirst(focusManagerOptions);
19112
+ focusedElement = focusManager.focusFirst(FOCUS_MANAGER_OPTIONS);
18971
19113
  lastIndex = getColumnIndex(focusedElement);
18972
19114
  } else {
18973
- // Should focus previous focusable element, if there is one
18974
- focusedElement = focusManager.focusPrevious(focusManagerOptions);
18975
- // Should move to prevoius row and select last focusable element in that row,
18976
- // if there is no previous focusable element in current row
18977
- if (props.index !== 0 && (!focusedElement || !event.currentTarget.contains(focusedElement))) {
18978
- tableMeta.hoverState.pause(true);
18979
- setCurrentRowIndex(props.index - 1);
18980
- setTimeout(() => {
18981
- focusedElement = focusManager.focusLast(focusManagerOptions);
18982
- // Need to update lastIndex when row got changed and last element got selected.
18983
- lastIndex = getColumnIndex(focusedElement);
18984
- }, 1);
18985
- } else {
19115
+ // looping backwards
19116
+ focusedElement = focusManager.focusPrevious(FOCUS_MANAGER_OPTIONS);
19117
+ if (focusedElement) {
18986
19118
  lastIndex = getColumnIndex(focusedElement);
19119
+ } else {
19120
+ // there are no previous elements to focus, go up a row (if there are rows above)
19121
+ if (!isFirstRow) {
19122
+ event.preventDefault();
19123
+ tableMeta.hoverState.pause(true);
19124
+ tableMeta.currentRow.setCurrentRowIndex(props.index - 1);
19125
+ setTimeout(() => {
19126
+ focusManager.focusLast(FOCUS_MANAGER_OPTIONS);
19127
+ // Need to update lastIndex when row got changed and last element got selected.
19128
+ lastIndex = getColumnIndex(focusedElement);
19129
+ }, 1);
19130
+ }
18987
19131
  }
18988
19132
  }
18989
19133
  }
18990
19134
  };
18991
19135
  const handleArrowRightKey = event => {
18992
19136
  let focusedElement;
18993
- if (event.key === 'ArrowRight' || event.key === 'Tab' && !event.shiftKey) {
18994
- // Need to stop propagation because "Tab" will be handled twice(default browser and programmatic one)
18995
- // and will lead to looping focus. Also we still need to perform special behaviour when focus reaches the end of the row,
19137
+ if (event.key === 'ArrowRight') {
19138
+ // We need to perform special behaviour when focus reaches the end of the row,
18996
19139
  // so we don't need default browser behaviour.
18997
19140
  event.stopPropagation();
18998
19141
  event.preventDefault();
18999
19142
  // "CTRL + ArrowRight" or "META + ArrowRight" should focus last focusable element of the row
19000
19143
  if (event.ctrlKey || event.metaKey) {
19001
19144
  event.target.blur();
19002
- focusedElement = focusManager.focusLast(focusManagerOptions);
19145
+ focusedElement = focusManager.focusLast(FOCUS_MANAGER_OPTIONS);
19003
19146
  lastIndex = getColumnIndex(focusedElement);
19004
19147
  } else {
19005
- // Should focus next focusable element, if there is one
19006
- focusedElement = focusManager.focusNext(focusManagerOptions);
19007
- // Should move to next row and select first focusable element in that row,
19008
- // if there is no next focusable element in current row
19009
- if (!isLastRow && (!focusedElement || !event.currentTarget.contains(focusedElement))) {
19010
- tableMeta.hoverState.pause(true);
19011
- setCurrentRowIndex(props.index + 1);
19012
- setTimeout(() => {
19013
- focusedElement = focusManager.focusFirst(focusManagerOptions);
19014
- // Need to update lastIndex when row got changed and first element got selected.
19015
- lastIndex = getColumnIndex(focusedElement);
19016
- }, 1);
19017
- } else {
19148
+ // looping forwards
19149
+ focusedElement = focusManager.focusNext(FOCUS_MANAGER_OPTIONS);
19150
+ if (focusedElement) {
19018
19151
  lastIndex = getColumnIndex(focusedElement);
19152
+ } else {
19153
+ // there are no next elements to focus, go down a row or go outside the table
19154
+ if (!props.isLastRow) {
19155
+ event.preventDefault();
19156
+ tableMeta.hoverState.pause(true);
19157
+ tableMeta.currentRow.setCurrentRowIndex(props.index + 1);
19158
+ setTimeout(() => {
19159
+ focusManager.focusFirst(FOCUS_MANAGER_OPTIONS);
19160
+ // Need to update lastIndex when row got changed and last element got selected.
19161
+ lastIndex = getColumnIndex(focusedElement);
19162
+ }, 1);
19163
+ }
19019
19164
  }
19020
19165
  }
19021
19166
  }
@@ -19030,6 +19175,7 @@ function EditingRow(props) {
19030
19175
  if (event.isDefaultPrevented() || event.isPropagationStopped() || tableMeta.editing.detailModeEditing) {
19031
19176
  return;
19032
19177
  }
19178
+ onKeyDown(event); // handles tab behaviour
19033
19179
  handleArrowLeftKey(event);
19034
19180
  handleArrowRightKey(event);
19035
19181
  };
@@ -19041,7 +19187,7 @@ function EditingRow(props) {
19041
19187
  const lastIndexCell = (_props$tableRef$curre = props.tableRef.current) === null || _props$tableRef$curre === void 0 ? void 0 : _props$tableRef$curre.querySelector(`[role="row"][data-current="true"] [data-column-index="${lastIndex}"]`);
19042
19188
  lastIndexCell === null || lastIndexCell === void 0 ? void 0 : (_lastIndexCell$queryS = lastIndexCell.querySelector(focusableSelector)) === null || _lastIndexCell$queryS === void 0 ? void 0 : _lastIndexCell$queryS.focus();
19043
19189
  } else {
19044
- focusManager.focusFirst(focusManagerOptions);
19190
+ focusManager.focusFirst(FOCUS_MANAGER_OPTIONS);
19045
19191
  }
19046
19192
  }
19047
19193
  // Need to subscribe to current row index and check is it a current row,
@@ -20333,8 +20479,18 @@ function PrintButton(props) {
20333
20479
  columnFilters: state.columnFilters,
20334
20480
  globalFilter: state.globalFilter
20335
20481
  }), [tableMeta.columnFreezing.frozenColumnIndex, state.columnOrder, state.columnSizing, state.columnVisibility, excludeUnmatchedResults, tableMeta.fontSize.size, tableMeta.rowHeight.height, state.sorting, state.columnFilters, state.globalFilter]);
20482
+ const iframeTableChildren = React__default.useMemo(() => React__default.Children.toArray(tableProps.children).filter(child => {
20483
+ var _child$props;
20484
+ const enableColumnInPrinting = (_child$props = child.props) === null || _child$props === void 0 ? void 0 : _child$props.enablePrinting;
20485
+ // For table children, only include columns doesn't have 'false' value for enablePrinting prop.
20486
+ if ( /*#__PURE__*/React__default.isValidElement(child) && enableColumnInPrinting === false) {
20487
+ return false;
20488
+ }
20489
+ return true;
20490
+ }), [tableProps.children]);
20336
20491
  const iframeTableProps = {
20337
20492
  ...tableProps,
20493
+ children: iframeTableChildren,
20338
20494
  defaultSettings,
20339
20495
  id: printTableId
20340
20496
  };
@@ -20767,7 +20923,7 @@ function Summary$1(props) {
20767
20923
  }
20768
20924
 
20769
20925
  // we cannot just use a fixed height because our rows need to grow in height (images, edit mode validation etc)
20770
- const getRowHeightSizing = (height, fontSize) => {
20926
+ const getCellHeightPadding = (height, fontSize) => {
20771
20927
  // TODO: can we get the rem values from tailwind
20772
20928
  switch (height) {
20773
20929
  case 'short':
@@ -20816,9 +20972,22 @@ const getRowHeightSizing = (height, fontSize) => {
20816
20972
  }
20817
20973
  }
20818
20974
  };
20975
+ const getCellWidthPadding = fontSize => {
20976
+ switch (fontSize) {
20977
+ case 'small':
20978
+ return '8px';
20979
+ case 'medium':
20980
+ return '12px';
20981
+ default:
20982
+ return '16px';
20983
+ // py-1.5
20984
+ }
20985
+ };
20986
+
20819
20987
  const useCssVars = (height, fontSize) => {
20820
20988
  const style = {
20821
- '--table3-row-padding': getRowHeightSizing(height, fontSize)
20989
+ '--table3-cell-padding-x': getCellWidthPadding(fontSize),
20990
+ '--table3-cell-padding-y': getCellHeightPadding(height, fontSize)
20822
20991
  };
20823
20992
  return {
20824
20993
  style
@@ -20991,7 +21160,7 @@ const Table$1 = /*#__PURE__*/fixedForwardRef(function Table3(props, ref) {
20991
21160
  return;
20992
21161
  }
20993
21162
  tableMeta.hoverState.handleKeyDown(event);
20994
- tableMeta.currentRow.handleKeyDown(event, table.getRowModel().rows.length, scrollToIndex);
21163
+ tableMeta.currentRow.handleKeyDown(event, table.getRowModel().rows.length, scrollToIndex, tableMeta.editing.isEditing, internalRef);
20995
21164
  tableMeta.rowClick.handleKeyDown(event, table);
20996
21165
  tableMeta.rowSelection.handleKeyDown(event, table);
20997
21166
  tableMeta.editing.handleKeyDown(event);
@@ -21004,10 +21173,13 @@ const Table$1 = /*#__PURE__*/fixedForwardRef(function Table3(props, ref) {
21004
21173
  // See https://github.com/e-conomic/taco/blob/dev/packages/taco/src/components/Table3/strategies/virtualised.tsx#L143
21005
21174
  // scrollToIndex function changes when row count changes, so it is important to update handlers with new
21006
21175
  // scrollToIndex function.
21007
- [scrollToIndex, internalRef.current]);
21176
+ [scrollToIndex, tableMeta.editing.isEditing, internalRef.current]);
21008
21177
  const handleBlur = event => {
21009
21178
  tableMeta.editing.handleBlur(event);
21010
21179
  };
21180
+ const handleFocus = event => {
21181
+ tableMeta.currentRow.handleFocus(event, table.getRowModel().rows.length, scrollToIndex);
21182
+ };
21011
21183
  const handleScroll = function (event) {
21012
21184
  try {
21013
21185
  tableMeta.columnFreezing.handleScroll(event);
@@ -21016,7 +21188,7 @@ const Table$1 = /*#__PURE__*/fixedForwardRef(function Table3(props, ref) {
21016
21188
  return Promise.reject(e);
21017
21189
  }
21018
21190
  };
21019
- const className = cn('border-grey-300 relative grid h-full w-full flex-grow overflow-auto rounded border bg-white scroll-mt-[41px]', '[&[data-resizing="true"]]:select-none', {
21191
+ const className = cn('border-grey-300 relative grid h-full w-full flex-grow overflow-auto rounded border bg-white scroll-mt-[41px] focus-visible:outline-none', '[&[data-resizing="true"]]:select-none', {
21020
21192
  'text-xs': tableMeta.fontSize.size === 'small',
21021
21193
  'text-sm': tableMeta.fontSize.size === 'medium',
21022
21194
  'text-base': tableMeta.fontSize.size === 'large'
@@ -21025,7 +21197,7 @@ const Table$1 = /*#__PURE__*/fixedForwardRef(function Table3(props, ref) {
21025
21197
  // if the table is a print table or not.
21026
21198
  const {
21027
21199
  style: cssGridStyle
21028
- } = useCssGrid(table, props.id.endsWith('_print'));
21200
+ } = useCssGrid(table, tableMeta.isPrinting);
21029
21201
  const {
21030
21202
  style: cssVars
21031
21203
  } = useCssVars(tableMeta.rowHeight.height, tableMeta.fontSize.size);
@@ -21057,10 +21229,12 @@ const Table$1 = /*#__PURE__*/fixedForwardRef(function Table3(props, ref) {
21057
21229
  "data-resizing": !!state.columnSizingInfo.isResizingColumn,
21058
21230
  "data-taco": "table2",
21059
21231
  onBlur: handleBlur,
21232
+ onFocus: handleFocus,
21060
21233
  onScroll: handleScroll,
21061
21234
  ref: internalRef,
21062
21235
  role: "table",
21063
- style: style
21236
+ style: style,
21237
+ tabIndex: -1
21064
21238
  }, isServerLoadingAndNotReady ? null : /*#__PURE__*/React__default.createElement("div", {
21065
21239
  className: "group/header contents",
21066
21240
  "data-taco": "table2-header",
@@ -21074,7 +21248,9 @@ const Table$1 = /*#__PURE__*/fixedForwardRef(function Table3(props, ref) {
21074
21248
  }, reactTable$1.flexRender(header.column.columnDef.header, {
21075
21249
  ...header.getContext(),
21076
21250
  scrollToIndex
21077
- })))))), table.getRowModel().rows.length ? /*#__PURE__*/React__default.createElement(React__default.Fragment, null, /*#__PURE__*/React__default.createElement(focus.FocusScope, null, /*#__PURE__*/React__default.createElement("div", {
21251
+ })))))), table.getRowModel().rows.length ? /*#__PURE__*/React__default.createElement(React__default.Fragment, null, /*#__PURE__*/React__default.createElement(focus.FocusScope, {
21252
+ autoFocus: tableMeta.editing.isEditing
21253
+ }, /*#__PURE__*/React__default.createElement("div", {
21078
21254
  className: "group/body contents",
21079
21255
  "data-taco": "table2-body",
21080
21256
  role: "rowgroup",