@deephaven/iris-grid 1.7.2-react-18-alpha.3 → 1.8.1-beta.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 (44) hide show
  1. package/dist/ColumnHeaderGroup.d.ts +6 -0
  2. package/dist/ColumnHeaderGroup.d.ts.map +1 -1
  3. package/dist/ColumnHeaderGroup.js +9 -0
  4. package/dist/ColumnHeaderGroup.js.map +1 -1
  5. package/dist/IrisGrid.d.ts +8 -0
  6. package/dist/IrisGrid.d.ts.map +1 -1
  7. package/dist/IrisGrid.js +30 -2
  8. package/dist/IrisGrid.js.map +1 -1
  9. package/dist/IrisGridBottomBar.d.ts.map +1 -1
  10. package/dist/IrisGridBottomBar.js +4 -1
  11. package/dist/IrisGridBottomBar.js.map +1 -1
  12. package/dist/sidebar/CustomColumnBuilder.d.ts +1 -1
  13. package/dist/sidebar/CustomColumnBuilder.d.ts.map +1 -1
  14. package/dist/sidebar/CustomColumnBuilder.js +1 -1
  15. package/dist/sidebar/CustomColumnBuilder.js.map +1 -1
  16. package/dist/sidebar/CustomColumnInput.js +1 -1
  17. package/dist/sidebar/CustomColumnInput.js.map +1 -1
  18. package/dist/sidebar/RollupRows.d.ts +1 -1
  19. package/dist/sidebar/RollupRows.d.ts.map +1 -1
  20. package/dist/sidebar/RollupRows.js +2 -2
  21. package/dist/sidebar/RollupRows.js.map +1 -1
  22. package/dist/sidebar/aggregations/Aggregations.js +1 -1
  23. package/dist/sidebar/aggregations/Aggregations.js.map +1 -1
  24. package/dist/sidebar/conditional-formatting/ConditionalFormattingMenu.js +1 -1
  25. package/dist/sidebar/conditional-formatting/ConditionalFormattingMenu.js.map +1 -1
  26. package/dist/sidebar/visibility-ordering-builder/VisibilityOrderingBuilder.d.ts +30 -12
  27. package/dist/sidebar/visibility-ordering-builder/VisibilityOrderingBuilder.d.ts.map +1 -1
  28. package/dist/sidebar/visibility-ordering-builder/VisibilityOrderingBuilder.js +283 -48
  29. package/dist/sidebar/visibility-ordering-builder/VisibilityOrderingBuilder.js.map +1 -1
  30. package/dist/sidebar/visibility-ordering-builder/VisibilityOrderingBuilderUtils.d.ts +1 -1
  31. package/dist/sidebar/visibility-ordering-builder/VisibilityOrderingBuilderUtils.d.ts.map +1 -1
  32. package/dist/sidebar/visibility-ordering-builder/VisibilityOrderingBuilderUtils.js +2 -2
  33. package/dist/sidebar/visibility-ordering-builder/VisibilityOrderingBuilderUtils.js.map +1 -1
  34. package/dist/sidebar/visibility-ordering-builder/VisibilityOrderingGroup.d.ts.map +1 -1
  35. package/dist/sidebar/visibility-ordering-builder/VisibilityOrderingGroup.js +4 -11
  36. package/dist/sidebar/visibility-ordering-builder/VisibilityOrderingGroup.js.map +1 -1
  37. package/dist/sidebar/visibility-ordering-builder/VisibilityOrderingItem.d.ts.map +1 -1
  38. package/dist/sidebar/visibility-ordering-builder/VisibilityOrderingItem.js +2 -1
  39. package/dist/sidebar/visibility-ordering-builder/VisibilityOrderingItem.js.map +1 -1
  40. package/dist/sidebar/visibility-ordering-builder/sortable-tree/utilities.d.ts +1 -1
  41. package/dist/sidebar/visibility-ordering-builder/sortable-tree/utilities.d.ts.map +1 -1
  42. package/dist/sidebar/visibility-ordering-builder/sortable-tree/utilities.js +10 -6
  43. package/dist/sidebar/visibility-ordering-builder/sortable-tree/utilities.js.map +1 -1
  44. package/package.json +17 -17
@@ -3,32 +3,38 @@ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t =
3
3
  function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
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
- import React, { PureComponent } from 'react';
6
+ import React, { memo, PureComponent, useCallback, useEffect, useRef } from 'react';
7
7
  import classNames from 'classnames';
8
8
  import { GridUtils } from '@deephaven/grid';
9
9
  import { TextUtils, assertNotNull, DbNameValidator } from '@deephaven/utils';
10
10
  import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
11
- import { dhEye, dhEyeSlash, dhSortAlphaDown, dhSortAlphaUp, dhArrowToTop, dhArrowToBottom, vsChevronUp, vsChevronDown, vsSymbolStructure, vsRefresh, vsCircleLargeFilled, vsAdd } from '@deephaven/icons';
11
+ import { dhEye, dhEyeSlash, dhSortAlphaDown, dhSortAlphaUp, dhArrowToTop, dhArrowToBottom, vsChevronUp, vsChevronDown, vsSymbolStructure, vsRefresh, vsCircleLargeFilled, vsAdd, vsBlank, vsCheck, vsKebabVertical } from '@deephaven/icons';
12
12
  import memoize from 'memoizee';
13
13
  import debounce from 'lodash.debounce';
14
- import { Button, SearchInput } from '@deephaven/components';
14
+ import { ActionButton, Button, GLOBAL_SHORTCUTS, Icon, Item, Keyboard, MenuTrigger, SearchInput, Section, SpectrumMenu, Text } from '@deephaven/components';
15
15
  import clamp from 'lodash.clamp';
16
16
  import throttle from 'lodash.throttle';
17
+ import { useUndoRedo } from '@deephaven/react-hooks';
18
+ import Log from '@deephaven/log';
17
19
  import "./VisibilityOrderingBuilder.css";
18
20
  import ColumnHeaderGroup from "../../ColumnHeaderGroup.js";
19
21
  import VisibilityOrderingItem from "./VisibilityOrderingItem.js";
20
22
  import { flattenTree, getTreeItems } from "./sortable-tree/utilities.js";
21
23
  import SortableTree from "./sortable-tree/SortableTree.js";
22
24
  import { moveItemsFromDrop, moveToGroup } from "./VisibilityOrderingBuilderUtils.js";
25
+ import IrisGridUtils from "../../IrisGridUtils.js";
23
26
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
27
+ var log = Log.module('VisibilityOrderingBuilder');
24
28
  var DEBOUNCE_SEARCH_COLUMN = 150;
25
- class VisibilityOrderingBuilder extends PureComponent {
29
+ class VisibilityOrderingBuilderInner extends PureComponent {
26
30
  static shouldRenderColumn(column) {
27
31
  // We don't want to render the proxy column in the visibility ordering list
28
32
  return column.isProxy !== true;
29
33
  }
30
34
  constructor(props) {
31
35
  super(props);
36
+ _defineProperty(this, "wrapperRef", /*#__PURE__*/React.createRef());
37
+ _defineProperty(this, "lastFocusedItemIndex", null);
32
38
  _defineProperty(this, "list", void 0);
33
39
  _defineProperty(this, "debouncedSearchColumns", debounce(this.searchColumns, DEBOUNCE_SEARCH_COLUMN));
34
40
  _defineProperty(this, "handleGroupColorChange", throttle((group, color) => {
@@ -87,7 +93,7 @@ class VisibilityOrderingBuilder extends PureComponent {
87
93
  onGroupNameChange: this.handleGroupNameChange,
88
94
  validateGroupName: this.validateGroupName,
89
95
  handleProps: handleProps
90
- });
96
+ }, item.id);
91
97
  }, {
92
98
  max: 1000
93
99
  }));
@@ -113,10 +119,10 @@ class VisibilityOrderingBuilder extends PureComponent {
113
119
  }, {
114
120
  max: 10
115
121
  }));
116
- _defineProperty(this, "memoizedGetTreeItems", memoize((columns, movedColumns, columnHeaderGroups, hiddenColumns, selectedColumns) => getTreeItems(columns, movedColumns, columnHeaderGroups, hiddenColumns, [...selectedColumns.values()]), {
122
+ _defineProperty(this, "memoizedGetTreeItems", memoize((columns, movedColumns, columnHeaderGroups, hiddenColumns, selectedColumns, showHiddenColumns) => getTreeItems(columns, movedColumns, columnHeaderGroups, hiddenColumns, [...selectedColumns.values()], showHiddenColumns), {
117
123
  max: 1000
118
124
  }));
119
- _defineProperty(this, "makeVisibilityOrderingList", memoize((columns, treeItems) => {
125
+ _defineProperty(this, "makeVisibilityOrderingList", memoize((columns, treeItems, showHiddenColumns) => {
120
126
  var {
121
127
  movedColumns
122
128
  } = this.props;
@@ -136,13 +142,16 @@ class VisibilityOrderingBuilder extends PureComponent {
136
142
  return Array.isArray(data.visibleIndex) ? data.visibleIndex[1] === lastMovableIndex : data.visibleIndex === lastMovableIndex;
137
143
  });
138
144
  var movableItems = treeItems.slice(firstMovableTreeIndex, lastMovableTreeIndex + 1);
145
+ if (!showHiddenColumns) {
146
+ movableItems = movableItems.filter(item => item.data.isVisible);
147
+ }
139
148
 
140
149
  // No movable items. Render all as immovable
141
150
  if (firstMovableIndex == null || lastMovableIndex === null) {
142
151
  for (var visibleIndex = 0; visibleIndex < columns.length; visibleIndex += 1) {
143
152
  var modelIndex = GridUtils.getModelIndex(visibleIndex, movedColumns);
144
153
  var column = columns[modelIndex];
145
- if (VisibilityOrderingBuilder.shouldRenderColumn(column)) {
154
+ if (VisibilityOrderingBuilderInner.shouldRenderColumn(column)) {
146
155
  elements.push(this.renderImmovableItem(column.name));
147
156
  }
148
157
  }
@@ -153,7 +162,7 @@ class VisibilityOrderingBuilder extends PureComponent {
153
162
  for (var _visibleIndex = 0; _visibleIndex < firstMovableIndex; _visibleIndex += 1) {
154
163
  var _modelIndex = GridUtils.getModelIndex(_visibleIndex, movedColumns);
155
164
  var _column = columns[_modelIndex];
156
- if (VisibilityOrderingBuilder.shouldRenderColumn(_column)) {
165
+ if (VisibilityOrderingBuilderInner.shouldRenderColumn(_column)) {
157
166
  elements.push(this.renderImmovableItem(_column.name));
158
167
  }
159
168
  }
@@ -172,7 +181,7 @@ class VisibilityOrderingBuilder extends PureComponent {
172
181
  for (var _visibleIndex2 = lastMovableIndex + 1; _visibleIndex2 < columns.length; _visibleIndex2 += 1) {
173
182
  var _modelIndex2 = GridUtils.getModelIndex(_visibleIndex2, movedColumns);
174
183
  var _column2 = columns[_modelIndex2];
175
- if (VisibilityOrderingBuilder.shouldRenderColumn(_column2)) {
184
+ if (VisibilityOrderingBuilderInner.shouldRenderColumn(_column2)) {
176
185
  elements.push(this.renderImmovableItem(_column2.name));
177
186
  }
178
187
  }
@@ -202,16 +211,33 @@ class VisibilityOrderingBuilder extends PureComponent {
202
211
  this.validateGroupName = this.validateGroupName.bind(this);
203
212
  this.addColumnToSelected = this.addColumnToSelected.bind(this);
204
213
  this.handleDragStart = this.handleDragStart.bind(this);
214
+ this.handleOverflowAction = this.handleOverflowAction.bind(this);
215
+ this.handleKeyboardShortcut = this.handleKeyboardShortcut.bind(this);
205
216
  this.state = {
206
217
  selectedColumns: new Set(),
207
218
  queriedColumnIndex: undefined,
208
219
  queriedColumnRange: undefined,
209
220
  prevQueriedColumns: undefined,
210
221
  lastSelectedColumn: '',
211
- searchFilter: ''
222
+ searchFilter: '',
223
+ showHiddenColumns: true
212
224
  };
213
225
  this.list = null;
214
226
  }
227
+ componentDidMount() {
228
+ assertNotNull(this.wrapperRef.current);
229
+ // This fixes focus loss when editing a group because we use the name as the key for rendering.
230
+ // When the name is changed or group deleted, we lose focus entirely which is indicated by
231
+ // the focusout relatedTarget being null.
232
+ this.wrapperRef.current.addEventListener('focusin', e => {
233
+ if (e.target instanceof HTMLElement) {
234
+ var treeItem = e.target.closest('.tree-item');
235
+ if (treeItem != null) {
236
+ this.lastFocusedItemIndex = typeof treeItem.dataset.index === 'string' ? parseInt(treeItem.dataset.index, 10) : null;
237
+ }
238
+ }
239
+ });
240
+ }
215
241
  componentDidUpdate(prevProps) {
216
242
  var {
217
243
  movedColumns
@@ -222,9 +248,34 @@ class VisibilityOrderingBuilder extends PureComponent {
222
248
  } = this.state;
223
249
  this.searchColumns(searchFilter, false);
224
250
  }
251
+
252
+ // document.activeElement is either body or html when nothing is focused.
253
+ // If there is no focused element, then we probably deleted or renamed a group
254
+ // 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
256
+ // (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)) {
261
+ log.warn('Could not maintain focus');
262
+ this.lastFocusedItemIndex = null;
263
+ return;
264
+ }
265
+ itemToFocus.focus();
266
+ }
225
267
  }
226
268
  componentWillUnmount() {
227
269
  this.debouncedSearchColumns.cancel();
270
+ var {
271
+ columnHeaderGroups,
272
+ onColumnHeaderGroupChanged
273
+ } = this.props;
274
+ // Clean up unnamed groups on unmount
275
+ var filteredGroups = columnHeaderGroups.filter(group => !group.isNew);
276
+ if (filteredGroups.length !== columnHeaderGroups.length) {
277
+ onColumnHeaderGroupChanged(filteredGroups);
278
+ }
228
279
  }
229
280
  resetVisibilityOrdering() {
230
281
  var {
@@ -297,14 +348,14 @@ class VisibilityOrderingBuilder extends PureComponent {
297
348
  });
298
349
  this.addColumnToSelected(columnIds, false);
299
350
  if (columnIds.length > 0) {
300
- var _this$list;
351
+ var _this$list2;
301
352
  var visibleIndexToFocus = flattenedItems.findIndex(_ref9 => {
302
353
  var {
303
354
  id
304
355
  } = _ref9;
305
356
  return id.toLowerCase().includes(searchFilter.toLowerCase());
306
357
  });
307
- var columnItemToFocus = (_this$list = this.list) === null || _this$list === void 0 ? void 0 : _this$list.querySelectorAll('.item-wrapper')[visibleIndexToFocus];
358
+ var columnItemToFocus = (_this$list2 = this.list) === null || _this$list2 === void 0 ? void 0 : _this$list2.querySelectorAll('.item-wrapper')[visibleIndexToFocus];
308
359
  columnItemToFocus === null || columnItemToFocus === void 0 || columnItemToFocus.scrollIntoView({
309
360
  block: 'center'
310
361
  });
@@ -327,7 +378,7 @@ class VisibilityOrderingBuilder extends PureComponent {
327
378
  */
328
379
 
329
380
  changeSelectedColumn(direction) {
330
- var _this$list2;
381
+ var _this$list3;
331
382
  var {
332
383
  queriedColumnIndex,
333
384
  queriedColumnRange,
@@ -355,7 +406,7 @@ class VisibilityOrderingBuilder extends PureComponent {
355
406
  }
356
407
  this.addColumnToSelected([Object.values(prevQueriedColumns)[newQueriedColumnIndex]], false);
357
408
  var actualColumnIndex = parseInt(Object.keys(prevQueriedColumns)[newQueriedColumnIndex], 10);
358
- var columnItemToFocus = (_this$list2 = this.list) === null || _this$list2 === void 0 ? void 0 : _this$list2.querySelectorAll('.item-wrapper')[actualColumnIndex];
409
+ var columnItemToFocus = (_this$list3 = this.list) === null || _this$list3 === void 0 ? void 0 : _this$list3.querySelectorAll('.item-wrapper')[actualColumnIndex];
359
410
  columnItemToFocus === null || columnItemToFocus === void 0 || columnItemToFocus.scrollIntoView({
360
411
  block: 'center'
361
412
  });
@@ -448,7 +499,7 @@ class VisibilityOrderingBuilder extends PureComponent {
448
499
  assertNotNull(firstMovableIndex);
449
500
  assertNotNull(lastMovableIndex);
450
501
  var selectedItems = this.getSelectedParentItems();
451
- var isMovingUpward = option === VisibilityOrderingBuilder.MOVE_OPTIONS.UP || option === VisibilityOrderingBuilder.MOVE_OPTIONS.TOP;
502
+ var isMovingUpward = option === VisibilityOrderingBuilderInner.MOVE_OPTIONS.UP || option === VisibilityOrderingBuilderInner.MOVE_OPTIONS.TOP;
452
503
 
453
504
  // for moving up and to the top, move column(s) in visibility index order
454
505
  // for moving down and to the bottom, move column(s) in reverse visibility index order
@@ -467,7 +518,7 @@ class VisibilityOrderingBuilder extends PureComponent {
467
518
  }
468
519
  } = selectedItems[i];
469
520
  switch (option) {
470
- case VisibilityOrderingBuilder.MOVE_OPTIONS.TOP:
521
+ case VisibilityOrderingBuilderInner.MOVE_OPTIONS.TOP:
471
522
  {
472
523
  newMoves = GridUtils.moveItemOrRange(visibleIndex, firstMovableIndex, newMoves, true);
473
524
  var size = Array.isArray(visibleIndex) ? visibleIndex[1] - visibleIndex[0] + 1 : 1;
@@ -476,7 +527,7 @@ class VisibilityOrderingBuilder extends PureComponent {
476
527
  updatedGroups = moveToGroup(selectedItems[i], null, updatedGroups);
477
528
  break;
478
529
  }
479
- case VisibilityOrderingBuilder.MOVE_OPTIONS.BOTTOM:
530
+ case VisibilityOrderingBuilderInner.MOVE_OPTIONS.BOTTOM:
480
531
  {
481
532
  newMoves = GridUtils.moveItemOrRange(visibleIndex, lastMovableIndex, newMoves, true);
482
533
  var _size = Array.isArray(visibleIndex) ? visibleIndex[1] - visibleIndex[0] + 1 : 1;
@@ -485,7 +536,7 @@ class VisibilityOrderingBuilder extends PureComponent {
485
536
  updatedGroups = moveToGroup(selectedItems[i], null, updatedGroups);
486
537
  break;
487
538
  }
488
- case VisibilityOrderingBuilder.MOVE_OPTIONS.UP:
539
+ case VisibilityOrderingBuilderInner.MOVE_OPTIONS.UP:
489
540
  {
490
541
  var itemIndex = treeItems.findIndex(item => item.id === id);
491
542
  // Array.findLast would be better here, but it's too new for our browser support
@@ -511,7 +562,7 @@ class VisibilityOrderingBuilder extends PureComponent {
511
562
  }
512
563
  break;
513
564
  }
514
- case VisibilityOrderingBuilder.MOVE_OPTIONS.DOWN:
565
+ case VisibilityOrderingBuilderInner.MOVE_OPTIONS.DOWN:
515
566
  {
516
567
  var _itemIndex = treeItems.findIndex(item => item.id === id);
517
568
  var nextItem = treeItems.find((item, idx) => idx > _itemIndex && !selectedColumns.has(item.id));
@@ -562,18 +613,18 @@ class VisibilityOrderingBuilder extends PureComponent {
562
613
  groups
563
614
  } = this.moveSelectedColumns(option);
564
615
  var scrollListAfterMove;
565
- if (option === VisibilityOrderingBuilder.MOVE_OPTIONS.TOP) {
616
+ if (option === VisibilityOrderingBuilderInner.MOVE_OPTIONS.TOP) {
566
617
  scrollListAfterMove = () => {
567
- var _this$list3;
568
- (_this$list3 = this.list) === null || _this$list3 === void 0 || (_this$list3 = _this$list3.parentElement) === null || _this$list3 === void 0 || _this$list3.scroll({
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({
569
620
  top: 0
570
621
  });
571
622
  };
572
623
  }
573
- if (option === VisibilityOrderingBuilder.MOVE_OPTIONS.BOTTOM) {
624
+ if (option === VisibilityOrderingBuilderInner.MOVE_OPTIONS.BOTTOM) {
574
625
  scrollListAfterMove = () => {
575
- var _this$list4;
576
- (_this$list4 = this.list) === null || _this$list4 === void 0 || (_this$list4 = _this$list4.parentElement) === null || _this$list4 === void 0 || _this$list4.scroll({
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({
577
628
  top: this.list.parentElement.scrollHeight
578
629
  });
579
630
  };
@@ -599,7 +650,7 @@ class VisibilityOrderingBuilder extends PureComponent {
599
650
  getSortMoves(itemsParam, option, movedColumns) {
600
651
  var items = [...itemsParam];
601
652
  // Sort all the movable columns
602
- var isAscending = option === VisibilityOrderingBuilder.SORTING_OPTIONS.ASC;
653
+ var isAscending = option === VisibilityOrderingBuilderInner.SORTING_OPTIONS.ASC;
603
654
  items.sort((a, b) => {
604
655
  var aName = a.id.toUpperCase();
605
656
  var bName = b.id.toUpperCase();
@@ -801,9 +852,7 @@ class VisibilityOrderingBuilder extends PureComponent {
801
852
  onColumnHeaderGroupChanged
802
853
  } = this.props;
803
854
  var selectedParentItems = this.getSelectedParentItems();
804
- var flattenedItems = flattenTree(this.getTreeItems()).map((item, i) => _objectSpread(_objectSpread({}, item), {}, {
805
- index: i
806
- }));
855
+ var flattenedItems = flattenTree(this.getTreeItems());
807
856
  var firstMovableIndex = this.getFirstMovableIndex();
808
857
  var lastMovableIndex = this.getLastMovableIndex();
809
858
  assertNotNull(firstMovableIndex);
@@ -818,7 +867,8 @@ class VisibilityOrderingBuilder extends PureComponent {
818
867
  handleGroupNameChange(group, newName) {
819
868
  var {
820
869
  columnHeaderGroups,
821
- onColumnHeaderGroupChanged
870
+ onColumnHeaderGroupChanged,
871
+ endUndoGroup
822
872
  } = this.props;
823
873
  var newGroups = [...columnHeaderGroups];
824
874
  var oldName = group.name;
@@ -847,10 +897,12 @@ class VisibilityOrderingBuilder extends PureComponent {
847
897
  newGroups.splice(parentIndex, 1, newParent);
848
898
  }
849
899
  onColumnHeaderGroupChanged(newGroups);
900
+ endUndoGroup();
850
901
  }
851
902
  handleGroupDelete(group) {
852
903
  var {
853
904
  columnHeaderGroups,
905
+ endUndoGroup,
854
906
  onColumnHeaderGroupChanged
855
907
  } = this.props;
856
908
  var newGroups = columnHeaderGroups.filter(g => g.name !== group.name);
@@ -862,17 +914,20 @@ class VisibilityOrderingBuilder extends PureComponent {
862
914
  newGroups.splice(parentIndex, 1, newParent);
863
915
  }
864
916
  onColumnHeaderGroupChanged(newGroups);
917
+ // Could be started from editing a new group which is deleted without saving
918
+ endUndoGroup();
865
919
  }
866
920
  handleGroupCreate() {
867
921
  var {
868
922
  movedColumns,
869
923
  onMovedColumnsChanged,
870
- onColumnHeaderGroupChanged
924
+ onColumnHeaderGroupChanged,
925
+ startUndoGroup
871
926
  } = this.props;
872
927
  var {
873
928
  newMoves,
874
929
  groups
875
- } = this.moveSelectedColumns(VisibilityOrderingBuilder.MOVE_OPTIONS.TOP);
930
+ } = this.moveSelectedColumns(VisibilityOrderingBuilderInner.MOVE_OPTIONS.TOP);
876
931
  var newGroups = groups.filter(group => !group.isNew);
877
932
  var selectedItems = this.getSelectedParentItems();
878
933
  var childIndexes = selectedItems.map(item => item.data.modelIndex).flat().filter(index => index >= 0);
@@ -891,9 +946,10 @@ class VisibilityOrderingBuilder extends PureComponent {
891
946
  depth: 0,
892
947
  childIndexes: [...new Set(childIndexes)] // Remove any duplicates
893
948
  });
949
+ startUndoGroup();
894
950
  onMovedColumnsChanged(movedColumns.concat(newMoves), () => {
895
- var _this$list5;
896
- (_this$list5 = this.list) === null || _this$list5 === void 0 || (_this$list5 = _this$list5.parentElement) === null || _this$list5 === void 0 || _this$list5.scroll({
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({
897
953
  top: 0
898
954
  });
899
955
  });
@@ -965,9 +1021,10 @@ class VisibilityOrderingBuilder extends PureComponent {
965
1021
  columnHeaderGroups
966
1022
  } = this.props;
967
1023
  var {
968
- selectedColumns
1024
+ selectedColumns,
1025
+ showHiddenColumns
969
1026
  } = this.state;
970
- return this.memoizedGetTreeItems(model.columns, movedColumns, columnHeaderGroups, hiddenColumns, selectedColumns);
1027
+ return this.memoizedGetTreeItems(model.columns, movedColumns, columnHeaderGroups, hiddenColumns, selectedColumns, showHiddenColumns);
971
1028
  }
972
1029
 
973
1030
  /**
@@ -992,17 +1049,54 @@ class VisibilityOrderingBuilder extends PureComponent {
992
1049
  );
993
1050
  });
994
1051
  }
1052
+ handleOverflowAction(key) {
1053
+ var {
1054
+ undo,
1055
+ redo
1056
+ } = this.props;
1057
+ switch (key) {
1058
+ case 'undo':
1059
+ undo();
1060
+ break;
1061
+ case 'redo':
1062
+ redo();
1063
+ break;
1064
+ case 'showHidden':
1065
+ this.setState(prev => ({
1066
+ showHiddenColumns: !prev.showHiddenColumns
1067
+ }));
1068
+ break;
1069
+ }
1070
+ }
1071
+ handleKeyboardShortcut(event) {
1072
+ var {
1073
+ canUndo,
1074
+ canRedo,
1075
+ undo,
1076
+ redo
1077
+ } = this.props;
1078
+ if (GLOBAL_SHORTCUTS.UNDO.matchesEvent(event) && canUndo) {
1079
+ event.preventDefault();
1080
+ undo();
1081
+ } else if (GLOBAL_SHORTCUTS.REDO.matchesEvent(event) && canRedo) {
1082
+ event.preventDefault();
1083
+ redo();
1084
+ }
1085
+ }
995
1086
  render() {
996
1087
  var {
997
1088
  model,
998
1089
  hiddenColumns,
999
- onColumnVisibilityChanged
1090
+ onColumnVisibilityChanged,
1091
+ canUndo,
1092
+ canRedo
1000
1093
  } = this.props;
1001
1094
  var {
1002
1095
  selectedColumns,
1003
1096
  searchFilter,
1004
1097
  prevQueriedColumns,
1005
- queriedColumnIndex
1098
+ queriedColumnIndex,
1099
+ showHiddenColumns
1006
1100
  } = this.state;
1007
1101
  var hasSelection = selectedColumns.size > 0;
1008
1102
  var treeItems = this.getTreeItems();
@@ -1014,7 +1108,7 @@ class VisibilityOrderingBuilder extends PureComponent {
1014
1108
  var areSomeVisible = columnsToToggle.some(column => !hiddenColumnsSet.has(column));
1015
1109
  var allToggleText = areSomeVisible ? 'Hide All' : 'Show All';
1016
1110
  var selectedToggleText = areSomeVisible ? 'Hide Selected' : 'Show Selected';
1017
- var visibilityOrderingList = this.makeVisibilityOrderingList(model.columns, treeItems);
1111
+ var visibilityOrderingList = this.makeVisibilityOrderingList(model.columns, treeItems, showHiddenColumns);
1018
1112
  var cursor = {
1019
1113
  index: queriedColumnIndex,
1020
1114
  next: direction => this.changeSelectedColumn(direction)
@@ -1022,8 +1116,10 @@ class VisibilityOrderingBuilder extends PureComponent {
1022
1116
  var matchCount = Object.keys(prevQueriedColumns !== null && prevQueriedColumns !== void 0 ? prevQueriedColumns : {}).length;
1023
1117
  return /*#__PURE__*/_jsxs("div", {
1024
1118
  role: "menu",
1119
+ ref: this.wrapperRef,
1025
1120
  className: "visibility-ordering-builder",
1026
1121
  tabIndex: 0,
1122
+ onKeyUp: this.handleKeyboardShortcut,
1027
1123
  children: [/*#__PURE__*/_jsxs("div", {
1028
1124
  className: "top-menu",
1029
1125
  children: [/*#__PURE__*/_jsx(Button, {
@@ -1041,6 +1137,56 @@ class VisibilityOrderingBuilder extends PureComponent {
1041
1137
  matchCount: searchFilter ? matchCount : undefined,
1042
1138
  onChange: this.handleSearchInputChange,
1043
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")
1188
+ })]
1189
+ })]
1044
1190
  })]
1045
1191
  }), /*#__PURE__*/_jsxs("div", {
1046
1192
  className: "top-menu",
@@ -1061,7 +1207,7 @@ class VisibilityOrderingBuilder extends PureComponent {
1061
1207
  className: "px-1",
1062
1208
  tooltip: "Sort ascending",
1063
1209
  onClick: () => {
1064
- this.handleSortColumns(VisibilityOrderingBuilder.SORTING_OPTIONS.ASC);
1210
+ this.handleSortColumns(VisibilityOrderingBuilderInner.SORTING_OPTIONS.ASC);
1065
1211
  }
1066
1212
  }), /*#__PURE__*/_jsx(Button, {
1067
1213
  kind: "ghost",
@@ -1069,7 +1215,7 @@ class VisibilityOrderingBuilder extends PureComponent {
1069
1215
  className: "px-1",
1070
1216
  tooltip: "Sort descending",
1071
1217
  onClick: () => {
1072
- this.handleSortColumns(VisibilityOrderingBuilder.SORTING_OPTIONS.DSC);
1218
+ this.handleSortColumns(VisibilityOrderingBuilderInner.SORTING_OPTIONS.DSC);
1073
1219
  }
1074
1220
  }), /*#__PURE__*/_jsx("span", {
1075
1221
  className: "vertical-divider"
@@ -1098,7 +1244,7 @@ class VisibilityOrderingBuilder extends PureComponent {
1098
1244
  className: "px-1",
1099
1245
  tooltip: "Move selection up",
1100
1246
  onClick: () => {
1101
- this.handleMoveColumns(VisibilityOrderingBuilder.MOVE_OPTIONS.UP);
1247
+ this.handleMoveColumns(VisibilityOrderingBuilderInner.MOVE_OPTIONS.UP);
1102
1248
  },
1103
1249
  disabled: !hasSelection
1104
1250
  }), /*#__PURE__*/_jsx(Button, {
@@ -1107,7 +1253,7 @@ class VisibilityOrderingBuilder extends PureComponent {
1107
1253
  className: "px-1",
1108
1254
  tooltip: "Move selection down",
1109
1255
  onClick: () => {
1110
- this.handleMoveColumns(VisibilityOrderingBuilder.MOVE_OPTIONS.DOWN);
1256
+ this.handleMoveColumns(VisibilityOrderingBuilderInner.MOVE_OPTIONS.DOWN);
1111
1257
  },
1112
1258
  disabled: !hasSelection
1113
1259
  }), /*#__PURE__*/_jsx(Button, {
@@ -1116,7 +1262,7 @@ class VisibilityOrderingBuilder extends PureComponent {
1116
1262
  className: "px-1",
1117
1263
  tooltip: "Move selection to top",
1118
1264
  onClick: () => {
1119
- this.handleMoveColumns(VisibilityOrderingBuilder.MOVE_OPTIONS.TOP);
1265
+ this.handleMoveColumns(VisibilityOrderingBuilderInner.MOVE_OPTIONS.TOP);
1120
1266
  },
1121
1267
  disabled: !hasSelection
1122
1268
  }), /*#__PURE__*/_jsx(Button, {
@@ -1125,7 +1271,7 @@ class VisibilityOrderingBuilder extends PureComponent {
1125
1271
  className: "px-1",
1126
1272
  tooltip: "Move selection to bottom",
1127
1273
  onClick: () => {
1128
- this.handleMoveColumns(VisibilityOrderingBuilder.MOVE_OPTIONS.BOTTOM);
1274
+ this.handleMoveColumns(VisibilityOrderingBuilderInner.MOVE_OPTIONS.BOTTOM);
1129
1275
  },
1130
1276
  disabled: !hasSelection
1131
1277
  })]
@@ -1143,15 +1289,104 @@ class VisibilityOrderingBuilder extends PureComponent {
1143
1289
  });
1144
1290
  }
1145
1291
  }
1146
- _defineProperty(VisibilityOrderingBuilder, "SORTING_OPTIONS", {
1292
+
1293
+ // drag and drop display
1294
+ _defineProperty(VisibilityOrderingBuilderInner, "SORTING_OPTIONS", {
1147
1295
  DSC: 'DSC',
1148
1296
  ASC: 'ASC'
1149
1297
  });
1150
- _defineProperty(VisibilityOrderingBuilder, "MOVE_OPTIONS", {
1298
+ _defineProperty(VisibilityOrderingBuilderInner, "MOVE_OPTIONS", {
1151
1299
  TOP: 'TOP',
1152
1300
  BOTTOM: 'BOTTOM',
1153
1301
  UP: 'UP',
1154
1302
  DOWN: 'DOWN'
1155
1303
  });
1304
+ var VisibilityOrderingBuilder = /*#__PURE__*/memo(props => {
1305
+ var {
1306
+ movedColumns,
1307
+ hiddenColumns,
1308
+ columnHeaderGroups,
1309
+ onMovedColumnsChanged,
1310
+ onColumnVisibilityChanged,
1311
+ onColumnHeaderGroupChanged,
1312
+ onFrozenColumnsChanged,
1313
+ // Used for unit tests only
1314
+ __testRef
1315
+ } = props;
1316
+ var {
1317
+ set: setUndoState,
1318
+ undo,
1319
+ canUndo,
1320
+ redo,
1321
+ canRedo,
1322
+ state
1323
+ } = useUndoRedo({
1324
+ movedColumns,
1325
+ hiddenColumns,
1326
+ columnHeaderGroups,
1327
+ frozenColumns: props.model.frozenColumns
1328
+ });
1329
+
1330
+ // On undo/redo, we need to ignore the prop change
1331
+ // because we are the ones updating the props
1332
+ var isUndoRedoAction = useRef(false);
1333
+ var isBatched = useRef(false);
1334
+ var startUndoGroup = useCallback(() => {
1335
+ isBatched.current = true;
1336
+ }, []);
1337
+ var endUndoGroup = useCallback(() => {
1338
+ isBatched.current = false;
1339
+ }, []);
1340
+ useEffect(() => {
1341
+ if (isUndoRedoAction.current) {
1342
+ onMovedColumnsChanged(state.movedColumns);
1343
+ onColumnVisibilityChanged(hiddenColumns, true);
1344
+ onColumnVisibilityChanged(state.hiddenColumns, false);
1345
+ onColumnHeaderGroupChanged(state.columnHeaderGroups);
1346
+ onFrozenColumnsChanged(state.frozenColumns);
1347
+ isUndoRedoAction.current = false;
1348
+ } else if (
1349
+ // If the parent props changed and it's not an undo/redo action, update the undo state
1350
+ !isBatched.current && (movedColumns !== state.movedColumns || columnHeaderGroups !== state.columnHeaderGroups || hiddenColumns.length !== state.hiddenColumns.length || hiddenColumns.some((col, index) => col !== state.hiddenColumns[index]))) {
1351
+ setUndoState({
1352
+ movedColumns,
1353
+ hiddenColumns,
1354
+ columnHeaderGroups,
1355
+ frozenColumns: props.model.frozenColumns
1356
+ });
1357
+ }
1358
+ }, [columnHeaderGroups, hiddenColumns, isBatched, movedColumns, onColumnHeaderGroupChanged, onColumnVisibilityChanged, onFrozenColumnsChanged, onMovedColumnsChanged, props.model.frozenColumns, setUndoState, state.columnHeaderGroups, state.frozenColumns, state.hiddenColumns, state.movedColumns]);
1359
+ 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]);
1364
+ var handleUndo = useCallback(() => {
1365
+ isUndoRedoAction.current = true;
1366
+ undo();
1367
+ }, [undo]);
1368
+ var handleRedo = useCallback(() => {
1369
+ isUndoRedoAction.current = true;
1370
+ redo();
1371
+ }, [redo]);
1372
+ return /*#__PURE__*/_jsx(VisibilityOrderingBuilderInner
1373
+ // eslint-disable-next-line react/jsx-props-no-spreading
1374
+ , _objectSpread(_objectSpread({}, props), {}, {
1375
+ ref: __testRef,
1376
+ movedColumns: movedColumns,
1377
+ hiddenColumns: hiddenColumns,
1378
+ columnHeaderGroups: columnHeaderGroups,
1379
+ onMovedColumnsChanged: onMovedColumnsChanged,
1380
+ onColumnVisibilityChanged: onColumnVisibilityChanged,
1381
+ onColumnHeaderGroupChanged: handleColumnHeaderGroupChanged,
1382
+ undo: handleUndo,
1383
+ canUndo: canUndo,
1384
+ redo: handleRedo,
1385
+ canRedo: canRedo,
1386
+ startUndoGroup: startUndoGroup,
1387
+ endUndoGroup: endUndoGroup
1388
+ }));
1389
+ });
1390
+ VisibilityOrderingBuilder.displayName = 'VisibilityOrderingBuilder';
1156
1391
  export default VisibilityOrderingBuilder;
1157
1392
  //# sourceMappingURL=VisibilityOrderingBuilder.js.map