@deephaven/iris-grid 1.8.1-beta.9 → 1.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (63) hide show
  1. package/dist/IrisGrid.d.ts +19 -0
  2. package/dist/IrisGrid.d.ts.map +1 -1
  3. package/dist/IrisGrid.js +17 -9
  4. package/dist/IrisGrid.js.map +1 -1
  5. package/dist/IrisGridMetricCalculator.d.ts +34 -1
  6. package/dist/IrisGridMetricCalculator.d.ts.map +1 -1
  7. package/dist/IrisGridMetricCalculator.js +136 -1
  8. package/dist/IrisGridMetricCalculator.js.map +1 -1
  9. package/dist/LazyIrisGrid.d.ts +1 -0
  10. package/dist/LazyIrisGrid.d.ts.map +1 -1
  11. package/dist/TreeRebalanceUtil.d.ts +50 -0
  12. package/dist/TreeRebalanceUtil.d.ts.map +1 -0
  13. package/dist/TreeRebalanceUtil.js +105 -0
  14. package/dist/TreeRebalanceUtil.js.map +1 -0
  15. package/dist/sidebar/visibility-ordering-builder/SearchItem.d.ts +12 -0
  16. package/dist/sidebar/visibility-ordering-builder/SearchItem.d.ts.map +1 -0
  17. package/dist/sidebar/visibility-ordering-builder/SearchItem.js +55 -0
  18. package/dist/sidebar/visibility-ordering-builder/SearchItem.js.map +1 -0
  19. package/dist/sidebar/visibility-ordering-builder/SearchWithModal.css +408 -0
  20. package/dist/sidebar/visibility-ordering-builder/SearchWithModal.css.map +1 -0
  21. package/dist/sidebar/visibility-ordering-builder/SearchWithModal.d.ts +14 -0
  22. package/dist/sidebar/visibility-ordering-builder/SearchWithModal.d.ts.map +1 -0
  23. package/dist/sidebar/visibility-ordering-builder/SearchWithModal.js +235 -0
  24. package/dist/sidebar/visibility-ordering-builder/SearchWithModal.js.map +1 -0
  25. package/dist/sidebar/visibility-ordering-builder/VisibilityOrderingBuilder.d.ts +43 -43
  26. package/dist/sidebar/visibility-ordering-builder/VisibilityOrderingBuilder.d.ts.map +1 -1
  27. package/dist/sidebar/visibility-ordering-builder/VisibilityOrderingBuilder.js +427 -466
  28. package/dist/sidebar/visibility-ordering-builder/VisibilityOrderingBuilder.js.map +1 -1
  29. package/dist/sidebar/visibility-ordering-builder/VisibilityOrderingItem.d.ts +7 -2
  30. package/dist/sidebar/visibility-ordering-builder/VisibilityOrderingItem.d.ts.map +1 -1
  31. package/dist/sidebar/visibility-ordering-builder/VisibilityOrderingItem.js +7 -4
  32. package/dist/sidebar/visibility-ordering-builder/VisibilityOrderingItem.js.map +1 -1
  33. package/dist/sidebar/visibility-ordering-builder/sortable-tree/SortableTree.d.ts +7 -15
  34. package/dist/sidebar/visibility-ordering-builder/sortable-tree/SortableTree.d.ts.map +1 -1
  35. package/dist/sidebar/visibility-ordering-builder/sortable-tree/SortableTree.js +53 -137
  36. package/dist/sidebar/visibility-ordering-builder/sortable-tree/SortableTree.js.map +1 -1
  37. package/dist/sidebar/visibility-ordering-builder/sortable-tree/SortableTreeDndContext.d.ts +14 -0
  38. package/dist/sidebar/visibility-ordering-builder/sortable-tree/SortableTreeDndContext.d.ts.map +1 -0
  39. package/dist/sidebar/visibility-ordering-builder/sortable-tree/SortableTreeDndContext.js +245 -0
  40. package/dist/sidebar/visibility-ordering-builder/sortable-tree/SortableTreeDndContext.js.map +1 -0
  41. package/dist/sidebar/visibility-ordering-builder/sortable-tree/SortableTreeItem.d.ts +4 -3
  42. package/dist/sidebar/visibility-ordering-builder/sortable-tree/SortableTreeItem.d.ts.map +1 -1
  43. package/dist/sidebar/visibility-ordering-builder/sortable-tree/SortableTreeItem.js +2 -1
  44. package/dist/sidebar/visibility-ordering-builder/sortable-tree/SortableTreeItem.js.map +1 -1
  45. package/dist/sidebar/visibility-ordering-builder/sortable-tree/TreeItem.css +45 -22
  46. package/dist/sidebar/visibility-ordering-builder/sortable-tree/TreeItem.css.map +1 -1
  47. package/dist/sidebar/visibility-ordering-builder/sortable-tree/TreeItem.d.ts +13 -14
  48. package/dist/sidebar/visibility-ordering-builder/sortable-tree/TreeItem.d.ts.map +1 -1
  49. package/dist/sidebar/visibility-ordering-builder/sortable-tree/TreeItem.js +9 -7
  50. package/dist/sidebar/visibility-ordering-builder/sortable-tree/TreeItem.js.map +1 -1
  51. package/dist/sidebar/visibility-ordering-builder/sortable-tree/keyboardCoordinates.d.ts +1 -1
  52. package/dist/sidebar/visibility-ordering-builder/sortable-tree/keyboardCoordinates.d.ts.map +1 -1
  53. package/dist/sidebar/visibility-ordering-builder/sortable-tree/keyboardCoordinates.js +8 -7
  54. package/dist/sidebar/visibility-ordering-builder/sortable-tree/keyboardCoordinates.js.map +1 -1
  55. package/dist/sidebar/visibility-ordering-builder/sortable-tree/utilities.d.ts +4 -4
  56. package/dist/sidebar/visibility-ordering-builder/sortable-tree/utilities.d.ts.map +1 -1
  57. package/dist/sidebar/visibility-ordering-builder/sortable-tree/utilities.js +5 -1
  58. package/dist/sidebar/visibility-ordering-builder/sortable-tree/utilities.js.map +1 -1
  59. package/package.json +20 -19
  60. package/dist/sidebar/visibility-ordering-builder/sortable-tree/SortableTreeInner.d.ts +0 -21
  61. package/dist/sidebar/visibility-ordering-builder/sortable-tree/SortableTreeInner.d.ts.map +0 -1
  62. package/dist/sidebar/visibility-ordering-builder/sortable-tree/SortableTreeInner.js +0 -149
  63. package/dist/sidebar/visibility-ordering-builder/sortable-tree/SortableTreeInner.js.map +0 -1
@@ -4,14 +4,14 @@ function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object
4
4
  function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
5
5
  function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
6
6
  import React, { memo, PureComponent, useCallback, useEffect, useRef } from 'react';
7
+ import { flushSync } from 'react-dom';
7
8
  import classNames from 'classnames';
8
9
  import { GridUtils } from '@deephaven/grid';
9
10
  import { TextUtils, assertNotNull, DbNameValidator } from '@deephaven/utils';
10
11
  import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
11
12
  import { dhEye, dhEyeSlash, dhSortAlphaDown, dhSortAlphaUp, dhArrowToTop, dhArrowToBottom, vsChevronUp, vsChevronDown, vsSymbolStructure, vsRefresh, vsCircleLargeFilled, vsAdd, vsBlank, vsCheck, vsKebabVertical } from '@deephaven/icons';
12
13
  import memoize from 'memoizee';
13
- import debounce from 'lodash.debounce';
14
- import { ActionButton, Button, GLOBAL_SHORTCUTS, Icon, Item, Keyboard, MenuTrigger, SearchInput, Section, SpectrumMenu, Text } from '@deephaven/components';
14
+ import { ActionButton, Button, GLOBAL_SHORTCUTS, Icon, Item, Keyboard, MenuTrigger, Section, SpectrumMenu, Text } from '@deephaven/components';
15
15
  import clamp from 'lodash.clamp';
16
16
  import throttle from 'lodash.throttle';
17
17
  import { useUndoRedo } from '@deephaven/react-hooks';
@@ -23,9 +23,10 @@ import { flattenTree, getTreeItems } from "./sortable-tree/utilities.js";
23
23
  import SortableTree from "./sortable-tree/SortableTree.js";
24
24
  import { moveItemsFromDrop, moveToGroup } from "./VisibilityOrderingBuilderUtils.js";
25
25
  import IrisGridUtils from "../../IrisGridUtils.js";
26
+ import SearchWithModal from "./SearchWithModal.js";
27
+ import SortableTreeDndContext from "./sortable-tree/SortableTreeDndContext.js";
26
28
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
27
29
  var log = Log.module('VisibilityOrderingBuilder');
28
- var DEBOUNCE_SEARCH_COLUMN = 150;
29
30
  class VisibilityOrderingBuilderInner extends PureComponent {
30
31
  static shouldRenderColumn(column) {
31
32
  // We don't want to render the proxy column in the visibility ordering list
@@ -34,9 +35,17 @@ class VisibilityOrderingBuilderInner extends PureComponent {
34
35
  constructor(props) {
35
36
  super(props);
36
37
  _defineProperty(this, "wrapperRef", /*#__PURE__*/React.createRef());
38
+ /**
39
+ * Used to track the last focused item index to maintain focus on updates.
40
+ * Cannot use name because it may change or be deleted when undoing or redoing.
41
+ */
37
42
  _defineProperty(this, "lastFocusedItemIndex", null);
38
43
  _defineProperty(this, "list", void 0);
39
- _defineProperty(this, "debouncedSearchColumns", debounce(this.searchColumns, DEBOUNCE_SEARCH_COLUMN));
44
+ /**
45
+ * This is set by the search modal handlers since a column could be hidden
46
+ * and not displayed in the list. We need to wait until the update to scroll to it.
47
+ */
48
+ _defineProperty(this, "scrollAndFocusColumnOnUpdate", null);
40
49
  _defineProperty(this, "handleGroupColorChange", throttle((group, color) => {
41
50
  var {
42
51
  columnHeaderGroups,
@@ -54,49 +63,6 @@ class VisibilityOrderingBuilderInner extends PureComponent {
54
63
  }), 1, newGroup);
55
64
  onColumnHeaderGroupChanged(newGroups);
56
65
  }, 250));
57
- _defineProperty(this, "renderItem", memoize(_ref2 => {
58
- var {
59
- value,
60
- clone,
61
- item,
62
- ref,
63
- handleProps
64
- } = _ref2;
65
- var {
66
- onColumnVisibilityChanged
67
- } = this.props;
68
- var {
69
- selectedColumns
70
- } = this.state;
71
- var displayString = value;
72
-
73
- // The cloned drag overlay we want to show the items being dragged
74
- if (clone) {
75
- var selectedItemNames = this.getSelectedParentItems().map(_ref3 => {
76
- var {
77
- id
78
- } = _ref3;
79
- return id;
80
- });
81
- displayString = selectedItemNames.join(', ');
82
- }
83
- return /*#__PURE__*/_jsx(VisibilityOrderingItem, {
84
- ref: ref,
85
- value: displayString,
86
- clone: clone,
87
- item: item,
88
- childCount: selectedColumns.size,
89
- onVisibilityChange: onColumnVisibilityChanged,
90
- onClick: this.handleItemClick,
91
- onGroupDelete: this.handleGroupDelete,
92
- onGroupColorChange: this.handleGroupColorChange,
93
- onGroupNameChange: this.handleGroupNameChange,
94
- validateGroupName: this.validateGroupName,
95
- handleProps: handleProps
96
- }, item.id);
97
- }, {
98
- max: 1000
99
- }));
100
66
  _defineProperty(this, "getMemoizedFirstMovableIndex", memoize((model, columns, movedColumns) => {
101
67
  for (var i = 0; i < columns.length; i += 1) {
102
68
  var modelIndex = GridUtils.getModelIndex(i, movedColumns);
@@ -122,23 +88,23 @@ class VisibilityOrderingBuilderInner extends PureComponent {
122
88
  _defineProperty(this, "memoizedGetTreeItems", memoize((columns, movedColumns, columnHeaderGroups, hiddenColumns, selectedColumns, showHiddenColumns) => getTreeItems(columns, movedColumns, columnHeaderGroups, hiddenColumns, [...selectedColumns.values()], showHiddenColumns), {
123
89
  max: 1000
124
90
  }));
125
- _defineProperty(this, "makeVisibilityOrderingList", memoize((columns, treeItems, showHiddenColumns) => {
91
+ _defineProperty(this, "makeVisibilityOrderingList", memoize((columns, treeItems, showHiddenColumns, isDraggable) => {
126
92
  var {
127
93
  movedColumns
128
94
  } = this.props;
129
95
  var elements = [];
130
96
  var firstMovableIndex = this.getFirstMovableIndex();
131
97
  var lastMovableIndex = this.getLastMovableIndex();
132
- var firstMovableTreeIndex = treeItems.findIndex(_ref4 => {
98
+ var firstMovableTreeIndex = treeItems.findIndex(_ref2 => {
133
99
  var {
134
100
  data
135
- } = _ref4;
101
+ } = _ref2;
136
102
  return Array.isArray(data.visibleIndex) ? data.visibleIndex[0] === firstMovableIndex : data.visibleIndex === firstMovableIndex;
137
103
  });
138
- var lastMovableTreeIndex = treeItems.findIndex(_ref5 => {
104
+ var lastMovableTreeIndex = treeItems.findIndex(_ref3 => {
139
105
  var {
140
106
  data
141
- } = _ref5;
107
+ } = _ref3;
142
108
  return Array.isArray(data.visibleIndex) ? data.visibleIndex[1] === lastMovableIndex : data.visibleIndex === lastMovableIndex;
143
109
  });
144
110
  var movableItems = treeItems.slice(firstMovableTreeIndex, lastMovableTreeIndex + 1);
@@ -172,8 +138,7 @@ class VisibilityOrderingBuilderInner extends PureComponent {
172
138
  elements.push(/*#__PURE__*/_jsx(SortableTree, {
173
139
  items: movableItems,
174
140
  renderItem: this.renderItem,
175
- onDragStart: this.handleDragStart,
176
- onDragEnd: this.handleDragEnd
141
+ isDraggable: isDraggable
177
142
  }, "movable-items"));
178
143
  if (lastMovableIndex != null && lastMovableIndex < columns.length - 1) {
179
144
  elements.push(/*#__PURE__*/_jsx("hr", {}, "bottom-horizontal-divider"));
@@ -201,8 +166,6 @@ class VisibilityOrderingBuilderInner extends PureComponent {
201
166
  }, columnName), {
202
167
  max: 1000
203
168
  }));
204
- this.handleSearchInputChange = this.handleSearchInputChange.bind(this);
205
- this.searchColumns = this.searchColumns.bind(this);
206
169
  this.handleItemClick = this.handleItemClick.bind(this);
207
170
  this.handleDragEnd = this.handleDragEnd.bind(this);
208
171
  this.handleGroupDelete = this.handleGroupDelete.bind(this);
@@ -213,14 +176,16 @@ class VisibilityOrderingBuilderInner extends PureComponent {
213
176
  this.handleDragStart = this.handleDragStart.bind(this);
214
177
  this.handleOverflowAction = this.handleOverflowAction.bind(this);
215
178
  this.handleKeyboardShortcut = this.handleKeyboardShortcut.bind(this);
179
+ this.handleSearchModalOpenChange = this.handleSearchModalOpenChange.bind(this);
180
+ this.handleSearchSelect = this.handleSearchSelect.bind(this);
181
+ this.handleSearchItemClicked = this.handleSearchItemClicked.bind(this);
182
+ this.renderItem = this.renderItem.bind(this);
216
183
  this.state = {
217
184
  selectedColumns: new Set(),
218
- queriedColumnIndex: undefined,
219
- queriedColumnRange: undefined,
220
- prevQueriedColumns: undefined,
221
185
  lastSelectedColumn: '',
222
- searchFilter: '',
223
- showHiddenColumns: true
186
+ showHiddenColumns: true,
187
+ isSearchModalOpen: false,
188
+ movedColumns: props.movedColumns
224
189
  };
225
190
  this.list = null;
226
191
  }
@@ -239,34 +204,46 @@ class VisibilityOrderingBuilderInner extends PureComponent {
239
204
  });
240
205
  }
241
206
  componentDidUpdate(prevProps) {
207
+ // If we change because of undo/redo or reorders in the grid, update internal state
242
208
  var {
243
209
  movedColumns
244
210
  } = this.props;
245
- if (movedColumns !== prevProps.movedColumns) {
246
- var {
247
- searchFilter
248
- } = this.state;
249
- this.searchColumns(searchFilter, false);
211
+ if (prevProps.movedColumns !== movedColumns) {
212
+ this.setState({
213
+ movedColumns
214
+ });
215
+ }
216
+
217
+ // Scroll to the item when it's available
218
+ if (this.scrollAndFocusColumnOnUpdate != null) {
219
+ var _this$list;
220
+ var itemElement = (_this$list = this.list) === null || _this$list === void 0 ? void 0 : _this$list.querySelector(".item-wrapper[data-id=\"".concat(this.scrollAndFocusColumnOnUpdate, "\"] .tree-item"));
221
+ if (itemElement instanceof HTMLElement) {
222
+ itemElement.scrollIntoView({
223
+ block: 'nearest'
224
+ });
225
+ itemElement.focus();
226
+ this.scrollAndFocusColumnOnUpdate = null;
227
+ }
250
228
  }
251
229
 
252
230
  // document.activeElement is either body or html when nothing is focused.
253
231
  // If there is no focused element, then we probably deleted or renamed a group
254
232
  // resulting in focus loss. Try to re-establish focus.
255
- // Cannot use focusout event for this because it doesn't fire when the focused element is deleted
233
+ // Cannot rely on focusout event for this because it doesn't fire when the focused element is deleted
256
234
  // (except in Chrome which is against the spec here).
257
- if ((document.activeElement === document.body || document.activeElement === document.documentElement) && this.lastFocusedItemIndex != null) {
258
- var _this$list;
259
- var itemToFocus = (_this$list = this.list) === null || _this$list === void 0 ? void 0 : _this$list.querySelector(".item-wrapper:nth-child(".concat(this.lastFocusedItemIndex + 1, ") .tree-item"));
260
- if (itemToFocus == null || !(itemToFocus instanceof HTMLElement)) {
235
+ if ((document.activeElement === document.body || document.activeElement === document.documentElement) && this.lastFocusedItemIndex !== null) {
236
+ var _this$list2;
237
+ var itemToFocus = (_this$list2 = this.list) === null || _this$list2 === void 0 ? void 0 : _this$list2.querySelector(".item-wrapper:nth-child(".concat(this.lastFocusedItemIndex + 1, ") .tree-item"));
238
+ if (itemToFocus != null && itemToFocus instanceof HTMLElement) {
239
+ itemToFocus.focus();
240
+ } else {
261
241
  log.warn('Could not maintain focus');
262
242
  this.lastFocusedItemIndex = null;
263
- return;
264
243
  }
265
- itemToFocus.focus();
266
244
  }
267
245
  }
268
246
  componentWillUnmount() {
269
- this.debouncedSearchColumns.cancel();
270
247
  var {
271
248
  columnHeaderGroups,
272
249
  onColumnHeaderGroupChanged
@@ -286,11 +263,7 @@ class VisibilityOrderingBuilderInner extends PureComponent {
286
263
  } = this.props;
287
264
  this.setState({
288
265
  selectedColumns: new Set(),
289
- queriedColumnIndex: undefined,
290
- queriedColumnRange: undefined,
291
- prevQueriedColumns: undefined,
292
- lastSelectedColumn: '',
293
- searchFilter: ''
266
+ lastSelectedColumn: ''
294
267
  });
295
268
  onReset();
296
269
  onColumnHeaderGroupChanged(model.initialColumnHeaderGroups);
@@ -302,164 +275,6 @@ class VisibilityOrderingBuilderInner extends PureComponent {
302
275
  lastSelectedColumn: ''
303
276
  });
304
277
  }
305
- handleSearchInputChange(event) {
306
- var searchFilter = event.target.value;
307
- this.setState({
308
- searchFilter
309
- });
310
- if (!searchFilter) {
311
- this.debouncedSearchColumns.cancel();
312
- this.resetSelection();
313
- return;
314
- }
315
- this.debouncedSearchColumns(searchFilter);
316
- }
317
- searchColumns(searchFilter) {
318
- var updateQuery = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
319
- var flattenedItems = flattenTree(this.getTreeItems());
320
- var itemsMatch = flattenedItems.filter(_ref6 => {
321
- var _data$group$isNew, _data$group;
322
- var {
323
- id,
324
- data
325
- } = _ref6;
326
- return !((_data$group$isNew = (_data$group = data.group) === null || _data$group === void 0 ? void 0 : _data$group.isNew) !== null && _data$group$isNew !== void 0 ? _data$group$isNew : false) && id.toLowerCase().includes(searchFilter.toLowerCase());
327
- });
328
- var columnsMatchMap = itemsMatch.reduce((acc, _ref7) => {
329
- var {
330
- id
331
- } = _ref7;
332
- var originalIndex = flattenedItems.findIndex(item => item.id === id);
333
- return _objectSpread(_objectSpread({}, acc), {}, {
334
- [originalIndex]: id
335
- });
336
- }, {});
337
- if (!updateQuery) {
338
- this.setState({
339
- prevQueriedColumns: columnsMatchMap
340
- });
341
- return;
342
- }
343
- var columnIds = itemsMatch.map(_ref8 => {
344
- var {
345
- id
346
- } = _ref8;
347
- return id;
348
- });
349
- this.addColumnToSelected(columnIds, false);
350
- if (columnIds.length > 0) {
351
- var _this$list2;
352
- var visibleIndexToFocus = flattenedItems.findIndex(_ref9 => {
353
- var {
354
- id
355
- } = _ref9;
356
- return id.toLowerCase().includes(searchFilter.toLowerCase());
357
- });
358
- var columnItemToFocus = (_this$list2 = this.list) === null || _this$list2 === void 0 ? void 0 : _this$list2.querySelectorAll('.item-wrapper')[visibleIndexToFocus];
359
- columnItemToFocus === null || columnItemToFocus === void 0 || columnItemToFocus.scrollIntoView({
360
- block: 'center'
361
- });
362
- }
363
- this.setState({
364
- prevQueriedColumns: columnsMatchMap,
365
- queriedColumnIndex: undefined
366
- });
367
- }
368
-
369
- /**
370
- * Change the selected column to the next or previous column that matches the search criteria.
371
- *
372
- * queriedColumnRange stores the closes options in the case that the user clicks on an option that didn't fulfill the search criteria.
373
- * On click of the forward/back button, queriedColumnIndex is updated to either the upper or lower index in queriedColumnRange
374
- *
375
- * queriedColumnIndex is the current index within prevQueriedColumns. Not their actual index in the tree.
376
- *
377
- * @param direction The direction to move the selection
378
- */
379
-
380
- changeSelectedColumn(direction) {
381
- var _this$list3;
382
- var {
383
- queriedColumnIndex,
384
- queriedColumnRange,
385
- prevQueriedColumns
386
- } = this.state;
387
- var newQueriedColumnIndex = queriedColumnIndex;
388
- if (prevQueriedColumns === undefined) return;
389
- var queriedColumnsLength = Object.keys(prevQueriedColumns).length;
390
- if (direction === 'forward') {
391
- if (queriedColumnRange !== undefined) {
392
- newQueriedColumnIndex = queriedColumnRange.nextIndex;
393
- } else if (newQueriedColumnIndex === undefined || newQueriedColumnIndex >= queriedColumnsLength - 1) {
394
- newQueriedColumnIndex = 0;
395
- } else {
396
- newQueriedColumnIndex += 1;
397
- }
398
- } else if (direction === 'back') {
399
- if (queriedColumnRange !== undefined) {
400
- newQueriedColumnIndex = queriedColumnRange.prevIndex;
401
- } else if (newQueriedColumnIndex === undefined || newQueriedColumnIndex <= 0) {
402
- newQueriedColumnIndex = queriedColumnsLength - 1;
403
- } else {
404
- newQueriedColumnIndex -= 1;
405
- }
406
- }
407
- this.addColumnToSelected([Object.values(prevQueriedColumns)[newQueriedColumnIndex]], false);
408
- var actualColumnIndex = parseInt(Object.keys(prevQueriedColumns)[newQueriedColumnIndex], 10);
409
- var columnItemToFocus = (_this$list3 = this.list) === null || _this$list3 === void 0 ? void 0 : _this$list3.querySelectorAll('.item-wrapper')[actualColumnIndex];
410
- columnItemToFocus === null || columnItemToFocus === void 0 || columnItemToFocus.scrollIntoView({
411
- block: 'center'
412
- });
413
- this.setState({
414
- queriedColumnIndex: newQueriedColumnIndex,
415
- queriedColumnRange: undefined
416
- });
417
- }
418
-
419
- /**
420
- * Handles changing the queriedColumnIndex on user click.
421
- *
422
- * If the option clicked matches the search criteria the index is updated immediately.
423
- *
424
- * If the option clicked doesn't meet the search criteria, the two closest options that fulfill the criteria are stored.
425
- * On click of the forward/back button the selection will change to one of those options. (Think of VS Code search functionality)
426
- *
427
- * @param name the name of the clicked column
428
- */
429
- adjustQueriedIndex(name) {
430
- var {
431
- prevQueriedColumns
432
- } = this.state;
433
- if (prevQueriedColumns === undefined) return;
434
- if (name in Object.values(prevQueriedColumns)) {
435
- var newQueriedColumnIndex = Object.values(prevQueriedColumns).indexOf(name);
436
- this.setState({
437
- queriedColumnIndex: newQueriedColumnIndex,
438
- queriedColumnRange: undefined
439
- });
440
- return;
441
- }
442
- var flattenedItems = flattenTree(this.getTreeItems());
443
- var clickedIndex = flattenedItems.findIndex(item => item.id === name);
444
- var queriedColumnsIndexes = Object.keys(prevQueriedColumns).map(idx => parseInt(idx, 10));
445
- var prevIndex = queriedColumnsIndexes.length - 1;
446
- var nextIndex = 0;
447
- for (var i = 0; i < queriedColumnsIndexes.length; i += 1) {
448
- var index = queriedColumnsIndexes[i];
449
- if (index < clickedIndex) {
450
- prevIndex = i;
451
- } else if (index > clickedIndex) {
452
- nextIndex = i;
453
- break;
454
- }
455
- }
456
- this.setState({
457
- queriedColumnRange: {
458
- prevIndex,
459
- nextIndex
460
- }
461
- });
462
- }
463
278
 
464
279
  /**
465
280
  * Moves the currently selected columns in the direction specified.
@@ -615,16 +430,16 @@ class VisibilityOrderingBuilderInner extends PureComponent {
615
430
  var scrollListAfterMove;
616
431
  if (option === VisibilityOrderingBuilderInner.MOVE_OPTIONS.TOP) {
617
432
  scrollListAfterMove = () => {
618
- var _this$list4;
619
- (_this$list4 = this.list) === null || _this$list4 === void 0 || (_this$list4 = _this$list4.parentElement) === null || _this$list4 === void 0 || _this$list4.scroll({
433
+ var _this$list3;
434
+ (_this$list3 = this.list) === null || _this$list3 === void 0 || (_this$list3 = _this$list3.parentElement) === null || _this$list3 === void 0 || _this$list3.scroll({
620
435
  top: 0
621
436
  });
622
437
  };
623
438
  }
624
439
  if (option === VisibilityOrderingBuilderInner.MOVE_OPTIONS.BOTTOM) {
625
440
  scrollListAfterMove = () => {
626
- var _this$list5;
627
- (_this$list5 = this.list) === null || _this$list5 === void 0 || (_this$list5 = _this$list5.parentElement) === null || _this$list5 === void 0 || _this$list5.scroll({
441
+ var _this$list4;
442
+ (_this$list4 = this.list) === null || _this$list4 === void 0 || (_this$list4 = _this$list4.parentElement) === null || _this$list4 === void 0 || _this$list4.scroll({
628
443
  top: this.list.parentElement.scrollHeight
629
444
  });
630
445
  };
@@ -705,14 +520,27 @@ class VisibilityOrderingBuilderInner extends PureComponent {
705
520
  var newMoves = this.getSortMoves(moveableTree, option, initialAndFrozenMovedColumns);
706
521
  onMovedColumnsChanged(newMoves);
707
522
  }
523
+
524
+ /**
525
+ * Handles clicking on an item in the visibility ordering list.
526
+ * Adds and removes to selection as necessary based on modifier and shift keys.
527
+ * Returns the columns to be added to the selection, if any.
528
+ *
529
+ * @param name The name of the column clicked
530
+ * @param event The click event
531
+ * @param showHiddenColumns If hidden columns should be included in the selection
532
+ * @returns The columns to be added to the selection, if any`
533
+ */
708
534
  handleItemClick(name, event) {
535
+ var _event$currentTarget;
536
+ var showHiddenColumns = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
709
537
  event.stopPropagation();
710
538
 
711
539
  // Click was triggered by an interactive element. Ignore select
712
540
  if (event.target instanceof HTMLElement && (event.target.tagName === 'BUTTON' || event.target.tagName === 'INPUT')) {
713
- return;
541
+ return [];
714
542
  }
715
- event.currentTarget.focus();
543
+ (_event$currentTarget = event.currentTarget) === null || _event$currentTarget === void 0 || _event$currentTarget.focus();
716
544
  var {
717
545
  selectedColumns,
718
546
  lastSelectedColumn
@@ -723,14 +551,14 @@ class VisibilityOrderingBuilderInner extends PureComponent {
723
551
  var columnsToBeAdded = [name];
724
552
  if (isSelected && isModifierKeyDown) {
725
553
  this.removeColumnFromSelected(name);
726
- return;
554
+ return [];
727
555
  }
728
- var movableItems = flattenTree(this.getTreeItems());
556
+ var movableItems = flattenTree(this.getTreeItems(showHiddenColumns));
729
557
  if (isSelected && !isShiftKeyDown && lastSelectedColumn === name) {
730
- var selectedItem = movableItems.find(_ref0 => {
558
+ var selectedItem = movableItems.find(_ref4 => {
731
559
  var {
732
560
  id
733
- } = _ref0;
561
+ } = _ref4;
734
562
  return id === name;
735
563
  });
736
564
  assertNotNull(selectedItem);
@@ -738,7 +566,7 @@ class VisibilityOrderingBuilderInner extends PureComponent {
738
566
  // If clicking on an item and it's the only thing selected, deselect it
739
567
  if (childCount + 1 === selectedColumns.size) {
740
568
  this.resetSelection();
741
- return;
569
+ return [];
742
570
  }
743
571
  }
744
572
  if (isShiftKeyDown) {
@@ -747,10 +575,48 @@ class VisibilityOrderingBuilderInner extends PureComponent {
747
575
  columnsToBeAdded.push(...movableItems.slice(Math.min(lastSelectedIndex, selectedIndex), Math.max(lastSelectedIndex, selectedIndex) + 1).map(item => item.id));
748
576
  }
749
577
  this.addColumnToSelected(columnsToBeAdded, isModifierKeyDown || isShiftKeyDown);
750
- this.adjustQueriedIndex(name);
751
578
  this.setState({
752
579
  lastSelectedColumn: name
753
580
  });
581
+ return columnsToBeAdded;
582
+ }
583
+ handleSearchItemClicked(name, event) {
584
+ var columnsToAdd = this.handleItemClick(name, event, true);
585
+ var {
586
+ showHiddenColumns
587
+ } = this.state;
588
+ var {
589
+ onColumnVisibilityChanged
590
+ } = this.props;
591
+ if (columnsToAdd.length === 0) {
592
+ return;
593
+ }
594
+ var modelIndexesToShow = this.getSelectedItemModelIndexes(new Set(columnsToAdd));
595
+ if (!showHiddenColumns) {
596
+ onColumnVisibilityChanged(modelIndexesToShow, true);
597
+ }
598
+ if (event.shiftKey || GridUtils.isModifierKeyDown(event)) {
599
+ return;
600
+ }
601
+ this.scrollAndFocusColumnOnUpdate = name;
602
+ }
603
+ handleSearchSelect(names) {
604
+ if (names.length === 0) {
605
+ return;
606
+ }
607
+ var {
608
+ showHiddenColumns
609
+ } = this.state;
610
+ var {
611
+ onColumnVisibilityChanged
612
+ } = this.props;
613
+ if (!showHiddenColumns) {
614
+ var modelIndexesToShow = this.getSelectedItemModelIndexes(new Set(names));
615
+ onColumnVisibilityChanged(modelIndexesToShow, true);
616
+ }
617
+ var [firstItem] = names;
618
+ this.scrollAndFocusColumnOnUpdate = firstItem;
619
+ this.addColumnToSelected(names, false);
754
620
  }
755
621
 
756
622
  /**
@@ -771,11 +637,11 @@ class VisibilityOrderingBuilderInner extends PureComponent {
771
637
  // The treeItems array will always be parent -> child in the order
772
638
  // We don't need to recursively iterate because of this
773
639
  // The parent will always be added before any children for nested selections
774
- flattenedItems.forEach(_ref1 => {
640
+ flattenedItems.forEach(_ref5 => {
775
641
  var {
776
642
  id,
777
643
  children
778
- } = _ref1;
644
+ } = _ref5;
779
645
  if (newSelectedColumns.has(id)) {
780
646
  children.forEach(child => newSelectedColumns.add(child.id));
781
647
  }
@@ -800,17 +666,17 @@ class VisibilityOrderingBuilderInner extends PureComponent {
800
666
  selectedColumns
801
667
  } = this.state;
802
668
  var flattenedItems = flattenTree(this.getTreeItems());
803
- var item = flattenedItems.find(_ref10 => {
669
+ var item = flattenedItems.find(_ref6 => {
804
670
  var {
805
671
  id
806
- } = _ref10;
672
+ } = _ref6;
807
673
  return id === name;
808
674
  });
809
675
  assertNotNull(item);
810
- var parentItem = flattenedItems.find(_ref11 => {
676
+ var parentItem = flattenedItems.find(_ref7 => {
811
677
  var {
812
678
  id
813
- } = _ref11;
679
+ } = _ref7;
814
680
  return id === item.parentId;
815
681
  });
816
682
 
@@ -821,10 +687,10 @@ class VisibilityOrderingBuilderInner extends PureComponent {
821
687
  var _loop2 = function _loop2() {
822
688
  selectedColumns.delete(parentItem.id);
823
689
  var newParentId = parentItem.parentId;
824
- parentItem = flattenedItems.find(_ref12 => {
690
+ parentItem = flattenedItems.find(_ref8 => {
825
691
  var {
826
692
  id
827
- } = _ref12;
693
+ } = _ref8;
828
694
  return id === newParentId;
829
695
  });
830
696
  };
@@ -836,13 +702,25 @@ class VisibilityOrderingBuilderInner extends PureComponent {
836
702
  selectedColumns: new Set(selectedColumns)
837
703
  });
838
704
  }
839
- handleDragStart(id) {
705
+ handleDragStart(id, event) {
840
706
  var {
841
707
  selectedColumns
842
708
  } = this.state;
843
- if (!selectedColumns.has(id)) {
844
- this.addColumnToSelected([id], false);
709
+ if (selectedColumns.has(id)) {
710
+ return;
845
711
  }
712
+ var dragEvent = event.activatorEvent;
713
+ var isAddingToSelection = GridUtils.isModifierKeyDown(dragEvent) || dragEvent.shiftKey;
714
+ // For some reason, flushSync is needed here to prevent issues when
715
+ // dragging multiple items, dropping, then immediately dragging a single item
716
+ // over the previously dragged group. Without flushSync, the item being dragged
717
+ // can cause items in the previously dragged group to be in completely wrong places.
718
+ flushSync(() => {
719
+ this.handleItemClick(id, event.activatorEvent, true);
720
+ // Always add the dragged item back to selected in case the user ctrl+dragged on an already
721
+ // selected item. The handleItemClick would deselect it, but we want to keep it selected.
722
+ this.addColumnToSelected([id], isAddingToSelection);
723
+ });
846
724
  }
847
725
  handleDragEnd(from, to) {
848
726
  var {
@@ -863,6 +741,15 @@ class VisibilityOrderingBuilderInner extends PureComponent {
863
741
  } = moveItemsFromDrop(from, to, movedColumns, columnHeaderGroups, flattenedItems, selectedParentItems, firstMovableIndex, lastMovableIndex);
864
742
  onColumnHeaderGroupChanged(newGroups);
865
743
  onMovedColumnsChanged(newMoves);
744
+ // Without tracking the state here, React 18 is rendering the child separately from
745
+ // the render which changes the prop. As a result, the drop animations go to the
746
+ // original location because of that render with stale items. I could not find any
747
+ // other way to fix this (removing memoization, removing keys, etc.)
748
+ this.setState({
749
+ movedColumns: newMoves
750
+ });
751
+ // Focus the dragged item after the move. Should not scroll since it's already in view
752
+ this.scrollAndFocusColumnOnUpdate = from.id;
866
753
  }
867
754
  handleGroupNameChange(group, newName) {
868
755
  var {
@@ -872,10 +759,10 @@ class VisibilityOrderingBuilderInner extends PureComponent {
872
759
  } = this.props;
873
760
  var newGroups = [...columnHeaderGroups];
874
761
  var oldName = group.name;
875
- var groupIndex = newGroups.findIndex(_ref13 => {
762
+ var groupIndex = newGroups.findIndex(_ref9 => {
876
763
  var {
877
764
  name
878
- } = _ref13;
765
+ } = _ref9;
879
766
  return name === oldName;
880
767
  });
881
768
  var oldGroup = newGroups[groupIndex];
@@ -884,10 +771,10 @@ class VisibilityOrderingBuilderInner extends PureComponent {
884
771
  var newGroup = new ColumnHeaderGroup(oldGroup);
885
772
  newGroup.name = newName;
886
773
  newGroups.splice(groupIndex, 1, newGroup);
887
- var parentIndex = newGroups.findIndex(_ref14 => {
774
+ var parentIndex = newGroups.findIndex(_ref0 => {
888
775
  var {
889
776
  name
890
- } = _ref14;
777
+ } = _ref0;
891
778
  return name === newGroup.parent;
892
779
  });
893
780
  if (parentIndex >= 0) {
@@ -896,6 +783,10 @@ class VisibilityOrderingBuilderInner extends PureComponent {
896
783
  newParent.addChildren([newName]);
897
784
  newGroups.splice(parentIndex, 1, newParent);
898
785
  }
786
+
787
+ // The group will be a new item, so focus it after the update
788
+ // otherwise we may lose focus entirely
789
+ this.scrollAndFocusColumnOnUpdate = newName;
899
790
  onColumnHeaderGroupChanged(newGroups);
900
791
  endUndoGroup();
901
792
  }
@@ -937,10 +828,10 @@ class VisibilityOrderingBuilderInner extends PureComponent {
937
828
  var name = "".concat(ColumnHeaderGroup.NEW_GROUP_PREFIX, "-").concat(Date.now());
938
829
  var newGroup = new ColumnHeaderGroup({
939
830
  name,
940
- children: selectedItems.map(_ref15 => {
831
+ children: selectedItems.map(_ref1 => {
941
832
  var {
942
833
  id
943
- } = _ref15;
834
+ } = _ref1;
944
835
  return id;
945
836
  }),
946
837
  depth: 0,
@@ -948,8 +839,8 @@ class VisibilityOrderingBuilderInner extends PureComponent {
948
839
  });
949
840
  startUndoGroup();
950
841
  onMovedColumnsChanged(movedColumns.concat(newMoves), () => {
951
- var _this$list6;
952
- (_this$list6 = this.list) === null || _this$list6 === void 0 || (_this$list6 = _this$list6.parentElement) === null || _this$list6 === void 0 || _this$list6.scroll({
842
+ var _this$list5;
843
+ (_this$list5 = this.list) === null || _this$list5 === void 0 || (_this$list5 = _this$list5.parentElement) === null || _this$list5 === void 0 || _this$list5.scroll({
953
844
  top: 0
954
845
  });
955
846
  });
@@ -973,21 +864,64 @@ class VisibilityOrderingBuilderInner extends PureComponent {
973
864
  if (!DbNameValidator.isValidColumnName(groupName)) {
974
865
  return 'Invalid name';
975
866
  }
976
- if (columns.some(_ref16 => {
867
+ if (columns.some(_ref10 => {
977
868
  var {
978
869
  name
979
- } = _ref16;
870
+ } = _ref10;
980
871
  return name === groupName;
981
- }) || columnHeaderGroups.some(_ref17 => {
872
+ }) || columnHeaderGroups.some(_ref11 => {
982
873
  var {
983
874
  name
984
- } = _ref17;
875
+ } = _ref11;
985
876
  return name === groupName;
986
877
  })) {
987
878
  return 'Duplicate name';
988
879
  }
989
880
  return '';
990
881
  }
882
+ renderItem(_ref12) {
883
+ var {
884
+ value,
885
+ clone,
886
+ item,
887
+ ref,
888
+ handleProps
889
+ } = _ref12;
890
+ var {
891
+ onColumnVisibilityChanged
892
+ } = this.props;
893
+ var {
894
+ selectedColumns,
895
+ showHiddenColumns
896
+ } = this.state;
897
+ var displayString = value;
898
+
899
+ // The cloned drag overlay we want to show the items being dragged
900
+ if (clone) {
901
+ var selectedItemNames = this.getSelectedParentItems().map(_ref13 => {
902
+ var {
903
+ id
904
+ } = _ref13;
905
+ return id;
906
+ });
907
+ displayString = selectedItemNames.join(', ');
908
+ }
909
+ return /*#__PURE__*/_jsx(VisibilityOrderingItem, {
910
+ ref: ref,
911
+ value: displayString,
912
+ clone: clone,
913
+ item: item,
914
+ childCount: selectedColumns.size,
915
+ onVisibilityChange: onColumnVisibilityChanged,
916
+ visibilityClickAndDrag: showHiddenColumns,
917
+ onClick: this.handleItemClick,
918
+ onGroupDelete: this.handleGroupDelete,
919
+ onGroupColorChange: this.handleGroupColorChange,
920
+ onGroupNameChange: this.handleGroupNameChange,
921
+ validateGroupName: this.validateGroupName,
922
+ handleProps: handleProps
923
+ }, item.id);
924
+ }
991
925
  /**
992
926
  * Gets the first movable visible index
993
927
  */
@@ -1011,20 +945,27 @@ class VisibilityOrderingBuilderInner extends PureComponent {
1011
945
  /**
1012
946
  * Gets the tree of movable items in order. Memoized for efficiency
1013
947
  * Use flattenItems(this.getTreeItems()) if a flat list is needed
948
+ * @param showHiddenColumns Whether to show hidden columns in the tree. Defaults to the current state value.
1014
949
  * @returns The movable tree items in order
1015
950
  */
1016
- getTreeItems() {
951
+ getTreeItems(showHiddenColumns) {
1017
952
  var {
1018
953
  model,
1019
- movedColumns,
1020
954
  hiddenColumns,
1021
955
  columnHeaderGroups
1022
956
  } = this.props;
1023
957
  var {
958
+ movedColumns,
1024
959
  selectedColumns,
1025
- showHiddenColumns
960
+ showHiddenColumns: showHiddenColumnsState
1026
961
  } = this.state;
1027
- return this.memoizedGetTreeItems(model.columns, movedColumns, columnHeaderGroups, hiddenColumns, selectedColumns, showHiddenColumns);
962
+ return this.memoizedGetTreeItems(model.columns, movedColumns, columnHeaderGroups, hiddenColumns, selectedColumns, showHiddenColumns !== null && showHiddenColumns !== void 0 ? showHiddenColumns : showHiddenColumnsState);
963
+ }
964
+ getSelectedItemModelIndexes(columnNames) {
965
+ var {
966
+ model
967
+ } = this.props;
968
+ return [...columnNames.values()].map(name => model.getColumnIndexByName(name)).filter(i => i != null).flat();
1028
969
  }
1029
970
 
1030
971
  /**
@@ -1038,11 +979,11 @@ class VisibilityOrderingBuilderInner extends PureComponent {
1038
979
  selectedColumns
1039
980
  } = this.state;
1040
981
  var treeItems = flattenTree(this.getTreeItems());
1041
- return treeItems.filter(_ref18 => {
982
+ return treeItems.filter(_ref14 => {
1042
983
  var {
1043
984
  id,
1044
985
  parentId
1045
- } = _ref18;
986
+ } = _ref14;
1046
987
  return (
1047
988
  // All items whose parents are not selected
1048
989
  selectedColumns.has(id) && !selectedColumns.has(parentId !== null && parentId !== void 0 ? parentId : '')
@@ -1063,7 +1004,8 @@ class VisibilityOrderingBuilderInner extends PureComponent {
1063
1004
  break;
1064
1005
  case 'showHidden':
1065
1006
  this.setState(prev => ({
1066
- showHiddenColumns: !prev.showHiddenColumns
1007
+ showHiddenColumns: !prev.showHiddenColumns,
1008
+ selectedColumns: new Set()
1067
1009
  }));
1068
1010
  break;
1069
1011
  }
@@ -1083,6 +1025,27 @@ class VisibilityOrderingBuilderInner extends PureComponent {
1083
1025
  redo();
1084
1026
  }
1085
1027
  }
1028
+ handleSearchModalOpenChange(isOpen) {
1029
+ if (isOpen) {
1030
+ this.resetSelection();
1031
+ } else {
1032
+ var {
1033
+ showHiddenColumns,
1034
+ selectedColumns
1035
+ } = this.state;
1036
+ var {
1037
+ onColumnVisibilityChanged
1038
+ } = this.props;
1039
+ // Make sure all selected columns are visible when closing the search modal
1040
+ if (!showHiddenColumns) {
1041
+ var modelIndexesToShow = this.getSelectedItemModelIndexes(selectedColumns);
1042
+ onColumnVisibilityChanged(modelIndexesToShow, true);
1043
+ }
1044
+ }
1045
+ this.setState({
1046
+ isSearchModalOpen: isOpen
1047
+ });
1048
+ }
1086
1049
  render() {
1087
1050
  var {
1088
1051
  model,
@@ -1093,199 +1056,195 @@ class VisibilityOrderingBuilderInner extends PureComponent {
1093
1056
  } = this.props;
1094
1057
  var {
1095
1058
  selectedColumns,
1096
- searchFilter,
1097
- prevQueriedColumns,
1098
- queriedColumnIndex,
1099
- showHiddenColumns
1059
+ showHiddenColumns,
1060
+ isSearchModalOpen
1100
1061
  } = this.state;
1101
1062
  var hasSelection = selectedColumns.size > 0;
1102
1063
  var treeItems = this.getTreeItems();
1103
- var nameToIndexes = new Map(flattenTree(treeItems).map(item => [item.id, item.data.modelIndex]));
1064
+ var flattenedItems = flattenTree(treeItems);
1104
1065
  var hiddenColumnsSet = new Set(hiddenColumns);
1105
- var columnsToToggle = [
1106
- // Pass through Set to dedupe model indexes
1107
- ...new Set(hasSelection ? [...selectedColumns.values()].map(name => nameToIndexes.get(name)).filter(i => i != null).flat() : treeItems.map(item => item.data.modelIndex).flat())];
1066
+ var columnsToToggle = hasSelection ? this.getSelectedItemModelIndexes(selectedColumns) : treeItems.map(item => item.data.modelIndex).flat();
1108
1067
  var areSomeVisible = columnsToToggle.some(column => !hiddenColumnsSet.has(column));
1109
1068
  var allToggleText = areSomeVisible ? 'Hide All' : 'Show All';
1110
1069
  var selectedToggleText = areSomeVisible ? 'Hide Selected' : 'Show Selected';
1111
- var visibilityOrderingList = this.makeVisibilityOrderingList(model.columns, treeItems, showHiddenColumns);
1112
- var cursor = {
1113
- index: queriedColumnIndex,
1114
- next: direction => this.changeSelectedColumn(direction)
1115
- };
1116
- var matchCount = Object.keys(prevQueriedColumns !== null && prevQueriedColumns !== void 0 ? prevQueriedColumns : {}).length;
1117
- return /*#__PURE__*/_jsxs("div", {
1118
- role: "menu",
1119
- ref: this.wrapperRef,
1120
- className: "visibility-ordering-builder",
1121
- tabIndex: 0,
1122
- onKeyUp: this.handleKeyboardShortcut,
1123
- children: [/*#__PURE__*/_jsxs("div", {
1124
- className: "top-menu",
1125
- children: [/*#__PURE__*/_jsx(Button, {
1126
- kind: "ghost",
1127
- className: "toggle-visibility-btn",
1128
- onClick: () => {
1129
- onColumnVisibilityChanged(columnsToToggle, !areSomeVisible);
1130
- },
1131
- icon: areSomeVisible ? dhEye : dhEyeSlash,
1132
- tooltip: "Toggle column visibility",
1133
- children: !hasSelection ? allToggleText : selectedToggleText
1134
- }), /*#__PURE__*/_jsx(SearchInput, {
1135
- className: "visibility-search",
1136
- value: searchFilter,
1137
- matchCount: searchFilter ? matchCount : undefined,
1138
- onChange: this.handleSearchInputChange,
1139
- cursor: cursor
1140
- }), /*#__PURE__*/_jsxs(MenuTrigger, {
1141
- closeOnSelect: false,
1142
- children: [/*#__PURE__*/_jsx(ActionButton, {
1143
- isQuiet: true,
1144
- "aria-label": "More options",
1145
- children: /*#__PURE__*/_jsx(FontAwesomeIcon, {
1146
- icon: vsKebabVertical
1147
- })
1148
- }), /*#__PURE__*/_jsxs(SpectrumMenu, {
1149
- onAction: this.handleOverflowAction,
1150
- disabledKeys: [!canUndo && 'undo', !canRedo && 'redo'].filter(k => typeof k === 'string'),
1151
- children: [/*#__PURE__*/_jsxs(Section, {
1152
- "aria-label": "Undo and Redo",
1153
- children: [/*#__PURE__*/_jsxs(Item, {
1154
- textValue: "Undo",
1155
- children: [/*#__PURE__*/_jsx(Icon, {
1156
- children: /*#__PURE__*/_jsx(FontAwesomeIcon, {
1157
- icon: vsBlank
1158
- })
1159
- }), /*#__PURE__*/_jsx(Text, {
1160
- children: "Undo"
1161
- }), /*#__PURE__*/_jsx(Keyboard, {
1162
- children: GLOBAL_SHORTCUTS.UNDO.getDisplayText()
1163
- })]
1164
- }, "undo"), /*#__PURE__*/_jsxs(Item, {
1165
- textValue: "Redo",
1166
- children: [/*#__PURE__*/_jsx(Icon, {
1167
- children: /*#__PURE__*/_jsx(FontAwesomeIcon, {
1168
- icon: vsBlank
1169
- })
1170
- }), /*#__PURE__*/_jsx(Text, {
1171
- children: "Redo"
1172
- }), /*#__PURE__*/_jsx(Keyboard, {
1173
- children: GLOBAL_SHORTCUTS.REDO.getDisplayText()
1174
- })]
1175
- }, "redo")]
1176
- }), /*#__PURE__*/_jsx(Section, {
1177
- "aria-label": "More actions",
1178
- children: /*#__PURE__*/_jsxs(Item, {
1179
- textValue: "Show hidden columns",
1180
- children: [/*#__PURE__*/_jsx(Icon, {
1181
- children: /*#__PURE__*/_jsx(FontAwesomeIcon, {
1182
- icon: showHiddenColumns ? vsCheck : vsBlank
1183
- })
1184
- }), /*#__PURE__*/_jsx(Text, {
1185
- children: "Show hidden columns"
1186
- })]
1187
- }, "showHidden")
1070
+ var visibilityOrderingList = this.makeVisibilityOrderingList(model.columns, treeItems, showHiddenColumns, !isSearchModalOpen);
1071
+ return /*#__PURE__*/_jsx(SortableTreeDndContext, {
1072
+ items: flattenedItems,
1073
+ onDragStart: this.handleDragStart,
1074
+ onDragEnd: this.handleDragEnd,
1075
+ renderItem: this.renderItem,
1076
+ children: /*#__PURE__*/_jsxs("div", {
1077
+ role: "menu",
1078
+ ref: this.wrapperRef,
1079
+ className: "visibility-ordering-builder",
1080
+ tabIndex: 0,
1081
+ onKeyUp: this.handleKeyboardShortcut,
1082
+ children: [/*#__PURE__*/_jsxs("div", {
1083
+ className: "top-menu",
1084
+ children: [/*#__PURE__*/_jsx(Button, {
1085
+ kind: "ghost",
1086
+ className: "toggle-visibility-btn",
1087
+ onClick: () => {
1088
+ onColumnVisibilityChanged(columnsToToggle, !areSomeVisible);
1089
+ },
1090
+ icon: areSomeVisible ? dhEye : dhEyeSlash,
1091
+ tooltip: "Toggle column visibility",
1092
+ children: !hasSelection ? allToggleText : selectedToggleText
1093
+ }), /*#__PURE__*/_jsx(SearchWithModal, {
1094
+ items: flattenedItems,
1095
+ onModalOpenChange: this.handleSearchModalOpenChange,
1096
+ onClick: this.handleSearchItemClicked,
1097
+ setSelection: this.handleSearchSelect
1098
+ }), /*#__PURE__*/_jsxs(MenuTrigger, {
1099
+ closeOnSelect: false,
1100
+ children: [/*#__PURE__*/_jsx(ActionButton, {
1101
+ isQuiet: true,
1102
+ "aria-label": "More options",
1103
+ children: /*#__PURE__*/_jsx(FontAwesomeIcon, {
1104
+ icon: vsKebabVertical
1105
+ })
1106
+ }), /*#__PURE__*/_jsxs(SpectrumMenu, {
1107
+ onAction: this.handleOverflowAction,
1108
+ disabledKeys: [!canUndo && 'undo', !canRedo && 'redo'].filter(k => typeof k === 'string'),
1109
+ children: [/*#__PURE__*/_jsxs(Section, {
1110
+ "aria-label": "Undo and Redo",
1111
+ children: [/*#__PURE__*/_jsxs(Item, {
1112
+ textValue: "Undo",
1113
+ children: [/*#__PURE__*/_jsx(Icon, {
1114
+ children: /*#__PURE__*/_jsx(FontAwesomeIcon, {
1115
+ icon: vsBlank
1116
+ })
1117
+ }), /*#__PURE__*/_jsx(Text, {
1118
+ children: "Undo"
1119
+ }), /*#__PURE__*/_jsx(Keyboard, {
1120
+ children: GLOBAL_SHORTCUTS.UNDO.getDisplayText()
1121
+ })]
1122
+ }, "undo"), /*#__PURE__*/_jsxs(Item, {
1123
+ textValue: "Redo",
1124
+ children: [/*#__PURE__*/_jsx(Icon, {
1125
+ children: /*#__PURE__*/_jsx(FontAwesomeIcon, {
1126
+ icon: vsBlank
1127
+ })
1128
+ }), /*#__PURE__*/_jsx(Text, {
1129
+ children: "Redo"
1130
+ }), /*#__PURE__*/_jsx(Keyboard, {
1131
+ children: GLOBAL_SHORTCUTS.REDO.getDisplayText()
1132
+ })]
1133
+ }, "redo")]
1134
+ }), /*#__PURE__*/_jsx(Section, {
1135
+ "aria-label": "More actions",
1136
+ children: /*#__PURE__*/_jsxs(Item, {
1137
+ textValue: "Show hidden columns",
1138
+ children: [/*#__PURE__*/_jsx(Icon, {
1139
+ children: /*#__PURE__*/_jsx(FontAwesomeIcon, {
1140
+ icon: showHiddenColumns ? vsCheck : vsBlank
1141
+ })
1142
+ }), /*#__PURE__*/_jsx(Text, {
1143
+ children: "Show hidden columns"
1144
+ })]
1145
+ }, "showHidden")
1146
+ })]
1188
1147
  })]
1189
1148
  })]
1149
+ }), /*#__PURE__*/_jsxs("div", {
1150
+ className: "top-menu",
1151
+ children: [/*#__PURE__*/_jsx(Button, {
1152
+ kind: "ghost",
1153
+ icon: vsRefresh,
1154
+ className: "px-1",
1155
+ tooltip: "Reset to default",
1156
+ onClick: () => {
1157
+ this.resetVisibilityOrdering();
1158
+ },
1159
+ children: "Reset"
1160
+ }), /*#__PURE__*/_jsx("span", {
1161
+ className: "vertical-divider"
1162
+ }), /*#__PURE__*/_jsx(Button, {
1163
+ kind: "ghost",
1164
+ icon: dhSortAlphaDown,
1165
+ className: "px-1",
1166
+ tooltip: "Sort ascending",
1167
+ onClick: () => {
1168
+ this.handleSortColumns(VisibilityOrderingBuilderInner.SORTING_OPTIONS.ASC);
1169
+ }
1170
+ }), /*#__PURE__*/_jsx(Button, {
1171
+ kind: "ghost",
1172
+ icon: dhSortAlphaUp,
1173
+ className: "px-1",
1174
+ tooltip: "Sort descending",
1175
+ onClick: () => {
1176
+ this.handleSortColumns(VisibilityOrderingBuilderInner.SORTING_OPTIONS.DSC);
1177
+ }
1178
+ }), /*#__PURE__*/_jsx("span", {
1179
+ className: "vertical-divider"
1180
+ }), /*#__PURE__*/_jsxs(Button, {
1181
+ kind: "ghost",
1182
+ className: "px-1",
1183
+ tooltip: "Create group from selection",
1184
+ disabled: !hasSelection,
1185
+ onClick: this.handleGroupCreate,
1186
+ children: [/*#__PURE__*/_jsxs("span", {
1187
+ className: "fa-layers",
1188
+ children: [/*#__PURE__*/_jsx(FontAwesomeIcon, {
1189
+ mask: vsSymbolStructure,
1190
+ icon: vsCircleLargeFilled,
1191
+ transform: "right-7 down-5 shrink-6"
1192
+ }), /*#__PURE__*/_jsx(FontAwesomeIcon, {
1193
+ icon: vsAdd,
1194
+ transform: "right-8 down-6 shrink-8"
1195
+ })]
1196
+ }), "Group"]
1197
+ }), /*#__PURE__*/_jsx("span", {
1198
+ className: "vertical-divider"
1199
+ }), /*#__PURE__*/_jsx(Button, {
1200
+ kind: "ghost",
1201
+ icon: vsChevronUp,
1202
+ className: "px-1",
1203
+ tooltip: "Move selection up",
1204
+ onClick: () => {
1205
+ this.handleMoveColumns(VisibilityOrderingBuilderInner.MOVE_OPTIONS.UP);
1206
+ },
1207
+ disabled: !hasSelection
1208
+ }), /*#__PURE__*/_jsx(Button, {
1209
+ kind: "ghost",
1210
+ icon: vsChevronDown,
1211
+ className: "px-1",
1212
+ tooltip: "Move selection down",
1213
+ onClick: () => {
1214
+ this.handleMoveColumns(VisibilityOrderingBuilderInner.MOVE_OPTIONS.DOWN);
1215
+ },
1216
+ disabled: !hasSelection
1217
+ }), /*#__PURE__*/_jsx(Button, {
1218
+ kind: "ghost",
1219
+ icon: dhArrowToTop,
1220
+ className: "px-1",
1221
+ tooltip: "Move selection to top",
1222
+ onClick: () => {
1223
+ this.handleMoveColumns(VisibilityOrderingBuilderInner.MOVE_OPTIONS.TOP);
1224
+ },
1225
+ disabled: !hasSelection
1226
+ }), /*#__PURE__*/_jsx(Button, {
1227
+ kind: "ghost",
1228
+ icon: dhArrowToBottom,
1229
+ className: "px-1",
1230
+ tooltip: "Move selection to bottom",
1231
+ onClick: () => {
1232
+ this.handleMoveColumns(VisibilityOrderingBuilderInner.MOVE_OPTIONS.BOTTOM);
1233
+ },
1234
+ disabled: !hasSelection
1235
+ })]
1236
+ }), /*#__PURE__*/_jsx("div", {
1237
+ role: "menu",
1238
+ className: classNames('visibility-ordering-list'),
1239
+ children: /*#__PURE__*/_jsx("div", {
1240
+ className: "column-list",
1241
+ ref: list => {
1242
+ this.list = list;
1243
+ },
1244
+ children: visibilityOrderingList
1245
+ })
1190
1246
  })]
1191
- }), /*#__PURE__*/_jsxs("div", {
1192
- className: "top-menu",
1193
- children: [/*#__PURE__*/_jsx(Button, {
1194
- kind: "ghost",
1195
- icon: vsRefresh,
1196
- className: "px-1",
1197
- tooltip: "Reset to default",
1198
- onClick: () => {
1199
- this.resetVisibilityOrdering();
1200
- },
1201
- children: "Reset"
1202
- }), /*#__PURE__*/_jsx("span", {
1203
- className: "vertical-divider"
1204
- }), /*#__PURE__*/_jsx(Button, {
1205
- kind: "ghost",
1206
- icon: dhSortAlphaDown,
1207
- className: "px-1",
1208
- tooltip: "Sort ascending",
1209
- onClick: () => {
1210
- this.handleSortColumns(VisibilityOrderingBuilderInner.SORTING_OPTIONS.ASC);
1211
- }
1212
- }), /*#__PURE__*/_jsx(Button, {
1213
- kind: "ghost",
1214
- icon: dhSortAlphaUp,
1215
- className: "px-1",
1216
- tooltip: "Sort descending",
1217
- onClick: () => {
1218
- this.handleSortColumns(VisibilityOrderingBuilderInner.SORTING_OPTIONS.DSC);
1219
- }
1220
- }), /*#__PURE__*/_jsx("span", {
1221
- className: "vertical-divider"
1222
- }), /*#__PURE__*/_jsxs(Button, {
1223
- kind: "ghost",
1224
- className: "px-1",
1225
- tooltip: "Create group from selection",
1226
- disabled: !hasSelection,
1227
- onClick: this.handleGroupCreate,
1228
- children: [/*#__PURE__*/_jsxs("span", {
1229
- className: "fa-layers",
1230
- children: [/*#__PURE__*/_jsx(FontAwesomeIcon, {
1231
- mask: vsSymbolStructure,
1232
- icon: vsCircleLargeFilled,
1233
- transform: "right-7 down-5 shrink-6"
1234
- }), /*#__PURE__*/_jsx(FontAwesomeIcon, {
1235
- icon: vsAdd,
1236
- transform: "right-8 down-6 shrink-8"
1237
- })]
1238
- }), "Group"]
1239
- }), /*#__PURE__*/_jsx("span", {
1240
- className: "vertical-divider"
1241
- }), /*#__PURE__*/_jsx(Button, {
1242
- kind: "ghost",
1243
- icon: vsChevronUp,
1244
- className: "px-1",
1245
- tooltip: "Move selection up",
1246
- onClick: () => {
1247
- this.handleMoveColumns(VisibilityOrderingBuilderInner.MOVE_OPTIONS.UP);
1248
- },
1249
- disabled: !hasSelection
1250
- }), /*#__PURE__*/_jsx(Button, {
1251
- kind: "ghost",
1252
- icon: vsChevronDown,
1253
- className: "px-1",
1254
- tooltip: "Move selection down",
1255
- onClick: () => {
1256
- this.handleMoveColumns(VisibilityOrderingBuilderInner.MOVE_OPTIONS.DOWN);
1257
- },
1258
- disabled: !hasSelection
1259
- }), /*#__PURE__*/_jsx(Button, {
1260
- kind: "ghost",
1261
- icon: dhArrowToTop,
1262
- className: "px-1",
1263
- tooltip: "Move selection to top",
1264
- onClick: () => {
1265
- this.handleMoveColumns(VisibilityOrderingBuilderInner.MOVE_OPTIONS.TOP);
1266
- },
1267
- disabled: !hasSelection
1268
- }), /*#__PURE__*/_jsx(Button, {
1269
- kind: "ghost",
1270
- icon: dhArrowToBottom,
1271
- className: "px-1",
1272
- tooltip: "Move selection to bottom",
1273
- onClick: () => {
1274
- this.handleMoveColumns(VisibilityOrderingBuilderInner.MOVE_OPTIONS.BOTTOM);
1275
- },
1276
- disabled: !hasSelection
1277
- })]
1278
- }), /*#__PURE__*/_jsx("div", {
1279
- role: "menu",
1280
- className: classNames('visibility-ordering-list'),
1281
- children: /*#__PURE__*/_jsx("div", {
1282
- className: "column-list",
1283
- ref: list => {
1284
- this.list = list;
1285
- },
1286
- children: visibilityOrderingList
1287
- })
1288
- })]
1247
+ })
1289
1248
  });
1290
1249
  }
1291
1250
  }
@@ -1357,10 +1316,12 @@ var VisibilityOrderingBuilder = /*#__PURE__*/memo(props => {
1357
1316
  }
1358
1317
  }, [columnHeaderGroups, hiddenColumns, isBatched, movedColumns, onColumnHeaderGroupChanged, onColumnVisibilityChanged, onFrozenColumnsChanged, onMovedColumnsChanged, props.model.frozenColumns, setUndoState, state.columnHeaderGroups, state.frozenColumns, state.hiddenColumns, state.movedColumns]);
1359
1318
  var handleColumnHeaderGroupChanged = useCallback(groups => {
1360
- onColumnHeaderGroupChanged(
1361
- // Updates which model indexes are in the groups if items were added/removed
1362
- IrisGridUtils.parseColumnHeaderGroups(props.model, groups).groups);
1363
- }, [onColumnHeaderGroupChanged, props.model]);
1319
+ if (groups !== columnHeaderGroups) {
1320
+ onColumnHeaderGroupChanged(
1321
+ // Updates which model indexes are in the groups if items were added/removed
1322
+ IrisGridUtils.parseColumnHeaderGroups(props.model, groups).groups);
1323
+ }
1324
+ }, [columnHeaderGroups, onColumnHeaderGroupChanged, props.model]);
1364
1325
  var handleUndo = useCallback(() => {
1365
1326
  isUndoRedoAction.current = true;
1366
1327
  undo();