@infinite-table/infinite-react 4.3.5 → 4.3.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/index.d.ts CHANGED
@@ -632,7 +632,13 @@ declare type InfiniteTableColumn<DATA_TYPE> = {
632
632
  field?: KeyOfNoSymbol<DATA_TYPE>;
633
633
  valueGetter?: InfiniteTableColumnValueGetter<DATA_TYPE>;
634
634
  defaultSortable?: InfiniteTableColumnSortable<DATA_TYPE>;
635
- draggable?: boolean;
635
+ /**
636
+ * Whether the column is draggable by default.
637
+ *
638
+ * This prop overrides the top-level columnDefaultDraggable prop, but is
639
+ * overridden by the top-level draggableColumns prop.
640
+ */
641
+ defaultDraggable?: boolean;
636
642
  resizable?: boolean;
637
643
  shouldAcceptEdit?: (params: InfiniteTablePropOnEditAcceptedParams<DATA_TYPE>) => boolean | Error | Promise<boolean | Error>;
638
644
  contentFocusable?: InfiniteTableColumnContentFocusable<DATA_TYPE>;
@@ -1400,6 +1406,7 @@ interface InfiniteTableMappedState<T> {
1400
1406
  onCellClick: InfiniteTableProps<T>['onCellClick'];
1401
1407
  rowDetailCache: RowDetailCache<RowDetailCacheKey, RowDetailCacheEntry>;
1402
1408
  headerOptions: NonUndefined<InfiniteTableProps<T>['headerOptions']>;
1409
+ draggableColumnsRestrictTo: NonUndefined<InfiniteTableProps<T>['draggableColumnsRestrictTo']>;
1403
1410
  onScrollbarsChange: InfiniteTableProps<T>['onScrollbarsChange'];
1404
1411
  getContextMenuItems: InfiniteTableProps<T>['getContextMenuItems'];
1405
1412
  getCellContextMenuItems: InfiniteTableProps<T>['getCellContextMenuItems'];
@@ -1459,7 +1466,8 @@ interface InfiniteTableMappedState<T> {
1459
1466
  columnDefaultWidth: NonUndefined<InfiniteTableProps<T>['columnDefaultWidth']>;
1460
1467
  columnDefaultFlex: InfiniteTableProps<T>['columnDefaultFlex'];
1461
1468
  columnCssEllipsis: NonUndefined<InfiniteTableProps<T>['columnCssEllipsis']>;
1462
- draggableColumns: NonUndefined<InfiniteTableProps<T>['draggableColumns']>;
1469
+ draggableColumns: InfiniteTableProps<T>['draggableColumns'];
1470
+ columnDefaultDraggable: InfiniteTableProps<T>['columnDefaultDraggable'];
1463
1471
  sortable: InfiniteTableProps<T>['sortable'];
1464
1472
  hideEmptyGroupColumns: NonUndefined<InfiniteTableProps<T>['hideEmptyGroupColumns']>;
1465
1473
  hideColumnWhenGrouped: NonUndefined<InfiniteTableProps<T>['hideColumnWhenGrouped']>;
@@ -1474,6 +1482,7 @@ interface InfiniteTableMappedState<T> {
1474
1482
  columnHeaderHeight: number;
1475
1483
  licenseKey: NonUndefined<InfiniteTableProps<T>['licenseKey']>;
1476
1484
  columnVisibility: InfiniteTablePropColumnVisibility;
1485
+ columnGroupVisibility: NonUndefined<InfiniteTableProps<T>['columnGroupVisibility']>;
1477
1486
  columnSizing: InfiniteTablePropColumnSizing;
1478
1487
  columnTypes: InfiniteTablePropColumnTypes<T>;
1479
1488
  columnGroups: InfiniteTablePropColumnGroups;
@@ -4749,6 +4758,7 @@ declare type LoadMaskProps = {
4749
4758
  declare type InfiniteTablePropColumnOrderNormalized = string[];
4750
4759
  declare type InfiniteTablePropColumnOrder = InfiniteTablePropColumnOrderNormalized | true;
4751
4760
  declare type InfiniteTablePropColumnVisibility = Record<string, false>;
4761
+ declare type InfiniteTablePropColumnGroupVisibility = Record<string, boolean>;
4752
4762
  declare type InfiniteTableColumnPinnedValues = false | 'start' | 'end';
4753
4763
  declare type InfiniteTablePropColumnPinning = Record<string, true | 'start' | 'end'>;
4754
4764
  declare type InfiniteTableRowStylingFnParams<T> = {
@@ -4780,7 +4790,7 @@ declare type InfiniteTableColumnType<T> = {
4780
4790
  defaultHiddenWhenGroupedBy?: InfiniteTableColumn<T>['defaultHiddenWhenGroupedBy'];
4781
4791
  header?: InfiniteTableColumn<T>['header'];
4782
4792
  comparer?: InfiniteTableColumn<T>['comparer'];
4783
- draggable?: InfiniteTableColumn<T>['draggable'];
4793
+ draggable?: InfiniteTableColumn<T>['defaultDraggable'];
4784
4794
  resizable?: InfiniteTableColumn<T>['resizable'];
4785
4795
  align?: InfiniteTableColumn<T>['align'];
4786
4796
  headerAlign?: InfiniteTableColumn<T>['headerAlign'];
@@ -4939,6 +4949,7 @@ interface InfiniteTableApi<T> {
4939
4949
  getSortingForColumn: (columnId: string) => SortDir | null;
4940
4950
  getColumnApi: (columnId: string) => InfiniteTableColumnApi<T> | null;
4941
4951
  setVisibilityForColumn: (columnId: string, visible: boolean) => void;
4952
+ setVisibilityForColumnGroup: (columnGroupId: string, visible: boolean) => void;
4942
4953
  getVisibleColumnsCount: () => number;
4943
4954
  scrollRowIntoView: (rowIndex: number, config?: {
4944
4955
  scrollAdjustPosition?: ScrollAdjustPosition;
@@ -5091,6 +5102,8 @@ interface InfiniteTableProps<T> {
5091
5102
  groupRenderStrategy?: InfiniteTablePropGroupRenderStrategy;
5092
5103
  hideEmptyGroupColumns?: boolean;
5093
5104
  columnVisibility?: InfiniteTablePropColumnVisibility;
5105
+ columnGroupVisibility?: InfiniteTablePropColumnGroupVisibility;
5106
+ defaultColumnGroupVisibility?: InfiniteTablePropColumnGroupVisibility;
5094
5107
  defaultColumnVisibility?: InfiniteTablePropColumnVisibility;
5095
5108
  pinnedStartMaxWidth?: number;
5096
5109
  pinnedEndMaxWidth?: number;
@@ -5116,6 +5129,7 @@ interface InfiniteTableProps<T> {
5116
5129
  collapsedColumnGroups?: InfiniteTablePropCollapsedColumnGroups;
5117
5130
  onScrollbarsChange?: (scrollbars: Scrollbars) => void;
5118
5131
  onColumnVisibilityChange?: (columnVisibility: InfiniteTablePropColumnVisibility) => void;
5132
+ onColumnGroupVisibilityChange?: (columnGroupVisibility: InfiniteTablePropColumnGroupVisibility) => void;
5119
5133
  columnTypes?: InfiniteTablePropColumnTypes<T>;
5120
5134
  showSeparatePivotColumnForSingleAggregation?: boolean;
5121
5135
  isRowDetailExpanded?: (rowInfo: InfiniteTableRowInfo<T>) => boolean;
@@ -5168,7 +5182,19 @@ interface InfiniteTableProps<T> {
5168
5182
  onActiveCellIndexChange?: (activeCellIndex: [number, number]) => void;
5169
5183
  activeCellIndex?: [number, number] | null;
5170
5184
  defaultActiveCellIndex?: [number, number] | null;
5185
+ /**
5186
+ * Whether the columns are draggable by default.
5187
+ *
5188
+ * This is the prop that has the lowest priority - it's overridden by column.defaultDraggable and ultimately by draggableColumns
5189
+ */
5190
+ columnDefaultDraggable?: boolean;
5191
+ /**
5192
+ * Whether the columns are draggable by default.
5193
+ *
5194
+ * This is the prop that has the highest priority - overrides columnDefaultDraggable and column.defaultDraggable
5195
+ */
5171
5196
  draggableColumns?: boolean;
5197
+ draggableColumnsRestrictTo?: false | 'group';
5172
5198
  header?: boolean;
5173
5199
  headerOptions?: InfiniteTablePropHeaderOptions;
5174
5200
  focusedClassName?: string;
@@ -5402,4 +5428,4 @@ declare const components: {
5402
5428
  NumberFilterEditor: typeof NumberFilterEditor;
5403
5429
  };
5404
5430
 
5405
- export { AdvancedAlignable, CellSelectionState, CellSelectionStateObject, ColumnTypeWithInherit, DataClient, DataSource, DataSourceAction, DataSourceActionType, DataSourceAggregationReducer, DataSourceApi, DataSourceCRUDParam, DataSourceComponentActions, DataSourceContextValue, DataSourceData, DataSourceDataParams, DataSourceDataParamsChanges, DataSourceDerivedState, DataSourceFilterFunctionParam, DataSourceFilterOperator, DataSourceFilterOperatorFunction, DataSourceFilterOperatorFunctionParam, DataSourceFilterType, DataSourceFilterValueItem, DataSourceFilterValueItemValueGetter, DataSourceGroupBy, DataSourceGroupRowsList, DataSourceInsertParam, DataSourceLivePaginationCursorFn, DataSourceLivePaginationCursorParams, DataSourceLivePaginationCursorValue, DataSourceMappedState, DataSourceMappings, DataSourceMasterDetailContextValue, DataSourcePivotBy, DataSourcePropAggregationReducers, DataSourcePropCellSelection, DataSourcePropCellSelection_MultiCell, DataSourcePropCellSelection_SingleCell, DataSourcePropFilterFunction, DataSourcePropFilterTypes, DataSourcePropFilterValue, DataSourcePropGroupBy, DataSourcePropGroupRowsStateObject, DataSourcePropIsRowSelected, DataSourcePropLivePaginationCursor, DataSourcePropMultiRowSelectionChangeParamType, DataSourcePropOnCellSelectionChange, DataSourcePropOnCellSelectionChange_MultiCell, DataSourcePropOnCellSelectionChange_SingleCell, DataSourcePropOnRowSelectionChange, DataSourcePropOnRowSelectionChange_MultiRow, DataSourcePropOnRowSelectionChange_SingleRow, DataSourcePropPivotBy, DataSourcePropRowInfoReducers, DataSourcePropRowSelection, DataSourcePropRowSelection_MultiRow, DataSourcePropRowSelection_SingleRow, DataSourcePropSelectionMode, DataSourcePropShouldReloadData, DataSourcePropShouldReloadDataObject, DataSourcePropSortFn, DataSourcePropSortInfo, DataSourcePropSortTypes, DataSourceProps, DataSourcePropsWithChildren, DataSourceRawReducer, DataSourceRemoteData, DataSourceRowInfoReducer, DataSourceSetupState, DataSourceSingleSortInfo, DataSourceSortInfo, DataSourceState, DebugLogger, DeepMap, ElementContainerGetter, FixedSizeSet, GroupRowsState, InfiniteColumnEditorContextType, InfiniteTable, InfiniteTableAction, InfiniteTableActionType, InfiniteTableApi, InfiniteTableClassName, InfiniteTableColumn, InfiniteTableColumnAggregator, InfiniteTableColumnApi, InfiniteTableColumnCellContextType, InfiniteTableColumnComparer, InfiniteTableColumnGroup, InfiniteTableColumnRenderFunctionForGroupRows, InfiniteTableColumnRenderFunctionForNormalRows, InfiniteTableColumnRenderValueParam, InfiniteTableColumnRowspanParam, InfiniteTableColumnSizingOptions, InfiniteTableColumnValueFormatterParams, InfiniteTableColumnValueGetterParams, InfiniteTableComponent, InfiniteTableComputedColumn, InfiniteTableComputedValues, InfiniteTableContextValue, InfiniteTableGroupColumnBase, InfiniteTableGroupColumnFunction, InfiniteTableGroupColumnGetterOptions, InfiniteTablePivotColumn, InfiniteTablePropAutoSizeColumnsKey, InfiniteTablePropColumnGroups, InfiniteTablePropColumnOrder, InfiniteTablePropColumnPinning, InfiniteTablePropColumnSizing, InfiniteTablePropColumnTypes, InfiniteTablePropColumnVisibility, InfiniteTablePropColumns, InfiniteTablePropComponents, InfiniteTablePropGetCellContextMenuItems, InfiniteTablePropGetColumnMenuItems, InfiniteTablePropGroupColumn, InfiniteTablePropGroupRenderStrategy, InfiniteTablePropHeaderOptions, InfiniteTablePropKeyboardNavigation, InfiniteTablePropKeyboardShorcut, InfiniteTablePropMultiSortBehavior, InfiniteTablePropRowClassName, InfiniteTablePropRowStyle, InfiniteTableProps, InfiniteTableRowClassNameFn, InfiniteTableRowInfo, InfiniteTableRowStyleFn, InfiniteTableState, InfiniteTable_HasGrouping_RowInfoGroup, InfiniteTable_HasGrouping_RowInfoNormal, LazyGroupDataDeepMap, LazyGroupDataItem, LazyRowInfoGroup, Menu, MenuChildrenFnParam, MenuColumn, MenuColumnRenderParam, MenuDecoration, MenuIconProps, MenuItemActionContext, MenuItemDefinition, MenuItemObject, MenuProps, MenuRenderable, MenuRuntimeItem, MenuRuntimeItemSelectable, MenuSeparator, OverlayShowParams, RowDetailCache, RowDetailState, RowDetailStateObject, RowSelectionState, ScrollStopInfo, Scrollbars, ShowOverlayFn, TableRenderRange, WeakFixedSizeSet, components, debounce, debug, defaultFilterTypes, eventMatchesKeyboardShortcut, defaultFilterTypes as filterTypes, flatten, buildManagedComponent as getComponentStateRoot, group, interceptMap, keyboardShortcuts, multisort, queryKeyToCacheKey, useManagedComponentState as useComponentState, useDataSourceInternal, useDataSourceState, useEffectWithChanges, useEffectWithObject, useGridScroll, useInfiniteColumnCell, useInfiniteColumnEditor, useInfiniteColumnFilterEditor, useInfiniteHeaderCell, useManagedDataSource, useMasterRowInfo, useOverlay, useOverlayPortal, useRowInfoReducers, useVisibleColumnSizes };
5431
+ export { AdvancedAlignable, CellSelectionState, CellSelectionStateObject, ColumnTypeWithInherit, DataClient, DataSource, DataSourceAction, DataSourceActionType, DataSourceAggregationReducer, DataSourceApi, DataSourceCRUDParam, DataSourceComponentActions, DataSourceContextValue, DataSourceData, DataSourceDataParams, DataSourceDataParamsChanges, DataSourceDerivedState, DataSourceFilterFunctionParam, DataSourceFilterOperator, DataSourceFilterOperatorFunction, DataSourceFilterOperatorFunctionParam, DataSourceFilterType, DataSourceFilterValueItem, DataSourceFilterValueItemValueGetter, DataSourceGroupBy, DataSourceGroupRowsList, DataSourceInsertParam, DataSourceLivePaginationCursorFn, DataSourceLivePaginationCursorParams, DataSourceLivePaginationCursorValue, DataSourceMappedState, DataSourceMappings, DataSourceMasterDetailContextValue, DataSourcePivotBy, DataSourcePropAggregationReducers, DataSourcePropCellSelection, DataSourcePropCellSelection_MultiCell, DataSourcePropCellSelection_SingleCell, DataSourcePropFilterFunction, DataSourcePropFilterTypes, DataSourcePropFilterValue, DataSourcePropGroupBy, DataSourcePropGroupRowsStateObject, DataSourcePropIsRowSelected, DataSourcePropLivePaginationCursor, DataSourcePropMultiRowSelectionChangeParamType, DataSourcePropOnCellSelectionChange, DataSourcePropOnCellSelectionChange_MultiCell, DataSourcePropOnCellSelectionChange_SingleCell, DataSourcePropOnRowSelectionChange, DataSourcePropOnRowSelectionChange_MultiRow, DataSourcePropOnRowSelectionChange_SingleRow, DataSourcePropPivotBy, DataSourcePropRowInfoReducers, DataSourcePropRowSelection, DataSourcePropRowSelection_MultiRow, DataSourcePropRowSelection_SingleRow, DataSourcePropSelectionMode, DataSourcePropShouldReloadData, DataSourcePropShouldReloadDataObject, DataSourcePropSortFn, DataSourcePropSortInfo, DataSourcePropSortTypes, DataSourceProps, DataSourcePropsWithChildren, DataSourceRawReducer, DataSourceRemoteData, DataSourceRowInfoReducer, DataSourceSetupState, DataSourceSingleSortInfo, DataSourceSortInfo, DataSourceState, DebugLogger, DeepMap, ElementContainerGetter, FixedSizeSet, GroupRowsState, InfiniteColumnEditorContextType, InfiniteTable, InfiniteTableAction, InfiniteTableActionType, InfiniteTableApi, InfiniteTableClassName, InfiniteTableColumn, InfiniteTableColumnAggregator, InfiniteTableColumnApi, InfiniteTableColumnCellContextType, InfiniteTableColumnComparer, InfiniteTableColumnGroup, InfiniteTableColumnRenderFunctionForGroupRows, InfiniteTableColumnRenderFunctionForNormalRows, InfiniteTableColumnRenderValueParam, InfiniteTableColumnRowspanParam, InfiniteTableColumnSizingOptions, InfiniteTableColumnValueFormatterParams, InfiniteTableColumnValueGetterParams, InfiniteTableComponent, InfiniteTableComputedColumn, InfiniteTableComputedValues, InfiniteTableContextValue, InfiniteTableGroupColumnBase, InfiniteTableGroupColumnFunction, InfiniteTableGroupColumnGetterOptions, InfiniteTablePivotColumn, InfiniteTablePropAutoSizeColumnsKey, InfiniteTablePropColumnGroupVisibility, InfiniteTablePropColumnGroups, InfiniteTablePropColumnOrder, InfiniteTablePropColumnPinning, InfiniteTablePropColumnSizing, InfiniteTablePropColumnTypes, InfiniteTablePropColumnVisibility, InfiniteTablePropColumns, InfiniteTablePropComponents, InfiniteTablePropGetCellContextMenuItems, InfiniteTablePropGetColumnMenuItems, InfiniteTablePropGroupColumn, InfiniteTablePropGroupRenderStrategy, InfiniteTablePropHeaderOptions, InfiniteTablePropKeyboardNavigation, InfiniteTablePropKeyboardShorcut, InfiniteTablePropMultiSortBehavior, InfiniteTablePropRowClassName, InfiniteTablePropRowStyle, InfiniteTableProps, InfiniteTableRowClassNameFn, InfiniteTableRowInfo, InfiniteTableRowStyleFn, InfiniteTableState, InfiniteTable_HasGrouping_RowInfoGroup, InfiniteTable_HasGrouping_RowInfoNormal, LazyGroupDataDeepMap, LazyGroupDataItem, LazyRowInfoGroup, Menu, MenuChildrenFnParam, MenuColumn, MenuColumnRenderParam, MenuDecoration, MenuIconProps, MenuItemActionContext, MenuItemDefinition, MenuItemObject, MenuProps, MenuRenderable, MenuRuntimeItem, MenuRuntimeItemSelectable, MenuSeparator, OverlayShowParams, RowDetailCache, RowDetailState, RowDetailStateObject, RowSelectionState, ScrollStopInfo, Scrollbars, ShowOverlayFn, TableRenderRange, WeakFixedSizeSet, components, debounce, debug, defaultFilterTypes, eventMatchesKeyboardShortcut, defaultFilterTypes as filterTypes, flatten, buildManagedComponent as getComponentStateRoot, group, interceptMap, keyboardShortcuts, multisort, queryKeyToCacheKey, useManagedComponentState as useComponentState, useDataSourceInternal, useDataSourceState, useEffectWithChanges, useEffectWithObject, useGridScroll, useInfiniteColumnCell, useInfiniteColumnEditor, useInfiniteColumnFilterEditor, useInfiniteHeaderCell, useManagedDataSource, useMasterRowInfo, useOverlay, useOverlayPortal, useRowInfoReducers, useVisibleColumnSizes };
package/index.dev.js CHANGED
@@ -5686,6 +5686,7 @@ var getComputedColumns = ({
5686
5686
  viewportReservedWidth,
5687
5687
  resizableColumns,
5688
5688
  draggableColumns,
5689
+ columnDefaultDraggable,
5689
5690
  columnOrder,
5690
5691
  columnPinning,
5691
5692
  editable,
@@ -5969,7 +5970,7 @@ var getComputedColumns = ({
5969
5970
  computedSortedDesc,
5970
5971
  computedVisibleIndex,
5971
5972
  computedPinned,
5972
- computedDraggable: (_z = (_y = c.draggable) != null ? _y : draggableColumns) != null ? _z : DEFAULT_DRAGGABLE,
5973
+ computedDraggable: (_z = (_y = draggableColumns != null ? draggableColumns : c.defaultDraggable) != null ? _y : columnDefaultDraggable) != null ? _z : DEFAULT_DRAGGABLE,
5973
5974
  computedFirstInCategory,
5974
5975
  computedLastInCategory,
5975
5976
  computedFirst: theComputedVisibleIndex === 0,
@@ -6950,6 +6951,7 @@ function reorderColumnsOnDrag(params) {
6950
6951
  infiniteDOMNode,
6951
6952
  brain,
6952
6953
  dragColumnHeaderTargetRect,
6954
+ draggableColumnsRestrictTo,
6953
6955
  tableRect,
6954
6956
  setProxyPosition,
6955
6957
  api: imperativeApi
@@ -6978,8 +6980,9 @@ function reorderColumnsOnDrag(params) {
6978
6980
  const scrollLeft2 = brain.getScrollPosition().scrollLeft;
6979
6981
  return col.computedOffset >= scrollLeft2 + getCurrentPinnedWidth("start") && col.computedOffset + col.computedWidth < scrollLeft2 + tableRect.width - getCurrentPinnedWidth("end");
6980
6982
  }
6981
- const getBreakPoints = (columns) => {
6982
- const breakpoints = [];
6983
+ const getBreakPoints = (columns, options) => {
6984
+ const { restrictToParentGroup, dragColumn: dragColumn2 } = options;
6985
+ let breakpoints = [];
6983
6986
  columns.forEach((c) => {
6984
6987
  const b = {
6985
6988
  columnId: c.id,
@@ -6993,6 +6996,26 @@ function reorderColumnsOnDrag(params) {
6993
6996
  breakpoints.push(b);
6994
6997
  }
6995
6998
  });
6999
+ if (restrictToParentGroup) {
7000
+ let checkAllowedColumnsInDirection2 = function(colIndex, dir2, disallowedTargets2) {
7001
+ const col = columns[colIndex];
7002
+ if (!col) {
7003
+ return;
7004
+ }
7005
+ if (col.columnGroup !== dragColumn2.columnGroup) {
7006
+ disallowedTargets2.add(col.id);
7007
+ }
7008
+ checkAllowedColumnsInDirection2(colIndex + dir2, dir2, disallowedTargets2);
7009
+ };
7010
+ var checkAllowedColumnsInDirection = checkAllowedColumnsInDirection2;
7011
+ const dragColIndex = dragColumn2.computedVisibleIndex;
7012
+ const disallowedTargets = /* @__PURE__ */ new Set();
7013
+ checkAllowedColumnsInDirection2(dragColIndex - 1, -1, disallowedTargets);
7014
+ checkAllowedColumnsInDirection2(dragColIndex + 1, 1, disallowedTargets);
7015
+ breakpoints = breakpoints.filter((b) => {
7016
+ return !disallowedTargets.has(b.columnId);
7017
+ });
7018
+ }
6996
7019
  return breakpoints;
6997
7020
  };
6998
7021
  const initialPinnedStartCount = computedPinnedStartColumns.length;
@@ -7171,7 +7194,10 @@ function reorderColumnsOnDrag(params) {
7171
7194
  imperativeApi.scrollLeft = value;
7172
7195
  }
7173
7196
  });
7174
- const breakpoints = getBreakPoints(computedVisibleColumns);
7197
+ const breakpoints = getBreakPoints(computedVisibleColumns, {
7198
+ dragColumn,
7199
+ restrictToParentGroup: draggableColumnsRestrictTo === "group"
7200
+ });
7175
7201
  let currentPos = dir === -1 ? dragColumn.computedOffset + diffX : dragColumn.computedOffset + dragColumn.computedWidth + diffX;
7176
7202
  let idx = (0, import_binary_search2.default)(
7177
7203
  breakpoints,
@@ -7330,7 +7356,7 @@ var useColumnPointerEvents = ({
7330
7356
  if (((_a2 = e.target) == null ? void 0 : _a2.tagName) === "INPUT") {
7331
7357
  return;
7332
7358
  }
7333
- const { brain } = getState();
7359
+ const { brain, draggableColumnsRestrictTo } = getState();
7334
7360
  const {
7335
7361
  computedVisibleColumns,
7336
7362
  computedVisibleColumnsMap,
@@ -7352,6 +7378,7 @@ var useColumnPointerEvents = ({
7352
7378
  let didDragAtLeastOnce = false;
7353
7379
  const dragger = reorderColumnsOnDrag({
7354
7380
  brain,
7381
+ draggableColumnsRestrictTo,
7355
7382
  columnOffsetAtIndexCSSVar: columnOffsetAtIndex4,
7356
7383
  columnWidthAtIndexCSSVar: columnWidthAtIndex3,
7357
7384
  computedPinnedEndColumns,
@@ -9960,6 +9987,7 @@ function InfiniteTableHeaderFn(props) {
9960
9987
  } = props;
9961
9988
  const {
9962
9989
  computed,
9990
+ getState,
9963
9991
  state: { headerBrain, headerOptions, showColumnFilters }
9964
9992
  } = useInfiniteTable();
9965
9993
  const { computedColumnsMap } = computed;
@@ -10012,7 +10040,8 @@ function InfiniteTableHeaderFn(props) {
10012
10040
  computedWidth: colGroupItem.computedWidth,
10013
10041
  groupOffset: colGroupItem.groupOffset
10014
10042
  });
10015
- return /* @__PURE__ */ React46.createElement(
10043
+ const visible = getState().columnGroupVisibility[colGroupItem.id] !== false;
10044
+ return visible ? /* @__PURE__ */ React46.createElement(
10016
10045
  InfiniteTableHeaderGroup,
10017
10046
  {
10018
10047
  bodyBrain,
@@ -10023,7 +10052,7 @@ function InfiniteTableHeaderFn(props) {
10023
10052
  height,
10024
10053
  columnGroup: computedColumnGroup
10025
10054
  }
10026
- );
10055
+ ) : null;
10027
10056
  }
10028
10057
  return /* @__PURE__ */ React46.createElement(
10029
10058
  InfiniteTableHeaderCell,
@@ -15890,6 +15919,15 @@ var InfiniteTableApiImpl = class {
15890
15919
  this.setColumnOrder = (columnOrder) => {
15891
15920
  this.actions.columnOrder = columnOrder;
15892
15921
  };
15922
+ this.setVisibilityForColumnGroup = (columnGroupId, visible) => {
15923
+ const columnGroupVisibility = __spreadValues({}, this.getState().columnGroupVisibility);
15924
+ if (visible) {
15925
+ delete columnGroupVisibility[columnGroupId];
15926
+ } else {
15927
+ columnGroupVisibility[columnGroupId] = false;
15928
+ }
15929
+ this.actions.columnGroupVisibility = columnGroupVisibility;
15930
+ };
15893
15931
  this.collapseAllGroupRows = () => {
15894
15932
  const state = this.getDataSourceState();
15895
15933
  const newState = new GroupRowsState(state.groupRowsState);
@@ -17333,12 +17371,18 @@ var ScrollListener = class {
17333
17371
  };
17334
17372
 
17335
17373
  // src/components/InfiniteTable/state/computeColumnGroupsDepths.ts
17336
- function computeColumnGroupsDepths(columnGroups) {
17374
+ function computeColumnGroupsDepths(columnGroups, columnGroupVisibility) {
17337
17375
  const map2 = /* @__PURE__ */ new Map();
17376
+ function isVisible(colGroupId) {
17377
+ return columnGroupVisibility[colGroupId] !== false;
17378
+ }
17338
17379
  Object.keys(columnGroups).forEach((colGroupId) => {
17339
17380
  const colGroup = columnGroups[colGroupId];
17340
17381
  let parentGroupId = colGroup.columnGroup;
17341
17382
  let depth = 0;
17383
+ if (!isVisible(colGroupId)) {
17384
+ depth = -1;
17385
+ }
17342
17386
  while (parentGroupId) {
17343
17387
  const parent = columnGroups[parentGroupId];
17344
17388
  if (!parent) {
@@ -17347,7 +17391,9 @@ function computeColumnGroupsDepths(columnGroups) {
17347
17391
  }
17348
17392
  break;
17349
17393
  }
17350
- depth++;
17394
+ if (isVisible(parentGroupId)) {
17395
+ depth++;
17396
+ }
17351
17397
  parentGroupId = parent.columnGroup;
17352
17398
  }
17353
17399
  map2.set(colGroupId, depth);
@@ -17364,6 +17410,7 @@ function getRowDetailRendererFromComponent(RowDetail) {
17364
17410
  }
17365
17411
 
17366
17412
  // src/components/InfiniteTable/state/getInitialState.ts
17413
+ var EMPTY_OBJECT = {};
17367
17414
  function createRenderer2(brain) {
17368
17415
  const renderer = new ReactHeadlessTableRenderer(brain);
17369
17416
  const onRenderUpdater = buildSubscriptionCallback();
@@ -17511,6 +17558,7 @@ var forwardProps4 = (_setupState) => {
17511
17558
  onScrollbarsChange: 1,
17512
17559
  autoSizeColumnsKey: 1,
17513
17560
  columnDefaultFlex: 1,
17561
+ draggableColumnsRestrictTo: (draggableColumnsRestrictTo) => draggableColumnsRestrictTo != null ? draggableColumnsRestrictTo : false,
17514
17562
  columnMenuRealignDelay: (columnMenuRealignDelay) => columnMenuRealignDelay != null ? columnMenuRealignDelay : 50,
17515
17563
  scrollStopDelay: (scrollStopDelay) => scrollStopDelay != null ? scrollStopDelay : 250,
17516
17564
  viewportReservedWidth: (viewportReservedWidth) => viewportReservedWidth != null ? viewportReservedWidth : 0,
@@ -17525,7 +17573,8 @@ var forwardProps4 = (_setupState) => {
17525
17573
  columnMaxWidth: (columnMaxWidth) => columnMaxWidth != null ? columnMaxWidth : 5e3,
17526
17574
  columnDefaultWidth: (columnDefaultWidth) => columnDefaultWidth != null ? columnDefaultWidth : 200,
17527
17575
  columnCssEllipsis: (columnCssEllipsis) => columnCssEllipsis != null ? columnCssEllipsis : true,
17528
- draggableColumns: (draggableColumns) => draggableColumns != null ? draggableColumns : true,
17576
+ draggableColumns: 1,
17577
+ columnDefaultDraggable: 1,
17529
17578
  headerOptions: (headerOptions) => __spreadValues({
17530
17579
  alwaysReserveSpaceForSortIcon: true
17531
17580
  }, headerOptions),
@@ -17549,7 +17598,8 @@ var forwardProps4 = (_setupState) => {
17549
17598
  rowDetailHeight: (rowDetailHeight) => typeof rowDetailHeight === "number" || typeof rowDetailHeight === "function" ? rowDetailHeight : 300,
17550
17599
  columnHeaderHeight: (columnHeaderHeight) => typeof columnHeaderHeight === "number" ? columnHeaderHeight : 30,
17551
17600
  columns: 1,
17552
- columnVisibility: (columnVisibility) => columnVisibility != null ? columnVisibility : {},
17601
+ columnVisibility: (columnVisibility) => columnVisibility != null ? columnVisibility : EMPTY_OBJECT,
17602
+ columnGroupVisibility: (columnGroupVisibility) => columnGroupVisibility != null ? columnGroupVisibility : EMPTY_OBJECT,
17553
17603
  // TODO check if columnPinning works when the value for a pinned col is `true` instead of `"start"`
17554
17604
  columnSizing: (columnSizing) => columnSizing || {},
17555
17605
  columnTypes: (columnTypes) => columnTypes || {},
@@ -17630,7 +17680,10 @@ var mapPropsToState = (params) => {
17630
17680
  var _a, _b, _c, _d, _e;
17631
17681
  const { props, state, oldState, parentState } = params;
17632
17682
  const computedColumnGroups = state.pivotColumnGroups || state.columnGroups;
17633
- const columnGroupsDepthsMap = state.columnGroups && state.columnGroups != (oldState == null ? void 0 : oldState.columnGroups) || state.pivotColumnGroups && state.pivotColumnGroups != (oldState == null ? void 0 : oldState.pivotColumnGroups) ? computeColumnGroupsDepths(computedColumnGroups) : state.columnGroupsDepthsMap;
17683
+ const columnGroupsDepthsMap = state.columnGroups && state.columnGroups != (oldState == null ? void 0 : oldState.columnGroups) || state.columnGroups && state.columnGroupVisibility != (oldState == null ? void 0 : oldState.columnGroupVisibility) || state.pivotColumnGroups && state.pivotColumnGroups != (oldState == null ? void 0 : oldState.pivotColumnGroups) ? computeColumnGroupsDepths(
17684
+ computedColumnGroups,
17685
+ state.columnGroupVisibility
17686
+ ) : state.columnGroupsDepthsMap;
17634
17687
  const groupBy = parentState == null ? void 0 : parentState.groupBy;
17635
17688
  const groupRenderStrategy = getGroupRenderStrategy({
17636
17689
  groupRenderStrategy: props.groupRenderStrategy,
@@ -17685,7 +17738,11 @@ var mapPropsToState = (params) => {
17685
17738
  keyboardNavigation: (_c = props.keyboardNavigation) != null ? _c : state.activeCellIndex != null ? "cell" : state.activeRowIndex != null ? "row" : "cell",
17686
17739
  columnHeaderCssEllipsis: (_e = (_d = props.columnHeaderCssEllipsis) != null ? _d : props.columnCssEllipsis) != null ? _e : true,
17687
17740
  columnGroupsDepthsMap,
17688
- columnGroupsMaxDepth: columnGroupsDepthsMap != state.columnGroupsDepthsMap ? Math.max(...columnGroupsDepthsMap.values(), 0) : state.columnGroupsMaxDepth,
17741
+ columnGroupsMaxDepth: columnGroupsDepthsMap != state.columnGroupsDepthsMap ? (
17742
+ // was 0, but after implementing columnGroupVisibility
17743
+ // it can be -1, to denote that no column group is visible
17744
+ Math.max(...columnGroupsDepthsMap.values(), -1)
17745
+ ) : state.columnGroupsMaxDepth,
17689
17746
  computedColumnGroups,
17690
17747
  rowHeightCSSVar: typeof props.rowHeight === "string" ? props.rowHeight : "",
17691
17748
  rowDetailHeightCSSVar: typeof props.rowDetailHeight === "string" ? props.rowDetailHeight : "",
@@ -18238,6 +18295,7 @@ var useComputedColumns = ({
18238
18295
  columnCssEllipsis,
18239
18296
  columnHeaderCssEllipsis,
18240
18297
  draggableColumns,
18298
+ columnDefaultDraggable,
18241
18299
  sortInfo,
18242
18300
  multiSort,
18243
18301
  filterValue,
@@ -18299,6 +18357,7 @@ var useComputedColumns = ({
18299
18357
  pinnedEndMaxWidth,
18300
18358
  pinnedStartMaxWidth,
18301
18359
  draggableColumns,
18360
+ columnDefaultDraggable,
18302
18361
  columnOrder,
18303
18362
  columnPinning,
18304
18363
  columnDefaultEditable,
@@ -18326,6 +18385,8 @@ var useComputedColumns = ({
18326
18385
  columnOrder,
18327
18386
  columnVisibility,
18328
18387
  columnVisibilityAssumeVisible,
18388
+ columnDefaultDraggable,
18389
+ draggableColumns,
18329
18390
  resizableColumns,
18330
18391
  pinnedEndMaxWidth,
18331
18392
  pinnedStartMaxWidth,
@@ -18583,6 +18644,7 @@ function useComputed() {
18583
18644
  columnDefaultWidth: componentState.columnDefaultWidth,
18584
18645
  columnDefaultFlex: componentState.columnDefaultFlex,
18585
18646
  columnDefaultSortable: componentState.columnDefaultSortable,
18647
+ columnDefaultDraggable: componentState.columnDefaultDraggable,
18586
18648
  pinnedStartMaxWidth: componentState.pinnedStartMaxWidth,
18587
18649
  pinnedEndMaxWidth: componentState.pinnedEndMaxWidth,
18588
18650
  bodySize,
@@ -18611,7 +18673,11 @@ function useComputed() {
18611
18673
  const computedPinnedEndOverflow = computedPinnedEndWidth ? computedPinnedEndColumnsWidth > computedPinnedEndWidth : false;
18612
18674
  const [multiRowSelector] = (0, import_react49.useState)(() => {
18613
18675
  const multiRowSelector2 = new MultiRowSelector({
18614
- getIdForIndex: (index) => getDataSourceState().dataArray[index].id
18676
+ getIdForIndex: (index) => {
18677
+ var _a2;
18678
+ const dataItem = getDataSourceState().dataArray[index];
18679
+ return (_a2 = dataItem == null ? void 0 : dataItem.id) != null ? _a2 : -1;
18680
+ }
18615
18681
  });
18616
18682
  return multiRowSelector2;
18617
18683
  });
@@ -18843,7 +18909,7 @@ var useLicense = (licenseKey = "") => {
18843
18909
  }
18844
18910
  let valid2 = isValidLicense(licenseKey, {
18845
18911
  publishedAt: 1624970570587,
18846
- version: "4.3.5"
18912
+ version: "4.3.7"
18847
18913
  });
18848
18914
  if (!licenseKey && !valid2 && isInsidePlayground) {
18849
18915
  return true;
package/index.dev.mjs CHANGED
@@ -5649,6 +5649,7 @@ var getComputedColumns = ({
5649
5649
  viewportReservedWidth,
5650
5650
  resizableColumns,
5651
5651
  draggableColumns,
5652
+ columnDefaultDraggable,
5652
5653
  columnOrder,
5653
5654
  columnPinning,
5654
5655
  editable,
@@ -5932,7 +5933,7 @@ var getComputedColumns = ({
5932
5933
  computedSortedDesc,
5933
5934
  computedVisibleIndex,
5934
5935
  computedPinned,
5935
- computedDraggable: (_z = (_y = c.draggable) != null ? _y : draggableColumns) != null ? _z : DEFAULT_DRAGGABLE,
5936
+ computedDraggable: (_z = (_y = draggableColumns != null ? draggableColumns : c.defaultDraggable) != null ? _y : columnDefaultDraggable) != null ? _z : DEFAULT_DRAGGABLE,
5936
5937
  computedFirstInCategory,
5937
5938
  computedLastInCategory,
5938
5939
  computedFirst: theComputedVisibleIndex === 0,
@@ -6913,6 +6914,7 @@ function reorderColumnsOnDrag(params) {
6913
6914
  infiniteDOMNode,
6914
6915
  brain,
6915
6916
  dragColumnHeaderTargetRect,
6917
+ draggableColumnsRestrictTo,
6916
6918
  tableRect,
6917
6919
  setProxyPosition,
6918
6920
  api: imperativeApi
@@ -6941,8 +6943,9 @@ function reorderColumnsOnDrag(params) {
6941
6943
  const scrollLeft2 = brain.getScrollPosition().scrollLeft;
6942
6944
  return col.computedOffset >= scrollLeft2 + getCurrentPinnedWidth("start") && col.computedOffset + col.computedWidth < scrollLeft2 + tableRect.width - getCurrentPinnedWidth("end");
6943
6945
  }
6944
- const getBreakPoints = (columns) => {
6945
- const breakpoints = [];
6946
+ const getBreakPoints = (columns, options) => {
6947
+ const { restrictToParentGroup, dragColumn: dragColumn2 } = options;
6948
+ let breakpoints = [];
6946
6949
  columns.forEach((c) => {
6947
6950
  const b = {
6948
6951
  columnId: c.id,
@@ -6956,6 +6959,26 @@ function reorderColumnsOnDrag(params) {
6956
6959
  breakpoints.push(b);
6957
6960
  }
6958
6961
  });
6962
+ if (restrictToParentGroup) {
6963
+ let checkAllowedColumnsInDirection2 = function(colIndex, dir2, disallowedTargets2) {
6964
+ const col = columns[colIndex];
6965
+ if (!col) {
6966
+ return;
6967
+ }
6968
+ if (col.columnGroup !== dragColumn2.columnGroup) {
6969
+ disallowedTargets2.add(col.id);
6970
+ }
6971
+ checkAllowedColumnsInDirection2(colIndex + dir2, dir2, disallowedTargets2);
6972
+ };
6973
+ var checkAllowedColumnsInDirection = checkAllowedColumnsInDirection2;
6974
+ const dragColIndex = dragColumn2.computedVisibleIndex;
6975
+ const disallowedTargets = /* @__PURE__ */ new Set();
6976
+ checkAllowedColumnsInDirection2(dragColIndex - 1, -1, disallowedTargets);
6977
+ checkAllowedColumnsInDirection2(dragColIndex + 1, 1, disallowedTargets);
6978
+ breakpoints = breakpoints.filter((b) => {
6979
+ return !disallowedTargets.has(b.columnId);
6980
+ });
6981
+ }
6959
6982
  return breakpoints;
6960
6983
  };
6961
6984
  const initialPinnedStartCount = computedPinnedStartColumns.length;
@@ -7134,7 +7157,10 @@ function reorderColumnsOnDrag(params) {
7134
7157
  imperativeApi.scrollLeft = value;
7135
7158
  }
7136
7159
  });
7137
- const breakpoints = getBreakPoints(computedVisibleColumns);
7160
+ const breakpoints = getBreakPoints(computedVisibleColumns, {
7161
+ dragColumn,
7162
+ restrictToParentGroup: draggableColumnsRestrictTo === "group"
7163
+ });
7138
7164
  let currentPos = dir === -1 ? dragColumn.computedOffset + diffX : dragColumn.computedOffset + dragColumn.computedWidth + diffX;
7139
7165
  let idx = (0, import_binary_search2.default)(
7140
7166
  breakpoints,
@@ -7293,7 +7319,7 @@ var useColumnPointerEvents = ({
7293
7319
  if (((_a2 = e.target) == null ? void 0 : _a2.tagName) === "INPUT") {
7294
7320
  return;
7295
7321
  }
7296
- const { brain } = getState();
7322
+ const { brain, draggableColumnsRestrictTo } = getState();
7297
7323
  const {
7298
7324
  computedVisibleColumns,
7299
7325
  computedVisibleColumnsMap,
@@ -7315,6 +7341,7 @@ var useColumnPointerEvents = ({
7315
7341
  let didDragAtLeastOnce = false;
7316
7342
  const dragger = reorderColumnsOnDrag({
7317
7343
  brain,
7344
+ draggableColumnsRestrictTo,
7318
7345
  columnOffsetAtIndexCSSVar: columnOffsetAtIndex4,
7319
7346
  columnWidthAtIndexCSSVar: columnWidthAtIndex3,
7320
7347
  computedPinnedEndColumns,
@@ -9923,6 +9950,7 @@ function InfiniteTableHeaderFn(props) {
9923
9950
  } = props;
9924
9951
  const {
9925
9952
  computed,
9953
+ getState,
9926
9954
  state: { headerBrain, headerOptions, showColumnFilters }
9927
9955
  } = useInfiniteTable();
9928
9956
  const { computedColumnsMap } = computed;
@@ -9975,7 +10003,8 @@ function InfiniteTableHeaderFn(props) {
9975
10003
  computedWidth: colGroupItem.computedWidth,
9976
10004
  groupOffset: colGroupItem.groupOffset
9977
10005
  });
9978
- return /* @__PURE__ */ React46.createElement(
10006
+ const visible = getState().columnGroupVisibility[colGroupItem.id] !== false;
10007
+ return visible ? /* @__PURE__ */ React46.createElement(
9979
10008
  InfiniteTableHeaderGroup,
9980
10009
  {
9981
10010
  bodyBrain,
@@ -9986,7 +10015,7 @@ function InfiniteTableHeaderFn(props) {
9986
10015
  height,
9987
10016
  columnGroup: computedColumnGroup
9988
10017
  }
9989
- );
10018
+ ) : null;
9990
10019
  }
9991
10020
  return /* @__PURE__ */ React46.createElement(
9992
10021
  InfiniteTableHeaderCell,
@@ -15858,6 +15887,15 @@ var InfiniteTableApiImpl = class {
15858
15887
  this.setColumnOrder = (columnOrder) => {
15859
15888
  this.actions.columnOrder = columnOrder;
15860
15889
  };
15890
+ this.setVisibilityForColumnGroup = (columnGroupId, visible) => {
15891
+ const columnGroupVisibility = __spreadValues({}, this.getState().columnGroupVisibility);
15892
+ if (visible) {
15893
+ delete columnGroupVisibility[columnGroupId];
15894
+ } else {
15895
+ columnGroupVisibility[columnGroupId] = false;
15896
+ }
15897
+ this.actions.columnGroupVisibility = columnGroupVisibility;
15898
+ };
15861
15899
  this.collapseAllGroupRows = () => {
15862
15900
  const state = this.getDataSourceState();
15863
15901
  const newState = new GroupRowsState(state.groupRowsState);
@@ -17305,12 +17343,18 @@ var ScrollListener = class {
17305
17343
  };
17306
17344
 
17307
17345
  // src/components/InfiniteTable/state/computeColumnGroupsDepths.ts
17308
- function computeColumnGroupsDepths(columnGroups) {
17346
+ function computeColumnGroupsDepths(columnGroups, columnGroupVisibility) {
17309
17347
  const map2 = /* @__PURE__ */ new Map();
17348
+ function isVisible(colGroupId) {
17349
+ return columnGroupVisibility[colGroupId] !== false;
17350
+ }
17310
17351
  Object.keys(columnGroups).forEach((colGroupId) => {
17311
17352
  const colGroup = columnGroups[colGroupId];
17312
17353
  let parentGroupId = colGroup.columnGroup;
17313
17354
  let depth = 0;
17355
+ if (!isVisible(colGroupId)) {
17356
+ depth = -1;
17357
+ }
17314
17358
  while (parentGroupId) {
17315
17359
  const parent = columnGroups[parentGroupId];
17316
17360
  if (!parent) {
@@ -17319,7 +17363,9 @@ function computeColumnGroupsDepths(columnGroups) {
17319
17363
  }
17320
17364
  break;
17321
17365
  }
17322
- depth++;
17366
+ if (isVisible(parentGroupId)) {
17367
+ depth++;
17368
+ }
17323
17369
  parentGroupId = parent.columnGroup;
17324
17370
  }
17325
17371
  map2.set(colGroupId, depth);
@@ -17336,6 +17382,7 @@ function getRowDetailRendererFromComponent(RowDetail) {
17336
17382
  }
17337
17383
 
17338
17384
  // src/components/InfiniteTable/state/getInitialState.ts
17385
+ var EMPTY_OBJECT = {};
17339
17386
  function createRenderer2(brain) {
17340
17387
  const renderer = new ReactHeadlessTableRenderer(brain);
17341
17388
  const onRenderUpdater = buildSubscriptionCallback();
@@ -17483,6 +17530,7 @@ var forwardProps4 = (_setupState) => {
17483
17530
  onScrollbarsChange: 1,
17484
17531
  autoSizeColumnsKey: 1,
17485
17532
  columnDefaultFlex: 1,
17533
+ draggableColumnsRestrictTo: (draggableColumnsRestrictTo) => draggableColumnsRestrictTo != null ? draggableColumnsRestrictTo : false,
17486
17534
  columnMenuRealignDelay: (columnMenuRealignDelay) => columnMenuRealignDelay != null ? columnMenuRealignDelay : 50,
17487
17535
  scrollStopDelay: (scrollStopDelay) => scrollStopDelay != null ? scrollStopDelay : 250,
17488
17536
  viewportReservedWidth: (viewportReservedWidth) => viewportReservedWidth != null ? viewportReservedWidth : 0,
@@ -17497,7 +17545,8 @@ var forwardProps4 = (_setupState) => {
17497
17545
  columnMaxWidth: (columnMaxWidth) => columnMaxWidth != null ? columnMaxWidth : 5e3,
17498
17546
  columnDefaultWidth: (columnDefaultWidth) => columnDefaultWidth != null ? columnDefaultWidth : 200,
17499
17547
  columnCssEllipsis: (columnCssEllipsis) => columnCssEllipsis != null ? columnCssEllipsis : true,
17500
- draggableColumns: (draggableColumns) => draggableColumns != null ? draggableColumns : true,
17548
+ draggableColumns: 1,
17549
+ columnDefaultDraggable: 1,
17501
17550
  headerOptions: (headerOptions) => __spreadValues({
17502
17551
  alwaysReserveSpaceForSortIcon: true
17503
17552
  }, headerOptions),
@@ -17521,7 +17570,8 @@ var forwardProps4 = (_setupState) => {
17521
17570
  rowDetailHeight: (rowDetailHeight) => typeof rowDetailHeight === "number" || typeof rowDetailHeight === "function" ? rowDetailHeight : 300,
17522
17571
  columnHeaderHeight: (columnHeaderHeight) => typeof columnHeaderHeight === "number" ? columnHeaderHeight : 30,
17523
17572
  columns: 1,
17524
- columnVisibility: (columnVisibility) => columnVisibility != null ? columnVisibility : {},
17573
+ columnVisibility: (columnVisibility) => columnVisibility != null ? columnVisibility : EMPTY_OBJECT,
17574
+ columnGroupVisibility: (columnGroupVisibility) => columnGroupVisibility != null ? columnGroupVisibility : EMPTY_OBJECT,
17525
17575
  // TODO check if columnPinning works when the value for a pinned col is `true` instead of `"start"`
17526
17576
  columnSizing: (columnSizing) => columnSizing || {},
17527
17577
  columnTypes: (columnTypes) => columnTypes || {},
@@ -17602,7 +17652,10 @@ var mapPropsToState = (params) => {
17602
17652
  var _a, _b, _c, _d, _e;
17603
17653
  const { props, state, oldState, parentState } = params;
17604
17654
  const computedColumnGroups = state.pivotColumnGroups || state.columnGroups;
17605
- const columnGroupsDepthsMap = state.columnGroups && state.columnGroups != (oldState == null ? void 0 : oldState.columnGroups) || state.pivotColumnGroups && state.pivotColumnGroups != (oldState == null ? void 0 : oldState.pivotColumnGroups) ? computeColumnGroupsDepths(computedColumnGroups) : state.columnGroupsDepthsMap;
17655
+ const columnGroupsDepthsMap = state.columnGroups && state.columnGroups != (oldState == null ? void 0 : oldState.columnGroups) || state.columnGroups && state.columnGroupVisibility != (oldState == null ? void 0 : oldState.columnGroupVisibility) || state.pivotColumnGroups && state.pivotColumnGroups != (oldState == null ? void 0 : oldState.pivotColumnGroups) ? computeColumnGroupsDepths(
17656
+ computedColumnGroups,
17657
+ state.columnGroupVisibility
17658
+ ) : state.columnGroupsDepthsMap;
17606
17659
  const groupBy = parentState == null ? void 0 : parentState.groupBy;
17607
17660
  const groupRenderStrategy = getGroupRenderStrategy({
17608
17661
  groupRenderStrategy: props.groupRenderStrategy,
@@ -17657,7 +17710,11 @@ var mapPropsToState = (params) => {
17657
17710
  keyboardNavigation: (_c = props.keyboardNavigation) != null ? _c : state.activeCellIndex != null ? "cell" : state.activeRowIndex != null ? "row" : "cell",
17658
17711
  columnHeaderCssEllipsis: (_e = (_d = props.columnHeaderCssEllipsis) != null ? _d : props.columnCssEllipsis) != null ? _e : true,
17659
17712
  columnGroupsDepthsMap,
17660
- columnGroupsMaxDepth: columnGroupsDepthsMap != state.columnGroupsDepthsMap ? Math.max(...columnGroupsDepthsMap.values(), 0) : state.columnGroupsMaxDepth,
17713
+ columnGroupsMaxDepth: columnGroupsDepthsMap != state.columnGroupsDepthsMap ? (
17714
+ // was 0, but after implementing columnGroupVisibility
17715
+ // it can be -1, to denote that no column group is visible
17716
+ Math.max(...columnGroupsDepthsMap.values(), -1)
17717
+ ) : state.columnGroupsMaxDepth,
17661
17718
  computedColumnGroups,
17662
17719
  rowHeightCSSVar: typeof props.rowHeight === "string" ? props.rowHeight : "",
17663
17720
  rowDetailHeightCSSVar: typeof props.rowDetailHeight === "string" ? props.rowDetailHeight : "",
@@ -18210,6 +18267,7 @@ var useComputedColumns = ({
18210
18267
  columnCssEllipsis,
18211
18268
  columnHeaderCssEllipsis,
18212
18269
  draggableColumns,
18270
+ columnDefaultDraggable,
18213
18271
  sortInfo,
18214
18272
  multiSort,
18215
18273
  filterValue,
@@ -18271,6 +18329,7 @@ var useComputedColumns = ({
18271
18329
  pinnedEndMaxWidth,
18272
18330
  pinnedStartMaxWidth,
18273
18331
  draggableColumns,
18332
+ columnDefaultDraggable,
18274
18333
  columnOrder,
18275
18334
  columnPinning,
18276
18335
  columnDefaultEditable,
@@ -18298,6 +18357,8 @@ var useComputedColumns = ({
18298
18357
  columnOrder,
18299
18358
  columnVisibility,
18300
18359
  columnVisibilityAssumeVisible,
18360
+ columnDefaultDraggable,
18361
+ draggableColumns,
18301
18362
  resizableColumns,
18302
18363
  pinnedEndMaxWidth,
18303
18364
  pinnedStartMaxWidth,
@@ -18555,6 +18616,7 @@ function useComputed() {
18555
18616
  columnDefaultWidth: componentState.columnDefaultWidth,
18556
18617
  columnDefaultFlex: componentState.columnDefaultFlex,
18557
18618
  columnDefaultSortable: componentState.columnDefaultSortable,
18619
+ columnDefaultDraggable: componentState.columnDefaultDraggable,
18558
18620
  pinnedStartMaxWidth: componentState.pinnedStartMaxWidth,
18559
18621
  pinnedEndMaxWidth: componentState.pinnedEndMaxWidth,
18560
18622
  bodySize,
@@ -18583,7 +18645,11 @@ function useComputed() {
18583
18645
  const computedPinnedEndOverflow = computedPinnedEndWidth ? computedPinnedEndColumnsWidth > computedPinnedEndWidth : false;
18584
18646
  const [multiRowSelector] = useState17(() => {
18585
18647
  const multiRowSelector2 = new MultiRowSelector({
18586
- getIdForIndex: (index) => getDataSourceState().dataArray[index].id
18648
+ getIdForIndex: (index) => {
18649
+ var _a2;
18650
+ const dataItem = getDataSourceState().dataArray[index];
18651
+ return (_a2 = dataItem == null ? void 0 : dataItem.id) != null ? _a2 : -1;
18652
+ }
18587
18653
  });
18588
18654
  return multiRowSelector2;
18589
18655
  });
@@ -18815,7 +18881,7 @@ var useLicense = (licenseKey = "") => {
18815
18881
  }
18816
18882
  let valid2 = isValidLicense(licenseKey, {
18817
18883
  publishedAt: 1624970570587,
18818
- version: "4.3.5"
18884
+ version: "4.3.7"
18819
18885
  });
18820
18886
  if (!licenseKey && !valid2 && isInsidePlayground) {
18821
18887
  return true;
package/index.js CHANGED
@@ -5686,6 +5686,7 @@ var getComputedColumns = ({
5686
5686
  viewportReservedWidth,
5687
5687
  resizableColumns,
5688
5688
  draggableColumns,
5689
+ columnDefaultDraggable,
5689
5690
  columnOrder,
5690
5691
  columnPinning,
5691
5692
  editable,
@@ -5969,7 +5970,7 @@ var getComputedColumns = ({
5969
5970
  computedSortedDesc,
5970
5971
  computedVisibleIndex,
5971
5972
  computedPinned,
5972
- computedDraggable: (_z = (_y = c.draggable) != null ? _y : draggableColumns) != null ? _z : DEFAULT_DRAGGABLE,
5973
+ computedDraggable: (_z = (_y = draggableColumns != null ? draggableColumns : c.defaultDraggable) != null ? _y : columnDefaultDraggable) != null ? _z : DEFAULT_DRAGGABLE,
5973
5974
  computedFirstInCategory,
5974
5975
  computedLastInCategory,
5975
5976
  computedFirst: theComputedVisibleIndex === 0,
@@ -6950,6 +6951,7 @@ function reorderColumnsOnDrag(params) {
6950
6951
  infiniteDOMNode,
6951
6952
  brain,
6952
6953
  dragColumnHeaderTargetRect,
6954
+ draggableColumnsRestrictTo,
6953
6955
  tableRect,
6954
6956
  setProxyPosition,
6955
6957
  api: imperativeApi
@@ -6978,8 +6980,9 @@ function reorderColumnsOnDrag(params) {
6978
6980
  const scrollLeft2 = brain.getScrollPosition().scrollLeft;
6979
6981
  return col.computedOffset >= scrollLeft2 + getCurrentPinnedWidth("start") && col.computedOffset + col.computedWidth < scrollLeft2 + tableRect.width - getCurrentPinnedWidth("end");
6980
6982
  }
6981
- const getBreakPoints = (columns) => {
6982
- const breakpoints = [];
6983
+ const getBreakPoints = (columns, options) => {
6984
+ const { restrictToParentGroup, dragColumn: dragColumn2 } = options;
6985
+ let breakpoints = [];
6983
6986
  columns.forEach((c) => {
6984
6987
  const b = {
6985
6988
  columnId: c.id,
@@ -6993,6 +6996,26 @@ function reorderColumnsOnDrag(params) {
6993
6996
  breakpoints.push(b);
6994
6997
  }
6995
6998
  });
6999
+ if (restrictToParentGroup) {
7000
+ let checkAllowedColumnsInDirection2 = function(colIndex, dir2, disallowedTargets2) {
7001
+ const col = columns[colIndex];
7002
+ if (!col) {
7003
+ return;
7004
+ }
7005
+ if (col.columnGroup !== dragColumn2.columnGroup) {
7006
+ disallowedTargets2.add(col.id);
7007
+ }
7008
+ checkAllowedColumnsInDirection2(colIndex + dir2, dir2, disallowedTargets2);
7009
+ };
7010
+ var checkAllowedColumnsInDirection = checkAllowedColumnsInDirection2;
7011
+ const dragColIndex = dragColumn2.computedVisibleIndex;
7012
+ const disallowedTargets = /* @__PURE__ */ new Set();
7013
+ checkAllowedColumnsInDirection2(dragColIndex - 1, -1, disallowedTargets);
7014
+ checkAllowedColumnsInDirection2(dragColIndex + 1, 1, disallowedTargets);
7015
+ breakpoints = breakpoints.filter((b) => {
7016
+ return !disallowedTargets.has(b.columnId);
7017
+ });
7018
+ }
6996
7019
  return breakpoints;
6997
7020
  };
6998
7021
  const initialPinnedStartCount = computedPinnedStartColumns.length;
@@ -7171,7 +7194,10 @@ function reorderColumnsOnDrag(params) {
7171
7194
  imperativeApi.scrollLeft = value;
7172
7195
  }
7173
7196
  });
7174
- const breakpoints = getBreakPoints(computedVisibleColumns);
7197
+ const breakpoints = getBreakPoints(computedVisibleColumns, {
7198
+ dragColumn,
7199
+ restrictToParentGroup: draggableColumnsRestrictTo === "group"
7200
+ });
7175
7201
  let currentPos = dir === -1 ? dragColumn.computedOffset + diffX : dragColumn.computedOffset + dragColumn.computedWidth + diffX;
7176
7202
  let idx = (0, import_binary_search2.default)(
7177
7203
  breakpoints,
@@ -7330,7 +7356,7 @@ var useColumnPointerEvents = ({
7330
7356
  if (((_a2 = e.target) == null ? void 0 : _a2.tagName) === "INPUT") {
7331
7357
  return;
7332
7358
  }
7333
- const { brain } = getState();
7359
+ const { brain, draggableColumnsRestrictTo } = getState();
7334
7360
  const {
7335
7361
  computedVisibleColumns,
7336
7362
  computedVisibleColumnsMap,
@@ -7352,6 +7378,7 @@ var useColumnPointerEvents = ({
7352
7378
  let didDragAtLeastOnce = false;
7353
7379
  const dragger = reorderColumnsOnDrag({
7354
7380
  brain,
7381
+ draggableColumnsRestrictTo,
7355
7382
  columnOffsetAtIndexCSSVar: columnOffsetAtIndex4,
7356
7383
  columnWidthAtIndexCSSVar: columnWidthAtIndex3,
7357
7384
  computedPinnedEndColumns,
@@ -9960,6 +9987,7 @@ function InfiniteTableHeaderFn(props) {
9960
9987
  } = props;
9961
9988
  const {
9962
9989
  computed,
9990
+ getState,
9963
9991
  state: { headerBrain, headerOptions, showColumnFilters }
9964
9992
  } = useInfiniteTable();
9965
9993
  const { computedColumnsMap } = computed;
@@ -10012,7 +10040,8 @@ function InfiniteTableHeaderFn(props) {
10012
10040
  computedWidth: colGroupItem.computedWidth,
10013
10041
  groupOffset: colGroupItem.groupOffset
10014
10042
  });
10015
- return /* @__PURE__ */ React46.createElement(
10043
+ const visible = getState().columnGroupVisibility[colGroupItem.id] !== false;
10044
+ return visible ? /* @__PURE__ */ React46.createElement(
10016
10045
  InfiniteTableHeaderGroup,
10017
10046
  {
10018
10047
  bodyBrain,
@@ -10023,7 +10052,7 @@ function InfiniteTableHeaderFn(props) {
10023
10052
  height,
10024
10053
  columnGroup: computedColumnGroup
10025
10054
  }
10026
- );
10055
+ ) : null;
10027
10056
  }
10028
10057
  return /* @__PURE__ */ React46.createElement(
10029
10058
  InfiniteTableHeaderCell,
@@ -15890,6 +15919,15 @@ var InfiniteTableApiImpl = class {
15890
15919
  this.setColumnOrder = (columnOrder) => {
15891
15920
  this.actions.columnOrder = columnOrder;
15892
15921
  };
15922
+ this.setVisibilityForColumnGroup = (columnGroupId, visible) => {
15923
+ const columnGroupVisibility = __spreadValues({}, this.getState().columnGroupVisibility);
15924
+ if (visible) {
15925
+ delete columnGroupVisibility[columnGroupId];
15926
+ } else {
15927
+ columnGroupVisibility[columnGroupId] = false;
15928
+ }
15929
+ this.actions.columnGroupVisibility = columnGroupVisibility;
15930
+ };
15893
15931
  this.collapseAllGroupRows = () => {
15894
15932
  const state = this.getDataSourceState();
15895
15933
  const newState = new GroupRowsState(state.groupRowsState);
@@ -17333,12 +17371,18 @@ var ScrollListener = class {
17333
17371
  };
17334
17372
 
17335
17373
  // src/components/InfiniteTable/state/computeColumnGroupsDepths.ts
17336
- function computeColumnGroupsDepths(columnGroups) {
17374
+ function computeColumnGroupsDepths(columnGroups, columnGroupVisibility) {
17337
17375
  const map2 = /* @__PURE__ */ new Map();
17376
+ function isVisible(colGroupId) {
17377
+ return columnGroupVisibility[colGroupId] !== false;
17378
+ }
17338
17379
  Object.keys(columnGroups).forEach((colGroupId) => {
17339
17380
  const colGroup = columnGroups[colGroupId];
17340
17381
  let parentGroupId = colGroup.columnGroup;
17341
17382
  let depth = 0;
17383
+ if (!isVisible(colGroupId)) {
17384
+ depth = -1;
17385
+ }
17342
17386
  while (parentGroupId) {
17343
17387
  const parent = columnGroups[parentGroupId];
17344
17388
  if (!parent) {
@@ -17347,7 +17391,9 @@ function computeColumnGroupsDepths(columnGroups) {
17347
17391
  }
17348
17392
  break;
17349
17393
  }
17350
- depth++;
17394
+ if (isVisible(parentGroupId)) {
17395
+ depth++;
17396
+ }
17351
17397
  parentGroupId = parent.columnGroup;
17352
17398
  }
17353
17399
  map2.set(colGroupId, depth);
@@ -17364,6 +17410,7 @@ function getRowDetailRendererFromComponent(RowDetail) {
17364
17410
  }
17365
17411
 
17366
17412
  // src/components/InfiniteTable/state/getInitialState.ts
17413
+ var EMPTY_OBJECT = {};
17367
17414
  function createRenderer2(brain) {
17368
17415
  const renderer = new ReactHeadlessTableRenderer(brain);
17369
17416
  const onRenderUpdater = buildSubscriptionCallback();
@@ -17511,6 +17558,7 @@ var forwardProps4 = (_setupState) => {
17511
17558
  onScrollbarsChange: 1,
17512
17559
  autoSizeColumnsKey: 1,
17513
17560
  columnDefaultFlex: 1,
17561
+ draggableColumnsRestrictTo: (draggableColumnsRestrictTo) => draggableColumnsRestrictTo != null ? draggableColumnsRestrictTo : false,
17514
17562
  columnMenuRealignDelay: (columnMenuRealignDelay) => columnMenuRealignDelay != null ? columnMenuRealignDelay : 50,
17515
17563
  scrollStopDelay: (scrollStopDelay) => scrollStopDelay != null ? scrollStopDelay : 250,
17516
17564
  viewportReservedWidth: (viewportReservedWidth) => viewportReservedWidth != null ? viewportReservedWidth : 0,
@@ -17525,7 +17573,8 @@ var forwardProps4 = (_setupState) => {
17525
17573
  columnMaxWidth: (columnMaxWidth) => columnMaxWidth != null ? columnMaxWidth : 5e3,
17526
17574
  columnDefaultWidth: (columnDefaultWidth) => columnDefaultWidth != null ? columnDefaultWidth : 200,
17527
17575
  columnCssEllipsis: (columnCssEllipsis) => columnCssEllipsis != null ? columnCssEllipsis : true,
17528
- draggableColumns: (draggableColumns) => draggableColumns != null ? draggableColumns : true,
17576
+ draggableColumns: 1,
17577
+ columnDefaultDraggable: 1,
17529
17578
  headerOptions: (headerOptions) => __spreadValues({
17530
17579
  alwaysReserveSpaceForSortIcon: true
17531
17580
  }, headerOptions),
@@ -17549,7 +17598,8 @@ var forwardProps4 = (_setupState) => {
17549
17598
  rowDetailHeight: (rowDetailHeight) => typeof rowDetailHeight === "number" || typeof rowDetailHeight === "function" ? rowDetailHeight : 300,
17550
17599
  columnHeaderHeight: (columnHeaderHeight) => typeof columnHeaderHeight === "number" ? columnHeaderHeight : 30,
17551
17600
  columns: 1,
17552
- columnVisibility: (columnVisibility) => columnVisibility != null ? columnVisibility : {},
17601
+ columnVisibility: (columnVisibility) => columnVisibility != null ? columnVisibility : EMPTY_OBJECT,
17602
+ columnGroupVisibility: (columnGroupVisibility) => columnGroupVisibility != null ? columnGroupVisibility : EMPTY_OBJECT,
17553
17603
  // TODO check if columnPinning works when the value for a pinned col is `true` instead of `"start"`
17554
17604
  columnSizing: (columnSizing) => columnSizing || {},
17555
17605
  columnTypes: (columnTypes) => columnTypes || {},
@@ -17630,7 +17680,10 @@ var mapPropsToState = (params) => {
17630
17680
  var _a, _b, _c, _d, _e;
17631
17681
  const { props, state, oldState, parentState } = params;
17632
17682
  const computedColumnGroups = state.pivotColumnGroups || state.columnGroups;
17633
- const columnGroupsDepthsMap = state.columnGroups && state.columnGroups != (oldState == null ? void 0 : oldState.columnGroups) || state.pivotColumnGroups && state.pivotColumnGroups != (oldState == null ? void 0 : oldState.pivotColumnGroups) ? computeColumnGroupsDepths(computedColumnGroups) : state.columnGroupsDepthsMap;
17683
+ const columnGroupsDepthsMap = state.columnGroups && state.columnGroups != (oldState == null ? void 0 : oldState.columnGroups) || state.columnGroups && state.columnGroupVisibility != (oldState == null ? void 0 : oldState.columnGroupVisibility) || state.pivotColumnGroups && state.pivotColumnGroups != (oldState == null ? void 0 : oldState.pivotColumnGroups) ? computeColumnGroupsDepths(
17684
+ computedColumnGroups,
17685
+ state.columnGroupVisibility
17686
+ ) : state.columnGroupsDepthsMap;
17634
17687
  const groupBy = parentState == null ? void 0 : parentState.groupBy;
17635
17688
  const groupRenderStrategy = getGroupRenderStrategy({
17636
17689
  groupRenderStrategy: props.groupRenderStrategy,
@@ -17685,7 +17738,11 @@ var mapPropsToState = (params) => {
17685
17738
  keyboardNavigation: (_c = props.keyboardNavigation) != null ? _c : state.activeCellIndex != null ? "cell" : state.activeRowIndex != null ? "row" : "cell",
17686
17739
  columnHeaderCssEllipsis: (_e = (_d = props.columnHeaderCssEllipsis) != null ? _d : props.columnCssEllipsis) != null ? _e : true,
17687
17740
  columnGroupsDepthsMap,
17688
- columnGroupsMaxDepth: columnGroupsDepthsMap != state.columnGroupsDepthsMap ? Math.max(...columnGroupsDepthsMap.values(), 0) : state.columnGroupsMaxDepth,
17741
+ columnGroupsMaxDepth: columnGroupsDepthsMap != state.columnGroupsDepthsMap ? (
17742
+ // was 0, but after implementing columnGroupVisibility
17743
+ // it can be -1, to denote that no column group is visible
17744
+ Math.max(...columnGroupsDepthsMap.values(), -1)
17745
+ ) : state.columnGroupsMaxDepth,
17689
17746
  computedColumnGroups,
17690
17747
  rowHeightCSSVar: typeof props.rowHeight === "string" ? props.rowHeight : "",
17691
17748
  rowDetailHeightCSSVar: typeof props.rowDetailHeight === "string" ? props.rowDetailHeight : "",
@@ -18238,6 +18295,7 @@ var useComputedColumns = ({
18238
18295
  columnCssEllipsis,
18239
18296
  columnHeaderCssEllipsis,
18240
18297
  draggableColumns,
18298
+ columnDefaultDraggable,
18241
18299
  sortInfo,
18242
18300
  multiSort,
18243
18301
  filterValue,
@@ -18299,6 +18357,7 @@ var useComputedColumns = ({
18299
18357
  pinnedEndMaxWidth,
18300
18358
  pinnedStartMaxWidth,
18301
18359
  draggableColumns,
18360
+ columnDefaultDraggable,
18302
18361
  columnOrder,
18303
18362
  columnPinning,
18304
18363
  columnDefaultEditable,
@@ -18326,6 +18385,8 @@ var useComputedColumns = ({
18326
18385
  columnOrder,
18327
18386
  columnVisibility,
18328
18387
  columnVisibilityAssumeVisible,
18388
+ columnDefaultDraggable,
18389
+ draggableColumns,
18329
18390
  resizableColumns,
18330
18391
  pinnedEndMaxWidth,
18331
18392
  pinnedStartMaxWidth,
@@ -18583,6 +18644,7 @@ function useComputed() {
18583
18644
  columnDefaultWidth: componentState.columnDefaultWidth,
18584
18645
  columnDefaultFlex: componentState.columnDefaultFlex,
18585
18646
  columnDefaultSortable: componentState.columnDefaultSortable,
18647
+ columnDefaultDraggable: componentState.columnDefaultDraggable,
18586
18648
  pinnedStartMaxWidth: componentState.pinnedStartMaxWidth,
18587
18649
  pinnedEndMaxWidth: componentState.pinnedEndMaxWidth,
18588
18650
  bodySize,
@@ -18611,7 +18673,11 @@ function useComputed() {
18611
18673
  const computedPinnedEndOverflow = computedPinnedEndWidth ? computedPinnedEndColumnsWidth > computedPinnedEndWidth : false;
18612
18674
  const [multiRowSelector] = (0, import_react49.useState)(() => {
18613
18675
  const multiRowSelector2 = new MultiRowSelector({
18614
- getIdForIndex: (index) => getDataSourceState().dataArray[index].id
18676
+ getIdForIndex: (index) => {
18677
+ var _a2;
18678
+ const dataItem = getDataSourceState().dataArray[index];
18679
+ return (_a2 = dataItem == null ? void 0 : dataItem.id) != null ? _a2 : -1;
18680
+ }
18615
18681
  });
18616
18682
  return multiRowSelector2;
18617
18683
  });
@@ -18843,7 +18909,7 @@ var useLicense = (licenseKey = "") => {
18843
18909
  }
18844
18910
  let valid2 = isValidLicense(licenseKey, {
18845
18911
  publishedAt: 1624970570587,
18846
- version: "4.3.5"
18912
+ version: "4.3.7"
18847
18913
  });
18848
18914
  if (!licenseKey && !valid2 && isInsidePlayground) {
18849
18915
  return true;
package/index.mjs CHANGED
@@ -5649,6 +5649,7 @@ var getComputedColumns = ({
5649
5649
  viewportReservedWidth,
5650
5650
  resizableColumns,
5651
5651
  draggableColumns,
5652
+ columnDefaultDraggable,
5652
5653
  columnOrder,
5653
5654
  columnPinning,
5654
5655
  editable,
@@ -5932,7 +5933,7 @@ var getComputedColumns = ({
5932
5933
  computedSortedDesc,
5933
5934
  computedVisibleIndex,
5934
5935
  computedPinned,
5935
- computedDraggable: (_z = (_y = c.draggable) != null ? _y : draggableColumns) != null ? _z : DEFAULT_DRAGGABLE,
5936
+ computedDraggable: (_z = (_y = draggableColumns != null ? draggableColumns : c.defaultDraggable) != null ? _y : columnDefaultDraggable) != null ? _z : DEFAULT_DRAGGABLE,
5936
5937
  computedFirstInCategory,
5937
5938
  computedLastInCategory,
5938
5939
  computedFirst: theComputedVisibleIndex === 0,
@@ -6913,6 +6914,7 @@ function reorderColumnsOnDrag(params) {
6913
6914
  infiniteDOMNode,
6914
6915
  brain,
6915
6916
  dragColumnHeaderTargetRect,
6917
+ draggableColumnsRestrictTo,
6916
6918
  tableRect,
6917
6919
  setProxyPosition,
6918
6920
  api: imperativeApi
@@ -6941,8 +6943,9 @@ function reorderColumnsOnDrag(params) {
6941
6943
  const scrollLeft2 = brain.getScrollPosition().scrollLeft;
6942
6944
  return col.computedOffset >= scrollLeft2 + getCurrentPinnedWidth("start") && col.computedOffset + col.computedWidth < scrollLeft2 + tableRect.width - getCurrentPinnedWidth("end");
6943
6945
  }
6944
- const getBreakPoints = (columns) => {
6945
- const breakpoints = [];
6946
+ const getBreakPoints = (columns, options) => {
6947
+ const { restrictToParentGroup, dragColumn: dragColumn2 } = options;
6948
+ let breakpoints = [];
6946
6949
  columns.forEach((c) => {
6947
6950
  const b = {
6948
6951
  columnId: c.id,
@@ -6956,6 +6959,26 @@ function reorderColumnsOnDrag(params) {
6956
6959
  breakpoints.push(b);
6957
6960
  }
6958
6961
  });
6962
+ if (restrictToParentGroup) {
6963
+ let checkAllowedColumnsInDirection2 = function(colIndex, dir2, disallowedTargets2) {
6964
+ const col = columns[colIndex];
6965
+ if (!col) {
6966
+ return;
6967
+ }
6968
+ if (col.columnGroup !== dragColumn2.columnGroup) {
6969
+ disallowedTargets2.add(col.id);
6970
+ }
6971
+ checkAllowedColumnsInDirection2(colIndex + dir2, dir2, disallowedTargets2);
6972
+ };
6973
+ var checkAllowedColumnsInDirection = checkAllowedColumnsInDirection2;
6974
+ const dragColIndex = dragColumn2.computedVisibleIndex;
6975
+ const disallowedTargets = /* @__PURE__ */ new Set();
6976
+ checkAllowedColumnsInDirection2(dragColIndex - 1, -1, disallowedTargets);
6977
+ checkAllowedColumnsInDirection2(dragColIndex + 1, 1, disallowedTargets);
6978
+ breakpoints = breakpoints.filter((b) => {
6979
+ return !disallowedTargets.has(b.columnId);
6980
+ });
6981
+ }
6959
6982
  return breakpoints;
6960
6983
  };
6961
6984
  const initialPinnedStartCount = computedPinnedStartColumns.length;
@@ -7134,7 +7157,10 @@ function reorderColumnsOnDrag(params) {
7134
7157
  imperativeApi.scrollLeft = value;
7135
7158
  }
7136
7159
  });
7137
- const breakpoints = getBreakPoints(computedVisibleColumns);
7160
+ const breakpoints = getBreakPoints(computedVisibleColumns, {
7161
+ dragColumn,
7162
+ restrictToParentGroup: draggableColumnsRestrictTo === "group"
7163
+ });
7138
7164
  let currentPos = dir === -1 ? dragColumn.computedOffset + diffX : dragColumn.computedOffset + dragColumn.computedWidth + diffX;
7139
7165
  let idx = (0, import_binary_search2.default)(
7140
7166
  breakpoints,
@@ -7293,7 +7319,7 @@ var useColumnPointerEvents = ({
7293
7319
  if (((_a2 = e.target) == null ? void 0 : _a2.tagName) === "INPUT") {
7294
7320
  return;
7295
7321
  }
7296
- const { brain } = getState();
7322
+ const { brain, draggableColumnsRestrictTo } = getState();
7297
7323
  const {
7298
7324
  computedVisibleColumns,
7299
7325
  computedVisibleColumnsMap,
@@ -7315,6 +7341,7 @@ var useColumnPointerEvents = ({
7315
7341
  let didDragAtLeastOnce = false;
7316
7342
  const dragger = reorderColumnsOnDrag({
7317
7343
  brain,
7344
+ draggableColumnsRestrictTo,
7318
7345
  columnOffsetAtIndexCSSVar: columnOffsetAtIndex4,
7319
7346
  columnWidthAtIndexCSSVar: columnWidthAtIndex3,
7320
7347
  computedPinnedEndColumns,
@@ -9923,6 +9950,7 @@ function InfiniteTableHeaderFn(props) {
9923
9950
  } = props;
9924
9951
  const {
9925
9952
  computed,
9953
+ getState,
9926
9954
  state: { headerBrain, headerOptions, showColumnFilters }
9927
9955
  } = useInfiniteTable();
9928
9956
  const { computedColumnsMap } = computed;
@@ -9975,7 +10003,8 @@ function InfiniteTableHeaderFn(props) {
9975
10003
  computedWidth: colGroupItem.computedWidth,
9976
10004
  groupOffset: colGroupItem.groupOffset
9977
10005
  });
9978
- return /* @__PURE__ */ React46.createElement(
10006
+ const visible = getState().columnGroupVisibility[colGroupItem.id] !== false;
10007
+ return visible ? /* @__PURE__ */ React46.createElement(
9979
10008
  InfiniteTableHeaderGroup,
9980
10009
  {
9981
10010
  bodyBrain,
@@ -9986,7 +10015,7 @@ function InfiniteTableHeaderFn(props) {
9986
10015
  height,
9987
10016
  columnGroup: computedColumnGroup
9988
10017
  }
9989
- );
10018
+ ) : null;
9990
10019
  }
9991
10020
  return /* @__PURE__ */ React46.createElement(
9992
10021
  InfiniteTableHeaderCell,
@@ -15858,6 +15887,15 @@ var InfiniteTableApiImpl = class {
15858
15887
  this.setColumnOrder = (columnOrder) => {
15859
15888
  this.actions.columnOrder = columnOrder;
15860
15889
  };
15890
+ this.setVisibilityForColumnGroup = (columnGroupId, visible) => {
15891
+ const columnGroupVisibility = __spreadValues({}, this.getState().columnGroupVisibility);
15892
+ if (visible) {
15893
+ delete columnGroupVisibility[columnGroupId];
15894
+ } else {
15895
+ columnGroupVisibility[columnGroupId] = false;
15896
+ }
15897
+ this.actions.columnGroupVisibility = columnGroupVisibility;
15898
+ };
15861
15899
  this.collapseAllGroupRows = () => {
15862
15900
  const state = this.getDataSourceState();
15863
15901
  const newState = new GroupRowsState(state.groupRowsState);
@@ -17305,12 +17343,18 @@ var ScrollListener = class {
17305
17343
  };
17306
17344
 
17307
17345
  // src/components/InfiniteTable/state/computeColumnGroupsDepths.ts
17308
- function computeColumnGroupsDepths(columnGroups) {
17346
+ function computeColumnGroupsDepths(columnGroups, columnGroupVisibility) {
17309
17347
  const map2 = /* @__PURE__ */ new Map();
17348
+ function isVisible(colGroupId) {
17349
+ return columnGroupVisibility[colGroupId] !== false;
17350
+ }
17310
17351
  Object.keys(columnGroups).forEach((colGroupId) => {
17311
17352
  const colGroup = columnGroups[colGroupId];
17312
17353
  let parentGroupId = colGroup.columnGroup;
17313
17354
  let depth = 0;
17355
+ if (!isVisible(colGroupId)) {
17356
+ depth = -1;
17357
+ }
17314
17358
  while (parentGroupId) {
17315
17359
  const parent = columnGroups[parentGroupId];
17316
17360
  if (!parent) {
@@ -17319,7 +17363,9 @@ function computeColumnGroupsDepths(columnGroups) {
17319
17363
  }
17320
17364
  break;
17321
17365
  }
17322
- depth++;
17366
+ if (isVisible(parentGroupId)) {
17367
+ depth++;
17368
+ }
17323
17369
  parentGroupId = parent.columnGroup;
17324
17370
  }
17325
17371
  map2.set(colGroupId, depth);
@@ -17336,6 +17382,7 @@ function getRowDetailRendererFromComponent(RowDetail) {
17336
17382
  }
17337
17383
 
17338
17384
  // src/components/InfiniteTable/state/getInitialState.ts
17385
+ var EMPTY_OBJECT = {};
17339
17386
  function createRenderer2(brain) {
17340
17387
  const renderer = new ReactHeadlessTableRenderer(brain);
17341
17388
  const onRenderUpdater = buildSubscriptionCallback();
@@ -17483,6 +17530,7 @@ var forwardProps4 = (_setupState) => {
17483
17530
  onScrollbarsChange: 1,
17484
17531
  autoSizeColumnsKey: 1,
17485
17532
  columnDefaultFlex: 1,
17533
+ draggableColumnsRestrictTo: (draggableColumnsRestrictTo) => draggableColumnsRestrictTo != null ? draggableColumnsRestrictTo : false,
17486
17534
  columnMenuRealignDelay: (columnMenuRealignDelay) => columnMenuRealignDelay != null ? columnMenuRealignDelay : 50,
17487
17535
  scrollStopDelay: (scrollStopDelay) => scrollStopDelay != null ? scrollStopDelay : 250,
17488
17536
  viewportReservedWidth: (viewportReservedWidth) => viewportReservedWidth != null ? viewportReservedWidth : 0,
@@ -17497,7 +17545,8 @@ var forwardProps4 = (_setupState) => {
17497
17545
  columnMaxWidth: (columnMaxWidth) => columnMaxWidth != null ? columnMaxWidth : 5e3,
17498
17546
  columnDefaultWidth: (columnDefaultWidth) => columnDefaultWidth != null ? columnDefaultWidth : 200,
17499
17547
  columnCssEllipsis: (columnCssEllipsis) => columnCssEllipsis != null ? columnCssEllipsis : true,
17500
- draggableColumns: (draggableColumns) => draggableColumns != null ? draggableColumns : true,
17548
+ draggableColumns: 1,
17549
+ columnDefaultDraggable: 1,
17501
17550
  headerOptions: (headerOptions) => __spreadValues({
17502
17551
  alwaysReserveSpaceForSortIcon: true
17503
17552
  }, headerOptions),
@@ -17521,7 +17570,8 @@ var forwardProps4 = (_setupState) => {
17521
17570
  rowDetailHeight: (rowDetailHeight) => typeof rowDetailHeight === "number" || typeof rowDetailHeight === "function" ? rowDetailHeight : 300,
17522
17571
  columnHeaderHeight: (columnHeaderHeight) => typeof columnHeaderHeight === "number" ? columnHeaderHeight : 30,
17523
17572
  columns: 1,
17524
- columnVisibility: (columnVisibility) => columnVisibility != null ? columnVisibility : {},
17573
+ columnVisibility: (columnVisibility) => columnVisibility != null ? columnVisibility : EMPTY_OBJECT,
17574
+ columnGroupVisibility: (columnGroupVisibility) => columnGroupVisibility != null ? columnGroupVisibility : EMPTY_OBJECT,
17525
17575
  // TODO check if columnPinning works when the value for a pinned col is `true` instead of `"start"`
17526
17576
  columnSizing: (columnSizing) => columnSizing || {},
17527
17577
  columnTypes: (columnTypes) => columnTypes || {},
@@ -17602,7 +17652,10 @@ var mapPropsToState = (params) => {
17602
17652
  var _a, _b, _c, _d, _e;
17603
17653
  const { props, state, oldState, parentState } = params;
17604
17654
  const computedColumnGroups = state.pivotColumnGroups || state.columnGroups;
17605
- const columnGroupsDepthsMap = state.columnGroups && state.columnGroups != (oldState == null ? void 0 : oldState.columnGroups) || state.pivotColumnGroups && state.pivotColumnGroups != (oldState == null ? void 0 : oldState.pivotColumnGroups) ? computeColumnGroupsDepths(computedColumnGroups) : state.columnGroupsDepthsMap;
17655
+ const columnGroupsDepthsMap = state.columnGroups && state.columnGroups != (oldState == null ? void 0 : oldState.columnGroups) || state.columnGroups && state.columnGroupVisibility != (oldState == null ? void 0 : oldState.columnGroupVisibility) || state.pivotColumnGroups && state.pivotColumnGroups != (oldState == null ? void 0 : oldState.pivotColumnGroups) ? computeColumnGroupsDepths(
17656
+ computedColumnGroups,
17657
+ state.columnGroupVisibility
17658
+ ) : state.columnGroupsDepthsMap;
17606
17659
  const groupBy = parentState == null ? void 0 : parentState.groupBy;
17607
17660
  const groupRenderStrategy = getGroupRenderStrategy({
17608
17661
  groupRenderStrategy: props.groupRenderStrategy,
@@ -17657,7 +17710,11 @@ var mapPropsToState = (params) => {
17657
17710
  keyboardNavigation: (_c = props.keyboardNavigation) != null ? _c : state.activeCellIndex != null ? "cell" : state.activeRowIndex != null ? "row" : "cell",
17658
17711
  columnHeaderCssEllipsis: (_e = (_d = props.columnHeaderCssEllipsis) != null ? _d : props.columnCssEllipsis) != null ? _e : true,
17659
17712
  columnGroupsDepthsMap,
17660
- columnGroupsMaxDepth: columnGroupsDepthsMap != state.columnGroupsDepthsMap ? Math.max(...columnGroupsDepthsMap.values(), 0) : state.columnGroupsMaxDepth,
17713
+ columnGroupsMaxDepth: columnGroupsDepthsMap != state.columnGroupsDepthsMap ? (
17714
+ // was 0, but after implementing columnGroupVisibility
17715
+ // it can be -1, to denote that no column group is visible
17716
+ Math.max(...columnGroupsDepthsMap.values(), -1)
17717
+ ) : state.columnGroupsMaxDepth,
17661
17718
  computedColumnGroups,
17662
17719
  rowHeightCSSVar: typeof props.rowHeight === "string" ? props.rowHeight : "",
17663
17720
  rowDetailHeightCSSVar: typeof props.rowDetailHeight === "string" ? props.rowDetailHeight : "",
@@ -18210,6 +18267,7 @@ var useComputedColumns = ({
18210
18267
  columnCssEllipsis,
18211
18268
  columnHeaderCssEllipsis,
18212
18269
  draggableColumns,
18270
+ columnDefaultDraggable,
18213
18271
  sortInfo,
18214
18272
  multiSort,
18215
18273
  filterValue,
@@ -18271,6 +18329,7 @@ var useComputedColumns = ({
18271
18329
  pinnedEndMaxWidth,
18272
18330
  pinnedStartMaxWidth,
18273
18331
  draggableColumns,
18332
+ columnDefaultDraggable,
18274
18333
  columnOrder,
18275
18334
  columnPinning,
18276
18335
  columnDefaultEditable,
@@ -18298,6 +18357,8 @@ var useComputedColumns = ({
18298
18357
  columnOrder,
18299
18358
  columnVisibility,
18300
18359
  columnVisibilityAssumeVisible,
18360
+ columnDefaultDraggable,
18361
+ draggableColumns,
18301
18362
  resizableColumns,
18302
18363
  pinnedEndMaxWidth,
18303
18364
  pinnedStartMaxWidth,
@@ -18555,6 +18616,7 @@ function useComputed() {
18555
18616
  columnDefaultWidth: componentState.columnDefaultWidth,
18556
18617
  columnDefaultFlex: componentState.columnDefaultFlex,
18557
18618
  columnDefaultSortable: componentState.columnDefaultSortable,
18619
+ columnDefaultDraggable: componentState.columnDefaultDraggable,
18558
18620
  pinnedStartMaxWidth: componentState.pinnedStartMaxWidth,
18559
18621
  pinnedEndMaxWidth: componentState.pinnedEndMaxWidth,
18560
18622
  bodySize,
@@ -18583,7 +18645,11 @@ function useComputed() {
18583
18645
  const computedPinnedEndOverflow = computedPinnedEndWidth ? computedPinnedEndColumnsWidth > computedPinnedEndWidth : false;
18584
18646
  const [multiRowSelector] = useState17(() => {
18585
18647
  const multiRowSelector2 = new MultiRowSelector({
18586
- getIdForIndex: (index) => getDataSourceState().dataArray[index].id
18648
+ getIdForIndex: (index) => {
18649
+ var _a2;
18650
+ const dataItem = getDataSourceState().dataArray[index];
18651
+ return (_a2 = dataItem == null ? void 0 : dataItem.id) != null ? _a2 : -1;
18652
+ }
18587
18653
  });
18588
18654
  return multiRowSelector2;
18589
18655
  });
@@ -18815,7 +18881,7 @@ var useLicense = (licenseKey = "") => {
18815
18881
  }
18816
18882
  let valid2 = isValidLicense(licenseKey, {
18817
18883
  publishedAt: 1624970570587,
18818
- version: "4.3.5"
18884
+ version: "4.3.7"
18819
18885
  });
18820
18886
  if (!licenseKey && !valid2 && isInsidePlayground) {
18821
18887
  return true;
package/package.json CHANGED
@@ -25,7 +25,7 @@
25
25
  "bugs": {
26
26
  "url": "https://github.com/infinite-table/infinite-react/issues"
27
27
  },
28
- "version": "4.3.5",
28
+ "version": "4.3.7",
29
29
  "main": "index.js",
30
30
  "module": "index.mjs",
31
31
  "typings": "index.d.ts",
@@ -34,5 +34,5 @@
34
34
  },
35
35
  "license": "Commercial & Open Source",
36
36
  "//": "will be updated at build time",
37
- "publishedAt": 1723208083972
37
+ "publishedAt": 1723637108931
38
38
  }