@economic/taco 2.6.0 → 2.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (47) hide show
  1. package/dist/components/Icon/components/AttachWarning.d.ts +3 -0
  2. package/dist/components/Icon/components/index.d.ts +1 -1
  3. package/dist/components/Input/Input.d.ts +1 -1
  4. package/dist/components/Menu/components/Item.d.ts +1 -1
  5. package/dist/components/Menu/components/Link.d.ts +1 -1
  6. package/dist/components/Navigation2/components/Link.d.ts +1 -1
  7. package/dist/components/Select2/components/Option.d.ts +1 -1
  8. package/dist/components/Select2/components/Search.d.ts +1 -1
  9. package/dist/components/Select2/components/Trigger.d.ts +1 -1
  10. package/dist/components/Table3/components/columns/cell/EditingCell.d.ts +5 -2
  11. package/dist/components/Table3/components/columns/cell/EditingControl.d.ts +21 -0
  12. package/dist/components/Table3/components/columns/cell/controls/TextAreaControl.d.ts +2 -0
  13. package/dist/components/Tag/Tag.d.ts +1 -1
  14. package/dist/esm/index.css +85 -22
  15. package/dist/esm/packages/taco/src/components/Icon/components/AttachWarning.js +19 -0
  16. package/dist/esm/packages/taco/src/components/Icon/components/AttachWarning.js.map +1 -0
  17. package/dist/esm/packages/taco/src/components/Icon/components/index.js +2 -0
  18. package/dist/esm/packages/taco/src/components/Icon/components/index.js.map +1 -1
  19. package/dist/esm/packages/taco/src/components/Select2/components/Trigger.js +1 -1
  20. package/dist/esm/packages/taco/src/components/Select2/components/Trigger.js.map +1 -1
  21. package/dist/esm/packages/taco/src/components/Table3/Table3.js +10 -3
  22. package/dist/esm/packages/taco/src/components/Table3/Table3.js.map +1 -1
  23. package/dist/esm/packages/taco/src/components/Table3/components/columns/cell/EditingCell.js +27 -145
  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 +158 -0
  26. package/dist/esm/packages/taco/src/components/Table3/components/columns/cell/EditingControl.js.map +1 -0
  27. package/dist/esm/packages/taco/src/components/Table3/components/columns/cell/controls/TextAreaControl.js +102 -0
  28. package/dist/esm/packages/taco/src/components/Table3/components/columns/cell/controls/TextAreaControl.js.map +1 -0
  29. package/dist/esm/packages/taco/src/components/Table3/components/columns/footer/Footer.js +1 -1
  30. package/dist/esm/packages/taco/src/components/Table3/components/columns/footer/Footer.js.map +1 -1
  31. package/dist/esm/packages/taco/src/components/Table3/components/columns/internal/Actions.js +2 -2
  32. package/dist/esm/packages/taco/src/components/Table3/components/columns/internal/Actions.js.map +1 -1
  33. package/dist/esm/packages/taco/src/components/Table3/components/columns/internal/Selection.js +1 -1
  34. package/dist/esm/packages/taco/src/components/Table3/components/columns/internal/Selection.js.map +1 -1
  35. package/dist/esm/packages/taco/src/components/Table3/components/toolbar/PrintButton/PrintIFrame.js +1 -1
  36. package/dist/esm/packages/taco/src/components/Table3/hooks/useConvertChildrenToColumns.js +1 -1
  37. package/dist/esm/packages/taco/src/components/Table3/hooks/useConvertChildrenToColumns.js.map +1 -1
  38. package/dist/esm/packages/taco/src/index.js +1 -1
  39. package/dist/index.css +85 -22
  40. package/dist/primitives/Listbox2/components/Root.d.ts +1 -1
  41. package/dist/primitives/Listbox2/types.d.ts +1 -1
  42. package/dist/taco.cjs.development.js +310 -163
  43. package/dist/taco.cjs.development.js.map +1 -1
  44. package/dist/taco.cjs.production.min.js +1 -1
  45. package/dist/taco.cjs.production.min.js.map +1 -1
  46. package/package.json +2 -2
  47. package/types.json +14876 -12163
@@ -318,6 +318,21 @@ function IconAttachCancel(props, svgRef) {
318
318
  }
319
319
  var AttachCancel = /*#__PURE__*/React.forwardRef(IconAttachCancel);
320
320
 
321
+ function IconAttachWarning(props, svgRef) {
322
+ return /*#__PURE__*/React.createElement("svg", Object.assign({
323
+ fill: "none",
324
+ xmlns: "http://www.w3.org/2000/svg",
325
+ viewBox: "0 0 24 24",
326
+ ref: svgRef
327
+ }, props), /*#__PURE__*/React.createElement("path", {
328
+ fillRule: "evenodd",
329
+ clipRule: "evenodd",
330
+ d: "M12.38 3.688a3.75 3.75 0 015.44 5.16l-.137.144-9.132 9.131a2.25 2.25 0 01-3.287-3.069l.105-.113 6.657-6.656a.75.75 0 011.128.983l-.068.077-6.656 6.657a.75.75 0 00.984 1.128l.076-.067 9.132-9.132a2.25 2.25 0 00-3.07-3.287l-.112.105-9.132 9.132a3.75 3.75 0 005.16 5.44l.144-.137 1.934-1.935a6.062 6.062 0 00.09 2.031l-.964.965a5.25 5.25 0 01-7.574-7.269l.15-.156 9.131-9.132zM22 18a4.5 4.5 0 10-9 0 4.5 4.5 0 009 0zm-5.243-2.852a.75.75 0 011.493.102v3.5l-.007.102a.75.75 0 01-1.493-.102v-3.5l.007-.102zM17.5 20a.75.75 0 100 1.5.75.75 0 000-1.5z",
331
+ fill: "currentColor"
332
+ }));
333
+ }
334
+ var AttachWarning = /*#__PURE__*/React.forwardRef(IconAttachWarning);
335
+
321
336
  function IconAttach(props, svgRef) {
322
337
  return /*#__PURE__*/React.createElement("svg", Object.assign({
323
338
  xmlns: "http://www.w3.org/2000/svg",
@@ -3201,6 +3216,7 @@ const icons = {
3201
3216
  'arrow-up': ArrowUp,
3202
3217
  'attach-auto': AttachAuto,
3203
3218
  'attach-cancel': AttachCancel,
3219
+ 'attach-warning': AttachWarning,
3204
3220
  attach: Attach,
3205
3221
  'autotext-insert': AutotextInsert,
3206
3222
  autotext: Autotext,
@@ -9953,7 +9969,7 @@ const Multiple = /*#__PURE__*/React__default.forwardRef(function Select2TriggerM
9953
9969
  }, /*#__PURE__*/React__default.createElement("div", {
9954
9970
  className: "flex flex-wrap gap-1"
9955
9971
  }, valuesAsChildren.map(child => /*#__PURE__*/React__default.createElement(Tag$1, {
9956
- key: child.props.value,
9972
+ key: String(child.props.value),
9957
9973
  className: "truncate",
9958
9974
  color: tags ? child.props.color : undefined,
9959
9975
  disabled: disabled,
@@ -16294,7 +16310,7 @@ const MemoedFooter = /*#__PURE__*/React__default.memo(function MemoedFooter(prop
16294
16310
  className: className,
16295
16311
  "data-align": align,
16296
16312
  "data-column-index": index,
16297
- role: "cell"
16313
+ role: "columnheader"
16298
16314
  }, typeof meta.footer === 'function' ? /*#__PURE__*/React__default.createElement("span", {
16299
16315
  className: "flex-grow truncate"
16300
16316
  }, meta.footer(table.getRowModel().rows.map(row => row.original[id]))) : null);
@@ -16340,7 +16356,7 @@ const MemoedCell = /*#__PURE__*/React__default.memo(function MemoedCell(props) {
16340
16356
  const actionsOnRow = visibleActions.length === actionsLength ? visibleActions : visibleActions.slice(0, actionsLength - 1);
16341
16357
  const actionsInMenu = visibleActions.slice(visibleActions.length === actionsLength ? actionsLength : actionsLength - 1);
16342
16358
  content = /*#__PURE__*/React__default.createElement("span", {
16343
- className: "-mb-2 -mt-2 flex justify-end pl-2 text-right",
16359
+ className: "-mb-2 -mt-1.5 flex justify-end pl-2 text-right",
16344
16360
  ref: ref
16345
16361
  }, actionsOnRow.map((button, index) => {
16346
16362
  var _ref, _button$props$tooltip;
@@ -16390,7 +16406,7 @@ function createRowActionsColumn$1() {
16390
16406
  footer: Footer$4,
16391
16407
  meta: {
16392
16408
  align: 'right',
16393
- 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', '[[role="table"][data-editing="false"]_&]:group-[[data-current="true"]]/row:shadow-[-6px_0px_6px_theme(colors.grey.200)] [[role="table"][data-pause-hover="false"][data-editing="false"]_&]:group-hover/row:shadow-[-6px_0px_6px_theme(colors.grey.100)]', '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'),
16409
+ 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'),
16394
16410
  enableOrdering: false,
16395
16411
  enableSearch: false,
16396
16412
  enableTruncate: false,
@@ -17529,121 +17545,133 @@ const willRowMoveAfterSorting$1 = (value, cell, rowIndex, rows, desc) => {
17529
17545
  return ((_resortedRows$index = resortedRows[index]) === null || _resortedRows$index === void 0 ? void 0 : _resortedRows$index.id) !== cell.row.id;
17530
17546
  };
17531
17547
 
17532
- function EditingCell$1(props) {
17533
- return /*#__PURE__*/React__default.createElement(MemoedEditingCell, Object.assign({}, props));
17534
- }
17535
- const MemoedEditingCell = /*#__PURE__*/React__default.memo(function MemoedEditingCell(props) {
17536
- var _tableMeta$editing$ge, _tableMeta$editing$ro, _rows$tableMeta$curre;
17548
+ const Textarea = /*#__PURE__*/React.forwardRef(function Textarea(props, ref) {
17537
17549
  const {
17538
- cell,
17550
+ defaultValue: _,
17551
+ highlighted,
17552
+ invalid,
17553
+ onKeyDown,
17554
+ ...otherProps
17555
+ } = props;
17556
+ const classNames = cn(getInputClasses(props), 'py-1 min-h-[75px] disabled:resize-none', props.className);
17557
+ // home and end keys only navigate to the start/end of textarea value if the textarea container does not scroll
17558
+ // if it has scroll height then the browser reverts to native scrolling behaviour only
17559
+ // so we manually override it to ensure _our_ desired behaviour remains intact
17560
+ const handleKeyDown = event => {
17561
+ if (event.key === 'Home' || event.key === 'End') {
17562
+ event.preventDefault();
17563
+ const position = event.key === 'End' ? event.currentTarget.value.length : 0;
17564
+ event.currentTarget.setSelectionRange(position, position);
17565
+ event.currentTarget.scrollTop = event.key === 'End' ? event.currentTarget.scrollHeight : 0;
17566
+ }
17567
+ if (onKeyDown) {
17568
+ onKeyDown(event);
17569
+ }
17570
+ };
17571
+ return /*#__PURE__*/React.createElement("textarea", Object.assign({}, otherProps, {
17572
+ className: classNames,
17573
+ "data-taco": "textarea",
17574
+ onKeyDown: handleKeyDown,
17575
+ ref: ref
17576
+ }));
17577
+ });
17578
+
17579
+ const TextAreaControl = /*#__PURE__*/React__default.forwardRef(function TextAreaControl(props, externalRef) {
17580
+ const {
17581
+ onKeyDown: handleKeyDown,
17582
+ onChange: handleChange,
17539
17583
  column,
17540
- index,
17541
- getValue,
17542
- table,
17543
- tableRef,
17544
- row
17584
+ isCellInDetailMode,
17585
+ align,
17586
+ isCurrentRow,
17587
+ value,
17588
+ ...attributes
17545
17589
  } = props;
17546
- const tableMeta = table.options.meta;
17590
+ const textareaMaxHeight = 120;
17591
+ const textareaMinHeight = 32;
17547
17592
  const columnMeta = column.columnDef.meta;
17548
- const cellRef = React__default.useRef(null);
17549
- const controlRef = React__default.useRef(null);
17550
- const handleChange = value => tableMeta.editing.setCellValue(cell, value);
17551
- const value = (_tableMeta$editing$ge = tableMeta.editing.getCellValue(cell)) !== null && _tableMeta$editing$ge !== void 0 ? _tableMeta$editing$ge : getValue();
17552
- const handleFocus = event => {
17553
- var _event$target;
17554
- // Check if cell is hidden behind pinned columns or edititng actions, and scroll to it.
17555
- const frozenColumnIndex = tableMeta.columnFreezing.frozenColumnIndex;
17556
- const tableElement = tableRef.current;
17557
- if (tableElement && frozenColumnIndex !== undefined && index > frozenColumnIndex) {
17558
- var _cellRef$current;
17559
- const lastFrozenColumnElement = getCurrentRowCellElement(frozenColumnIndex, tableElement);
17560
- const cellRect = (_cellRef$current = cellRef.current) === null || _cellRef$current === void 0 ? void 0 : _cellRef$current.getBoundingClientRect();
17561
- const lastFrozenRect = lastFrozenColumnElement === null || lastFrozenColumnElement === void 0 ? void 0 : lastFrozenColumnElement.getBoundingClientRect();
17562
- const tableRect = tableElement.getBoundingClientRect();
17563
- // Check for pinned columns overlap
17564
- if (cellRect && lastFrozenRect && cellRect.left < lastFrozenRect.left + lastFrozenRect.width) {
17565
- const pinnedColumnsWidth = lastFrozenRect.left + lastFrozenRect.width;
17566
- tableElement.scrollTo(cellRect.left - pinnedColumnsWidth, tableElement.scrollTop);
17567
- // Check for editing actions overlap
17568
- } else if (cellRect && tableRect && cellRect.right > tableRect.right - EDITING_ACTIONS_WIDTH) {
17569
- const spaceBetweenCellAndEditingActions = 10;
17570
- tableElement.scrollTo(
17571
- // Need to take into account if table has been already scrolled.
17572
- tableElement.scrollLeft + EDITING_ACTIONS_WIDTH + spaceBetweenCellAndEditingActions, tableElement.scrollTop);
17593
+ const ref = useMergedRef(externalRef);
17594
+ React__default.useEffect(() => {
17595
+ // If truncation is not enabled, then textarea should re-calculate it's height to fit with it's own content, when initialized.
17596
+ if (ref !== null && ref !== void 0 && ref.current && !(columnMeta !== null && columnMeta !== void 0 && columnMeta.enableTruncate)) {
17597
+ const textareaElement = ref === null || ref === void 0 ? void 0 : ref.current;
17598
+ resizeTextArea(textareaElement);
17599
+ }
17600
+ }, []);
17601
+ React__default.useEffect(() => {
17602
+ // If truncation is enabled, then textarea should only adjust to it's own content, when in detail mode.
17603
+ // Otherwise it should collapse to minimal height.
17604
+ if (ref !== null && ref !== void 0 && ref.current && columnMeta !== null && columnMeta !== void 0 && columnMeta.enableTruncate) {
17605
+ const textareaElement = ref === null || ref === void 0 ? void 0 : ref.current;
17606
+ if (isCellInDetailMode) {
17607
+ resizeTextArea(textareaElement);
17608
+ } else {
17609
+ textareaElement.style.height = `${textareaMinHeight}px`;
17573
17610
  }
17574
17611
  }
17575
- if ((_event$target = event.target) !== null && _event$target !== void 0 && _event$target.select) {
17576
- requestAnimationFrame(() => {
17577
- event.target.select();
17578
- });
17612
+ }, [isCellInDetailMode]);
17613
+ const resizeTextArea = textareaElement => {
17614
+ // Need to set inherit before calculating height, so that browser sets the scrollHeight properly,
17615
+ // depending on text inside.
17616
+ const textareaRect = textareaElement.getBoundingClientRect();
17617
+ const prevHeight = textareaRect.height;
17618
+ if (columnMeta !== null && columnMeta !== void 0 && columnMeta.enableTruncate) {
17619
+ if (prevHeight < textareaMaxHeight) {
17620
+ textareaElement.style.height = 'inherit';
17621
+ textareaElement.style.height = `${Math.min(textareaElement.scrollHeight, textareaMaxHeight)}px`;
17622
+ }
17623
+ } else {
17624
+ textareaElement.style.height = 'inherit';
17625
+ textareaElement.style.height = `${textareaElement.scrollHeight}px`;
17579
17626
  }
17580
17627
  };
17581
- const handleBlur = () => {
17582
- tableMeta.editing.setDetailModeEditing(false);
17583
- };
17584
- // row move indicator
17585
- const moveReason = (_tableMeta$editing$ro = tableMeta.editing.rowMoveReason[cell.column.id]) !== null && _tableMeta$editing$ro !== void 0 ? _tableMeta$editing$ro : null;
17586
- const rows = table.getRowModel().rows;
17587
- const isCurrentRow = ((_rows$tableMeta$curre = rows[tableMeta.currentRow.currentRowIndex]) === null || _rows$tableMeta$curre === void 0 ? void 0 : _rows$tableMeta$curre.id) === row.id;
17588
- const mountNode = React__default.useMemo(() => {
17589
- if (moveReason) {
17590
- var _cellRef$current2, _cellRef$current2$par;
17591
- return (_cellRef$current2 = cellRef.current) === null || _cellRef$current2 === void 0 ? void 0 : (_cellRef$current2$par = _cellRef$current2.parentElement) === null || _cellRef$current2$par === void 0 ? void 0 : _cellRef$current2$par.firstChild;
17592
- }
17593
- return null;
17594
- }, [moveReason, cellRef]);
17595
- const removeMoveReason = () => {
17596
- tableMeta.editing.removeRowMoveReason(cell.column.id);
17628
+ const handleTextareaChange = e => {
17629
+ resizeTextArea(e.target);
17597
17630
  };
17598
- React__default.useEffect(() => {
17599
- // To avoid reseting move reason on another row hover,
17600
- // we need to check for changes only if value got changed in the current row.
17601
- if (!isCurrentRow) {
17631
+ const textareaContainerClassName = cn('w-full', {
17632
+ '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
17633
+ });
17634
+ const handleTextareaKeyDown = event => {
17635
+ // By default Shift + Enter in textarea makes a new line, we want to keep this behaviour
17636
+ if (event.shiftKey && event.key === 'Enter') {
17602
17637
  return;
17603
- }
17604
- if (hasChanged$1(getValue(), value)) {
17605
- const moveReason = getRowMoveReason(table, row.index, row.original, cell, value);
17606
- tableMeta.editing.setRowMoveReason({
17607
- [cell.column.id]: moveReason
17608
- });
17609
17638
  } else {
17610
- removeMoveReason();
17639
+ handleKeyDown(event);
17611
17640
  }
17612
- return removeMoveReason;
17613
- }, [value]);
17614
- const className = cn('!px-2 py-[var(--table3-row-padding)]',
17615
- // component overrides - grayscale for editing hover
17616
- '[[role="row"][data-current="false"]:hover_&>*]:!grayscale [[role="row"][data-current="false"]:hover_&_.bg-white]:!bg-grey-100',
17617
- // we alias to any because className conflicts with the Table2 definition,
17618
- // when Table2 is gone, remove this as any
17619
- typeof columnMeta.className === 'function' ? columnMeta.className(row.original) : columnMeta.className);
17620
- return /*#__PURE__*/React__default.createElement(React__default.Fragment, null, moveReason !== null && mountNode && /*#__PURE__*/React__default.createElement(Indicator$1, {
17621
- reason: moveReason,
17622
- columnName: String(cell.column.columnDef.header),
17623
- mountNode: mountNode,
17624
- validationErrors: []
17625
- }), /*#__PURE__*/React__default.createElement("div", {
17626
- className: className,
17627
- "data-column-index": index,
17628
- role: "cell",
17629
- ref: cellRef
17630
- }, /*#__PURE__*/React__default.createElement(Control, {
17631
- align: columnMeta.align,
17632
- column: cell.column,
17633
- data: cell.row.original,
17634
- initialValue: getValue(),
17635
- onBlur: handleBlur,
17636
- onFocus: handleFocus,
17637
- onChange: handleChange,
17638
- ref: controlRef,
17639
- table: table,
17640
- tableRef: tableRef,
17641
- value: value,
17642
- cell: cell
17641
+ };
17642
+ return /*#__PURE__*/React__default.createElement("div", {
17643
+ className: textareaContainerClassName,
17644
+ "data-taco": "input-container"
17645
+ }, /*#__PURE__*/React__default.createElement(Textarea, Object.assign({}, attributes, {
17646
+ onChange: event => {
17647
+ handleChange(event.target.value);
17648
+ handleTextareaChange(event);
17649
+ },
17650
+ rows: 1,
17651
+ onKeyDown: e => {
17652
+ handleTextareaKeyDown(e);
17653
+ },
17654
+ onBlur: event => {
17655
+ // If truncation is enabled, then textarea should shring back to min height, when loosing focus.
17656
+ if (columnMeta !== null && columnMeta !== void 0 && columnMeta.enableTruncate) {
17657
+ const textareaElement = event.currentTarget;
17658
+ textareaElement.style.height = `${textareaMinHeight}px`;
17659
+ }
17660
+ },
17661
+ className: cn(getCellAlignmentClasses$1(align), `z-20 h-fit resize-none`, {
17662
+ [`!min-h-[${textareaMinHeight}px]`]: columnMeta === null || columnMeta === void 0 ? void 0 : columnMeta.enableTruncate,
17663
+ '!yt-focus-dark': isCellInDetailMode,
17664
+ [`h-[${textareaMinHeight}px]`]: !isCellInDetailMode && (columnMeta === null || columnMeta === void 0 ? void 0 : columnMeta.enableTruncate),
17665
+ // Only allow resizing when focused and truncation enabled
17666
+ 'focus:resize-y': isCurrentRow && (columnMeta === null || columnMeta === void 0 ? void 0 : columnMeta.enableTruncate)
17667
+ }),
17668
+ ref: ref,
17669
+ value: String(value !== null && value !== void 0 ? value : '')
17643
17670
  })));
17644
17671
  });
17645
- const Control = /*#__PURE__*/React__default.forwardRef(function Control(props, ref) {
17646
- var _column$columnDef$met, _ref$current;
17672
+
17673
+ const EditingControl = /*#__PURE__*/React__default.forwardRef(function Control(props, externalRef) {
17674
+ var _ref$current;
17647
17675
  const {
17648
17676
  align,
17649
17677
  column,
@@ -17654,11 +17682,16 @@ const Control = /*#__PURE__*/React__default.forwardRef(function Control(props, r
17654
17682
  tableRef,
17655
17683
  value,
17656
17684
  cell,
17685
+ isCurrentRow,
17657
17686
  ...attributes
17658
17687
  } = props;
17659
17688
  const tableMeta = table.options.meta;
17660
- const controlRenderer = (_column$columnDef$met = column.columnDef.meta) === null || _column$columnDef$met === void 0 ? void 0 : _column$columnDef$met.control;
17689
+ const ref = React__default.useRef();
17690
+ const refCallback = mergeRefs([ref, externalRef]);
17691
+ const columnMeta = column.columnDef.meta;
17692
+ const controlRenderer = columnMeta === null || columnMeta === void 0 ? void 0 : columnMeta.control;
17661
17693
  const isCellInDetailMode = tableMeta.editing.detailModeEditing && (ref === null || ref === void 0 ? void 0 : (_ref$current = ref.current) === null || _ref$current === void 0 ? void 0 : _ref$current.contains(document.activeElement));
17694
+ // Revert to initial value if escape was pressed
17662
17695
  const handleKeyDown = event => {
17663
17696
  const target = event.target;
17664
17697
  if (target.readOnly) {
@@ -17666,12 +17699,10 @@ const Control = /*#__PURE__*/React__default.forwardRef(function Control(props, r
17666
17699
  }
17667
17700
  // prevent row arrow shortcuts triggering when in detail mode
17668
17701
  if (tableMeta.editing.detailModeEditing && (event.key === 'ArrowUp' || event.key === 'ArrowDown')) {
17669
- event.preventDefault();
17670
17702
  event.stopPropagation();
17671
17703
  }
17672
17704
  if (event.key === 'Escape') {
17673
17705
  event.preventDefault();
17674
- // Revert to initial value if escape was pressed in detail mode.
17675
17706
  if (tableMeta.editing.detailModeEditing) {
17676
17707
  tableMeta.editing.setDetailModeEditing(false);
17677
17708
  if (value !== initialValue) {
@@ -17689,7 +17720,9 @@ const Control = /*#__PURE__*/React__default.forwardRef(function Control(props, r
17689
17720
  }
17690
17721
  }
17691
17722
  } else {
17723
+ var _tableRef$current;
17692
17724
  tableMeta.editing.toggleEditing(false);
17725
+ (_tableRef$current = tableRef.current) === null || _tableRef$current === void 0 ? void 0 : _tableRef$current.focus();
17693
17726
  }
17694
17727
  return;
17695
17728
  }
@@ -17707,6 +17740,15 @@ const Control = /*#__PURE__*/React__default.forwardRef(function Control(props, r
17707
17740
  return;
17708
17741
  }
17709
17742
  };
17743
+ const isNumber = typeof value === 'number';
17744
+ const handleInputKeyDown = event => {
17745
+ handleKeyDown(event);
17746
+ // Switching to editing mode, when key pressed any alphabetical character or number
17747
+ if (/^[a-z0-9]$/i.test(event.key)) {
17748
+ tableMeta.editing.setDetailModeEditing(true);
17749
+ return;
17750
+ }
17751
+ };
17710
17752
  const handleDatepickerChange = event => {
17711
17753
  // When datepicker looses focus, it triggers change event, even if date wasn't changed,
17712
17754
  // so adding additional check here to prevent adding change to the edititng state.
@@ -17719,7 +17761,7 @@ const Control = /*#__PURE__*/React__default.forwardRef(function Control(props, r
17719
17761
  if (typeof controlRenderer === 'function') {
17720
17762
  return controlRenderer({
17721
17763
  ...attributes,
17722
- ref,
17764
+ ref: ref,
17723
17765
  setValue: nextValue => {
17724
17766
  if (nextValue !== value) {
17725
17767
  handleChange(nextValue);
@@ -17741,7 +17783,7 @@ const Control = /*#__PURE__*/React__default.forwardRef(function Control(props, r
17741
17783
  }),
17742
17784
  onChange: handleDatepickerChange,
17743
17785
  onKeyDown: handleDatepickerKeyDown,
17744
- ref: ref,
17786
+ ref: refCallback,
17745
17787
  value: value
17746
17788
  }));
17747
17789
  } else if (controlRenderer === 'switch') {
@@ -17749,18 +17791,15 @@ const Control = /*#__PURE__*/React__default.forwardRef(function Control(props, r
17749
17791
  className: "mx-2 mt-1.5",
17750
17792
  checked: Boolean(value),
17751
17793
  onChange: handleChange,
17752
- ref: ref
17794
+ ref: refCallback
17795
+ }));
17796
+ } else if (controlRenderer === 'textarea') {
17797
+ return /*#__PURE__*/React__default.createElement(TextAreaControl, Object.assign({}, props, {
17798
+ isCellInDetailMode: isCellInDetailMode,
17799
+ onKeyDown: handleInputKeyDown,
17800
+ ref: refCallback
17753
17801
  }));
17754
17802
  }
17755
- const isNumber = typeof value === 'number';
17756
- const handleInputKeyDown = event => {
17757
- handleKeyDown(event);
17758
- // Switching to editing mode, when key pressed any alphabetical character or number
17759
- if (/^[a-z0-9]$/i.test(event.key)) {
17760
- tableMeta.editing.setDetailModeEditing(true);
17761
- return;
17762
- }
17763
- };
17764
17803
  return /*#__PURE__*/React__default.createElement(Input, Object.assign({}, attributes, {
17765
17804
  className: cn(getInputAppearanceClassnames(), getCellAlignmentClasses$1(align), {
17766
17805
  '!yt-focus-dark': isCellInDetailMode
@@ -17769,11 +17808,143 @@ const Control = /*#__PURE__*/React__default.forwardRef(function Control(props, r
17769
17808
  handleChange(event.target.value);
17770
17809
  },
17771
17810
  onKeyDown: handleInputKeyDown,
17772
- ref: ref,
17811
+ ref: refCallback,
17773
17812
  type: isNumber ? 'number' : undefined,
17774
17813
  value: isNumber ? value : String(value !== null && value !== void 0 ? value : '')
17775
17814
  }));
17776
17815
  });
17816
+
17817
+ function EditingCell$1(props) {
17818
+ const {
17819
+ isHovered
17820
+ } = useRowContext$1();
17821
+ // Need to explicitly pass tableMeta, because just passing the table object will not trigger editing change since table object is not mutatable.
17822
+ const tableMeta = props.table.options.meta;
17823
+ return /*#__PURE__*/React__default.createElement(MemoedEditingCell, Object.assign({}, props, {
17824
+ isHovered: isHovered,
17825
+ tableMeta: tableMeta
17826
+ }));
17827
+ }
17828
+ const MemoedEditingCell = /*#__PURE__*/React__default.memo(function MemoedEditingCell(props) {
17829
+ var _tableMeta$editing$ge, _tableMeta$editing$ro, _rows$tableMeta$curre, _column$columnDef$met;
17830
+ const {
17831
+ cell,
17832
+ column,
17833
+ index,
17834
+ getValue,
17835
+ table,
17836
+ tableRef,
17837
+ row,
17838
+ isHovered,
17839
+ tableMeta
17840
+ } = props;
17841
+ const columnMeta = column.columnDef.meta;
17842
+ const cellRef = React__default.useRef(null);
17843
+ const controlRef = React__default.useRef(null);
17844
+ const handleChange = value => tableMeta.editing.setCellValue(cell, value);
17845
+ const value = (_tableMeta$editing$ge = tableMeta.editing.getCellValue(cell)) !== null && _tableMeta$editing$ge !== void 0 ? _tableMeta$editing$ge : getValue();
17846
+ const handleFocus = event => {
17847
+ var _event$target;
17848
+ // Check if cell is hidden behind pinned columns or edititng actions, and scroll to it.
17849
+ const frozenColumnIndex = tableMeta.columnFreezing.frozenColumnIndex;
17850
+ const tableElement = tableRef.current;
17851
+ if (tableElement && frozenColumnIndex !== undefined && index > frozenColumnIndex) {
17852
+ var _cellRef$current;
17853
+ const lastFrozenColumnElement = getCurrentRowCellElement(frozenColumnIndex, tableElement);
17854
+ const cellRect = (_cellRef$current = cellRef.current) === null || _cellRef$current === void 0 ? void 0 : _cellRef$current.getBoundingClientRect();
17855
+ const lastFrozenRect = lastFrozenColumnElement === null || lastFrozenColumnElement === void 0 ? void 0 : lastFrozenColumnElement.getBoundingClientRect();
17856
+ const tableRect = tableElement.getBoundingClientRect();
17857
+ // Check for pinned columns overlap
17858
+ if (cellRect && lastFrozenRect && cellRect.left < lastFrozenRect.left + lastFrozenRect.width) {
17859
+ const pinnedColumnsWidth = lastFrozenRect.left + lastFrozenRect.width;
17860
+ tableElement.scrollTo(cellRect.left - pinnedColumnsWidth, tableElement.scrollTop);
17861
+ // Check for editing actions overlap
17862
+ } else if (cellRect && tableRect && cellRect.right > tableRect.right - EDITING_ACTIONS_WIDTH) {
17863
+ const spaceBetweenCellAndEditingActions = 10;
17864
+ tableElement.scrollTo(
17865
+ // Need to take into account if table has been already scrolled.
17866
+ tableElement.scrollLeft + EDITING_ACTIONS_WIDTH + spaceBetweenCellAndEditingActions, tableElement.scrollTop);
17867
+ }
17868
+ }
17869
+ if ((_event$target = event.target) !== null && _event$target !== void 0 && _event$target.select) {
17870
+ requestAnimationFrame(() => {
17871
+ event.target.select();
17872
+ });
17873
+ }
17874
+ };
17875
+ const handleBlur = () => {
17876
+ tableMeta.editing.setDetailModeEditing(false);
17877
+ };
17878
+ // row move indicator
17879
+ const moveReason = (_tableMeta$editing$ro = tableMeta.editing.rowMoveReason[cell.column.id]) !== null && _tableMeta$editing$ro !== void 0 ? _tableMeta$editing$ro : null;
17880
+ const rows = table.getRowModel().rows;
17881
+ const isCurrentRow = ((_rows$tableMeta$curre = rows[tableMeta.currentRow.currentRowIndex]) === null || _rows$tableMeta$curre === void 0 ? void 0 : _rows$tableMeta$curre.id) === row.id;
17882
+ const mountNode = React__default.useMemo(() => {
17883
+ if (moveReason) {
17884
+ var _cellRef$current2, _cellRef$current2$par;
17885
+ return (_cellRef$current2 = cellRef.current) === null || _cellRef$current2 === void 0 ? void 0 : (_cellRef$current2$par = _cellRef$current2.parentElement) === null || _cellRef$current2$par === void 0 ? void 0 : _cellRef$current2$par.firstChild;
17886
+ }
17887
+ return null;
17888
+ }, [moveReason, cellRef]);
17889
+ const removeMoveReason = () => {
17890
+ tableMeta.editing.removeRowMoveReason(cell.column.id);
17891
+ };
17892
+ React__default.useEffect(() => {
17893
+ // To avoid reseting move reason on another row hover,
17894
+ // we need to check for changes only if value got changed in the current row.
17895
+ if (!isCurrentRow) {
17896
+ return;
17897
+ }
17898
+ if (hasChanged$1(getValue(), value)) {
17899
+ const moveReason = getRowMoveReason(table, row.index, row.original, cell, value);
17900
+ tableMeta.editing.setRowMoveReason({
17901
+ [cell.column.id]: moveReason
17902
+ });
17903
+ } else {
17904
+ removeMoveReason();
17905
+ }
17906
+ return removeMoveReason;
17907
+ }, [value]);
17908
+ const controlRenderer = (_column$columnDef$met = column.columnDef.meta) === null || _column$columnDef$met === void 0 ? void 0 : _column$columnDef$met.control;
17909
+ const className = cn('!px-2 py-[var(--table3-row-padding)]', {
17910
+ relative: (isCurrentRow || isHovered) && controlRenderer === 'textarea',
17911
+ // Need to set higher z-index, so that the current row textarea (in expanded state) overlaps rows below
17912
+ 'z-10': isCurrentRow,
17913
+ // When row is hovered and located below, then the hovered textarea overlaps the current row textarea(if the current row textarea is expanded to support multiple lines),
17914
+ // as result we need to set lower z-index for the hovered row -> cell.
17915
+ 'z-0': isHovered
17916
+ },
17917
+ // component overrides - grayscale for editing hover
17918
+ '[[role="row"][data-current="false"]:hover_&>*]:!grayscale [[role="row"][data-current="false"]:hover_&_.bg-white]:!bg-grey-100',
17919
+ // we alias to any because className conflicts with the Table2 definition,
17920
+ // when Table2 is gone, remove this as any
17921
+ typeof columnMeta.className === 'function' ? columnMeta.className(row.original) : columnMeta.className);
17922
+ return /*#__PURE__*/React__default.createElement(React__default.Fragment, null, moveReason !== null && mountNode && /*#__PURE__*/React__default.createElement(Indicator$1, {
17923
+ reason: moveReason,
17924
+ columnName: String(cell.column.columnDef.header),
17925
+ mountNode: mountNode,
17926
+ validationErrors: []
17927
+ }), /*#__PURE__*/React__default.createElement("div", {
17928
+ className: className,
17929
+ "data-column-index": index,
17930
+ role: "cell",
17931
+ ref: cellRef
17932
+ }, /*#__PURE__*/React__default.createElement(EditingControl, {
17933
+ align: columnMeta.align,
17934
+ column: cell.column,
17935
+ data: cell.row.original,
17936
+ initialValue: getValue(),
17937
+ onBlur: handleBlur,
17938
+ onFocus: handleFocus,
17939
+ onChange: handleChange,
17940
+ ref: controlRef,
17941
+ table: table,
17942
+ tableRef: tableRef,
17943
+ value: value,
17944
+ cell: cell,
17945
+ isCurrentRow: isCurrentRow
17946
+ })));
17947
+ });
17777
17948
  function getRowMoveReason(table, rowIndex, rowValues, cell, newValue) {
17778
17949
  var _table$getState$sorti;
17779
17950
  let rowMoveReason = null;
@@ -17910,7 +18081,7 @@ const Cell$4 = /*#__PURE__*/React__default.memo(function MemoedCell(context) {
17910
18081
  return newTableMeta.currentRow.currentRowIndex === oldTableMeta.currentRow.currentRowIndex && newProps.row.getIsSelected() !== oldProps.row.getIsSelected();
17911
18082
  });
17912
18083
  function createRowSelectionColumn$1(hasDrag, hasExpansion) {
17913
- const size = hasDrag && hasExpansion ? 22 : 40;
18084
+ const size = hasDrag && hasExpansion ? 22 : 4;
17914
18085
  return {
17915
18086
  id: COLUMN_ID$2,
17916
18087
  header: Header$3,
@@ -18209,7 +18380,7 @@ function useConvertChildrenToColumns(props, options, editing) {
18209
18380
  defaultColumnVisibility,
18210
18381
  defaultSorting
18211
18382
  };
18212
- }, [props.children]);
18383
+ }, []);
18213
18384
  }
18214
18385
 
18215
18386
  function usePrinting(isEnabled, loadAll, showWarningWhenPrintingLargeDataset = true) {
@@ -19356,11 +19527,11 @@ function FilterValue(props) {
19356
19527
  if (((_column$columnDef$met = column.columnDef.meta) === null || _column$columnDef$met === void 0 ? void 0 : _column$columnDef$met.dataType) === 'datetime') {
19357
19528
  return /*#__PURE__*/React__default.createElement("div", {
19358
19529
  className: "flex flex-grow items-center gap-2"
19359
- }, /*#__PURE__*/React__default.createElement(Control$1, {
19530
+ }, /*#__PURE__*/React__default.createElement(Control, {
19360
19531
  column: column,
19361
19532
  onChange: value => handleChange([value, toValue]),
19362
19533
  value: fromValue
19363
- }), /*#__PURE__*/React__default.createElement(Control$1, {
19534
+ }), /*#__PURE__*/React__default.createElement(Control, {
19364
19535
  column: column,
19365
19536
  onChange: value => handleChange([fromValue, value]),
19366
19537
  value: toValue
@@ -19368,26 +19539,26 @@ function FilterValue(props) {
19368
19539
  }
19369
19540
  return /*#__PURE__*/React__default.createElement("div", {
19370
19541
  className: "flex flex-grow items-center gap-2"
19371
- }, /*#__PURE__*/React__default.createElement(Control$1, {
19542
+ }, /*#__PURE__*/React__default.createElement(Control, {
19372
19543
  column: column,
19373
19544
  onChange: value => handleChange([isNaN(value) ? undefined : value, toValue]),
19374
19545
  placeholder: "from",
19375
19546
  value: fromValue !== null && fromValue !== void 0 ? fromValue : ''
19376
- }), /*#__PURE__*/React__default.createElement(Control$1, {
19547
+ }), /*#__PURE__*/React__default.createElement(Control, {
19377
19548
  column: column,
19378
19549
  onChange: value => handleChange([fromValue, isNaN(value) ? undefined : value]),
19379
19550
  placeholder: "to",
19380
19551
  value: toValue !== null && toValue !== void 0 ? toValue : ''
19381
19552
  }));
19382
19553
  }
19383
- return /*#__PURE__*/React__default.createElement(Control$1, {
19554
+ return /*#__PURE__*/React__default.createElement(Control, {
19384
19555
  comparator: comparator,
19385
19556
  column: column,
19386
19557
  onChange: handleChange,
19387
19558
  value: value
19388
19559
  });
19389
19560
  }
19390
- function Control$1(props) {
19561
+ function Control(props) {
19391
19562
  var _column$columnDef$met2, _column$columnDef$met3;
19392
19563
  const {
19393
19564
  column,
@@ -20517,10 +20688,12 @@ const Table$1 = /*#__PURE__*/fixedForwardRef(function Table3(props, ref) {
20517
20688
  } = useTableRenderStrategy$1(props, table, internalRef);
20518
20689
  const tableMeta = table.options.meta;
20519
20690
  const state = table.getState();
20691
+ const bodyRef = React__default.useRef(null);
20520
20692
  React__default.useEffect(() => {
20521
20693
  const handleKeyDown = event => {
20694
+ var _bodyRef$current;
20522
20695
  // prevent global shortcuts activating while active in other elements, like inputs or buttons
20523
- if (isEventTriggeredOnInteractiveElement(event.target)) {
20696
+ if (isEventTriggeredOnInteractiveElement(event.target) && !(bodyRef !== null && bodyRef !== void 0 && (_bodyRef$current = bodyRef.current) !== null && _bodyRef$current !== void 0 && _bodyRef$current.contains(event.target))) {
20524
20697
  return;
20525
20698
  }
20526
20699
  tableMeta.hoverState.handleKeyDown(event);
@@ -20533,7 +20706,11 @@ const Table$1 = /*#__PURE__*/fixedForwardRef(function Table3(props, ref) {
20533
20706
  return () => {
20534
20707
  document.removeEventListener('keydown', handleKeyDown);
20535
20708
  };
20536
- }, []);
20709
+ },
20710
+ // See https://github.com/e-conomic/taco/blob/dev/packages/taco/src/components/Table3/strategies/virtualised.tsx#L143
20711
+ // scrollToIndex function changes when row count changes, so it is important to update handlers with new
20712
+ // scrollToIndex function.
20713
+ [scrollToIndex]);
20537
20714
  const handleBlur = event => {
20538
20715
  tableMeta.editing.handleBlur(event);
20539
20716
  };
@@ -20604,7 +20781,8 @@ const Table$1 = /*#__PURE__*/fixedForwardRef(function Table3(props, ref) {
20604
20781
  })))))), table.getRowModel().rows.length ? /*#__PURE__*/React__default.createElement(React__default.Fragment, null, /*#__PURE__*/React__default.createElement(focus.FocusScope, null, /*#__PURE__*/React__default.createElement("div", {
20605
20782
  className: "group/body contents",
20606
20783
  "data-taco": "table2-body",
20607
- role: "rowgroup"
20784
+ role: "rowgroup",
20785
+ ref: bodyRef
20608
20786
  }, renderBody())), /*#__PURE__*/React__default.createElement("div", {
20609
20787
  className: "border-grey-300 col-span-full -mt-px border-t"
20610
20788
  }), tableMeta.enableFooter ? /*#__PURE__*/React__default.createElement("div", {
@@ -20718,37 +20896,6 @@ Tabs.List = TabList;
20718
20896
  Tabs.Trigger = TabTrigger;
20719
20897
  Tabs.Content = TabContent;
20720
20898
 
20721
- const Textarea = /*#__PURE__*/React.forwardRef(function Textarea(props, ref) {
20722
- const {
20723
- defaultValue: _,
20724
- highlighted,
20725
- invalid,
20726
- onKeyDown,
20727
- ...otherProps
20728
- } = props;
20729
- const classNames = cn(getInputClasses(props), 'py-1 min-h-[75px] disabled:resize-none', props.className);
20730
- // home and end keys only navigate to the start/end of textarea value if the textarea container does not scroll
20731
- // if it has scroll height then the browser reverts to native scrolling behaviour only
20732
- // so we manually override it to ensure _our_ desired behaviour remains intact
20733
- const handleKeyDown = event => {
20734
- if (event.key === 'Home' || event.key === 'End') {
20735
- event.preventDefault();
20736
- const position = event.key === 'End' ? event.currentTarget.value.length : 0;
20737
- event.currentTarget.setSelectionRange(position, position);
20738
- event.currentTarget.scrollTop = event.key === 'End' ? event.currentTarget.scrollHeight : 0;
20739
- }
20740
- if (onKeyDown) {
20741
- onKeyDown(event);
20742
- }
20743
- };
20744
- return /*#__PURE__*/React.createElement("textarea", Object.assign({}, otherProps, {
20745
- className: classNames,
20746
- "data-taco": "textarea",
20747
- onKeyDown: handleKeyDown,
20748
- ref: ref
20749
- }));
20750
- });
20751
-
20752
20899
  const Tooltip$1 = ({
20753
20900
  continuous,
20754
20901
  index,