@economic/taco 2.17.1 → 2.18.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (46) hide show
  1. package/dist/components/Select2/components/Search.d.ts +5 -1
  2. package/dist/components/Table3/components/columns/cell/EditingCell.d.ts +1 -0
  3. package/dist/components/Table3/components/columns/cell/Indicator.d.ts +5 -0
  4. package/dist/components/Table3/components/toolbar/Filter/filters/components/FilterValue.d.ts +1 -1
  5. package/dist/components/Table3/types.d.ts +1 -1
  6. package/dist/esm/packages/taco/src/components/Select2/Select2.js +21 -7
  7. package/dist/esm/packages/taco/src/components/Select2/Select2.js.map +1 -1
  8. package/dist/esm/packages/taco/src/components/Select2/components/Search.js +2 -1
  9. package/dist/esm/packages/taco/src/components/Select2/components/Search.js.map +1 -1
  10. package/dist/esm/packages/taco/src/components/Table3/components/alert/ErrorAlert.js +1 -1
  11. package/dist/esm/packages/taco/src/components/Table3/components/alert/ErrorAlert.js.map +1 -1
  12. package/dist/esm/packages/taco/src/components/Table3/components/columns/cell/Cell.js +12 -7
  13. package/dist/esm/packages/taco/src/components/Table3/components/columns/cell/Cell.js.map +1 -1
  14. package/dist/esm/packages/taco/src/components/Table3/components/columns/cell/DisplayCell.js +1 -1
  15. package/dist/esm/packages/taco/src/components/Table3/components/columns/cell/DisplayCell.js.map +1 -1
  16. package/dist/esm/packages/taco/src/components/Table3/components/columns/cell/EditingCell.js +11 -6
  17. package/dist/esm/packages/taco/src/components/Table3/components/columns/cell/EditingCell.js.map +1 -1
  18. package/dist/esm/packages/taco/src/components/Table3/components/columns/cell/Indicator.js +15 -1
  19. package/dist/esm/packages/taco/src/components/Table3/components/columns/cell/Indicator.js.map +1 -1
  20. package/dist/esm/packages/taco/src/components/Table3/components/columns/internal/Actions.js +6 -1
  21. package/dist/esm/packages/taco/src/components/Table3/components/columns/internal/Actions.js.map +1 -1
  22. package/dist/esm/packages/taco/src/components/Table3/components/columns/internal/EditingActions.js +10 -4
  23. package/dist/esm/packages/taco/src/components/Table3/components/columns/internal/EditingActions.js.map +1 -1
  24. package/dist/esm/packages/taco/src/components/Table3/components/toolbar/Filter/filters/components/Filter.js +11 -1
  25. package/dist/esm/packages/taco/src/components/Table3/components/toolbar/Filter/filters/components/Filter.js.map +1 -1
  26. package/dist/esm/packages/taco/src/components/Table3/components/toolbar/Filter/filters/components/FilterValue.js +0 -2
  27. package/dist/esm/packages/taco/src/components/Table3/components/toolbar/Filter/filters/components/FilterValue.js.map +1 -1
  28. package/dist/esm/packages/taco/src/components/Table3/components/toolbar/PrintButton/PrintIFrame.js +1 -1
  29. package/dist/esm/packages/taco/src/components/Table3/components/toolbar/Search.js +5 -2
  30. package/dist/esm/packages/taco/src/components/Table3/components/toolbar/Search.js.map +1 -1
  31. package/dist/esm/packages/taco/src/components/Table3/components/toolbar/Toolbar.js +1 -1
  32. package/dist/esm/packages/taco/src/components/Table3/components/toolbar/Toolbar.js.map +1 -1
  33. package/dist/esm/packages/taco/src/components/Table3/types.js.map +1 -1
  34. package/dist/esm/packages/taco/src/primitives/Listbox2/components/Option.js +4 -0
  35. package/dist/esm/packages/taco/src/primitives/Listbox2/components/Option.js.map +1 -1
  36. package/dist/esm/packages/taco/src/primitives/Table/useTable/listeners/useTableRowSelectionListener.js +7 -2
  37. package/dist/esm/packages/taco/src/primitives/Table/useTable/listeners/useTableRowSelectionListener.js.map +1 -1
  38. package/dist/esm/packages/taco/src/utils/dom.js +13 -1
  39. package/dist/esm/packages/taco/src/utils/dom.js.map +1 -1
  40. package/dist/taco.cjs.development.js +177 -100
  41. package/dist/taco.cjs.development.js.map +1 -1
  42. package/dist/taco.cjs.production.min.js +1 -1
  43. package/dist/taco.cjs.production.min.js.map +1 -1
  44. package/dist/utils/dom.d.ts +1 -0
  45. package/package.json +2 -2
  46. package/types.json +5388 -5018
@@ -9594,6 +9594,10 @@ const Option = /*#__PURE__*/React__default.forwardRef(function Listbox2Option(pr
9594
9594
  if (disabled || listboxDisabled || listboxReadOnly) {
9595
9595
  event.stopPropagation();
9596
9596
  return;
9597
+ }
9598
+ // UX requirement: if tab key is pressed and the current option is selected then keydown event is ignored
9599
+ else if (event.key === 'Tab' && selected) {
9600
+ return;
9597
9601
  } else if (isAriaSelectionKey(event)) {
9598
9602
  setValue(value);
9599
9603
  }
@@ -10032,6 +10036,18 @@ const getIndexOfFirstChildOverflowingParent = (element, overscan = 0) => {
10032
10036
  }
10033
10037
  return boundaryChildIndex;
10034
10038
  };
10039
+ const getNextFocussableElement = currentElement => {
10040
+ if (!currentElement) {
10041
+ return null;
10042
+ }
10043
+ const focussableElements = [...document.querySelectorAll('button:not([disabled]), [href]:not(link):not(script), input:not([disabled]), select:not([disabled]), textarea:not([disabled]), [tabindex]:not([tabindex="-1"]):not([disabled]), details:not([disabled]), summary:not(:disabled)')];
10044
+ const currentElementIndex = focussableElements.indexOf(currentElement);
10045
+ // If the currentElement is not in the focussable elements list or it is the last element
10046
+ if (currentElementIndex !== -1 && currentElementIndex === focussableElements.length - 1) {
10047
+ return null;
10048
+ }
10049
+ return focussableElements[currentElementIndex + 1];
10050
+ };
10035
10051
 
10036
10052
  const Trigger$7 = /*#__PURE__*/React__default.forwardRef(function Select2Trigger(props, ref) {
10037
10053
  const {
@@ -10360,6 +10376,7 @@ const BubbleSelect = props => {
10360
10376
 
10361
10377
  const Search$1 = /*#__PURE__*/React__default.forwardRef(function ListboxSearch(props, ref) {
10362
10378
  const {
10379
+ onTabKeyPress,
10363
10380
  ...otherProps
10364
10381
  } = props;
10365
10382
  const {
@@ -10384,7 +10401,7 @@ const Search$1 = /*#__PURE__*/React__default.forwardRef(function ListboxSearch(p
10384
10401
  // Select2 should close dropdown and receive focus, when user press Tab while searching (UX requirement to support better keyboard navigation)
10385
10402
  if (event.key === 'Tab') {
10386
10403
  setOpen(false);
10387
- return;
10404
+ onTabKeyPress();
10388
10405
  }
10389
10406
  if (isAriaSelectionKey(event) || event.key === 'ArrowDown' || event.key === 'ArrowUp') {
10390
10407
  var _listboxRef$current;
@@ -10624,6 +10641,7 @@ const Select2 = /*#__PURE__*/React__default.forwardRef(function Select2(props, r
10624
10641
  // align the listbox min width with the width of the input - it should never be smaller
10625
10642
  const dimensions = useBoundingClientRectListener(internalRef);
10626
10643
  // state
10644
+ const [tabTriggeredClose, setTabTriggeredClose] = React__default.useState(false);
10627
10645
  const [open, setOpen] = React__default.useState(false);
10628
10646
  const [value, _setValue] = reactUseControllableState.useControllableState({
10629
10647
  // uncontrolled
@@ -10706,6 +10724,22 @@ const Select2 = /*#__PURE__*/React__default.forwardRef(function Select2(props, r
10706
10724
  setShouldPauseHoverState(true);
10707
10725
  }
10708
10726
  };
10727
+ const handleCloseAutoFocus = event => {
10728
+ event.preventDefault();
10729
+ event.stopPropagation();
10730
+ if (tabTriggeredClose) {
10731
+ const nextFocussableElement = getNextFocussableElement(internalRef.current);
10732
+ if (nextFocussableElement) {
10733
+ // UX requirement: move focus to the next focussable element when tab key is pressed to select the value
10734
+ nextFocussableElement.focus();
10735
+ // Reset the tabTriggeredClose state
10736
+ setTabTriggeredClose(false);
10737
+ }
10738
+ } else {
10739
+ var _internalRef$current;
10740
+ (_internalRef$current = internalRef.current) === null || _internalRef$current === void 0 ? void 0 : _internalRef$current.focus();
10741
+ }
10742
+ };
10709
10743
  const className = cn('border-grey-300 rounded border bg-white py-1.5 shadow-md outline-none', createCollectionClassName());
10710
10744
  return /*#__PURE__*/React__default.createElement(Select2Context.Provider, {
10711
10745
  value: context
@@ -10734,15 +10768,10 @@ const Select2 = /*#__PURE__*/React__default.forwardRef(function Select2(props, r
10734
10768
  asChild: true,
10735
10769
  align: "start",
10736
10770
  onOpenAutoFocus: () => {
10737
- var _internalRef$current;
10738
- (_internalRef$current = internalRef.current) === null || _internalRef$current === void 0 ? void 0 : _internalRef$current.focus();
10739
- },
10740
- onCloseAutoFocus: event => {
10741
10771
  var _internalRef$current2;
10742
- event.preventDefault();
10743
- event.stopPropagation();
10744
10772
  (_internalRef$current2 = internalRef.current) === null || _internalRef$current2 === void 0 ? void 0 : _internalRef$current2.focus();
10745
10773
  },
10774
+ onCloseAutoFocus: handleCloseAutoFocus,
10746
10775
  sideOffset: 4,
10747
10776
  tabIndex: -1
10748
10777
  }, /*#__PURE__*/React__default.createElement("div", {
@@ -10752,7 +10781,8 @@ const Select2 = /*#__PURE__*/React__default.forwardRef(function Select2(props, r
10752
10781
  }
10753
10782
  }, flattenedChildren.length > 0 || onCreate ? ( /*#__PURE__*/React__default.createElement(Search$1, {
10754
10783
  placeholder: onCreate ? texts.select2.searchOrCreate : texts.select2.search,
10755
- ref: searchRef
10784
+ ref: searchRef,
10785
+ onTabKeyPress: () => setTabTriggeredClose(true)
10756
10786
  })) : null, flattenedChildren.length <= 0 ? ( /*#__PURE__*/React__default.createElement("div", {
10757
10787
  className: "text-grey-700 -mt-0.5 flex h-8 items-center px-2",
10758
10788
  role: "presentation"
@@ -12897,7 +12927,7 @@ function DisplayCell(props) {
12897
12927
  index,
12898
12928
  tableRef
12899
12929
  };
12900
- }, [row.original, props.children, value, tableMeta.columnFreezing.frozenColumnIndex]);
12930
+ }, [row.original, props.children, value, tableMeta.columnFreezing.frozenColumnIndex, className]);
12901
12931
  return /*#__PURE__*/React__default.createElement(MemoedDisplayCell, Object.assign({}, memoedProps, {
12902
12932
  highlighted: highlighted,
12903
12933
  highlightedAsCurrent: highlightedAsCurrent
@@ -13010,6 +13040,85 @@ function FontSize$1(props) {
13010
13040
  }, texts.table3.fontSize.sizes.large)));
13011
13041
  }
13012
13042
 
13043
+ var IndicatorReason;
13044
+ (function (IndicatorReason) {
13045
+ IndicatorReason["SEARCH"] = "SEARCH";
13046
+ IndicatorReason["SORTING"] = "SORTING";
13047
+ IndicatorReason["FILTER"] = "FILTER";
13048
+ })(IndicatorReason || (IndicatorReason = {}));
13049
+ const useIndicatorText = reason => {
13050
+ let title = '';
13051
+ let description = '';
13052
+ const {
13053
+ texts
13054
+ } = useLocalization();
13055
+ switch (reason) {
13056
+ case IndicatorReason.FILTER:
13057
+ title = texts.table3.editing.rowIndicator.rowWillBeHidden;
13058
+ description = texts.table3.editing.rowIndicator.rowWillMoveReasonFilter;
13059
+ break;
13060
+ case IndicatorReason.SEARCH:
13061
+ title = texts.table3.editing.rowIndicator.rowWillBeHidden;
13062
+ description = texts.table3.editing.rowIndicator.rowWillMoveReasonSearch;
13063
+ break;
13064
+ case IndicatorReason.SORTING:
13065
+ title = texts.table3.editing.rowIndicator.rowWillMove;
13066
+ description = texts.table3.editing.rowIndicator.rowWillMoveReasonSorting;
13067
+ break;
13068
+ }
13069
+ return {
13070
+ title,
13071
+ description
13072
+ };
13073
+ };
13074
+ const Indicator = ({
13075
+ reason,
13076
+ columnName,
13077
+ mountNode,
13078
+ validationErrors
13079
+ }) => {
13080
+ const container = React__default.useMemo(() => {
13081
+ const element = document.createElement('div');
13082
+ element.className += 'rounded-b-md items-center wcag-blue-500 absolute left-0 top-full ml-1 whitespace-nowrap px-1 py-0.5 text-xs font-bold shadow-sm';
13083
+ return element;
13084
+ }, []);
13085
+ const indicatorText = useIndicatorText(reason);
13086
+ const hasValidationErrorsInRow = !!validationErrors;
13087
+ React__default.useEffect(() => {
13088
+ // mountNode could be null when rows are filtered
13089
+ // Pinned columns has z-20 class assigned, which overlaps indicator element, need to add z-21 to overlap pinned columns.
13090
+ mountNode === null || mountNode === void 0 ? void 0 : mountNode.classList.add('!z-[21]', 'relative');
13091
+ mountNode === null || mountNode === void 0 ? void 0 : mountNode.appendChild(container);
13092
+ return () => {
13093
+ mountNode === null || mountNode === void 0 ? void 0 : mountNode.classList.remove('!z-[21]', 'relative');
13094
+ mountNode === null || mountNode === void 0 ? void 0 : mountNode.removeChild(container);
13095
+ };
13096
+ }, [hasValidationErrorsInRow, mountNode]);
13097
+ // Using react portal inside a react tree component is an unorthodox way, but in order to avoid much code refactoring
13098
+ // and being able to use Taco Tooltip component in side the visual indicator, portal is used.
13099
+ return /*#__PURE__*/ReactDOM.createPortal( /*#__PURE__*/React__default.createElement(Tooltip, {
13100
+ title: indicatorText.description.replace('[COLUMN]', columnName)
13101
+ }, /*#__PURE__*/React__default.createElement("span", {
13102
+ className: "flex gap-1 hover:cursor-pointer"
13103
+ }, /*#__PURE__*/React__default.createElement(Icon, {
13104
+ name: "info",
13105
+ className: "!h-4 !w-4 rounded-full bg-white !p-0 text-blue-500"
13106
+ }), indicatorText.title)), container);
13107
+ };
13108
+ /**
13109
+ * Generates class names needed to highlight row cells, used when row has a move indicator
13110
+ */
13111
+ function getIndicatorCellClassName(columnIndex, lastColumnIndex) {
13112
+ return cn('!border-blue !border-y-2 border-x-0', {
13113
+ 'border-l-2 rounded-l': columnIndex === 0,
13114
+ 'border-r-2 rounded-r': columnIndex === lastColumnIndex
13115
+ });
13116
+ }
13117
+ function isIndicatorVisible(rowIndex, rowActiveIndex, rowMoveReason) {
13118
+ const isActiveRow = rowActiveIndex === rowIndex;
13119
+ return isActiveRow && rowMoveReason;
13120
+ }
13121
+
13013
13122
  const COLUMN_ID = '__actions';
13014
13123
  const MemoedCell = /*#__PURE__*/React__default.memo(function MemoedCell(props) {
13015
13124
  const {
@@ -13054,7 +13163,7 @@ const MemoedCell = /*#__PURE__*/React__default.memo(function MemoedCell(props) {
13054
13163
  // Adjust negative margin on row actions cell to ensure that the cell aligns vertically.
13055
13164
  '-mt-2': fontSize === FONT_SIZE.small,
13056
13165
  '-mt-1.5': fontSize !== FONT_SIZE.small
13057
- });
13166
+ }, props.className);
13058
13167
  content = /*#__PURE__*/React__default.createElement("span", {
13059
13168
  className: className,
13060
13169
  ref: ref
@@ -13089,9 +13198,13 @@ function Cell(context) {
13089
13198
  rowIndex
13090
13199
  } = React__default.useContext(RowContext);
13091
13200
  const tableMeta = context.table.options.meta;
13201
+ const allVisibleColumns = context.table.getVisibleLeafColumns();
13202
+ const lastColumnIndex = allVisibleColumns.length > 0 ? allVisibleColumns.length - 1 : 0;
13203
+ const className = isIndicatorVisible(rowIndex, tableMeta.rowActive.rowActiveIndex, tableMeta.editing.rowMoveReason) ? getIndicatorCellClassName(context.index, lastColumnIndex) : undefined;
13092
13204
  return /*#__PURE__*/React__default.createElement(MemoedCell, Object.assign({}, context, {
13093
13205
  actions: tableMeta.rowActions.actionsForRow,
13094
13206
  actionsLength: tableMeta.rowActions.actionsForRowLength,
13207
+ className: className,
13095
13208
  fontSize: tableMeta.fontSize.size,
13096
13209
  isActiveRow: tableMeta.rowActive.rowActiveIndex === rowIndex,
13097
13210
  isEditing: tableMeta.editing.isEditing,
@@ -13526,8 +13639,9 @@ function useLazyEffect(effect, deps) {
13526
13639
  }
13527
13640
 
13528
13641
  function useTableRowSelectionListener(table, onRowSelect) {
13529
- const selectedRows = table.getSelectedRowModel().rows;
13642
+ const rowSelection = table.getState().rowSelection;
13530
13643
  useLazyEffect(() => {
13644
+ const selectedRows = table.getSelectedRowModel().rows;
13531
13645
  if (table.options.enableRowSelection && typeof onRowSelect === 'function') {
13532
13646
  if (table.options.enableMultiRowSelection) {
13533
13647
  onRowSelect(selectedRows.map(row => row.original));
@@ -13536,7 +13650,11 @@ function useTableRowSelectionListener(table, onRowSelect) {
13536
13650
  onRowSelect((_ref = [(_selectedRows$ = selectedRows[0]) === null || _selectedRows$ === void 0 ? void 0 : _selectedRows$.original]) !== null && _ref !== void 0 ? _ref : []);
13537
13651
  }
13538
13652
  }
13539
- }, [table.options.enableRowSelection, table.options.enableMultiRowSelection, selectedRows]);
13653
+ // It is important to stringify either rowSelection state or selectedRows, because we don't
13654
+ // know if the array or object that is returned by react-table has the same reference or not.
13655
+ // rowSelection state is used here because it will be more expensive to strigify selectedRows
13656
+ // than rowSelection state.
13657
+ }, [table.options.enableRowSelection, table.options.enableMultiRowSelection, JSON.stringify(rowSelection)]);
13540
13658
  }
13541
13659
 
13542
13660
  function useRowDrag(isEnabled) {
@@ -13907,72 +14025,6 @@ function useRowDrop(isEnabled, handler) {
13907
14025
  };
13908
14026
  }
13909
14027
 
13910
- var IndicatorReason;
13911
- (function (IndicatorReason) {
13912
- IndicatorReason["SEARCH"] = "SEARCH";
13913
- IndicatorReason["SORTING"] = "SORTING";
13914
- IndicatorReason["FILTER"] = "FILTER";
13915
- })(IndicatorReason || (IndicatorReason = {}));
13916
- const useIndicatorText = reason => {
13917
- let title = '';
13918
- let description = '';
13919
- const {
13920
- texts
13921
- } = useLocalization();
13922
- switch (reason) {
13923
- case IndicatorReason.FILTER:
13924
- title = texts.table3.editing.rowIndicator.rowWillBeHidden;
13925
- description = texts.table3.editing.rowIndicator.rowWillMoveReasonFilter;
13926
- break;
13927
- case IndicatorReason.SEARCH:
13928
- title = texts.table3.editing.rowIndicator.rowWillBeHidden;
13929
- description = texts.table3.editing.rowIndicator.rowWillMoveReasonSearch;
13930
- break;
13931
- case IndicatorReason.SORTING:
13932
- title = texts.table3.editing.rowIndicator.rowWillMove;
13933
- description = texts.table3.editing.rowIndicator.rowWillMoveReasonSorting;
13934
- break;
13935
- }
13936
- return {
13937
- title,
13938
- description
13939
- };
13940
- };
13941
- const Indicator = ({
13942
- reason,
13943
- columnName,
13944
- mountNode,
13945
- validationErrors
13946
- }) => {
13947
- const container = React__default.useMemo(() => {
13948
- const element = document.createElement('div');
13949
- element.className += 'rounded-b-md items-center wcag-blue-500 absolute left-0 top-full ml-1 whitespace-nowrap px-1 py-0.5 text-xs font-bold shadow-sm';
13950
- return element;
13951
- }, []);
13952
- const indicatorText = useIndicatorText(reason);
13953
- const hasValidationErrorsInRow = !!validationErrors;
13954
- React__default.useEffect(() => {
13955
- // mountNode could be null when rows are filtered
13956
- // Pinned columns has z-20 class assigned, which overlaps indicator element, need to add z-21 to overlap pinned columns.
13957
- mountNode === null || mountNode === void 0 ? void 0 : mountNode.classList.add('!z-[21]', 'relative');
13958
- mountNode === null || mountNode === void 0 ? void 0 : mountNode.appendChild(container);
13959
- return () => {
13960
- mountNode === null || mountNode === void 0 ? void 0 : mountNode.classList.remove('!z-[21]', 'relative');
13961
- mountNode === null || mountNode === void 0 ? void 0 : mountNode.removeChild(container);
13962
- };
13963
- }, [hasValidationErrorsInRow, mountNode]);
13964
- // Using react portal inside a react tree component is an unorthodox way, but in order to avoid much code refactoring
13965
- // and being able to use Taco Tooltip component in side the visual indicator, portal is used.
13966
- return /*#__PURE__*/ReactDOM.createPortal( /*#__PURE__*/React__default.createElement(Tooltip, {
13967
- title: indicatorText.description.replace('[COLUMN]', columnName)
13968
- }, /*#__PURE__*/React__default.createElement("span", {
13969
- className: "flex gap-1 hover:cursor-pointer"
13970
- }, /*#__PURE__*/React__default.createElement(Icon, {
13971
- name: "info",
13972
- className: "!h-4 !w-4 rounded-full bg-white !p-0 text-blue-500"
13973
- }), indicatorText.title)), container);
13974
- };
13975
-
13976
14028
  const focussableNodeNames = ['A', 'BUTTON', 'INPUT', 'TEXTAREA', 'SELECT', 'DETAILS'];
13977
14029
  const focusableSelector = /*#__PURE__*/focussableNodeNames.join(', ');
13978
14030
  const hasChanged = (value, newValue) => {
@@ -14627,10 +14679,11 @@ const COLUMN_ID$1 = '__editing_actions';
14627
14679
  const MemoedCell$1 = /*#__PURE__*/React__default.memo(function MemoedCell(props) {
14628
14680
  var _column$columnDef$met;
14629
14681
  const {
14682
+ className,
14683
+ editing,
14630
14684
  hasChanges,
14631
14685
  isActiveRow,
14632
14686
  row,
14633
- editing,
14634
14687
  rowIdentifier,
14635
14688
  table
14636
14689
  } = props;
@@ -14724,7 +14777,7 @@ const MemoedCell$1 = /*#__PURE__*/React__default.memo(function MemoedCell(props)
14724
14777
  '-mb-2 -mt-2': isActiveRow
14725
14778
  });
14726
14779
  return /*#__PURE__*/React__default.createElement(DisplayCell, Object.assign({}, props, {
14727
- className: cn({
14780
+ className: cn(className, {
14728
14781
  '!sticky': !!content
14729
14782
  })
14730
14783
  }), content ? /*#__PURE__*/React__default.createElement("span", {
@@ -14737,10 +14790,14 @@ function Cell$1(props) {
14737
14790
  } = React__default.useContext(RowContext);
14738
14791
  const tableMeta = props.table.options.meta;
14739
14792
  const changeset = tableMeta.editing.changes ? Object.keys(tableMeta.editing.changes) : [];
14793
+ const allVisibleColumns = props.table.getVisibleLeafColumns();
14794
+ const lastColumnIndex = allVisibleColumns.length > 0 ? allVisibleColumns.length - 1 : 0;
14795
+ const className = isIndicatorVisible(rowIndex, tableMeta.rowActive.rowActiveIndex, tableMeta.editing.rowMoveReason) ? getIndicatorCellClassName(props.index, lastColumnIndex) : undefined;
14740
14796
  return /*#__PURE__*/React__default.createElement(MemoedCell$1, Object.assign({}, props, {
14797
+ className: className,
14798
+ editing: tableMeta.editing,
14741
14799
  hasChanges: changeset.indexOf(props.row.id) >= 0,
14742
- isActiveRow: tableMeta.rowActive.rowActiveIndex === rowIndex,
14743
- editing: tableMeta.editing
14800
+ isActiveRow: tableMeta.rowActive.rowActiveIndex === rowIndex
14744
14801
  }));
14745
14802
  }
14746
14803
  const EDITING_ACTIONS_WIDTH = 60;
@@ -15197,7 +15254,10 @@ const MemoedEditingCell = /*#__PURE__*/React__default.memo(function MemoedEditin
15197
15254
  React__default.useEffect(() => {
15198
15255
  // To avoid reseting move reason on another row hover,
15199
15256
  // we need to check for changes only if value got changed in the current row.
15200
- if (!isActiveRow || error) {
15257
+ if (!isActiveRow) {
15258
+ return;
15259
+ }
15260
+ if (error) {
15201
15261
  if (tableMeta.editing.rowMoveReason) {
15202
15262
  removeMoveReason();
15203
15263
  }
@@ -15207,9 +15267,11 @@ const MemoedEditingCell = /*#__PURE__*/React__default.memo(function MemoedEditin
15207
15267
  const moveReason = getRowMoveReason(table, rowIndex,
15208
15268
  // cannot use row.index, as this is not kept in sync once a column is sorted.
15209
15269
  row.original, cell, value, tableMeta.search.excludeUnmatchedResults);
15210
- tableMeta.editing.setRowMoveReason({
15211
- [cell.column.id]: moveReason
15212
- });
15270
+ if (moveReason) {
15271
+ tableMeta.editing.setRowMoveReason({
15272
+ [cell.column.id]: moveReason
15273
+ });
15274
+ }
15213
15275
  } else {
15214
15276
  removeMoveReason();
15215
15277
  }
@@ -15219,7 +15281,7 @@ const MemoedEditingCell = /*#__PURE__*/React__default.memo(function MemoedEditin
15219
15281
  const className = cn('py-[calc(var(--table3-cell-padding-y)_-_0.06rem)]', {
15220
15282
  // Textarea control is positioned absolute, when column is in enableTruncate mode, so the cell need to be positioned relative
15221
15283
  relative: controlRenderer === 'textarea' && columnMeta.enableTruncate
15222
- }, typeof columnMeta.className === 'function' ? columnMeta.className(row.original) : columnMeta.className);
15284
+ }, props.className, typeof columnMeta.className === 'function' ? columnMeta.className(row.original) : columnMeta.className);
15223
15285
  const fieldClassName = cn('!min-h-0 w-full !pb-0', {
15224
15286
  '!pb-3': !!error
15225
15287
  });
@@ -15302,7 +15364,8 @@ function Cell$2(props) {
15302
15364
  } = props;
15303
15365
  const {
15304
15366
  isHovered: isHoveredRow,
15305
- hasError
15367
+ hasError,
15368
+ rowIndex
15306
15369
  } = useRowContext();
15307
15370
  const rows = table.getRowModel().rows;
15308
15371
  const tableMeta = table.options.meta;
@@ -15312,15 +15375,15 @@ function Cell$2(props) {
15312
15375
  const rowActiveIndex = tableMeta.rowActive.rowActiveIndex;
15313
15376
  const isActiveRow = rowActiveIndex !== undefined && ((_rows$rowActiveIndex = rows[rowActiveIndex]) === null || _rows$rowActiveIndex === void 0 ? void 0 : _rows$rowActiveIndex.id) === row.id;
15314
15377
  let value = getValue();
15378
+ const allVisibleColumns = table.getVisibleLeafColumns();
15379
+ const lastColumnIndex = allVisibleColumns.length > 0 ? allVisibleColumns.length - 1 : 0;
15380
+ const className = isIndicatorVisible(rowIndex, rowActiveIndex, tableMeta.editing.rowMoveReason) ? getIndicatorCellClassName(index, lastColumnIndex) : undefined;
15315
15381
  // When row has changes we always need to show the editing state value, end revert it to original value only when row got saved successfully.
15316
15382
  // Otherwise it might confuse user because it will look like display value is getting reverted everytime user leaves the row.
15317
15383
  if (tableMeta.editing.isEditing) {
15318
15384
  const editingValue = tableMeta.editing.getCellValue(cell);
15319
15385
  value = editingValue !== null && editingValue !== void 0 ? editingValue : value;
15320
15386
  }
15321
- const {
15322
- rowIndex
15323
- } = React__default.useContext(RowContext);
15324
15387
  const memoedHighlight = React__default.useMemo(() => {
15325
15388
  var _tableMeta$search$que;
15326
15389
  if (!tableMeta.search.isHighlightingEnabled || !columnMeta.enableSearch) {
@@ -15348,10 +15411,13 @@ function Cell$2(props) {
15348
15411
  if (tableMeta.editing.isEditing && columnMeta.control && (isActiveRow || isHoveredRow && !tableMeta.rowActive.isHoverStatePaused ||
15349
15412
  // When cell has error, we renderimg it in edit mode (UX reqirement)
15350
15413
  isColumnError)) {
15351
- return /*#__PURE__*/React__default.createElement(EditingCell, Object.assign({}, props, highlightProps));
15414
+ return /*#__PURE__*/React__default.createElement(EditingCell, Object.assign({}, props, highlightProps, {
15415
+ className: className
15416
+ }));
15352
15417
  }
15353
15418
  return /*#__PURE__*/React__default.createElement(DisplayCell, Object.assign({}, props, highlightProps, {
15354
- value: value
15419
+ value: value,
15420
+ className: className
15355
15421
  }));
15356
15422
  }
15357
15423
 
@@ -16695,11 +16761,14 @@ function Search$2(props) {
16695
16761
  setQuery(String(query !== null && query !== void 0 ? query : ''));
16696
16762
  };
16697
16763
  const handleClear = () => {
16698
- const [rowIndex = null, cellIndex = null] = tableMeta.search.highlightedColumnIndexes[tableMeta.search.currentHighlightColumnIndex || 0];
16764
+ var _tableMeta$search$cur, _tableMeta$search$hig;
16765
+ const highlightedColumnIndex = (_tableMeta$search$cur = tableMeta.search.currentHighlightColumnIndex) !== null && _tableMeta$search$cur !== void 0 ? _tableMeta$search$cur : 0;
16766
+ const highlightedCell = (_tableMeta$search$hig = tableMeta.search.highlightedColumnIndexes[highlightedColumnIndex]) !== null && _tableMeta$search$hig !== void 0 ? _tableMeta$search$hig : [];
16767
+ const [rowIndex = null, columnIndex = null] = highlightedCell;
16699
16768
  const rows = table.getRowModel().rows;
16700
16769
  tableMeta.search.setQuery('');
16701
16770
  // Need to save row id and cell index, to be able to find the row in the table with updated indexes, after global filter will be reset.
16702
- lastCellIndex.value = String(cellIndex);
16771
+ lastCellIndex.value = String(columnIndex);
16703
16772
  if (rowIndex !== null) {
16704
16773
  var _rows$rowIndex;
16705
16774
  const rowId = ((_rows$rowIndex = rows[rowIndex]) === null || _rows$rowIndex === void 0 ? void 0 : _rows$rowIndex.id) || null;
@@ -17056,7 +17125,6 @@ function FilterValue(props) {
17056
17125
  }));
17057
17126
  }
17058
17127
  return /*#__PURE__*/React__default.createElement(Control, {
17059
- comparator: comparator,
17060
17128
  column: column,
17061
17129
  onChange: handleChange,
17062
17130
  value: value
@@ -17066,7 +17134,6 @@ function Control(props) {
17066
17134
  var _column$columnDef$met2, _column$columnDef$met3;
17067
17135
  const {
17068
17136
  column,
17069
- comparator,
17070
17137
  onChange,
17071
17138
  value,
17072
17139
  ...attributes
@@ -17133,9 +17200,19 @@ function Filter$1(props) {
17133
17200
  }
17134
17201
  } = filter;
17135
17202
  const handleChangeColumn = columnId => {
17203
+ var _columnPrev$columnDef, _columnNext$columnDef;
17204
+ const columnPrev = allColumns.find(column => column.id === id);
17205
+ const columnNext = allColumns.find(column => column.id === columnId);
17206
+ // UX requirement: if old column data type is the same as next column data type,
17207
+ // then we applying the same filter value for the next column,
17208
+ // but when data types are different, we're reseting comparator ans value for the next column
17209
+ const value = (columnPrev === null || columnPrev === void 0 ? void 0 : (_columnPrev$columnDef = columnPrev.columnDef.meta) === null || _columnPrev$columnDef === void 0 ? void 0 : _columnPrev$columnDef.dataType) === (columnNext === null || columnNext === void 0 ? void 0 : (_columnNext$columnDef = columnNext.columnDef.meta) === null || _columnNext$columnDef === void 0 ? void 0 : _columnNext$columnDef.dataType) ? filter.value : {
17210
+ comparator: null,
17211
+ value: null
17212
+ };
17136
17213
  handleChange(id, {
17137
17214
  id: columnId,
17138
- value: filter.value
17215
+ value
17139
17216
  });
17140
17217
  };
17141
17218
  const handleChangeComparator = comparator => {
@@ -18173,7 +18250,7 @@ function Toolbar(props) {
18173
18250
  }
18174
18251
  const tableMeta = table.options.meta;
18175
18252
  return /*#__PURE__*/React__default.createElement("div", {
18176
- className: "mb-4 flex flex-shrink flex-grow-0 flex-wrap gap-2",
18253
+ className: "mb-4 flex flex-shrink flex-grow-0 flex-wrap gap-2 empty:hidden",
18177
18254
  "data-taco": "table3-toolbar"
18178
18255
  }, left, /*#__PURE__*/React__default.createElement(Group, {
18179
18256
  className: "ml-auto flex-shrink-0 print:hidden"
@@ -18437,7 +18514,7 @@ function ErrorAlert(props) {
18437
18514
  // Getting the row from core rows (ignoring search and filtering)
18438
18515
  const getCoreRow = React__default.useCallback(rowId => coreRows.find(coreRow => coreRow.id === rowId), [coreRows]);
18439
18516
  return /*#__PURE__*/React__default.createElement("div", {
18440
- className: "mb-4"
18517
+ className: "mb-4 empty:hidden"
18441
18518
  }, errorsRowIds.length ? ( /*#__PURE__*/React__default.createElement(Alert, {
18442
18519
  state: "error",
18443
18520
  className: "mb-1"