@economic/taco 1.28.1 → 1.30.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (75) hide show
  1. package/dist/components/Icon/components/ColumnFreeze.d.ts +3 -0
  2. package/dist/components/Icon/components/ColumnUnfreeze.d.ts +3 -0
  3. package/dist/components/Icon/components/index.d.ts +1 -1
  4. package/dist/components/Input/Input.d.ts +1 -1
  5. package/dist/components/Menu/components/Item.d.ts +1 -1
  6. package/dist/components/Menu/components/Link.d.ts +1 -1
  7. package/dist/components/Navigation2/components/Link.d.ts +1 -1
  8. package/dist/components/Provider/Localization.d.ts +12 -4
  9. package/dist/components/Select2/components/Option.d.ts +1 -1
  10. package/dist/components/Select2/components/Search.d.ts +1 -1
  11. package/dist/components/Table2/Table2.d.ts +11 -4
  12. package/dist/components/Table2/components/row/ExpandedRow.d.ts +1 -1
  13. package/dist/components/Table2/hooks/useColumnDefinitions.d.ts +2 -2
  14. package/dist/components/Table2/hooks/useTable.d.ts +4 -0
  15. package/dist/components/Table2/types.d.ts +3 -4
  16. package/dist/components/Table2/utilities/cell.d.ts +1 -1
  17. package/dist/components/Table2/utilities/columns.d.ts +1 -0
  18. package/dist/components/Tag/Tag.d.ts +1 -1
  19. package/dist/components/Truncate/Truncate.d.ts +6 -0
  20. package/dist/esm/packages/taco/src/components/Icon/components/ColumnFreeze.js +19 -0
  21. package/dist/esm/packages/taco/src/components/Icon/components/ColumnFreeze.js.map +1 -0
  22. package/dist/esm/packages/taco/src/components/Icon/components/ColumnUnfreeze.js +19 -0
  23. package/dist/esm/packages/taco/src/components/Icon/components/ColumnUnfreeze.js.map +1 -0
  24. package/dist/esm/packages/taco/src/components/Icon/components/index.js +4 -0
  25. package/dist/esm/packages/taco/src/components/Icon/components/index.js.map +1 -1
  26. package/dist/esm/packages/taco/src/components/Input/Input.js +14 -14
  27. package/dist/esm/packages/taco/src/components/Input/Input.js.map +1 -1
  28. package/dist/esm/packages/taco/src/components/Provider/Localization.js +13 -6
  29. package/dist/esm/packages/taco/src/components/Provider/Localization.js.map +1 -1
  30. package/dist/esm/packages/taco/src/components/SearchInput/SearchInput.js +1 -0
  31. package/dist/esm/packages/taco/src/components/SearchInput/SearchInput.js.map +1 -1
  32. package/dist/esm/packages/taco/src/components/Select2/components/Collection.js +2 -1
  33. package/dist/esm/packages/taco/src/components/Select2/components/Collection.js.map +1 -1
  34. package/dist/esm/packages/taco/src/components/Table2/Table2.js +21 -9
  35. package/dist/esm/packages/taco/src/components/Table2/Table2.js.map +1 -1
  36. package/dist/esm/packages/taco/src/components/Table2/components/ColumnSettingsButton.js +243 -111
  37. package/dist/esm/packages/taco/src/components/Table2/components/ColumnSettingsButton.js.map +1 -1
  38. package/dist/esm/packages/taco/src/components/Table2/components/column/Base.js +5 -5
  39. package/dist/esm/packages/taco/src/components/Table2/components/column/Base.js.map +1 -1
  40. package/dist/esm/packages/taco/src/components/Table2/components/column/Cell.js +76 -31
  41. package/dist/esm/packages/taco/src/components/Table2/components/column/Cell.js.map +1 -1
  42. package/dist/esm/packages/taco/src/components/Table2/components/column/Footer.js +2 -2
  43. package/dist/esm/packages/taco/src/components/Table2/components/column/Footer.js.map +1 -1
  44. package/dist/esm/packages/taco/src/components/Table2/components/column/Header.js +85 -19
  45. package/dist/esm/packages/taco/src/components/Table2/components/column/Header.js.map +1 -1
  46. package/dist/esm/packages/taco/src/components/Table2/components/row/ExpandedRow.js +3 -0
  47. package/dist/esm/packages/taco/src/components/Table2/components/row/ExpandedRow.js.map +1 -1
  48. package/dist/esm/packages/taco/src/components/Table2/hooks/listeners/useColumnOffsetStateListener.js +6 -3
  49. package/dist/esm/packages/taco/src/components/Table2/hooks/listeners/useColumnOffsetStateListener.js.map +1 -1
  50. package/dist/esm/packages/taco/src/components/Table2/hooks/listeners/useSettingsStateListener.js +2 -2
  51. package/dist/esm/packages/taco/src/components/Table2/hooks/listeners/useSettingsStateListener.js.map +1 -1
  52. package/dist/esm/packages/taco/src/components/Table2/hooks/useColumnDefinitions.js +6 -9
  53. package/dist/esm/packages/taco/src/components/Table2/hooks/useColumnDefinitions.js.map +1 -1
  54. package/dist/esm/packages/taco/src/components/Table2/hooks/useTable.js +14 -6
  55. package/dist/esm/packages/taco/src/components/Table2/hooks/useTable.js.map +1 -1
  56. package/dist/esm/packages/taco/src/components/Table2/types.js.map +1 -1
  57. package/dist/esm/packages/taco/src/components/Table2/utilities/cell.js +8 -8
  58. package/dist/esm/packages/taco/src/components/Table2/utilities/cell.js.map +1 -1
  59. package/dist/esm/packages/taco/src/components/Table2/utilities/columns.js +17 -8
  60. package/dist/esm/packages/taco/src/components/Table2/utilities/columns.js.map +1 -1
  61. package/dist/esm/packages/taco/src/components/Truncate/Truncate.js +32 -0
  62. package/dist/esm/packages/taco/src/components/Truncate/Truncate.js.map +1 -0
  63. package/dist/esm/packages/taco/src/index.js +1 -1
  64. package/dist/esm/packages/taco/src/primitives/Listbox2/components/Option.js +3 -1
  65. package/dist/esm/packages/taco/src/primitives/Listbox2/components/Option.js.map +1 -1
  66. package/dist/esm/packages/taco/src/primitives/Listbox2/components/Root.js +3 -1
  67. package/dist/esm/packages/taco/src/primitives/Listbox2/components/Root.js.map +1 -1
  68. package/dist/esm/packages/taco/src/primitives/Sortable/components/Item.js +5 -1
  69. package/dist/esm/packages/taco/src/primitives/Sortable/components/Item.js.map +1 -1
  70. package/dist/taco.cjs.development.js +576 -229
  71. package/dist/taco.cjs.development.js.map +1 -1
  72. package/dist/taco.cjs.production.min.js +1 -1
  73. package/dist/taco.cjs.production.min.js.map +1 -1
  74. package/package.json +2 -2
  75. package/types.json +68 -19
@@ -750,6 +750,36 @@ function IconClose(props, svgRef) {
750
750
  }
751
751
  var Close = /*#__PURE__*/React.forwardRef(IconClose);
752
752
 
753
+ function IconColumnFreeze(props, svgRef) {
754
+ return /*#__PURE__*/React.createElement("svg", Object.assign({
755
+ fill: "none",
756
+ xmlns: "http://www.w3.org/2000/svg",
757
+ viewBox: "0 0 24 24",
758
+ ref: svgRef
759
+ }, props), /*#__PURE__*/React.createElement("path", {
760
+ fillRule: "evenodd",
761
+ clipRule: "evenodd",
762
+ d: "M14 4.5h-4v15h4v-15zm1.5 0v15h3.75a.25.25 0 00.25-.25V4.75a.25.25 0 00-.25-.25H15.5zM4.75 3A1.75 1.75 0 003 4.75v14.5c0 .966.784 1.75 1.75 1.75h14.5A1.75 1.75 0 0021 19.25V4.75A1.75 1.75 0 0019.25 3H4.75z",
763
+ fill: "currentColor"
764
+ }));
765
+ }
766
+ var ColumnFreeze = /*#__PURE__*/React.forwardRef(IconColumnFreeze);
767
+
768
+ function IconColumnUnfreeze(props, svgRef) {
769
+ return /*#__PURE__*/React.createElement("svg", Object.assign({
770
+ fill: "none",
771
+ xmlns: "http://www.w3.org/2000/svg",
772
+ viewBox: "0 0 24 24",
773
+ ref: svgRef
774
+ }, props), /*#__PURE__*/React.createElement("path", {
775
+ fillRule: "evenodd",
776
+ clipRule: "evenodd",
777
+ d: "M9.6 4.5H14v15h-2.378a2.26 2.26 0 010 1.5h7.628A1.75 1.75 0 0021 19.25V4.75A1.75 1.75 0 0019.25 3H4.75A1.75 1.75 0 003 4.75v6.75c.576 0 1.152.22 1.591.659l1.659 1.659 1.659-1.659a2.244 2.244 0 011.691-.657V4.5zm5.9 15v-15h3.75a.25.25 0 01.25.25v14.5a.25.25 0 01-.25.25H15.5zM2.47 20.78a.75.75 0 010-1.06L5.19 17l-2.72-2.72a.75.75 0 111.06-1.06l2.72 2.72 2.72-2.72a.75.75 0 111.06 1.06L7.31 17l2.72 2.72a.75.75 0 11-1.06 1.06l-2.72-2.72-2.72 2.72a.75.75 0 01-1.06 0z",
778
+ fill: "currentColor"
779
+ }));
780
+ }
781
+ var ColumnUnfreeze = /*#__PURE__*/React.forwardRef(IconColumnUnfreeze);
782
+
753
783
  function IconColumns(props, svgRef) {
754
784
  return /*#__PURE__*/React.createElement("svg", Object.assign({
755
785
  fill: "none",
@@ -3036,6 +3066,8 @@ const icons = {
3036
3066
  'clamp-open': ClampOpen,
3037
3067
  clamp: Clamp,
3038
3068
  close: Close,
3069
+ 'column-freeze': ColumnFreeze,
3070
+ 'column-unfreeze': ColumnUnfreeze,
3039
3071
  columns: Columns,
3040
3072
  'connection-enable': ConnectionEnable,
3041
3073
  'connection-revoke': ConnectionRevoke,
@@ -3825,15 +3857,22 @@ const defaultLocalisationTexts = {
3825
3857
  deselectAll: 'Deselect all rows',
3826
3858
  select: 'Select row',
3827
3859
  selectAll: 'Select all rows'
3860
+ },
3861
+ menu: {
3862
+ freezeColumns: (count = 1) => count === 1 ? 'Freeze the first column' : `Freeze first ${count} columns`,
3863
+ unfreezeColumns: 'Unfreeze all columns'
3828
3864
  }
3829
3865
  },
3830
3866
  columnSettings: {
3831
- columnsOther: 'Other columns',
3832
- columnsOtherDrop: 'Drop column here to unpin',
3833
- columnsPinned: 'Pinned columns',
3834
- columnsPinnedDrop: 'Drop column here to pin',
3867
+ columnsHidden: 'Hidden columns',
3868
+ columnsHiddenDrop: 'Drop column here to hide',
3869
+ columnsVisible: 'Visible columns',
3870
+ columnsVisibleDrop: 'Drop column here to show',
3871
+ noHiddenColumns: 'No hidden columns',
3872
+ noVisibleColumns: 'No visible columns',
3835
3873
  search: 'Search column...',
3836
- tooltip: 'Column settings'
3874
+ tooltip: 'Column settings',
3875
+ button: 'Columns'
3837
3876
  },
3838
3877
  editing: {
3839
3878
  button: 'Edit',
@@ -4380,6 +4419,8 @@ const InputWithoutDeprecatedFeatures = /*#__PURE__*/React.forwardRef(function In
4380
4419
  className: className,
4381
4420
  "data-taco": "input",
4382
4421
  onKeyDown: handleKeyDown,
4422
+ "aria-invalid": invalid,
4423
+ "data-highlighted": highlighted,
4383
4424
  ref: internalRef,
4384
4425
  style: {
4385
4426
  paddingLeft: prefixRect ? `${prefixRect.width - 1}px` : undefined,
@@ -4404,20 +4445,18 @@ const Affix = /*#__PURE__*/React.memo( /*#__PURE__*/React.forwardRef(function Af
4404
4445
  disabled,
4405
4446
  type
4406
4447
  } = props;
4407
- if (children) {
4408
- return /*#__PURE__*/React.createElement("div", {
4409
- className: cn('group absolute top-0 flex h-full items-center justify-center px-2',
4410
- // icon
4411
- '[&_[data-taco="icon"]]:!h-5 [&_[data-taco="icon"]]:!w-5', {
4412
- 'text-grey-300': disabled,
4413
- 'text-grey-700': !disabled,
4414
- 'left-0 [&>button]:!-ml-2': type === 'prefix',
4415
- 'right-0 [&>button]:!-mr-2': type === 'postfix'
4416
- }),
4417
- ref: ref
4418
- }, children);
4419
- }
4420
- return null;
4448
+ return /*#__PURE__*/React.createElement("div", {
4449
+ className: cn('group absolute top-0 flex h-full items-center justify-center px-2',
4450
+ // icon
4451
+ '[&_[data-taco="icon"]]:!h-5 [&_[data-taco="icon"]]:!w-5', {
4452
+ 'text-grey-300': disabled,
4453
+ 'text-grey-700': !disabled,
4454
+ 'left-0 [&>button]:!-ml-2': type === 'prefix',
4455
+ 'right-0 [&>button]:!-mr-2': type === 'postfix'
4456
+ }),
4457
+ "data-affix-type": type,
4458
+ ref: ref
4459
+ }, children);
4421
4460
  }));
4422
4461
  const Input = /*#__PURE__*/React.forwardRef(function LegacyInput(props, ref) {
4423
4462
  var _attributes$postfix;
@@ -8317,6 +8356,7 @@ const SearchInput = /*#__PURE__*/React.forwardRef(function SearchInput({
8317
8356
  onKeyDown: handleKeyDown,
8318
8357
  postfix: /*#__PURE__*/React.createElement(React.Fragment, null, props.disabled || props.readOnly || !props.value ? null : /*#__PURE__*/React.createElement(IconButton, {
8319
8358
  "aria-hidden": true,
8359
+ "aria-label": texts.searchInput.clear,
8320
8360
  className: "group-peer-focus:visible group-peer-hover:visible !text-grey-700 invisible mr-0.5 !h-5 !min-h-[theme(spacing.4)] !w-5 !min-w-[theme(spacing.4)] text-xs hover:visible group-hover:visible",
8321
8361
  icon: "close",
8322
8362
  onClick: handleCancelClick,
@@ -8523,7 +8563,9 @@ const Root$1 = /*#__PURE__*/React__default.forwardRef(function Listbox2(props, r
8523
8563
  value,
8524
8564
  ...otherProps
8525
8565
  } = props;
8526
- const id = useId(nativeId);
8566
+ // The id name cannot start with a number, otherwise unit tests will fail when trying to querry element with such id.
8567
+ // That's why adding prefix.
8568
+ const id = 'listbox2-' + useId(nativeId);
8527
8569
  const context = React__default.useMemo(() => ({
8528
8570
  disabled,
8529
8571
  readOnly,
@@ -8578,7 +8620,9 @@ const Option = /*#__PURE__*/React__default.forwardRef(function Listbox2Option(pr
8578
8620
  setValue,
8579
8621
  value: currentValue
8580
8622
  } = useListbox2Context();
8581
- const id = useId(nativeId);
8623
+ // The id name cannot start with a number, otherwise unit tests will fail when trying to querry element with such id.
8624
+ // That's why adding prefix.
8625
+ const id = 'option-' + useId(nativeId);
8582
8626
  const selected = Array.isArray(currentValue) ? currentValue.includes(value) : currentValue === value;
8583
8627
  const handleClick = event => {
8584
8628
  if (disabled || listboxDisabled || listboxReadOnly) {
@@ -9509,8 +9553,9 @@ const Collection$1 = props => {
9509
9553
  const {
9510
9554
  children
9511
9555
  } = props;
9556
+ // max-h-[11.5rem] = is 5.5 options + spacing between them. Option height is 2rem, spacing 0.125. In total it's 11.5.
9512
9557
  return /*#__PURE__*/React__default.createElement(ScrollArea, {
9513
- className: "flex max-h-[10.3rem] w-full flex-col gap-y-0.5 px-1.5"
9558
+ className: "flex max-h-[11.5rem] w-full flex-col gap-y-0.5 px-1.5"
9514
9559
  }, children);
9515
9560
  };
9516
9561
 
@@ -11328,6 +11373,7 @@ const COLUMN_ID_FOR_DRAGGABLE = '__draggable';
11328
11373
  const COLUMN_ID_FOR_SELECTION = '__select';
11329
11374
  const COLUMN_ID_FOR_EXPANSION = '__expansion';
11330
11375
  const COLUMN_ID_FOR_ACTIONS = '__actions';
11376
+ const isInternalFrozenColumn = id => isInternalColumn(id) && id !== COLUMN_ID_FOR_ACTIONS;
11331
11377
  const isInternalColumn = id => id === COLUMN_ID_FOR_SELECTION || id === COLUMN_ID_FOR_EXPANSION || id === COLUMN_ID_FOR_ACTIONS || id === COLUMN_ID_FOR_DRAGGABLE;
11332
11378
  const MIN_COLUMN_SIZE = 80; // accounts for padding and sort controls
11333
11379
  const toggleBetween$1 = (fromRowIndex, toRowIndex) => {
@@ -11504,6 +11550,7 @@ function createRowSelectionColumn(enableMultipleRowSelection, lastSelectedRowInd
11504
11550
  }
11505
11551
  const ExpandCell = /*#__PURE__*/React__default.memo(({
11506
11552
  expandedRowRenderer,
11553
+ isExpanded,
11507
11554
  row,
11508
11555
  texts
11509
11556
  }) => {
@@ -11511,7 +11558,6 @@ const ExpandCell = /*#__PURE__*/React__default.memo(({
11511
11558
  if (!hasExpandedRow) {
11512
11559
  return null;
11513
11560
  }
11514
- const isExpanded = row.getIsExpanded();
11515
11561
  return /*#__PURE__*/React__default.createElement(Tooltip, {
11516
11562
  title: /*#__PURE__*/React__default.createElement(React__default.Fragment, null, isExpanded ? texts.table2.columns.expansion.collapse : texts.table2.columns.expansion.expand, /*#__PURE__*/React__default.createElement(Shortcut$1, {
11517
11563
  className: "ml-2",
@@ -11548,8 +11594,13 @@ function createRowExpansionColumn(expandedRowRenderer, texts) {
11548
11594
  })),
11549
11595
  cell: ({
11550
11596
  row
11551
- }) => /*#__PURE__*/React__default.createElement(ExpandCell, {
11597
+ }) =>
11598
+ /*#__PURE__*/
11599
+ // ExpandCell is memoised and that's why calling row.getIsExpanded() inside it doesn't return the correct
11600
+ // expand state. This is the reason why isExpanded is pulled out of the ExpandCell component.
11601
+ React__default.createElement(ExpandCell, {
11552
11602
  expandedRowRenderer: expandedRowRenderer,
11603
+ isExpanded: row.getIsExpanded(),
11553
11604
  row: row,
11554
11605
  texts: texts
11555
11606
  }),
@@ -11654,11 +11705,14 @@ function createRowActionsColumn(rowActions, texts) {
11654
11705
  align: 'right',
11655
11706
  className: (row, table) => {
11656
11707
  var _table$options$meta3;
11657
- return cn('items-center print:opacity-0 group-[[aria-current]]/row:sticky group-hover/row:sticky right-0 !px-1', {
11658
- 'group-[[aria-current]]/row:!shadow-[-6px_0px_6px_theme(colors.grey.200)]': !row.getIsSelected(),
11659
- 'group-hover/row:!shadow-[-6px_0px_6px_theme(colors.grey.100)]': !row.getIsSelected() && (!((_table$options$meta3 = table.options.meta) !== null && _table$options$meta3 !== void 0 && _table$options$meta3.shouldPauseHoverState) || table.options.meta.editMode.isEditing),
11660
- 'shadow-[-6px_0px_6px_theme(colors.blue.100)]': row.getIsSelected()
11661
- });
11708
+ return (
11709
+ // Adding z-index so that it shows on top of frozen columns
11710
+ cn('items-center print:opacity-0 group-[[aria-current]]/row:sticky group-hover/row:sticky right-0 !px-1 z-[1]', {
11711
+ 'group-[[aria-current]]/row:!shadow-[-6px_0px_6px_theme(colors.grey.200)]': !row.getIsSelected(),
11712
+ 'group-hover/row:!shadow-[-6px_0px_6px_theme(colors.grey.100)]': !row.getIsSelected() && (!((_table$options$meta3 = table.options.meta) !== null && _table$options$meta3 !== void 0 && _table$options$meta3.shouldPauseHoverState) || table.options.meta.editMode.isEditing),
11713
+ 'shadow-[-6px_0px_6px_theme(colors.blue.100)]': row.getIsSelected()
11714
+ })
11715
+ );
11662
11716
  },
11663
11717
  headerClassName: 'hover:!bg-white !px-1'
11664
11718
  },
@@ -11687,15 +11741,15 @@ const getCellAlignmentClasses = (alignment = 'left') => ({
11687
11741
  'justify-end text-right': alignment === 'right',
11688
11742
  'justify-center text-center': alignment === 'center'
11689
11743
  });
11690
- const getPinnedShadowClasses = (column, columnPinning, isHorizontallyOffset) => {
11691
- const pinned = !!column.getIsPinned();
11744
+ const getFrozenShadowClasses = (column, frozenColumns, isHorizontallyOffset) => {
11745
+ const frozen = !!column.getIsPinned();
11692
11746
  // react-table has column.getPinnedIndex() but it does not exclude hidden columns, so the number is wrong
11693
- const pinnedIndex = columnPinning.indexOf(column.id);
11694
- const isLastPinned = pinned && pinnedIndex === columnPinning.length - 1;
11695
- const hidePinnedShadow = !isHorizontallyOffset && (column.id === COLUMN_ID_FOR_EXPANSION || column.id === COLUMN_ID_FOR_SELECTION);
11747
+ const frozenColumnIndex = frozenColumns.indexOf(column.id);
11748
+ const isLastFrozen = frozen && frozenColumnIndex === frozenColumns.length - 1;
11749
+ const hideFrozenShadow = !isHorizontallyOffset && (column.id === COLUMN_ID_FOR_EXPANSION || column.id === COLUMN_ID_FOR_SELECTION);
11696
11750
  return {
11697
- 'shadow-[6px_0px_6px_rgb(0_0_0/8%),1px_0px_0px_theme(colors.grey.300)]': isLastPinned && isHorizontallyOffset,
11698
- 'shadow-[1px_0px_0px_theme(colors.grey.300)]': isLastPinned && !isHorizontallyOffset && !hidePinnedShadow
11751
+ 'shadow-[6px_0px_6px_rgb(0_0_0/8%),1px_0px_0px_theme(colors.grey.300)]': isLastFrozen && isHorizontallyOffset,
11752
+ 'shadow-[1px_0px_0px_theme(colors.grey.300)]': isLastFrozen && !isHorizontallyOffset && !hideFrozenShadow
11699
11753
  };
11700
11754
  };
11701
11755
  const isKeyboardFocusableElement = element => {
@@ -11712,18 +11766,18 @@ const ColumnBase = /*#__PURE__*/React__default.forwardRef(function Table2ColumnB
11712
11766
  table,
11713
11767
  ...attributes
11714
11768
  } = props;
11715
- const pinned = !!column.getIsPinned();
11769
+ const isFrozenColumn = !!column.getIsPinned();
11716
11770
  const meta = table.options.meta;
11717
11771
  const left = meta.columnOffsets[column.id];
11718
- const columnPinning = table.getLeftVisibleLeafColumns().map(c => c.id);
11719
- const className = cn('border-grey-300', getPinnedShadowClasses(column, columnPinning, scrolled), getCellAlignmentClasses((_column$columnDef$met = column.columnDef.meta) === null || _column$columnDef$met === void 0 ? void 0 : _column$columnDef$met.align), {
11772
+ const columnFreezing = table.getLeftVisibleLeafColumns().map(c => c.id);
11773
+ const className = cn('border-grey-300', getFrozenShadowClasses(column, columnFreezing, scrolled), getCellAlignmentClasses((_column$columnDef$met = column.columnDef.meta) === null || _column$columnDef$met === void 0 ? void 0 : _column$columnDef$met.align), {
11720
11774
  'cursor-pointer': !!attributes.onClick
11721
11775
  }, attributes.className);
11722
11776
  return /*#__PURE__*/React__default.createElement("div", Object.assign({}, attributes, {
11723
11777
  className: className,
11724
11778
  style: {
11725
11779
  ...style,
11726
- left: pinned && Number.isInteger(left) ? left : undefined
11780
+ left: isFrozenColumn && Number.isInteger(left) ? left : undefined
11727
11781
  },
11728
11782
  ref: ref
11729
11783
  }));
@@ -12115,7 +12169,7 @@ const Cell = function Cell(props) {
12115
12169
  const controlRef = React__default.useRef(null);
12116
12170
  const cellClassName = (_cell$column$columnDe = cell.column.columnDef.meta) === null || _cell$column$columnDe === void 0 ? void 0 : _cell$column$columnDe.className;
12117
12171
  const isActiveRow = meta.activeRowIndex === rowIndex;
12118
- const isPinned = !!cell.column.getIsPinned();
12172
+ const isFrozen = !!cell.column.getIsPinned();
12119
12173
  const isDragging = meta.dragging[cell.row.id];
12120
12174
  const isSelected = cell.row.getIsSelected();
12121
12175
  const isDataColumn = !isInternalColumn(cell.column.id);
@@ -12141,7 +12195,7 @@ const Cell = function Cell(props) {
12141
12195
  }, [isIndicatorVisible, isLastRow]);
12142
12196
  const className = cn('[&>[data-taco="tag"]]:-my-0.5', {
12143
12197
  'border-b': !isLastRow,
12144
- 'sticky z-[1]': isPinned,
12198
+ 'sticky z-[1]': isFrozen,
12145
12199
  // use isHoveredRow rather than css group-hover/row because we want to hide hover state when keyboard navigating
12146
12200
  'bg-white': !isActiveRow && !isSelected,
12147
12201
  'group-hover/row:bg-grey-100': !isActiveRow && !isSelected && !meta.shouldPauseHoverState,
@@ -12150,10 +12204,10 @@ const Cell = function Cell(props) {
12150
12204
  '!wcag-blue-500': isDragging,
12151
12205
  '[&>*]:!grayscale [&_.bg-white]:!bg-grey-100': !isEditingThisRow && isHoveringThisRowWhileEditing,
12152
12206
  '!bg-red-100': hasValidationErrorsInRow,
12153
- 'z-[1]': isPinned && isActiveRow,
12207
+ 'z-[1]': isFrozen && isActiveRow,
12154
12208
  // First column should have higher z-index so that row indicator always show on top of the cell
12155
- // control components.
12156
- 'z-[2]': isPinned && isActiveRow && index === 0,
12209
+ // control components. A z-index of 3, will show the indicator when columns are pinned.
12210
+ 'z-[3]': isFrozen && isActiveRow && index === 0,
12157
12211
  'border-blue !border-y-2 border-x-0': isIndicatorVisible,
12158
12212
  'border-l-2 rounded-l': isIndicatorVisible && index === 0,
12159
12213
  'border-r-2 rounded-r': isIndicatorVisible && index === lastColumnIndex
@@ -12193,9 +12247,6 @@ const Cell = function Cell(props) {
12193
12247
  role: 'cell'
12194
12248
  };
12195
12249
  const [detailModeEditing, setDetailModeEditing] = React__default.useState(false);
12196
- const detailModeClassName = cn({
12197
- '!shadow-[0_0_0_4px_rgba(0,99,255,0.25)]': detailModeEditing
12198
- });
12199
12250
  // reset the editing state when we move column
12200
12251
  React__default.useEffect(() => {
12201
12252
  if (meta.editMode.columnIndex !== index) {
@@ -12234,6 +12285,9 @@ const Cell = function Cell(props) {
12234
12285
  }
12235
12286
  }
12236
12287
  };
12288
+ attributes.onBlur = () => {
12289
+ setDetailModeEditing(false);
12290
+ };
12237
12291
  if (canEditThisCell) {
12238
12292
  var _allFocussableColumnI, _allFocussableColumnI2;
12239
12293
  const firstDataColumnIndex = (_allFocussableColumnI = allFocussableColumnIndexes.at(0)) !== null && _allFocussableColumnI !== void 0 ? _allFocussableColumnI : 0;
@@ -12253,18 +12307,24 @@ const Cell = function Cell(props) {
12253
12307
  if (!detailModeEditing) {
12254
12308
  var _input$setSelectionRa, _input$value, _input$value2;
12255
12309
  (_input$setSelectionRa = input.setSelectionRange) === null || _input$setSelectionRa === void 0 ? void 0 : _input$setSelectionRa.call(input, (_input$value = input.value) === null || _input$value === void 0 ? void 0 : _input$value.length, (_input$value2 = input.value) === null || _input$value2 === void 0 ? void 0 : _input$value2.length);
12256
- setDetailModeEditing(true);
12310
+ } else {
12311
+ var _input$select;
12312
+ input === null || input === void 0 ? void 0 : (_input$select = input.select) === null || _input$select === void 0 ? void 0 : _input$select.call(input);
12257
12313
  }
12314
+ setDetailModeEditing(!detailModeEditing);
12258
12315
  return;
12259
12316
  }
12317
+ // Datepicker doesn't have keydown event handler its value doesn't change when user types inside
12318
+ // datepicker input, so we need to explicitly enable detail editing mode on typing any alphanumeric
12319
+ // character
12320
+ if (control !== null && control !== void 0 && control.closest('[data-taco="datepicker"]') && /^[a-z0-9]$/i.test(event.key)) {
12321
+ setDetailModeEditing(true);
12322
+ }
12260
12323
  }
12261
12324
  // Don't exit edit mode if the target of the escape isn't a child of the cell (e.g. if its a popover).
12262
12325
  if (event.key === 'Escape' && event.currentTarget.contains(control)) {
12263
12326
  event.preventDefault();
12264
- const input = control;
12265
12327
  if (detailModeEditing) {
12266
- var _input$select;
12267
- input === null || input === void 0 ? void 0 : (_input$select = input.select) === null || _input$select === void 0 ? void 0 : _input$select.call(input);
12268
12328
  setDetailModeEditing(false);
12269
12329
  } else {
12270
12330
  var _tableRef$current3;
@@ -12347,7 +12407,7 @@ const Cell = function Cell(props) {
12347
12407
  };
12348
12408
  }
12349
12409
  return /*#__PURE__*/React__default.createElement(ColumnBase, Object.assign({}, attributes), /*#__PURE__*/React__default.createElement(EditingCell, {
12350
- detailModeClassName: detailModeClassName,
12410
+ detailModeEditing: detailModeEditing,
12351
12411
  cell: cell,
12352
12412
  cellRef: internalRef,
12353
12413
  columnIndex: index,
@@ -12358,7 +12418,12 @@ const Cell = function Cell(props) {
12358
12418
  tableRef: tableRef,
12359
12419
  ref: controlRef,
12360
12420
  rowValues: rows[rowIndex].original,
12361
- rowsLength: rows.length
12421
+ rowsLength: rows.length,
12422
+ enableDetailModeEditing: () => {
12423
+ if (!detailModeEditing) {
12424
+ setDetailModeEditing(true);
12425
+ }
12426
+ }
12362
12427
  }));
12363
12428
  } else {
12364
12429
  if (meta.onRowClick) {
@@ -12379,13 +12444,14 @@ const EditingCell = /*#__PURE__*/React__default.memo( /*#__PURE__*/React__defaul
12379
12444
  cell,
12380
12445
  cellRef,
12381
12446
  columnIndex,
12382
- detailModeClassName,
12447
+ detailModeEditing,
12383
12448
  isEditingThisCell = false,
12384
12449
  onSave: handleSave,
12385
12450
  rowIndex,
12386
12451
  rowValues,
12387
12452
  table,
12388
- tableRef
12453
+ tableRef,
12454
+ enableDetailModeEditing
12389
12455
  } = props;
12390
12456
  const {
12391
12457
  editMode: {
@@ -12410,6 +12476,7 @@ const EditingCell = /*#__PURE__*/React__default.memo( /*#__PURE__*/React__defaul
12410
12476
  const hasValidationError = !isHoveringAnotherRowWhileEditing && !!cellValidationError;
12411
12477
  // On each save, the initialValue will be set to the new value of the cell
12412
12478
  const initialValue = React__default.useRef(value);
12479
+ const stateReset = React__default.useRef(false);
12413
12480
  // It is important that we let consumers pass a newValue as an argument because when setState is called before
12414
12481
  // onBlur then saveIfChanged method gets the stale state value. This happens because the rerender hasn't happened
12415
12482
  // before the saveIfChanged method is called.
@@ -12470,15 +12537,39 @@ const EditingCell = /*#__PURE__*/React__default.memo( /*#__PURE__*/React__defaul
12470
12537
  const pinnedColumnsWidth = React__default.useMemo(() => {
12471
12538
  const pinnedColumns = table.getState().columnPinning.left;
12472
12539
  if (Array.isArray(pinnedColumns) && pinnedColumns.length > 0) {
12473
- const lastPinnedColumn = pinnedColumns[pinnedColumns.length - 1];
12474
- const lastPinnedColumnOffset = meta.columnOffsets[lastPinnedColumn];
12475
- if (lastPinnedColumnOffset !== undefined) {
12540
+ const lastFrozenColumn = pinnedColumns[pinnedColumns.length - 1];
12541
+ const lastFrozenColumnOffset = meta.columnOffsets[lastFrozenColumn];
12542
+ if (lastFrozenColumnOffset !== undefined) {
12476
12543
  var _table$getState$colum;
12477
- return lastPinnedColumnOffset + ((_table$getState$colum = table.getState().columnSizing[lastPinnedColumn]) !== null && _table$getState$colum !== void 0 ? _table$getState$colum : 0);
12544
+ return lastFrozenColumnOffset + ((_table$getState$colum = table.getState().columnSizing[lastFrozenColumn]) !== null && _table$getState$colum !== void 0 ? _table$getState$colum : 0);
12478
12545
  }
12479
12546
  }
12480
12547
  return 0;
12481
12548
  }, [meta.columnOffsets, table.getState().columnSizing]);
12549
+ React__default.useEffect(() => {
12550
+ if (hasChanged(initialValue.current, state)) {
12551
+ var _controlRef$current2;
12552
+ // For an input we want to make sure that if the value is changed then we go into detail mode, so that
12553
+ // arrow keys doesn't trigger the quick mode shortcuts.
12554
+ if (((_controlRef$current2 = controlRef.current) === null || _controlRef$current2 === void 0 ? void 0 : _controlRef$current2.nodeName) === 'INPUT') {
12555
+ enableDetailModeEditing();
12556
+ }
12557
+ showIndicator();
12558
+ } else {
12559
+ hideIndicator();
12560
+ }
12561
+ return hideIndicator;
12562
+ }, [state]);
12563
+ // This effect makes sure we select the input control value when escape key is pressed
12564
+ React__default.useEffect(() => {
12565
+ var _controlRef$current3, _controlRef$current4;
12566
+ const isControlInput = ((_controlRef$current3 = controlRef.current) === null || _controlRef$current3 === void 0 ? void 0 : _controlRef$current3.nodeName) === 'INPUT' && ((_controlRef$current4 = controlRef.current) === null || _controlRef$current4 === void 0 ? void 0 : _controlRef$current4.getAttribute('data-inline-editing-component')) === 'true';
12567
+ if (stateReset.current && isControlInput) {
12568
+ var _controlRef$current5;
12569
+ (_controlRef$current5 = controlRef.current) === null || _controlRef$current5 === void 0 ? void 0 : _controlRef$current5.select();
12570
+ }
12571
+ stateReset.current = false;
12572
+ }, [stateReset.current]);
12482
12573
  const handleFocus = event => {
12483
12574
  var _event$target, _cellRef$current;
12484
12575
  meta.editMode.setColumn(columnIndex);
@@ -12494,14 +12585,17 @@ const EditingCell = /*#__PURE__*/React__default.memo( /*#__PURE__*/React__defaul
12494
12585
  (_tableRef$current4 = tableRef.current) === null || _tableRef$current4 === void 0 ? void 0 : _tableRef$current4.scrollTo(leftOffset - pinnedColumnsWidth, tableRef.current.scrollTop);
12495
12586
  }
12496
12587
  };
12497
- React__default.useEffect(() => {
12498
- if (hasChanged(initialValue.current, state)) {
12499
- showIndicator();
12500
- } else {
12501
- hideIndicator();
12588
+ // In order to reset the value of an input when escape key is pressed this keydown handler is required.
12589
+ // Instead of adding this event handler in parent component, this handler is added here because we have access
12590
+ // to the state handler of the control component.
12591
+ const handleKeyDown = event => {
12592
+ const control = event.target;
12593
+ const isControlInput = control.nodeName === 'INPUT' && (control === null || control === void 0 ? void 0 : control.getAttribute('data-inline-editing-component')) === 'true';
12594
+ if (isControlInput && event.key === 'Escape') {
12595
+ setState(initialValue.current);
12596
+ stateReset.current = true;
12502
12597
  }
12503
- return hideIndicator;
12504
- }, [state]);
12598
+ };
12505
12599
  const showIndicator = () => {
12506
12600
  var _table$getState$sorti;
12507
12601
  let willRowMoveReason = null;
@@ -12550,6 +12644,9 @@ const EditingCell = /*#__PURE__*/React__default.memo( /*#__PURE__*/React__defaul
12550
12644
  const className = cn(getCellAlignmentClasses((_cell$column$columnDe4 = cell.column.columnDef.meta) === null || _cell$column$columnDe4 === void 0 ? void 0 : _cell$column$columnDe4.align));
12551
12645
  const indicatorMountNode = (_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.querySelector(':first-child');
12552
12646
  let controlComponent;
12647
+ const detailModeClassName = cn({
12648
+ '!shadow-[0_0_0_4px_rgba(0,99,255,0.25)]': detailModeEditing
12649
+ });
12553
12650
  if (cellControl) {
12554
12651
  if (typeof cellControl === 'function') {
12555
12652
  controlComponent = cellControl({
@@ -12559,14 +12656,15 @@ const EditingCell = /*#__PURE__*/React__default.memo( /*#__PURE__*/React__defaul
12559
12656
  ref: controlRef,
12560
12657
  setValue: setState,
12561
12658
  value: state,
12562
- 'data-inline-editing-component': 'true',
12563
- className: detailModeClassName
12659
+ 'data-inline-editing-component': 'true'
12564
12660
  }, cell.row.original);
12565
12661
  } else {
12566
12662
  switch (cellControl) {
12567
12663
  case 'datepicker':
12568
12664
  controlComponent = /*#__PURE__*/React__default.createElement(Datepicker, Object.assign({}, attributes, {
12569
- className: detailModeClassName,
12665
+ className: cn({
12666
+ '[&_input]:!shadow-[0_0_0_4px_rgba(0,99,255,0.25)]': detailModeEditing
12667
+ }),
12570
12668
  invalid: hasValidationError,
12571
12669
  onBlur: event => {
12572
12670
  const newDate = event.detail;
@@ -12595,7 +12693,8 @@ const EditingCell = /*#__PURE__*/React__default.memo( /*#__PURE__*/React__defaul
12595
12693
  setState(event.target.value);
12596
12694
  },
12597
12695
  ref: controlRef,
12598
- value: String(state !== null && state !== void 0 ? state : '')
12696
+ value: String(state !== null && state !== void 0 ? state : ''),
12697
+ onKeyDown: handleKeyDown
12599
12698
  }));
12600
12699
  break;
12601
12700
  }
@@ -12613,7 +12712,7 @@ const EditingCell = /*#__PURE__*/React__default.memo( /*#__PURE__*/React__defaul
12613
12712
  }));
12614
12713
 
12615
12714
  const Header$1 = function Header(props) {
12616
- var _header$column$column, _header$column$column2, _asc$desc$header$colu, _header$column$column4, _header$column$column5, _header$column$column6, _header$column$column7, _asc$desc$header$colu2, _header$column$column8;
12715
+ var _header$column$column, _header$column$column2, _asc$desc$header$colu, _header$column$column4, _header$column$column5, _header$column$column6, _header$column$column7, _asc$desc$header$colu2, _header$column$column8, _header$column$column9;
12617
12716
  const {
12618
12717
  header,
12619
12718
  index,
@@ -12623,11 +12722,14 @@ const Header$1 = function Header(props) {
12623
12722
  ...columnProps
12624
12723
  } = props;
12625
12724
  const textRef = React__default.useRef(null);
12626
- const pinned = !!header.column.getIsPinned();
12725
+ const frozen = !!header.column.getIsPinned();
12627
12726
  const isOtherColumnBeingResized = table.getState().columnSizingInfo.isResizingColumn && table.getState().columnSizingInfo.isResizingColumn !== header.id;
12727
+ const {
12728
+ enableColumnFreezing
12729
+ } = table.options.meta;
12628
12730
  const className = cn('group/header sticky top-0 bg-white border-b-2 relative font-bold z-[5] hover:z-[6]', {
12629
12731
  'z-[6]': header.column.getIsResizing(),
12630
- 'z-[7]': pinned,
12732
+ 'z-[7]': frozen,
12631
12733
  'cursor-pointer select-none': header.column.getCanSort(),
12632
12734
  'hover:bg-grey-100': header.column.getCanSort() || header.column.getCanResize() || ((_header$column$column = header.column.columnDef.meta) === null || _header$column$column === void 0 ? void 0 : _header$column$column.menu),
12633
12735
  'pointer-events-none': isOtherColumnBeingResized
@@ -12639,7 +12741,7 @@ const Header$1 = function Header(props) {
12639
12741
  const size = Math.ceil(node.getBoundingClientRect().width);
12640
12742
  table.setColumnSizing(sizes => ({
12641
12743
  ...sizes,
12642
- [header.id]: !isInternalColumn(header.id) && size < MIN_COLUMN_SIZE ? MIN_COLUMN_SIZE : size
12744
+ [header.id]: !isInternalFrozenColumn(header.id) && size < MIN_COLUMN_SIZE ? MIN_COLUMN_SIZE : size
12643
12745
  }));
12644
12746
  }
12645
12747
  };
@@ -12663,7 +12765,7 @@ const Header$1 = function Header(props) {
12663
12765
  ...sizes
12664
12766
  };
12665
12767
  if (size) {
12666
- nextSizes[header.id] = !isInternalColumn(header.id) && size < MIN_COLUMN_SIZE ? MIN_COLUMN_SIZE : size;
12768
+ nextSizes[header.id] = !isInternalFrozenColumn(header.id) && size < MIN_COLUMN_SIZE ? MIN_COLUMN_SIZE : size;
12667
12769
  } else {
12668
12770
  delete nextSizes[header.id];
12669
12771
  }
@@ -12696,7 +12798,7 @@ const Header$1 = function Header(props) {
12696
12798
  ref: refCallback,
12697
12799
  role: "columnheader",
12698
12800
  "data-column-index": index
12699
- }), isInternalColumn(header.id) ? reactTable$1.flexRender(header.column.columnDef.header, header.getContext()) : /*#__PURE__*/React__default.createElement("div", {
12801
+ }), isInternalFrozenColumn(header.id) ? reactTable$1.flexRender(header.column.columnDef.header, header.getContext()) : /*#__PURE__*/React__default.createElement(React__default.Fragment, null, /*#__PURE__*/React__default.createElement("div", {
12700
12802
  className: cn('flex flex-grow overflow-hidden', {
12701
12803
  'group-hover/header:-ml-2': !!header.column.getIsSorted() && !!((_header$column$column4 = header.column.columnDef.meta) !== null && _header$column$column4 !== void 0 && _header$column$column4.menu)
12702
12804
  }, getCellAlignmentClasses((_header$column$column5 = header.column.columnDef.meta) === null || _header$column$column5 === void 0 ? void 0 : _header$column$column5.align))
@@ -12712,9 +12814,12 @@ const Header$1 = function Header(props) {
12712
12814
  name: "chevron-down-solid",
12713
12815
  className: "pointer-events-none -my-0.5"
12714
12816
  })
12715
- }[header.column.getIsSorted()]) !== null && _asc$desc$header$colu2 !== void 0 ? _asc$desc$header$colu2 : null), (_header$column$column8 = header.column.columnDef.meta) !== null && _header$column$column8 !== void 0 && _header$column$column8.menu ? /*#__PURE__*/React__default.createElement(HeaderMenu, {
12716
- header: header
12717
- }) : null, header.column.getCanResize() ? /*#__PURE__*/React__default.createElement(Tooltip, {
12817
+ }[header.column.getIsSorted()]) !== null && _asc$desc$header$colu2 !== void 0 ? _asc$desc$header$colu2 : null), (_header$column$column8 = header.column.columnDef.meta) !== null && _header$column$column8 !== void 0 && _header$column$column8.menu || enableColumnFreezing ? /*#__PURE__*/React__default.createElement(HeaderMenu, {
12818
+ menu: (_header$column$column9 = header.column.columnDef.meta) === null || _header$column$column9 === void 0 ? void 0 : _header$column$column9.menu,
12819
+ enableColumnFreezing: enableColumnFreezing,
12820
+ table: table,
12821
+ columnIndex: index
12822
+ }) : null), header.column.getCanResize() ? /*#__PURE__*/React__default.createElement(Tooltip, {
12718
12823
  placement: "top",
12719
12824
  title: "Resize column"
12720
12825
  }, /*#__PURE__*/React__default.createElement("div", {
@@ -12736,26 +12841,84 @@ const Header$1 = function Header(props) {
12736
12841
  }))) : null);
12737
12842
  };
12738
12843
  const HeaderMenu = ({
12739
- header
12844
+ menu,
12845
+ enableColumnFreezing,
12846
+ table,
12847
+ columnIndex
12740
12848
  }) => {
12741
12849
  const [open, setOpen] = React__default.useState(false);
12850
+ const {
12851
+ texts
12852
+ } = useLocalization();
12853
+ const {
12854
+ frozenColumnsCount,
12855
+ setFrozenColumnsCount
12856
+ } = table.options.meta;
12857
+ const columns = table.getAllLeafColumns();
12858
+ const {
12859
+ columnVisibility,
12860
+ columnOrder
12861
+ } = table.getState();
12862
+ const visibleInternalColumnsCount = React__default.useMemo(() => columns.filter(column => isInternalFrozenColumn(column.id)).length, [columns]);
12863
+ const columnPosition = columnIndex + 1;
12864
+ const externalFrozenColumnsCount = columnPosition - visibleInternalColumnsCount;
12865
+ const isSomeExternalColumnFrozen = frozenColumnsCount !== 0;
12866
+ const freeAllColumns = () => {
12867
+ setFrozenColumnsCount(0);
12868
+ };
12869
+ const freezeColumns = () => {
12870
+ setFrozenColumnsCount(externalFrozenColumnsCount);
12871
+ };
12742
12872
  const className = cn('-my-0.5 -mr-1 -ml-0.5 hidden !h-6 !min-h-[theme(spacing.6)] !w-6 !min-w-[theme(spacing.6)] flex-shrink-0 justify-end group-hover/header:flex', {
12743
12873
  '!flex': open
12744
12874
  });
12745
- return header.column.columnDef.meta ?
12746
- /*#__PURE__*/
12747
- // This div catches the mousedown events from menu item and menu trigger and prevents
12748
- // mousedown event from bubbling up to the Header component to prevent toggling sorting
12749
- React__default.createElement("div", {
12750
- onMouseDown: event => event.stopPropagation()
12751
- }, header.column.columnDef.meta.menu({
12875
+ const freezeMenuItems = [/*#__PURE__*/React__default.createElement(Menu$1.Item, {
12876
+ icon: "column-freeze",
12877
+ onClick: freezeColumns,
12878
+ key: "_freeze-columns_"
12879
+ }, texts.table2.columns.menu.freezeColumns(externalFrozenColumnsCount)), ...(isSomeExternalColumnFrozen ? [/*#__PURE__*/React__default.createElement(Menu$1.Item, {
12880
+ icon: "column-unfreeze",
12881
+ onClick: freeAllColumns,
12882
+ key: "_unfreeze-columns_"
12883
+ }, texts.table2.columns.menu.unfreezeColumns)] : [])];
12884
+ React__default.useEffect(() => {
12885
+ // Update column pinning/freezing whenever frozen columns count changes, or column order or visiblity changes
12886
+ const totalFrozenColumnsCount = visibleInternalColumnsCount + frozenColumnsCount;
12887
+ table.setColumnPinning({
12888
+ left: columns.slice(0, totalFrozenColumnsCount).map(column => column.id),
12889
+ right: []
12890
+ });
12891
+ }, [frozenColumnsCount, columnVisibility, columnOrder, visibleInternalColumnsCount]);
12892
+ const menuProps = {
12752
12893
  trigger: /*#__PURE__*/React__default.createElement(IconButton, {
12753
12894
  className: className,
12754
12895
  icon: "more"
12755
12896
  }),
12756
12897
  open: open,
12757
12898
  onChange: setOpen
12758
- })) : null;
12899
+ };
12900
+ let menuComponent = null;
12901
+ if (menu) {
12902
+ menuComponent = menu(menuProps);
12903
+ if (enableColumnFreezing) {
12904
+ const menuContent = React__default.Children.only(menuComponent.props.children);
12905
+ const menuContentChildren = React__default.Children.toArray(menuContent.props.children);
12906
+ const menuItemsWithFreezingItems = [...menuContentChildren, /*#__PURE__*/React__default.createElement(Menu$1.Separator, null), ...freezeMenuItems];
12907
+ const menuContentWithFreezingItems = /*#__PURE__*/React__default.createElement(Menu$1.Content, null, menuItemsWithFreezingItems.map((item, key) => /*#__PURE__*/React__default.cloneElement(item, {
12908
+ key
12909
+ })));
12910
+ menuComponent = /*#__PURE__*/React__default.cloneElement(menuComponent, {
12911
+ children: menuContentWithFreezingItems
12912
+ });
12913
+ }
12914
+ } else if (enableColumnFreezing) {
12915
+ menuComponent = /*#__PURE__*/React__default.createElement(Menu$1, Object.assign({}, menuProps), /*#__PURE__*/React__default.createElement(Menu$1.Content, null, freezeMenuItems));
12916
+ }
12917
+ // This div catches the mousedown events from menu item and menu trigger and prevents
12918
+ // mousedown event from bubbling up to the Header component to prevent toggling sorting
12919
+ return menuComponent ? /*#__PURE__*/React__default.createElement("div", {
12920
+ onMouseDown: event => event.stopPropagation()
12921
+ }, menuComponent) : null;
12759
12922
  };
12760
12923
 
12761
12924
  const Footer$3 = function Footer(props) {
@@ -12766,9 +12929,9 @@ const Footer$3 = function Footer(props) {
12766
12929
  table,
12767
12930
  ...columnProps
12768
12931
  } = props;
12769
- const isPinned = !!footer.column.getIsPinned();
12932
+ const isFrozen = !!footer.column.getIsPinned();
12770
12933
  const className = cn('group/header sticky bottom-0 bg-white border-t-2 relative', getCellSizingClasses('normal'), {
12771
- 'z-[1]': isPinned
12934
+ 'z-[1]': isFrozen
12772
12935
  }, props.className);
12773
12936
  return /*#__PURE__*/React__default.createElement(ColumnBase, Object.assign({}, columnProps, {
12774
12937
  // base props
@@ -12790,9 +12953,9 @@ function useColumnDefinitions(children, options, tableRef) {
12790
12953
  const columnHelper = reactTable$1.createColumnHelper();
12791
12954
  return React__default.useMemo(() => {
12792
12955
  var _options$actionsForRo;
12956
+ let internalFrozenColumnCount = 0;
12793
12957
  // cannot be typed correctly until https://github.com/TanStack/table/discussions/4530 is resolved
12794
12958
  const columns = [];
12795
- const defaultColumnPinning = [];
12796
12959
  const defaultColumnSizing = {};
12797
12960
  const defaultColumnVisibility = {};
12798
12961
  const defaultSorting = [];
@@ -12800,9 +12963,6 @@ function useColumnDefinitions(children, options, tableRef) {
12800
12963
  React__default.Children.toArray(children).filter(child => !!child).forEach(child => {
12801
12964
  if ( /*#__PURE__*/React__default.isValidElement(child)) {
12802
12965
  var _child$props$minWidth;
12803
- if (child.props.defaultPinned && options.enableColumnPinning) {
12804
- defaultColumnPinning.push(child.props.accessor);
12805
- }
12806
12966
  if (child.props.defaultWidth) {
12807
12967
  defaultColumnSizing[child.props.accessor] = child.props.defaultWidth;
12808
12968
  }
@@ -12861,22 +13021,22 @@ function useColumnDefinitions(children, options, tableRef) {
12861
13021
  });
12862
13022
  if (options.enableRowExpansion && options.expandedRowRenderer) {
12863
13023
  columns.unshift(columnHelper.display(createRowExpansionColumn(options.expandedRowRenderer, texts)));
12864
- defaultColumnPinning.unshift(COLUMN_ID_FOR_EXPANSION);
13024
+ internalFrozenColumnCount++;
12865
13025
  }
12866
13026
  if (options.enableRowSelection) {
12867
13027
  columns.unshift(columnHelper.display(createRowSelectionColumn(options.enableMultipleRowSelection, lastSelectedRowIndex, options.onRowDrag, tableRef, texts)));
12868
- defaultColumnPinning.unshift(COLUMN_ID_FOR_SELECTION);
13028
+ internalFrozenColumnCount++;
12869
13029
  }
12870
13030
  if (options.onRowDrag) {
12871
13031
  columns.unshift(columnHelper.display(createRowDraggableColumn(options.onRowDrag, texts)));
12872
- defaultColumnPinning.unshift(COLUMN_ID_FOR_DRAGGABLE);
13032
+ internalFrozenColumnCount++;
12873
13033
  }
12874
13034
  if ((_options$actionsForRo = options.actionsForRow) !== null && _options$actionsForRo !== void 0 && _options$actionsForRo.length) {
12875
13035
  columns.push(columnHelper.display(createRowActionsColumn(options.actionsForRow, texts)));
12876
13036
  }
12877
13037
  return {
12878
13038
  columns,
12879
- defaultColumnPinning,
13039
+ internalFrozenColumnCount,
12880
13040
  defaultColumnSizing,
12881
13041
  defaultColumnVisibility,
12882
13042
  defaultSorting,
@@ -12891,15 +13051,18 @@ const getSortingFn = dataType => {
12891
13051
  return 'auto';
12892
13052
  };
12893
13053
 
12894
- // pinned columns have position sticky, and because we support more than one of them
13054
+ // frozen columns have position sticky, and because we support more than one of them
12895
13055
  // we must set a 'left' css value. this hook listens to changes on state that will
12896
- // affect the left offset (resize, visibility, pinning) and updates offsets based on width
13056
+ // affect the left offset (resize, visibility, freezing) and updates offsets based on width
12897
13057
  const useColumnOffsetStateListener = (table, setColumnOffsets) => {
12898
13058
  const {
12899
13059
  columnOrder,
12900
13060
  columnSizingInfo,
12901
13061
  columnVisibility
12902
13062
  } = table.getState();
13063
+ const {
13064
+ frozenColumnsCount
13065
+ } = table.options.meta;
12903
13066
  React__default.useEffect(() => {
12904
13067
  const offsets = {};
12905
13068
  // store left offsets for each visible column
@@ -12908,7 +13071,7 @@ const useColumnOffsetStateListener = (table, setColumnOffsets) => {
12908
13071
  return offset + column.getSize();
12909
13072
  }, 0);
12910
13073
  setColumnOffsets(offsets);
12911
- }, [columnOrder, columnSizingInfo, columnVisibility]);
13074
+ }, [columnOrder, columnSizingInfo, columnVisibility, frozenColumnsCount]);
12912
13075
  };
12913
13076
 
12914
13077
  const useRowSelectionListener = (table, onRowSelect) => {
@@ -12933,16 +13096,16 @@ const useSettingsStateListener = (table, onChangeSettings) => {
12933
13096
  handler = setTimeout(() => onChangeSettings({
12934
13097
  columnFilters: state.columnFilters,
12935
13098
  columnOrder: state.columnOrder,
12936
- columnPinning: state.columnPinning,
12937
13099
  columnSizing: state.columnSizing,
12938
13100
  columnVisibility: state.columnVisibility,
13101
+ frozenColumnCount: meta.frozenColumnsCount,
12939
13102
  globalFilter: state.globalFilter,
12940
13103
  rowDensity: meta.rowDensity,
12941
13104
  sorting: state.sorting
12942
13105
  }), 250);
12943
13106
  }
12944
13107
  return () => clearTimeout(handler);
12945
- }, [state.columnFilters, state.columnOrder, state.columnPinning, state.columnSizing, state.columnVisibility, state.globalFilter, meta.rowDensity, state.sorting]);
13108
+ }, [state.columnFilters, state.columnOrder, meta.frozenColumnsCount, state.columnSizing, state.columnVisibility, state.globalFilter, meta.rowDensity, state.sorting]);
12946
13109
  };
12947
13110
 
12948
13111
  const useActiveRow = (defaultActiveRowIndex = 0) => {
@@ -12990,14 +13153,14 @@ const useActiveRowStateListener = (table, rows, activeRowIndex) => {
12990
13153
  };
12991
13154
 
12992
13155
  function useTable$1(children, props, ref) {
12993
- var _settings$columnOrder, _ref, _settings$columnPinni, _settings$columnPinni2, _settings$columnSizin, _settings$columnVisib, _settings$rowDensity;
13156
+ var _settings$frozenColum, _settings$columnOrder, _settings$columnSizin, _settings$columnVisib, _settings$rowDensity;
12994
13157
  const {
12995
13158
  actionsForRow = [],
12996
13159
  data,
12997
13160
  defaultActiveRowIndex,
12998
13161
  disableColumnFiltering = false,
12999
13162
  disableColumnHiding = false,
13000
- disableColumnPinning = false,
13163
+ disableColumnFreezing = false,
13001
13164
  disableColumnReordering = false,
13002
13165
  disableColumnResizing = false,
13003
13166
  disableRowDensity = false,
@@ -13024,7 +13187,7 @@ function useTable$1(children, props, ref) {
13024
13187
  const enableMultipleRowSelection = !disableMultipleRowSelection && enableRowSelection;
13025
13188
  const {
13026
13189
  columns,
13027
- defaultColumnPinning,
13190
+ internalFrozenColumnCount,
13028
13191
  defaultColumnSizing,
13029
13192
  defaultSorting,
13030
13193
  defaultColumnVisibility,
@@ -13033,7 +13196,7 @@ function useTable$1(children, props, ref) {
13033
13196
  actionsForRow,
13034
13197
  enableColumnFiltering: !disableColumnFiltering,
13035
13198
  enableColumnHiding: !disableColumnHiding,
13036
- enableColumnPinning: !disableColumnPinning,
13199
+ enableColumnFreezing: !disableColumnFreezing,
13037
13200
  enableRowExpansion,
13038
13201
  enableRowSelection,
13039
13202
  enableMultipleRowSelection,
@@ -13041,11 +13204,13 @@ function useTable$1(children, props, ref) {
13041
13204
  onRowDrag
13042
13205
  }, ref);
13043
13206
  const lastSortedOrFilteredRows = React__default.useRef(null);
13207
+ const totalFrozenColumns = internalFrozenColumnCount + ((_settings$frozenColum = settings === null || settings === void 0 ? void 0 : settings.frozenColumnCount) !== null && _settings$frozenColum !== void 0 ? _settings$frozenColum : 0);
13208
+ const frozenColumns = columns.slice(0, totalFrozenColumns).map(column => column.id);
13044
13209
  // defaults
13045
13210
  const initialState = {
13046
13211
  columnOrder: (_settings$columnOrder = settings === null || settings === void 0 ? void 0 : settings.columnOrder) !== null && _settings$columnOrder !== void 0 ? _settings$columnOrder : columns.map(column => column.id),
13047
13212
  columnPinning: {
13048
- left: (_ref = (_settings$columnPinni = settings === null || settings === void 0 ? void 0 : (_settings$columnPinni2 = settings.columnPinning) === null || _settings$columnPinni2 === void 0 ? void 0 : _settings$columnPinni2.left) !== null && _settings$columnPinni !== void 0 ? _settings$columnPinni : defaultColumnPinning) !== null && _ref !== void 0 ? _ref : [],
13213
+ left: frozenColumns,
13049
13214
  right: []
13050
13215
  },
13051
13216
  columnSizing: (_settings$columnSizin = settings === null || settings === void 0 ? void 0 : settings.columnSizing) !== null && _settings$columnSizin !== void 0 ? _settings$columnSizin : defaultColumnSizing,
@@ -13063,6 +13228,8 @@ function useTable$1(children, props, ref) {
13063
13228
  const [dragging, setDragging] = React__default.useState({});
13064
13229
  const [shouldPauseSortingAndFiltering, setShouldPauseSortingAndFiltering] = React__default.useState(false);
13065
13230
  const [shouldDisableTableActions, setShouldDisableTableActions] = React__default.useState(false);
13231
+ // Frozen column count is the count of external columns that are frozen
13232
+ const [frozenColumnsCount, setFrozenColumnsCount] = React__default.useState(totalFrozenColumns - internalFrozenColumnCount);
13066
13233
  // For some reason, using state instead of ref didn't work as expected, that's why ref is used
13067
13234
  const focussableColumnIndexes = React__default.useRef([]);
13068
13235
  // some options get set even if they are undefined, so we have to do it conditionally
@@ -13072,7 +13239,7 @@ function useTable$1(children, props, ref) {
13072
13239
  enableColumnResizing: !disableColumnResizing,
13073
13240
  enableGlobalFilter: !disableSearch,
13074
13241
  enableHiding: !disableColumnHiding,
13075
- enablePinning: !disableColumnPinning,
13242
+ enablePinning: !disableColumnFreezing,
13076
13243
  enableRowSelection: enableRowSelection,
13077
13244
  enableMultiRowSelection: enableMultipleRowSelection,
13078
13245
  enableSorting: !disableSorting
@@ -13133,9 +13300,13 @@ function useTable$1(children, props, ref) {
13133
13300
  dragging,
13134
13301
  setDragging,
13135
13302
  // computed
13303
+ enableColumnFreezing: !disableColumnFreezing,
13136
13304
  enableColumnReordering: !disableColumnReordering,
13305
+ enableColumnHiding: !disableColumnHiding,
13137
13306
  shouldPauseHoverState,
13138
13307
  setShouldPauseHoverState,
13308
+ frozenColumnsCount,
13309
+ setFrozenColumnsCount,
13139
13310
  // resorting
13140
13311
  shouldPauseSortingAndFiltering,
13141
13312
  setShouldPauseSortingAndFiltering,
@@ -13333,6 +13504,10 @@ function Container(externalProps) {
13333
13504
  }
13334
13505
  Container.displayName = 'SortableContainer';
13335
13506
 
13507
+ const isFormElement = element => {
13508
+ const formElementNodeNames = ['BUTTON', 'INPUT', 'TEXTAREA', 'SELECT', 'FIELDSET'];
13509
+ return formElementNodeNames.includes(element.nodeName);
13510
+ };
13336
13511
  function Item$3(props) {
13337
13512
  const {
13338
13513
  asChild,
@@ -13356,7 +13531,7 @@ function Item$3(props) {
13356
13531
  };
13357
13532
  const onPointerDown = event => {
13358
13533
  // allow form components, like checkboxes, to be active
13359
- if (event.target === event.currentTarget) {
13534
+ if (event.currentTarget.contains(event.target) && !isFormElement(event.target)) {
13360
13535
  listeners === null || listeners === void 0 ? void 0 : listeners.onPointerDown(event);
13361
13536
  }
13362
13537
  };
@@ -13396,50 +13571,80 @@ function List$1(externalProps) {
13396
13571
  }
13397
13572
  List$1.displayName = 'SortableList';
13398
13573
 
13574
+ const Truncate = ({
13575
+ tooltip,
13576
+ children
13577
+ }) => {
13578
+ const ref = React__default.useRef(null);
13579
+ const [mounted, setMounted] = React__default.useState(false);
13580
+ const {
13581
+ truncated
13582
+ } = useTruncated(ref.current, [mounted]);
13583
+ React__default.useEffect(() => {
13584
+ setMounted(true);
13585
+ return () => setMounted(false);
13586
+ }, []);
13587
+ const clonedChildrenWithRef = /*#__PURE__*/React__default.cloneElement(React__default.Children.only(children), {
13588
+ ref,
13589
+ className: cn(children.props.className, 'truncate')
13590
+ });
13591
+ if (truncated) {
13592
+ return /*#__PURE__*/React__default.createElement(Tooltip, {
13593
+ title: tooltip
13594
+ }, clonedChildrenWithRef);
13595
+ }
13596
+ return clonedChildrenWithRef;
13597
+ };
13598
+
13399
13599
  const OrderableColumn = /*#__PURE__*/React__default.forwardRef((props, ref) => {
13400
- var _column$columnDef$hea;
13600
+ var _ref, _column$columnDef$hea, _column$columnDef$hea2;
13401
13601
  const {
13402
13602
  canBeReordered,
13403
13603
  column,
13404
- isReorderingAllowed,
13604
+ children,
13605
+ isColumnFixed,
13405
13606
  ...attributes
13406
13607
  } = props;
13407
13608
  let icon;
13408
13609
  if (canBeReordered) {
13409
13610
  icon = /*#__PURE__*/React__default.createElement(Icon, {
13410
13611
  name: "drag",
13411
- className: "text-grey-500 hover:text-grey-700 mr-0.5 -ml-2 -mt-px cursor-move"
13612
+ /** top margin of -3px on Icon, is added to make sure that each OrderableColumn is of 32px height **/
13613
+ className: "text-grey-500 hover:text-grey-700 mr-0.5 -ml-[6px] -mt-[3px] inline-block !h-5 !w-5 cursor-move"
13412
13614
  });
13413
- } else if (isReorderingAllowed) {
13615
+ } else if (isColumnFixed) {
13414
13616
  icon = /*#__PURE__*/React__default.createElement("span", {
13415
13617
  className: "mr-0.5 inline-flex w-4"
13416
13618
  });
13417
13619
  }
13620
+ // columnName should be a string
13621
+ const columnName = (_ref = (_column$columnDef$hea = (_column$columnDef$hea2 = column.columnDef.header) === null || _column$columnDef$hea2 === void 0 ? void 0 : _column$columnDef$hea2.toString()) !== null && _column$columnDef$hea !== void 0 ? _column$columnDef$hea : column.columnDef.id) !== null && _ref !== void 0 ? _ref : '';
13418
13622
  return /*#__PURE__*/React__default.createElement("div", Object.assign({}, attributes, {
13419
- className: "hover:bg-grey-100 aria-pressed:bg-grey-200 flex w-full items-center justify-between gap-x-2 rounded py-1 px-2 aria-pressed:z-10",
13623
+ className: "hover:bg-grey-100 aria-pressed:bg-grey-200 flex w-full items-center justify-between gap-x-2 rounded py-[6px] px-2 aria-pressed:z-10",
13420
13624
  ref: ref
13421
- }), /*#__PURE__*/React__default.createElement("span", {
13422
- className: "pointer-events-none"
13423
- }, icon, (_column$columnDef$hea = column.columnDef.header) !== null && _column$columnDef$hea !== void 0 ? _column$columnDef$hea : column.columnDef.id), column.getCanHide() ? /*#__PURE__*/React__default.createElement(Checkbox, {
13424
- checked: column.getIsVisible(),
13425
- onChange: column.toggleVisibility
13426
- }) : null);
13625
+ }), /*#__PURE__*/React__default.createElement(Truncate, {
13626
+ tooltip: columnName
13627
+ }, /*#__PURE__*/React__default.createElement("span", {
13628
+ className: "select-none"
13629
+ }, icon, columnName)), children);
13427
13630
  });
13428
13631
  const isOrderingAllowed = (table, column) => {
13429
13632
  var _column$columnDef$met;
13430
13633
  const meta = table.options.meta;
13431
- if (table.options.enablePinning) {
13432
- return true;
13433
- }
13434
13634
  return meta.enableColumnReordering ? !((_column$columnDef$met = column.columnDef.meta) !== null && _column$columnDef$met !== void 0 && _column$columnDef$met.disableReordering) : false;
13435
13635
  };
13636
+ const isColumnOrderingDisabled = (table, column) => {
13637
+ var _column$columnDef$met2;
13638
+ const meta = table.options.meta;
13639
+ return meta.enableColumnReordering && !!((_column$columnDef$met2 = column.columnDef.meta) !== null && _column$columnDef$met2 !== void 0 && _column$columnDef$met2.disableReordering);
13640
+ };
13436
13641
  const SortableColumnContainer = ({
13437
13642
  state,
13438
13643
  moveColumn,
13439
13644
  reorderColumn,
13440
- table
13645
+ table,
13646
+ query
13441
13647
  }) => {
13442
- var _ref;
13443
13648
  const {
13444
13649
  texts
13445
13650
  } = useLocalization();
@@ -13448,7 +13653,7 @@ const SortableColumnContainer = ({
13448
13653
  const draggedColumn = state[listId].find(c => c.id === activeId);
13449
13654
  const targetColumn = state[listId].find(c => c.id === overId);
13450
13655
  if (draggedColumn && targetColumn) {
13451
- reorderColumn(draggedColumn.id, targetColumn.id, listId === 'pinned');
13656
+ reorderColumn(draggedColumn.id, targetColumn.id, listId === 'visible');
13452
13657
  }
13453
13658
  };
13454
13659
  const move = (activeId, oldListId) => {
@@ -13457,80 +13662,114 @@ const SortableColumnContainer = ({
13457
13662
  moveColumn(column);
13458
13663
  }
13459
13664
  };
13460
- const handleDoubleClick = (id, status) => table.options.enablePinning ? event => {
13461
- event.stopPropagation();
13462
- move(id, status);
13463
- } : undefined;
13464
- const isReorderingAllowed = (_ref = meta.enableColumnReordering || table.options.enablePinning) !== null && _ref !== void 0 ? _ref : false;
13465
- if (!table.options.enablePinning) {
13665
+ const handleColumnCheckboxChange = column => () => {
13666
+ moveColumn === null || moveColumn === void 0 ? void 0 : moveColumn(column);
13667
+ column.toggleVisibility();
13668
+ };
13669
+ const isColumnHidingAllowed = meta.enableColumnHiding;
13670
+ const isQueryFilterNotApplied = query === '';
13671
+ const filteredHiddenColumns = state.hidden.filter(column => {
13672
+ var _column$columnDef$hea3;
13673
+ return (_column$columnDef$hea3 = column.columnDef.header) === null || _column$columnDef$hea3 === void 0 ? void 0 : _column$columnDef$hea3.toString().toLowerCase().includes(query.toLowerCase());
13674
+ });
13675
+ const filteredVisibleColumns = state.visible.filter(column => {
13676
+ var _column$columnDef$hea4;
13677
+ return (_column$columnDef$hea4 = column.columnDef.header) === null || _column$columnDef$hea4 === void 0 ? void 0 : _column$columnDef$hea4.toString().toLowerCase().includes(query.toLowerCase());
13678
+ });
13679
+ const visibleListDescriptionText = isQueryFilterNotApplied ? texts.table2.columnSettings.columnsVisibleDrop : texts.table2.columnSettings.noVisibleColumns;
13680
+ const hiddenListDescriptionText = isQueryFilterNotApplied ? texts.table2.columnSettings.columnsHiddenDrop : texts.table2.columnSettings.noHiddenColumns;
13681
+ if (isColumnHidingAllowed) {
13466
13682
  return /*#__PURE__*/React__default.createElement(Container, {
13467
13683
  reorder: reorder,
13468
13684
  move: move
13469
- }, /*#__PURE__*/React__default.createElement(List$1, {
13470
- id: "other",
13471
- className: "flex min-h-[theme(spacing.8)] flex-col gap-y-px overflow-x-hidden px-2"
13472
- }, state.other.map(column => {
13473
- var _column$columnDef$met2;
13474
- const canBeReordered = isOrderingAllowed(table, column);
13685
+ }, /*#__PURE__*/React__default.createElement(Truncate, {
13686
+ tooltip: texts.table2.columnSettings.columnsVisible
13687
+ }, /*#__PURE__*/React__default.createElement("h5", {
13688
+ className: "mx-4 my-[6px]"
13689
+ }, texts.table2.columnSettings.columnsVisible)), /*#__PURE__*/React__default.createElement(List$1, {
13690
+ id: "visible",
13691
+ className: "flex min-h-[theme(spacing.8)] flex-col overflow-hidden px-2"
13692
+ }, filteredVisibleColumns.length ? filteredVisibleColumns.map(column => {
13693
+ // When searching a column, we disable reordering and make it fixed
13694
+ const canBeReordered = isOrderingAllowed(table, column) && isQueryFilterNotApplied;
13695
+ const isColumnFixed = isColumnOrderingDisabled(table, column) && isQueryFilterNotApplied;
13475
13696
  return /*#__PURE__*/React__default.createElement(Item$3, {
13476
13697
  key: column.id,
13477
- disabled: (_column$columnDef$met2 = column.columnDef.meta) === null || _column$columnDef$met2 === void 0 ? void 0 : _column$columnDef$met2.disableReordering,
13698
+ disabled: !canBeReordered,
13478
13699
  id: column.id,
13479
13700
  asChild: true
13480
13701
  }, /*#__PURE__*/React__default.createElement(OrderableColumn, {
13481
13702
  canBeReordered: canBeReordered,
13482
13703
  column: column,
13483
- isReorderingAllowed: isReorderingAllowed,
13484
- onDoubleClick: handleDoubleClick(column.id, 'other')
13485
- }));
13486
- })));
13704
+ isColumnFixed: isColumnFixed
13705
+ }, column.getCanHide() ? /*#__PURE__*/React__default.createElement(Checkbox, {
13706
+ className: "!mt-0",
13707
+ checked: column.getIsVisible(),
13708
+ onChange: handleColumnCheckboxChange(column)
13709
+ }) : null));
13710
+ }) :
13711
+ /*#__PURE__*/
13712
+ // For some reason wrapping this paragraph with Truncate will throw error in scenarios where
13713
+ // we conditionally hide or show the paragraph e.g. moving the last column to the hide list
13714
+ React__default.createElement("p", {
13715
+ className: "text-grey-500 mb-0 flex h-8 items-center truncate px-2"
13716
+ }, visibleListDescriptionText)), /*#__PURE__*/React__default.createElement(Truncate, {
13717
+ tooltip: texts.table2.columnSettings.columnsHidden
13718
+ }, /*#__PURE__*/React__default.createElement("h5", {
13719
+ className: "mx-4 my-[6px] truncate"
13720
+ }, texts.table2.columnSettings.columnsHidden)), /*#__PURE__*/React__default.createElement(List$1, {
13721
+ id: "hidden",
13722
+ className: "flex min-h-[theme(spacing.8)] flex-col gap-y-px overflow-hidden px-2"
13723
+ }, filteredHiddenColumns.length ? filteredHiddenColumns.map(column => {
13724
+ // When searching a column, we disable reordering and make it fixed
13725
+ const canBeReordered = isOrderingAllowed(table, column) && isQueryFilterNotApplied;
13726
+ const isColumnFixed = isColumnOrderingDisabled(table, column) && isQueryFilterNotApplied;
13727
+ return /*#__PURE__*/React__default.createElement(Item$3, {
13728
+ key: column.id,
13729
+ disabled: !canBeReordered,
13730
+ id: column.id,
13731
+ asChild: true
13732
+ }, /*#__PURE__*/React__default.createElement(OrderableColumn, {
13733
+ canBeReordered: canBeReordered,
13734
+ column: column,
13735
+ isColumnFixed: isColumnFixed
13736
+ }, column.getCanHide() ? /*#__PURE__*/React__default.createElement(Checkbox, {
13737
+ className: "!mt-0",
13738
+ checked: column.getIsVisible(),
13739
+ onChange: handleColumnCheckboxChange(column)
13740
+ }) : null));
13741
+ }) :
13742
+ /*#__PURE__*/
13743
+ // For some reason wrapping this paragraph with Truncate will throw error in scenarios where
13744
+ // we conditionally hide or show the paragraph e.g. moving the last column to the visible list
13745
+ React__default.createElement("p", {
13746
+ className: "text-grey-500 mb-0 flex h-8 items-center truncate px-2"
13747
+ }, hiddenListDescriptionText)));
13487
13748
  }
13488
13749
  return /*#__PURE__*/React__default.createElement(Container, {
13489
13750
  reorder: reorder,
13490
13751
  move: move
13491
- }, /*#__PURE__*/React__default.createElement("h5", {
13492
- className: "mx-4"
13493
- }, texts.table2.columnSettings.columnsPinned), /*#__PURE__*/React__default.createElement(List$1, {
13494
- id: "pinned",
13495
- className: "flex min-h-[theme(spacing.8)] flex-col gap-y-px overflow-x-hidden px-2"
13496
- }, state.pinned.length ? state.pinned.map(column => {
13497
- var _column$columnDef$met3;
13498
- const canBeReordered = isOrderingAllowed(table, column);
13752
+ }, /*#__PURE__*/React__default.createElement(List$1, {
13753
+ id: "visible",
13754
+ className: "flex min-h-[theme(spacing.8)] flex-col gap-y-px overflow-hidden px-2"
13755
+ }, state.visible.length ? state.visible.filter(column => {
13756
+ var _column$columnDef$hea5;
13757
+ return (_column$columnDef$hea5 = column.columnDef.header) === null || _column$columnDef$hea5 === void 0 ? void 0 : _column$columnDef$hea5.toString().toLowerCase().includes(query.toLowerCase());
13758
+ }).map(column => {
13759
+ // When searching a column, we disable reordering and make it fixed
13760
+ const canBeReordered = isOrderingAllowed(table, column) && isQueryFilterNotApplied;
13761
+ const isColumnFixed = isColumnOrderingDisabled(table, column) && isQueryFilterNotApplied;
13499
13762
  return /*#__PURE__*/React__default.createElement(Item$3, {
13500
13763
  key: column.id,
13501
- disabled: (_column$columnDef$met3 = column.columnDef.meta) === null || _column$columnDef$met3 === void 0 ? void 0 : _column$columnDef$met3.disableReordering,
13764
+ disabled: !canBeReordered,
13502
13765
  id: column.id,
13503
13766
  asChild: true
13504
13767
  }, /*#__PURE__*/React__default.createElement(OrderableColumn, {
13505
13768
  canBeReordered: canBeReordered,
13506
13769
  column: column,
13507
- isReorderingAllowed: isReorderingAllowed,
13508
- onDoubleClick: handleDoubleClick(column.id, 'pinned')
13770
+ isColumnFixed: isColumnFixed
13509
13771
  }));
13510
- }) : /*#__PURE__*/React__default.createElement("p", {
13511
- className: "text-grey-500 mb-0 flex h-8 items-center px-2"
13512
- }, texts.table2.columnSettings.columnsPinnedDrop)), /*#__PURE__*/React__default.createElement("h5", {
13513
- className: "mx-4"
13514
- }, texts.table2.columnSettings.columnsOther), /*#__PURE__*/React__default.createElement(List$1, {
13515
- id: "other",
13516
- className: "flex min-h-[theme(spacing.8)] flex-col gap-y-px overflow-x-hidden px-2"
13517
- }, state.other.length ? state.other.map(column => {
13518
- var _column$columnDef$met4;
13519
- const canBeReordered = isOrderingAllowed(table, column);
13520
- return /*#__PURE__*/React__default.createElement(Item$3, {
13521
- key: column.id,
13522
- disabled: (_column$columnDef$met4 = column.columnDef.meta) === null || _column$columnDef$met4 === void 0 ? void 0 : _column$columnDef$met4.disableReordering,
13523
- id: column.id,
13524
- asChild: true
13525
- }, /*#__PURE__*/React__default.createElement(OrderableColumn, {
13526
- canBeReordered: canBeReordered,
13527
- column: column,
13528
- isReorderingAllowed: isReorderingAllowed,
13529
- onDoubleClick: handleDoubleClick(column.id, 'other')
13530
- }));
13531
- }) : /*#__PURE__*/React__default.createElement("p", {
13532
- className: "text-grey-500 mb-0 flex h-8 items-center px-2"
13533
- }, texts.table2.columnSettings.columnsOtherDrop)));
13772
+ }) : null));
13534
13773
  };
13535
13774
  const reorder = (draggedColumnId, targetColumnId, list = []) => {
13536
13775
  const nextColumnOrder = [...list];
@@ -13546,38 +13785,109 @@ const ColumnSettingsButton = ({
13546
13785
  const [query, setQuery] = React__default.useState('');
13547
13786
  const columns = table.getAllLeafColumns().filter(column => !isInternalColumn(column.id));
13548
13787
  const [state, setState] = React__default.useState({
13549
- pinned: columns.filter(column => column.getIsPinned()),
13550
- other: columns.filter(column => !column.getIsPinned())
13788
+ visible: columns.filter(column => column.getIsVisible()),
13789
+ hidden: columns.filter(column => !column.getIsVisible())
13551
13790
  });
13552
- const pinColumn = column => {
13553
- if (state.pinned.find(c => c.id === column.id)) {
13554
- setState(currentState => ({
13555
- pinned: currentState.pinned.filter(c => c.id !== column.id),
13556
- other: [column].concat(...currentState.other)
13557
- }));
13791
+ const initialOrderedColumns = React__default.useRef(columns);
13792
+ const moveColumnToList = column => {
13793
+ // If column can't hide then don't toggle visiblity
13794
+ if (column.getCanHide()) {
13795
+ column.toggleVisibility();
13796
+ }
13797
+ if (state.visible.find(c => c.id === column.id)) {
13798
+ setState(currentState => {
13799
+ const filteredColumns = currentState.visible.filter(c => c.id !== column.id);
13800
+ if (column.getCanHide()) {
13801
+ const hiddenColumns = [column].concat(...currentState.hidden);
13802
+ // Sort the hidden column so that they follow the initial order of fixed columns
13803
+ const sortedFixedHiddenColumns = hiddenColumns.filter(hiddenColumn => {
13804
+ var _hiddenColumn$columnD;
13805
+ return !!((_hiddenColumn$columnD = hiddenColumn.columnDef.meta) !== null && _hiddenColumn$columnD !== void 0 && _hiddenColumn$columnD.disableReordering);
13806
+ }).sort((colA, colB) => {
13807
+ const indexA = initialOrderedColumns.current.indexOf(colA);
13808
+ const indexB = initialOrderedColumns.current.indexOf(colB);
13809
+ return indexA - indexB;
13810
+ });
13811
+ const reorderableHiddenColumns = hiddenColumns.filter(hiddenColumn => {
13812
+ var _hiddenColumn$columnD2;
13813
+ return !((_hiddenColumn$columnD2 = hiddenColumn.columnDef.meta) !== null && _hiddenColumn$columnD2 !== void 0 && _hiddenColumn$columnD2.disableReordering);
13814
+ });
13815
+ return {
13816
+ visible: filteredColumns,
13817
+ hidden: [...sortedFixedHiddenColumns, ...reorderableHiddenColumns]
13818
+ };
13819
+ }
13820
+ // If column can't hide and it is dragged to hidden column list then move the column to the bottom of
13821
+ // the visible column list
13822
+ return {
13823
+ visible: filteredColumns.concat(column),
13824
+ hidden: currentState.hidden
13825
+ };
13826
+ });
13558
13827
  } else {
13559
- setState(currentState => ({
13560
- pinned: currentState.pinned.concat(column),
13561
- other: currentState.other.filter(c => c.id !== column.id)
13562
- }));
13828
+ setState(currentState => {
13829
+ let visibleColumns = [];
13830
+ // If ordering is allowed then we don't care about the previous column order
13831
+ if (isOrderingAllowed(table, column)) {
13832
+ visibleColumns = currentState.visible.concat(column);
13833
+ } else {
13834
+ const orderedVisibleColumns = initialOrderedColumns.current.filter(orderedColumn => !state.hidden.find(c => c.id === orderedColumn.id) || orderedColumn.id === column.id).map(({
13835
+ id
13836
+ }) => id);
13837
+ const movedColumnIndex = orderedVisibleColumns.indexOf(column.id);
13838
+ // Index of the column that is moved to visible list
13839
+ // Intial value for the index is the last item in visible list
13840
+ let index = currentState.visible.length;
13841
+ currentState.visible.find((col, colIndex) => {
13842
+ const columnIndex = orderedVisibleColumns.indexOf(col.id);
13843
+ // Index where the moved column should be shown in visible list
13844
+ if (movedColumnIndex < columnIndex) {
13845
+ index = colIndex;
13846
+ return true;
13847
+ }
13848
+ return false;
13849
+ });
13850
+ visibleColumns = currentState.visible.slice(0, index).concat(column).concat(currentState.visible.slice(index));
13851
+ }
13852
+ return {
13853
+ visible: visibleColumns,
13854
+ hidden: currentState.hidden.filter(c => c.id !== column.id)
13855
+ };
13856
+ });
13563
13857
  }
13564
13858
  };
13565
- const reorderColumn = (draggedColumnId, targetColumnId, pinned) => {
13566
- if (pinned) {
13859
+ const reorderColumnInList = (draggedColumnId, targetColumnId, isVisible) => {
13860
+ var _columns$find, _columns$find$columnD;
13861
+ const isTargetColumnFixed = !!((_columns$find = columns.find(column => column.id === targetColumnId)) !== null && _columns$find !== void 0 && (_columns$find$columnD = _columns$find.columnDef.meta) !== null && _columns$find$columnD !== void 0 && _columns$find$columnD.disableReordering);
13862
+ if (isVisible) {
13863
+ let firstReorderableVisibleColumnId = targetColumnId;
13864
+ if (isTargetColumnFixed) {
13865
+ var _state$visible$find$i, _state$visible$find;
13866
+ firstReorderableVisibleColumnId = (_state$visible$find$i = (_state$visible$find = state.visible.find(visibleColumn => {
13867
+ var _visibleColumn$column;
13868
+ return !((_visibleColumn$column = visibleColumn.columnDef.meta) !== null && _visibleColumn$column !== void 0 && _visibleColumn$column.disableReordering);
13869
+ })) === null || _state$visible$find === void 0 ? void 0 : _state$visible$find.id) !== null && _state$visible$find$i !== void 0 ? _state$visible$find$i : targetColumnId;
13870
+ }
13567
13871
  setState(currentState => ({
13568
13872
  ...currentState,
13569
- pinned: reorder(draggedColumnId, targetColumnId, currentState.pinned)
13873
+ visible: reorder(draggedColumnId, firstReorderableVisibleColumnId, currentState.visible)
13570
13874
  }));
13571
13875
  } else {
13876
+ let firstReorderableHiddenColumnId = targetColumnId;
13877
+ if (isTargetColumnFixed) {
13878
+ var _state$hidden$find$id, _state$hidden$find;
13879
+ firstReorderableHiddenColumnId = (_state$hidden$find$id = (_state$hidden$find = state.hidden.find(visibleColumn => {
13880
+ var _visibleColumn$column2;
13881
+ return !((_visibleColumn$column2 = visibleColumn.columnDef.meta) !== null && _visibleColumn$column2 !== void 0 && _visibleColumn$column2.disableReordering);
13882
+ })) === null || _state$hidden$find === void 0 ? void 0 : _state$hidden$find.id) !== null && _state$hidden$find$id !== void 0 ? _state$hidden$find$id : targetColumnId;
13883
+ }
13572
13884
  setState(currentState => ({
13573
13885
  ...currentState,
13574
- other: reorder(draggedColumnId, targetColumnId, currentState.other)
13886
+ hidden: reorder(draggedColumnId, firstReorderableHiddenColumnId, currentState.hidden)
13575
13887
  }));
13576
13888
  }
13577
13889
  };
13578
- // probably a more elegant way to do this without local state but had
13579
- // a range of issues using the native apis directly
13580
- React__default.useEffect(() => {
13890
+ const changeColumnOrder = newColumnOrder => {
13581
13891
  const internals = [];
13582
13892
  if (table.options.enableRowSelection) {
13583
13893
  internals.push(COLUMN_ID_FOR_SELECTION);
@@ -13585,14 +13895,42 @@ const ColumnSettingsButton = ({
13585
13895
  if (table.options.enableExpanding) {
13586
13896
  internals.push(COLUMN_ID_FOR_EXPANSION);
13587
13897
  }
13588
- table.setColumnPinning({
13589
- left: internals.concat(...state.pinned.map(c => c.id))
13590
- });
13591
- table.setColumnOrder(internals.concat([...state.pinned, ...state.other].map(c => c.id)));
13898
+ table.setColumnOrder(internals.concat(newColumnOrder.map(c => c.id)));
13899
+ };
13900
+ // probably a more elegant way to do this without local state but had
13901
+ // a range of issues using the native apis directly
13902
+ React__default.useEffect(() => {
13903
+ changeColumnOrder([...state.visible, ...state.hidden]);
13592
13904
  }, [state]);
13593
- return /*#__PURE__*/React__default.createElement(IconButton, {
13905
+ // This effect moves up all fixed/unorderable columns before orderable columns.
13906
+ // For custom column order, the fixed/unorderable columns will also move up before orderable columns.
13907
+ // The order between all fixed/unorderable column items, and all orderable column items will be same as it was
13908
+ // specified by the consumer.
13909
+ React__default.useEffect(() => {
13910
+ const orderableColumns = [];
13911
+ const fixedColumns = [];
13912
+ columns.forEach(column => {
13913
+ var _column$columnDef$met3;
13914
+ const isColumnFixed = !!((_column$columnDef$met3 = column.columnDef.meta) !== null && _column$columnDef$met3 !== void 0 && _column$columnDef$met3.disableReordering);
13915
+ if (isColumnFixed) {
13916
+ fixedColumns.push(column);
13917
+ } else {
13918
+ orderableColumns.push(column);
13919
+ }
13920
+ });
13921
+ const newOrderedColumns = [...fixedColumns, ...orderableColumns];
13922
+ // Changes order in the table
13923
+ changeColumnOrder(newOrderedColumns);
13924
+ // Changes order in the column settings button popover
13925
+ setState({
13926
+ visible: newOrderedColumns.filter(column => column.getIsVisible()),
13927
+ hidden: newOrderedColumns.filter(column => !column.getIsVisible())
13928
+ });
13929
+ // update initial column order
13930
+ initialOrderedColumns.current = newOrderedColumns;
13931
+ }, []);
13932
+ return /*#__PURE__*/React__default.createElement(Button$1, {
13594
13933
  "aria-label": texts.table2.columnSettings.tooltip,
13595
- icon: "columns",
13596
13934
  popover: popoverProps => /*#__PURE__*/React__default.createElement(Popover, Object.assign({}, popoverProps), /*#__PURE__*/React__default.createElement(Popover.Content, {
13597
13935
  align: "end"
13598
13936
  }, /*#__PURE__*/React__default.createElement("div", {
@@ -13602,25 +13940,18 @@ const ColumnSettingsButton = ({
13602
13940
  placeholder: texts.table2.columnSettings.search,
13603
13941
  value: query
13604
13942
  }) : null, /*#__PURE__*/React__default.createElement("div", {
13605
- className: "-ml-4 -mb-2 max-h-64 w-[calc(100%_+_theme(spacing.8))] overflow-auto"
13606
- }, query ? /*#__PURE__*/React__default.createElement("div", {
13607
- className: "flex min-h-[theme(spacing.8)] flex-col gap-y-px overflow-x-hidden px-2"
13608
- }, columns.filter(column => {
13609
- var _column$columnDef$hea2;
13610
- return (_column$columnDef$hea2 = column.columnDef.header) === null || _column$columnDef$hea2 === void 0 ? void 0 : _column$columnDef$hea2.toString().toLowerCase().includes(query.toLowerCase());
13611
- }).map(column => /*#__PURE__*/React__default.createElement(OrderableColumn, {
13612
- key: column.id,
13613
- canBeReordered: false,
13614
- column: column,
13615
- isReorderingAllowed: false
13616
- }))) : /*#__PURE__*/React__default.createElement(SortableColumnContainer, {
13943
+ className: "-ml-[calc(theme(spacing.4)_-_2px)] -mb-2 max-h-64 w-[calc(100%_+_theme(spacing.7)_-_1px)] overflow-auto"
13944
+ }, /*#__PURE__*/React__default.createElement(SortableColumnContainer, {
13617
13945
  state: state,
13618
- moveColumn: pinColumn,
13619
- reorderColumn: reorderColumn,
13620
- table: table
13946
+ moveColumn: moveColumnToList,
13947
+ reorderColumn: reorderColumnInList,
13948
+ table: table,
13949
+ query: query
13621
13950
  }))))),
13622
13951
  tooltip: texts.table2.columnSettings.tooltip
13623
- });
13952
+ }, /*#__PURE__*/React__default.createElement(Icon, {
13953
+ name: "columns"
13954
+ }), texts.table2.columnSettings.button);
13624
13955
  };
13625
13956
 
13626
13957
  const ExpandedRow = ({
@@ -13645,6 +13976,9 @@ const ExpandedRow = ({
13645
13976
  });
13646
13977
  }
13647
13978
  }, []);
13979
+ if (props.children === null || props.children === undefined) {
13980
+ return null;
13981
+ }
13648
13982
  return /*#__PURE__*/React__default.createElement("div", Object.assign({
13649
13983
  className: "border-grey-300 bg-grey-50 col-span-full border-b p-4"
13650
13984
  }, props, {
@@ -14275,6 +14609,7 @@ const Table2 = /*#__PURE__*/React__default.forwardRef(function Table2(props, ref
14275
14609
  } = props;
14276
14610
  const tableRef = useMergedRef(ref);
14277
14611
  const timeoutIdRef = React__default.useRef();
14612
+ const prevScrollY = React__default.useRef(0);
14278
14613
  // react-table
14279
14614
  const {
14280
14615
  rows,
@@ -14445,15 +14780,26 @@ const Table2 = /*#__PURE__*/React__default.forwardRef(function Table2(props, ref
14445
14780
  } else {
14446
14781
  const _temp3 = function () {
14447
14782
  if (typeof loadMore === 'function') {
14783
+ const scrollY = event.currentTarget.scrollTop;
14784
+ const isVerticalScrolling = scrollY !== prevScrollY.current;
14785
+ prevScrollY.current = scrollY;
14448
14786
  const _temp2 = function () {
14449
- if (event.currentTarget.scrollHeight - event.currentTarget.scrollTop - event.currentTarget.clientHeight < 600 && !loadingRef.current) {
14787
+ if (
14788
+ // This condition will also prevent triggering of loadMore function when scrolled upwards
14789
+ event.currentTarget.scrollHeight - event.currentTarget.scrollTop - event.currentTarget.clientHeight < 600 && !loadingRef.current &&
14790
+ // We don't want to trigger loadMore function on horizontal scrolling
14791
+ isVerticalScrolling) {
14450
14792
  const _temp = _finallyRethrows(function () {
14451
- const isAllRowsSelected = table.getIsAllRowsSelected();
14452
- loadingRef.current = true;
14453
- return Promise.resolve(loadMore()).then(function () {
14454
- if (isAllRowsSelected) {
14455
- table.toggleAllRowsSelected(true);
14456
- }
14793
+ return _catch(function () {
14794
+ const isAllRowsSelected = table.getIsAllRowsSelected();
14795
+ loadingRef.current = true;
14796
+ return Promise.resolve(loadMore()).then(function () {
14797
+ if (isAllRowsSelected) {
14798
+ table.toggleAllRowsSelected(true);
14799
+ }
14800
+ });
14801
+ }, function (error) {
14802
+ console.error(error);
14457
14803
  });
14458
14804
  }, function (_wasThrown, _result) {
14459
14805
  loadingRef.current = false;
@@ -14483,7 +14829,7 @@ const Table2 = /*#__PURE__*/React__default.forwardRef(function Table2(props, ref
14483
14829
  handleMouseLeave = () => meta.setShouldPauseHoverState(false);
14484
14830
  }
14485
14831
  const className = cn('bg-white border border-grey-300 focus:yt-focus focus:border-blue-500 grid auto-rows-max overflow-auto relative rounded group', props.className);
14486
- const enableSettingsButton = table.options.enablePinning || table.options.enableHiding || meta.enableColumnReordering;
14832
+ const enableSettingsButton = table.options.enableHiding || meta.enableColumnReordering;
14487
14833
  const hasInternalToolbar = enableSettingsButton || meta.editMode.enableEditMode || table.options.enableColumnFilters || meta.enableRowDensity || table.options.enableGlobalFilter;
14488
14834
  const hasToolbar = hasInternalToolbar || !!toolbarLeft || !toolbarRight;
14489
14835
  const hasFooters = React__default.useMemo(() => {
@@ -15639,6 +15985,7 @@ exports.VisuallyHidden = VisuallyHidden;
15639
15985
  exports.WindowedTable = WindowedTable;
15640
15986
  exports.convertRowIndexPathToNumberArray = convertRowIndexPathToNumberArray;
15641
15987
  exports.defaultLocalisationTexts = defaultLocalisationTexts;
15988
+ exports.defaultLocalizationContext = defaultLocalizationContext;
15642
15989
  exports.findByValue = findByValue$1;
15643
15990
  exports.format = format;
15644
15991
  exports.getByRowIndexPath = getByRowIndexPath;