dockview-core 2.0.0 → 2.1.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 (56) hide show
  1. package/dist/cjs/api/component.api.d.ts +2 -2
  2. package/dist/cjs/dockview/components/titlebar/voidContainer.js +0 -1
  3. package/dist/cjs/dockview/components/watermark/watermark.d.ts +0 -3
  4. package/dist/cjs/dockview/components/watermark/watermark.js +1 -33
  5. package/dist/cjs/dockview/dockviewComponent.d.ts +32 -14
  6. package/dist/cjs/dockview/dockviewComponent.js +52 -18
  7. package/dist/cjs/dockview/dockviewGroupPanelModel.d.ts +1 -0
  8. package/dist/cjs/dockview/dockviewGroupPanelModel.js +4 -4
  9. package/dist/cjs/dockview/options.d.ts +4 -0
  10. package/dist/cjs/dockview/options.js +1 -0
  11. package/dist/cjs/gridview/baseComponentGridview.d.ts +8 -3
  12. package/dist/cjs/gridview/baseComponentGridview.js +8 -8
  13. package/dist/cjs/gridview/gridview.d.ts +9 -1
  14. package/dist/cjs/gridview/gridview.js +49 -5
  15. package/dist/cjs/overlay/overlay.d.ts +3 -0
  16. package/dist/cjs/overlay/overlay.js +15 -0
  17. package/dist/dockview-core.amd.js +128 -64
  18. package/dist/dockview-core.amd.js.map +1 -1
  19. package/dist/dockview-core.amd.min.js +2 -2
  20. package/dist/dockview-core.amd.min.js.map +1 -1
  21. package/dist/dockview-core.amd.min.noStyle.js +2 -2
  22. package/dist/dockview-core.amd.min.noStyle.js.map +1 -1
  23. package/dist/dockview-core.amd.noStyle.js +127 -63
  24. package/dist/dockview-core.amd.noStyle.js.map +1 -1
  25. package/dist/dockview-core.cjs.js +128 -64
  26. package/dist/dockview-core.cjs.js.map +1 -1
  27. package/dist/dockview-core.esm.js +128 -64
  28. package/dist/dockview-core.esm.js.map +1 -1
  29. package/dist/dockview-core.esm.min.js +2 -2
  30. package/dist/dockview-core.esm.min.js.map +1 -1
  31. package/dist/dockview-core.js +128 -64
  32. package/dist/dockview-core.js.map +1 -1
  33. package/dist/dockview-core.min.js +2 -2
  34. package/dist/dockview-core.min.js.map +1 -1
  35. package/dist/dockview-core.min.noStyle.js +2 -2
  36. package/dist/dockview-core.min.noStyle.js.map +1 -1
  37. package/dist/dockview-core.noStyle.js +127 -63
  38. package/dist/dockview-core.noStyle.js.map +1 -1
  39. package/dist/esm/api/component.api.d.ts +2 -2
  40. package/dist/esm/dockview/components/titlebar/voidContainer.js +0 -1
  41. package/dist/esm/dockview/components/watermark/watermark.d.ts +0 -3
  42. package/dist/esm/dockview/components/watermark/watermark.js +1 -33
  43. package/dist/esm/dockview/dockviewComponent.d.ts +32 -14
  44. package/dist/esm/dockview/dockviewComponent.js +52 -18
  45. package/dist/esm/dockview/dockviewGroupPanelModel.d.ts +1 -0
  46. package/dist/esm/dockview/dockviewGroupPanelModel.js +4 -4
  47. package/dist/esm/dockview/options.d.ts +4 -0
  48. package/dist/esm/dockview/options.js +1 -0
  49. package/dist/esm/gridview/baseComponentGridview.d.ts +8 -3
  50. package/dist/esm/gridview/baseComponentGridview.js +8 -4
  51. package/dist/esm/gridview/gridview.d.ts +9 -1
  52. package/dist/esm/gridview/gridview.js +49 -5
  53. package/dist/esm/overlay/overlay.d.ts +3 -0
  54. package/dist/esm/overlay/overlay.js +11 -0
  55. package/dist/styles/dockview.css +4 -33
  56. package/package.json +1 -1
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * dockview-core
3
- * @version 2.0.0
3
+ * @version 2.1.0
4
4
  * @link https://github.com/mathuo/dockview
5
5
  * @license MIT
6
6
  */
@@ -2193,6 +2193,7 @@
2193
2193
  if (this.hasMaximizedView()) {
2194
2194
  this.exitMaximizedView();
2195
2195
  }
2196
+ serializeBranchNode(this.getView(), this.orientation);
2196
2197
  const hiddenOnMaximize = [];
2197
2198
  function hideAllViewsBut(parent, exclude) {
2198
2199
  for (let i = 0; i < parent.children.length; i++) {
@@ -2214,7 +2215,10 @@
2214
2215
  }
2215
2216
  hideAllViewsBut(this.root, node);
2216
2217
  this._maximizedNode = { leaf: node, hiddenOnMaximize };
2217
- this._onDidMaximizedNodeChange.fire();
2218
+ this._onDidMaximizedNodeChange.fire({
2219
+ view: node.view,
2220
+ isMaximized: true,
2221
+ });
2218
2222
  }
2219
2223
  exitMaximizedView() {
2220
2224
  if (!this._maximizedNode) {
@@ -2235,24 +2239,51 @@
2235
2239
  }
2236
2240
  }
2237
2241
  showViewsInReverseOrder(this.root);
2242
+ const tmp = this._maximizedNode.leaf;
2238
2243
  this._maximizedNode = undefined;
2239
- this._onDidMaximizedNodeChange.fire();
2244
+ this._onDidMaximizedNodeChange.fire({
2245
+ view: tmp.view,
2246
+ isMaximized: false,
2247
+ });
2240
2248
  }
2241
2249
  serialize() {
2250
+ const maximizedView = this.maximizedView();
2251
+ let maxmizedViewLocation;
2252
+ if (maximizedView) {
2253
+ /**
2254
+ * The minimum information we can get away with in order to serialize a maxmized view is it's location within the grid
2255
+ * which is represented as a branch of indices
2256
+ */
2257
+ maxmizedViewLocation = getGridLocation(maximizedView.element);
2258
+ }
2242
2259
  if (this.hasMaximizedView()) {
2243
2260
  /**
2244
- * do not persist maximized view state
2245
- * firstly exit any maximized views to ensure the correct dimensions are persisted
2261
+ * the saved layout cannot be in its maxmized state otherwise all of the underlying
2262
+ * view dimensions will be wrong
2263
+ *
2264
+ * To counteract this we temporaily remove the maximized view to compute the serialized output
2265
+ * of the grid before adding back the maxmized view as to not alter the layout from the users
2266
+ * perspective when `.toJSON()` is called
2246
2267
  */
2247
2268
  this.exitMaximizedView();
2248
2269
  }
2249
2270
  const root = serializeBranchNode(this.getView(), this.orientation);
2250
- return {
2271
+ const resullt = {
2251
2272
  root,
2252
2273
  width: this.width,
2253
2274
  height: this.height,
2254
2275
  orientation: this.orientation,
2255
2276
  };
2277
+ if (maxmizedViewLocation) {
2278
+ resullt.maximizedNode = {
2279
+ location: maxmizedViewLocation,
2280
+ };
2281
+ }
2282
+ if (maximizedView) {
2283
+ // replace any maximzied view that was removed for serialization purposes
2284
+ this.maximizeView(maximizedView);
2285
+ }
2286
+ return resullt;
2256
2287
  }
2257
2288
  dispose() {
2258
2289
  this.disposable.dispose();
@@ -2271,6 +2302,19 @@
2271
2302
  const orientation = json.orientation;
2272
2303
  const height = orientation === exports.Orientation.VERTICAL ? json.height : json.width;
2273
2304
  this._deserialize(json.root, orientation, deserializer, height);
2305
+ /**
2306
+ * The deserialied layout must be positioned through this.layout(...)
2307
+ * before any maximizedNode can be positioned
2308
+ */
2309
+ this.layout(json.width, json.height);
2310
+ if (json.maximizedNode) {
2311
+ const location = json.maximizedNode.location;
2312
+ const [_, node] = this.getNode(location);
2313
+ if (!(node instanceof LeafNode)) {
2314
+ return;
2315
+ }
2316
+ this.maximizeView(node.view);
2317
+ }
2274
2318
  }
2275
2319
  _deserialize(root, orientation, deserializer, orthogonalSize) {
2276
2320
  this.root = this._deserializeNode(root, orientation, deserializer, orthogonalSize);
@@ -2695,6 +2739,8 @@
2695
2739
  this.onDidRemove = this._onDidRemove.event;
2696
2740
  this._onDidAdd = new Emitter();
2697
2741
  this.onDidAdd = this._onDidAdd.event;
2742
+ this._onDidMaximizedChange = new Emitter();
2743
+ this.onDidMaximizedChange = this._onDidMaximizedChange.event;
2698
2744
  this._onDidActiveChange = new Emitter();
2699
2745
  this.onDidActiveChange = this._onDidActiveChange.event;
2700
2746
  this._bufferOnDidLayoutChange = new AsapEvent();
@@ -2710,7 +2756,12 @@
2710
2756
  this.gridview.locked = !!options.locked;
2711
2757
  this.element.appendChild(this.gridview.element);
2712
2758
  this.layout(0, 0, true); // set some elements height/widths
2713
- this.addDisposables(this.gridview.onDidViewVisibilityChange(() => this._onDidViewVisibilityChangeMicroTaskQueue.fire()), this.onDidViewVisibilityChangeMicroTaskQueue(() => {
2759
+ this.addDisposables(this.gridview.onDidMaximizedNodeChange((event) => {
2760
+ this._onDidMaximizedChange.fire({
2761
+ panel: event.view,
2762
+ isMaximized: event.isMaximized,
2763
+ });
2764
+ }), this.gridview.onDidViewVisibilityChange(() => this._onDidViewVisibilityChangeMicroTaskQueue.fire()), this.onDidViewVisibilityChangeMicroTaskQueue(() => {
2714
2765
  this.layout(this.width, this.height, true);
2715
2766
  }), exports.DockviewDisposable.from(() => {
2716
2767
  var _a;
@@ -2760,9 +2811,6 @@
2760
2811
  hasMaximizedGroup() {
2761
2812
  return this.gridview.hasMaximizedView();
2762
2813
  }
2763
- get onDidMaximizedGroupChange() {
2764
- return this.gridview.onDidMaximizedNodeChange;
2765
- }
2766
2814
  doAddGroup(group, location = [0], size) {
2767
2815
  this.gridview.addView(group, size !== null && size !== void 0 ? size : exports.Sizing.Distribute, location);
2768
2816
  this._onDidAdd.fire(group);
@@ -4772,7 +4820,6 @@
4772
4820
  this.onDragStart = this._onDragStart.event;
4773
4821
  this._element = document.createElement('div');
4774
4822
  this._element.className = 'dv-void-container';
4775
- this._element.tabIndex = 0;
4776
4823
  this._element.draggable = true;
4777
4824
  this.addDisposables(this._onDrop, this._onDragStart, addDisposableListener(this._element, 'pointerdown', () => {
4778
4825
  this.accessor.doSetGroupActive(this.group);
@@ -5086,6 +5133,7 @@
5086
5133
  disableDnd: undefined,
5087
5134
  gap: undefined,
5088
5135
  className: undefined,
5136
+ noPanelsOverlay: undefined,
5089
5137
  };
5090
5138
  return Object.keys(properties);
5091
5139
  })();
@@ -5526,7 +5574,10 @@
5526
5574
  this.doClose(panel);
5527
5575
  }
5528
5576
  doClose(panel) {
5529
- this.accessor.removePanel(panel);
5577
+ const isLast = this.panels.length === 1 && this.accessor.groups.length === 1;
5578
+ this.accessor.removePanel(panel, isLast && this.accessor.options.noPanelsOverlay === 'emptyGroup'
5579
+ ? { removeEmptyGroup: false }
5580
+ : undefined);
5530
5581
  }
5531
5582
  isPanelActive(panel) {
5532
5583
  return this._activePanel === panel;
@@ -5632,7 +5683,6 @@
5632
5683
  }
5633
5684
  updateContainer() {
5634
5685
  var _a, _b;
5635
- toggleClass(this.container, 'dv-empty', this.isEmpty);
5636
5686
  this.panels.forEach((panel) => panel.runEvents());
5637
5687
  if (this.isEmpty && !this.watermark) {
5638
5688
  const watermark = this.accessor.createWatermarkComponent();
@@ -5646,14 +5696,12 @@
5646
5696
  this.accessor.doSetGroupActive(this.groupPanel);
5647
5697
  }
5648
5698
  });
5649
- this.tabsContainer.hide();
5650
5699
  this.contentContainer.element.appendChild(this.watermark.element);
5651
5700
  }
5652
5701
  if (!this.isEmpty && this.watermark) {
5653
5702
  this.watermark.element.remove();
5654
5703
  (_b = (_a = this.watermark).dispose) === null || _b === void 0 ? void 0 : _b.call(_a);
5655
5704
  this.watermark = undefined;
5656
- this.tabsContainer.show();
5657
5705
  }
5658
5706
  }
5659
5707
  canDisplayOverlay(event, position, target) {
@@ -6581,38 +6629,9 @@
6581
6629
  super();
6582
6630
  this._element = document.createElement('div');
6583
6631
  this._element.className = 'dv-watermark';
6584
- const title = document.createElement('div');
6585
- title.className = 'dv-watermark-title';
6586
- const emptySpace = document.createElement('span');
6587
- emptySpace.style.flexGrow = '1';
6588
- const content = document.createElement('div');
6589
- content.className = 'dv-watermark-content';
6590
- this._element.appendChild(title);
6591
- this._element.appendChild(content);
6592
- const actionsContainer = document.createElement('div');
6593
- actionsContainer.className = 'dv-actions-container';
6594
- const closeAnchor = document.createElement('div');
6595
- closeAnchor.className = 'dv-close-action';
6596
- closeAnchor.appendChild(createCloseButton());
6597
- actionsContainer.appendChild(closeAnchor);
6598
- title.appendChild(emptySpace);
6599
- title.appendChild(actionsContainer);
6600
- this.addDisposables(addDisposableListener(closeAnchor, 'click', (event) => {
6601
- var _a;
6602
- event.preventDefault();
6603
- if (this._group) {
6604
- (_a = this._api) === null || _a === void 0 ? void 0 : _a.removeGroup(this._group);
6605
- }
6606
- }));
6607
6632
  }
6608
6633
  init(_params) {
6609
- this._api = _params.containerApi;
6610
- this._group = _params.group;
6611
- this.render();
6612
- }
6613
- render() {
6614
- const isOneGroup = !!(this._api && this._api.size <= 1);
6615
- toggleClass(this.element, 'dv-has-actions', isOneGroup);
6634
+ // noop
6616
6635
  }
6617
6636
  }
6618
6637
 
@@ -6649,6 +6668,9 @@
6649
6668
  get element() {
6650
6669
  return this._element;
6651
6670
  }
6671
+ get isVisible() {
6672
+ return this._isVisible;
6673
+ }
6652
6674
  constructor(options) {
6653
6675
  super();
6654
6676
  this.options = options;
@@ -6659,6 +6681,7 @@
6659
6681
  this.onDidChangeEnd = this._onDidChangeEnd.event;
6660
6682
  this.addDisposables(this._onDidChange, this._onDidChangeEnd);
6661
6683
  this._element.className = 'dv-resize-container';
6684
+ this._isVisible = true;
6662
6685
  this.setupResize('top');
6663
6686
  this.setupResize('bottom');
6664
6687
  this.setupResize('left');
@@ -6673,6 +6696,13 @@
6673
6696
  this.setBounds(Object.assign(Object.assign(Object.assign(Object.assign({ height: this.options.height, width: this.options.width }, ('top' in this.options && { top: this.options.top })), ('bottom' in this.options && { bottom: this.options.bottom })), ('left' in this.options && { left: this.options.left })), ('right' in this.options && { right: this.options.right })));
6674
6697
  arialLevelTracker.push(this._element);
6675
6698
  }
6699
+ setVisible(isVisible) {
6700
+ if (isVisible === this.isVisible) {
6701
+ return;
6702
+ }
6703
+ this._isVisible = isVisible;
6704
+ toggleClass(this.element, 'dv-hidden', !this.isVisible);
6705
+ }
6676
6706
  bringToFront() {
6677
6707
  arialLevelTracker.push(this._element);
6678
6708
  }
@@ -7432,6 +7462,8 @@
7432
7462
  this.onDidActivePanelChange = this._onDidActivePanelChange.event;
7433
7463
  this._onDidMovePanel = new Emitter();
7434
7464
  this.onDidMovePanel = this._onDidMovePanel.event;
7465
+ this._onDidMaximizedGroupChange = new Emitter();
7466
+ this.onDidMaximizedGroupChange = this._onDidMaximizedGroupChange.event;
7435
7467
  this._floatingGroups = [];
7436
7468
  this._popoutGroups = [];
7437
7469
  this._onDidRemoveGroup = new Emitter();
@@ -7458,6 +7490,11 @@
7458
7490
  if (!this._moving) {
7459
7491
  this._onDidActiveGroupChange.fire(event);
7460
7492
  }
7493
+ }), this.onDidMaximizedChange((event) => {
7494
+ this._onDidMaximizedGroupChange.fire({
7495
+ group: event.panel,
7496
+ isMaximized: event.isMaximized,
7497
+ });
7461
7498
  }), exports.DockviewEvent.any(this.onDidAdd, this.onDidRemove)(() => {
7462
7499
  this.updateWatermark();
7463
7500
  }), exports.DockviewEvent.any(this.onDidAddPanel, this.onDidRemovePanel, this.onDidAddGroup, this.onDidRemove, this.onDidMovePanel, this.onDidActivePanelChange)(() => {
@@ -7556,8 +7593,28 @@
7556
7593
  this._api = new DockviewApi(this);
7557
7594
  this.updateWatermark();
7558
7595
  }
7596
+ setVisible(panel, visible) {
7597
+ switch (panel.api.location.type) {
7598
+ case 'grid':
7599
+ super.setVisible(panel, visible);
7600
+ break;
7601
+ case 'floating': {
7602
+ const item = this.floatingGroups.find((floatingGroup) => floatingGroup.group === panel);
7603
+ if (item) {
7604
+ item.overlay.setVisible(visible);
7605
+ panel.api._onDidVisibilityChange.fire({
7606
+ isVisible: visible,
7607
+ });
7608
+ }
7609
+ break;
7610
+ }
7611
+ case 'popout':
7612
+ console.warn('dockview: You cannot hide a group that is in a popout window');
7613
+ break;
7614
+ }
7615
+ }
7559
7616
  addPopoutGroup(itemToPopout, options) {
7560
- var _a, _b, _c;
7617
+ var _a, _b, _c, _d, _e;
7561
7618
  if (itemToPopout instanceof DockviewPanel &&
7562
7619
  itemToPopout.group.size === 1) {
7563
7620
  return this.addPopoutGroup(itemToPopout.group, options);
@@ -7580,7 +7637,7 @@
7580
7637
  const groupId = (_b = (_a = options === null || options === void 0 ? void 0 : options.overridePopoutGroup) === null || _a === void 0 ? void 0 : _a.id) !== null && _b !== void 0 ? _b : this.getNextGroupId();
7581
7638
  const _window = new PopoutWindow(`${this.id}-${groupId}`, // unique id
7582
7639
  theme !== null && theme !== void 0 ? theme : '', {
7583
- url: (_c = options === null || options === void 0 ? void 0 : options.popoutUrl) !== null && _c !== void 0 ? _c : '/popout.html',
7640
+ url: (_e = (_c = options === null || options === void 0 ? void 0 : options.popoutUrl) !== null && _c !== void 0 ? _c : (_d = this.options) === null || _d === void 0 ? void 0 : _d.popoutUrl) !== null && _e !== void 0 ? _e : '/popout.html',
7584
7641
  left: window.screenX + box.left,
7585
7642
  top: window.screenY + box.top,
7586
7643
  width: box.width,
@@ -7594,7 +7651,6 @@
7594
7651
  return _window
7595
7652
  .open()
7596
7653
  .then((popoutContainer) => {
7597
- var _a;
7598
7654
  if (_window.isDisposed) {
7599
7655
  return false;
7600
7656
  }
@@ -7614,14 +7670,19 @@
7614
7670
  * of this case is when being called from the `fromJSON(...)` method
7615
7671
  */
7616
7672
  const isGroupAddedToDom = referenceGroup.element.parentElement !== null;
7617
- const group = !isGroupAddedToDom
7618
- ? referenceGroup
7619
- : (_a = options === null || options === void 0 ? void 0 : options.overridePopoutGroup) !== null && _a !== void 0 ? _a : this.createGroup({ id: groupId });
7620
- group.model.renderContainer = overlayRenderContainer;
7621
- group.layout(_window.window.innerWidth, _window.window.innerHeight);
7622
- if (!this._groups.has(group.api.id)) {
7673
+ let group;
7674
+ if (!isGroupAddedToDom) {
7675
+ group = referenceGroup;
7676
+ }
7677
+ else if (options === null || options === void 0 ? void 0 : options.overridePopoutGroup) {
7678
+ group = options.overridePopoutGroup;
7679
+ }
7680
+ else {
7681
+ group = this.createGroup({ id: groupId });
7623
7682
  this._onDidAddGroup.fire(group);
7624
7683
  }
7684
+ group.model.renderContainer = overlayRenderContainer;
7685
+ group.layout(_window.window.innerWidth, _window.window.innerHeight);
7625
7686
  if (!(options === null || options === void 0 ? void 0 : options.overridePopoutGroup) && isGroupAddedToDom) {
7626
7687
  if (itemToPopout instanceof DockviewPanel) {
7627
7688
  this.movingLock(() => {
@@ -7652,6 +7713,7 @@
7652
7713
  group.model.location = {
7653
7714
  type: 'popout',
7654
7715
  getWindow: () => _window.window,
7716
+ popoutUrl: options === null || options === void 0 ? void 0 : options.popoutUrl,
7655
7717
  };
7656
7718
  if (isGroupAddedToDom &&
7657
7719
  itemToPopout.api.location.type === 'grid') {
@@ -7668,16 +7730,15 @@
7668
7730
  (_a = _window.window) === null || _a === void 0 ? void 0 : _a.focus();
7669
7731
  }));
7670
7732
  let returnedGroup;
7733
+ const isValidReferenceGroup = isGroupAddedToDom &&
7734
+ referenceGroup &&
7735
+ this.getPanel(referenceGroup.id);
7671
7736
  const value = {
7672
7737
  window: _window,
7673
7738
  popoutGroup: group,
7674
- referenceGroup: !isGroupAddedToDom
7675
- ? undefined
7676
- : referenceGroup
7677
- ? this.getPanel(referenceGroup.id)
7678
- ? referenceGroup.id
7679
- : undefined
7680
- : undefined,
7739
+ referenceGroup: isValidReferenceGroup
7740
+ ? referenceGroup.id
7741
+ : undefined,
7681
7742
  disposable: {
7682
7743
  dispose: () => {
7683
7744
  popoutWindowDisposable.dispose();
@@ -8026,6 +8087,9 @@
8026
8087
  data: group.popoutGroup.toJSON(),
8027
8088
  gridReferenceGroup: group.referenceGroup,
8028
8089
  position: group.window.dimensions(),
8090
+ url: group.popoutGroup.api.location.type === 'popout'
8091
+ ? group.popoutGroup.api.location.popoutUrl
8092
+ : undefined,
8029
8093
  };
8030
8094
  });
8031
8095
  const result = {
@@ -8112,7 +8176,7 @@
8112
8176
  }
8113
8177
  const serializedPopoutGroups = (_b = data.popoutGroups) !== null && _b !== void 0 ? _b : [];
8114
8178
  for (const serializedPopoutGroup of serializedPopoutGroups) {
8115
- const { data, position, gridReferenceGroup } = serializedPopoutGroup;
8179
+ const { data, position, gridReferenceGroup, url } = serializedPopoutGroup;
8116
8180
  const group = createGroupFromSerializedState(data);
8117
8181
  this.addPopoutGroup((_c = (gridReferenceGroup
8118
8182
  ? this.getPanel(gridReferenceGroup)
@@ -8121,6 +8185,7 @@
8121
8185
  overridePopoutGroup: gridReferenceGroup
8122
8186
  ? group
8123
8187
  : undefined,
8188
+ popoutUrl: url,
8124
8189
  });
8125
8190
  }
8126
8191
  for (const floatingGroup of this._floatingGroups) {
@@ -8330,7 +8395,6 @@
8330
8395
  }
8331
8396
  removePanel(panel, options = {
8332
8397
  removeEmptyGroup: true,
8333
- skipDispose: false,
8334
8398
  }) {
8335
8399
  const group = panel.group;
8336
8400
  if (!group) {