dockview-core 8.4.0 → 8.4.1

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.
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * dockview-core
3
- * @version 8.4.0
3
+ * @version 8.4.1
4
4
  * @link https://github.com/dockview/dockview
5
5
  * @license MIT
6
6
  */
@@ -333,21 +333,29 @@ var OverflowObserver = class extends CompositeDisposable {
333
333
  }
334
334
  };
335
335
  function watchElementResize(element, cb) {
336
+ const pendingFrames = /* @__PURE__ */ new Set();
336
337
  const observer = new ResizeObserver((entires) => {
337
338
  /**
338
339
  * Fast browser window resize produces Error: ResizeObserver loop limit exceeded.
339
340
  * The error isn't visible in browser console, doesn't affect functionality, but degrades performance.
340
341
  * See https://stackoverflow.com/questions/49384120/resizeobserver-loop-limit-exceeded/58701523#58701523
341
342
  */
342
- requestAnimationFrame(() => {
343
+ let ran = false;
344
+ let frame;
345
+ frame = requestAnimationFrame(() => {
346
+ ran = true;
347
+ if (frame !== void 0) pendingFrames.delete(frame);
343
348
  const firstEntry = entires[0];
344
349
  cb(firstEntry);
345
350
  });
351
+ if (!ran) pendingFrames.add(frame);
346
352
  });
347
353
  observer.observe(element);
348
354
  return { dispose: () => {
349
355
  observer.unobserve(element);
350
356
  observer.disconnect();
357
+ for (const frame of pendingFrames) cancelAnimationFrame(frame);
358
+ pendingFrames.clear();
351
359
  } };
352
360
  }
353
361
  const removeClasses = (element, ...classes) => {
@@ -10216,16 +10224,21 @@ var TabsContainer = class extends CompositeDisposable {
10216
10224
  y: event.clientY,
10217
10225
  zIndex: (relativeParent === null || relativeParent === void 0 ? void 0 : relativeParent.style.zIndex) ? `calc(${relativeParent.style.zIndex} * 2)` : void 0
10218
10226
  };
10219
- const context = this.createOverflowRenderContext(root, anchor);
10227
+ const { context, rowRenderers } = this.createOverflowRenderContext(root, anchor);
10220
10228
  const advancedOverflow = this.accessor.advancedOverflowService;
10221
- if (advancedOverflow) advancedOverflow.renderOverflow({
10222
- group: this.group,
10223
- overflowTabs: [...this._overflowTabs],
10224
- overflowTabGroups: [...this._overflowTabGroups],
10225
- pinnedOverflowTabs: [...this._overflowPinnedTabs],
10226
- context
10227
- });
10228
- else context.open(this.renderFreeOverflowList(context));
10229
+ try {
10230
+ if (advancedOverflow) advancedOverflow.renderOverflow({
10231
+ group: this.group,
10232
+ overflowTabs: [...this._overflowTabs],
10233
+ overflowTabGroups: [...this._overflowTabGroups],
10234
+ pinnedOverflowTabs: [...this._overflowPinnedTabs],
10235
+ context
10236
+ });
10237
+ else context.open(this.renderFreeOverflowList(context));
10238
+ } catch (err) {
10239
+ rowRenderers.dispose();
10240
+ throw err;
10241
+ }
10229
10242
  }));
10230
10243
  }
10231
10244
  /**
@@ -10246,6 +10259,7 @@ var TabsContainer = class extends CompositeDisposable {
10246
10259
  if (overflowGroupSet.has(tg.id)) for (const pid of tg.panelIds) panelToGroup.set(pid, tg);
10247
10260
  }
10248
10261
  const popup = () => this.accessor.getPopupServiceForGroup(this.group);
10262
+ const rowRenderers = new CompositeDisposable();
10249
10263
  const buildGroupHeader = (tg) => {
10250
10264
  const groupHeader = document.createElement("div");
10251
10265
  groupHeader.className = "dv-tabs-overflow-group-header";
@@ -10275,69 +10289,87 @@ var TabsContainer = class extends CompositeDisposable {
10275
10289
  return groupHeader;
10276
10290
  };
10277
10291
  return {
10278
- overflowGroupIdForPanel: (panelId) => {
10279
- var _panelToGroup$get;
10280
- return (_panelToGroup$get = panelToGroup.get(panelId)) === null || _panelToGroup$get === void 0 ? void 0 : _panelToGroup$get.id;
10281
- },
10282
- buildGroupHeader: (tabGroupId) => {
10283
- const tg = groupById.get(tabGroupId);
10284
- if (!tg || !overflowGroupSet.has(tg.id)) return;
10285
- return buildGroupHeader(tg);
10286
- },
10287
- buildPinnedHeader: () => {
10288
- const header = document.createElement("div");
10289
- header.className = "dv-tabs-overflow-group-header dv-tabs-overflow-pinned-header";
10290
- const glyph = createPinButton();
10291
- glyph.classList.add("dv-tabs-overflow-pinned-icon");
10292
- header.appendChild(glyph);
10293
- const labelSpan = document.createElement("span");
10294
- labelSpan.className = "dv-tabs-overflow-group-label";
10295
- labelSpan.textContent = "Pinned";
10296
- header.appendChild(labelSpan);
10297
- return header;
10298
- },
10299
- buildRow: (panelId) => {
10300
- const panel = this.group.panels.find((p) => p.id === panelId);
10301
- if (!panel) return;
10302
- const tab = this.tabs.tabs.find((t) => t.panel.id === panelId);
10303
- const tg = panelToGroup.get(panelId);
10304
- const child = panel.view.createTabRenderer("headerOverflow").element;
10305
- const wrapper = document.createElement("div");
10306
- toggleClass(wrapper, "dv-tab", true);
10307
- toggleClass(wrapper, "dv-active-tab", panel.api.isActive);
10308
- toggleClass(wrapper, "dv-inactive-tab", !panel.api.isActive);
10309
- if (tg) toggleClass(wrapper, "dv-tab--grouped", true);
10310
- const doActivate = () => {
10311
- if (tg === null || tg === void 0 ? void 0 : tg.collapsed) tg.expand();
10312
- tab === null || tab === void 0 || tab.element.scrollIntoView({
10313
- block: "nearest",
10314
- inline: "nearest"
10292
+ context: {
10293
+ overflowGroupIdForPanel: (panelId) => {
10294
+ var _panelToGroup$get;
10295
+ return (_panelToGroup$get = panelToGroup.get(panelId)) === null || _panelToGroup$get === void 0 ? void 0 : _panelToGroup$get.id;
10296
+ },
10297
+ buildGroupHeader: (tabGroupId) => {
10298
+ const tg = groupById.get(tabGroupId);
10299
+ if (!tg || !overflowGroupSet.has(tg.id)) return;
10300
+ return buildGroupHeader(tg);
10301
+ },
10302
+ buildPinnedHeader: () => {
10303
+ const header = document.createElement("div");
10304
+ header.className = "dv-tabs-overflow-group-header dv-tabs-overflow-pinned-header";
10305
+ const glyph = createPinButton();
10306
+ glyph.classList.add("dv-tabs-overflow-pinned-icon");
10307
+ header.appendChild(glyph);
10308
+ const labelSpan = document.createElement("span");
10309
+ labelSpan.className = "dv-tabs-overflow-group-label";
10310
+ labelSpan.textContent = "Pinned";
10311
+ header.appendChild(labelSpan);
10312
+ return header;
10313
+ },
10314
+ buildRow: (panelId) => {
10315
+ const panel = this.group.panels.find((p) => p.id === panelId);
10316
+ if (!panel) return;
10317
+ const tab = this.tabs.tabs.find((t) => t.panel.id === panelId);
10318
+ const tg = panelToGroup.get(panelId);
10319
+ const tabComponent = panel.view.createTabRenderer("headerOverflow");
10320
+ let rowDisposed = false;
10321
+ const disposeRow = Disposable.from(() => {
10322
+ if (!rowDisposed) {
10323
+ var _tabComponent$dispose;
10324
+ rowDisposed = true;
10325
+ (_tabComponent$dispose = tabComponent.dispose) === null || _tabComponent$dispose === void 0 || _tabComponent$dispose.call(tabComponent);
10326
+ }
10315
10327
  });
10316
- this.accessor.withOrigin("user", () => panel.api.setActive());
10317
- };
10318
- wrapper.addEventListener("click", (event) => {
10319
- popup().close();
10320
- if (event.defaultPrevented) return;
10321
- doActivate();
10322
- });
10323
- wrapper.appendChild(child);
10324
- return {
10325
- element: wrapper,
10326
- panel,
10327
- activate: () => {
10328
+ if (rowRenderers.isDisposed) disposeRow.dispose();
10329
+ else rowRenderers.addDisposables(disposeRow);
10330
+ const child = tabComponent.element;
10331
+ const wrapper = document.createElement("div");
10332
+ toggleClass(wrapper, "dv-tab", true);
10333
+ toggleClass(wrapper, "dv-active-tab", panel.api.isActive);
10334
+ toggleClass(wrapper, "dv-inactive-tab", !panel.api.isActive);
10335
+ if (tg) toggleClass(wrapper, "dv-tab--grouped", true);
10336
+ const doActivate = () => {
10337
+ if (tg === null || tg === void 0 ? void 0 : tg.collapsed) tg.expand();
10338
+ tab === null || tab === void 0 || tab.element.scrollIntoView({
10339
+ block: "nearest",
10340
+ inline: "nearest"
10341
+ });
10342
+ this.accessor.withOrigin("user", () => panel.api.setActive());
10343
+ };
10344
+ wrapper.addEventListener("click", (event) => {
10328
10345
  popup().close();
10346
+ if (event.defaultPrevented) return;
10329
10347
  doActivate();
10330
- }
10331
- };
10332
- },
10333
- open: (body) => {
10334
- popup().openPopover(body, anchor);
10348
+ });
10349
+ wrapper.appendChild(child);
10350
+ return {
10351
+ element: wrapper,
10352
+ panel,
10353
+ activate: () => {
10354
+ popup().close();
10355
+ doActivate();
10356
+ },
10357
+ dispose: () => {
10358
+ rowRenderers.removeDisposable(disposeRow);
10359
+ disposeRow.dispose();
10360
+ }
10361
+ };
10362
+ },
10363
+ open: (body) => {
10364
+ popup().openPopover(body, anchor, { onClose: () => rowRenderers.dispose() });
10365
+ },
10366
+ close: () => popup().close(),
10367
+ focusTrigger: () => {
10368
+ root.tabIndex = -1;
10369
+ root.focus();
10370
+ }
10335
10371
  },
10336
- close: () => popup().close(),
10337
- focusTrigger: () => {
10338
- root.tabIndex = -1;
10339
- root.focus();
10340
- }
10372
+ rowRenderers
10341
10373
  };
10342
10374
  }
10343
10375
  /**
@@ -11254,6 +11286,7 @@ var DockviewGroupPanelModel = class extends CompositeDisposable {
11254
11286
  this.tabsContainer.setRightActionsElement(element);
11255
11287
  }
11256
11288
  setActive(isGroupActive, force = false) {
11289
+ if (this.isDisposed) return;
11257
11290
  if (!force && this.isActive === isGroupActive) return;
11258
11291
  this._isGroupActive = isGroupActive;
11259
11292
  toggleClass(this.container, "dv-active-group", isGroupActive);
@@ -14298,13 +14331,14 @@ var ContextMenuController = class {
14298
14331
  * menu passes the `tabGroup`. No-op when no renderer could be created (no
14299
14332
  * factory configured, or the factory declined the component).
14300
14333
  */
14301
- appendComponentItem(menuEl, item, identity, group, close) {
14334
+ appendComponentItem(menuEl, item, identity, group, close, renderers) {
14302
14335
  var _this$accessor$option4, _this$accessor$option5;
14303
14336
  const renderer = (_this$accessor$option4 = (_this$accessor$option5 = this.accessor.options).createContextMenuItemComponent) === null || _this$accessor$option4 === void 0 ? void 0 : _this$accessor$option4.call(_this$accessor$option5, {
14304
14337
  id: nextContextMenuItemId(),
14305
14338
  component: item.component
14306
14339
  });
14307
14340
  if (!renderer) return;
14341
+ renderers.addDisposables(renderer);
14308
14342
  renderer.init(_objectSpread2(_objectSpread2({}, identity), {}, {
14309
14343
  group,
14310
14344
  api: this.accessor.api,
@@ -14355,9 +14389,9 @@ var ContextMenuController = class {
14355
14389
  * default row; an item carrying none of the three renders nothing. Shared
14356
14390
  * by both menus, which differ only in `identity`.
14357
14391
  */
14358
- appendConfigItem(menuEl, item, identity, group, close) {
14392
+ appendConfigItem(menuEl, item, identity, group, close, renderers) {
14359
14393
  if (item.element) menuEl.appendChild(item.element);
14360
- else if (item.component) this.appendComponentItem(menuEl, item, identity, group, close);
14394
+ else if (item.component) this.appendComponentItem(menuEl, item, identity, group, close, renderers);
14361
14395
  else if (item.label) menuEl.appendChild(buildItem(item.label, close, () => {
14362
14396
  var _item$action;
14363
14397
  return (_item$action = item.action) === null || _item$action === void 0 ? void 0 : _item$action.call(item);
@@ -14369,22 +14403,28 @@ var ContextMenuController = class {
14369
14403
  event.preventDefault();
14370
14404
  const popupService = this.accessor.getPopupServiceForGroup(group);
14371
14405
  const close = () => popupService.close();
14406
+ const renderers = new CompositeDisposable();
14372
14407
  const menuEl = document.createElement("div");
14373
14408
  menuEl.className = "dv-context-menu";
14374
14409
  menuEl.setAttribute("role", "menu");
14375
- for (const item of items) {
14376
- if (isItemConfig(item)) {
14377
- this.appendConfigItem(menuEl, item, { panel }, group, close);
14378
- continue;
14410
+ try {
14411
+ for (const item of items) {
14412
+ if (isItemConfig(item)) {
14413
+ this.appendConfigItem(menuEl, item, { panel }, group, close, renderers);
14414
+ continue;
14415
+ }
14416
+ const el = this.buildBuiltInTabItem(item, panel, group, close);
14417
+ if (el) menuEl.appendChild(el);
14379
14418
  }
14380
- const el = this.buildBuiltInTabItem(item, panel, group, close);
14381
- if (el) menuEl.appendChild(el);
14419
+ } catch (err) {
14420
+ renderers.dispose();
14421
+ throw err;
14382
14422
  }
14383
14423
  popupService.openPopover(menuEl, {
14384
14424
  x: event.clientX,
14385
14425
  y: event.clientY,
14386
14426
  zIndex: popoverZIndexFor(event.target, group)
14387
- });
14427
+ }, { onClose: () => renderers.dispose() });
14388
14428
  }
14389
14429
  showForChip(tabGroup, group, event) {
14390
14430
  if (!this.accessor.options.getTabGroupChipContextMenuItems) return;
@@ -14398,22 +14438,28 @@ var ContextMenuController = class {
14398
14438
  event.preventDefault();
14399
14439
  const popupService = this.accessor.getPopupServiceForGroup(group);
14400
14440
  const close = () => popupService.close();
14441
+ const renderers = new CompositeDisposable();
14401
14442
  const menuEl = document.createElement("div");
14402
14443
  menuEl.className = "dv-context-menu";
14403
14444
  menuEl.setAttribute("role", "menu");
14404
- for (const item of items) if (item === "separator") menuEl.appendChild(buildSeparator());
14405
- else if (item === "rename") menuEl.appendChild(buildRenameInput(tabGroup));
14406
- else if (item === "colorPicker") menuEl.appendChild(buildColorPicker(tabGroup, this.accessor.tabGroupColorPalette));
14407
- else if (item === "collapse") menuEl.appendChild(this.buildCollapseItem(tabGroup, close));
14408
- else if (item === "close") menuEl.appendChild(buildItem("Close All", close, () => {
14409
- group.panels.filter((p) => tabGroup.containsPanel(p.id)).forEach((p) => p.api.close());
14410
- }));
14411
- else if (isItemConfig(item)) this.appendConfigItem(menuEl, item, { tabGroup }, group, close);
14445
+ try {
14446
+ for (const item of items) if (item === "separator") menuEl.appendChild(buildSeparator());
14447
+ else if (item === "rename") menuEl.appendChild(buildRenameInput(tabGroup));
14448
+ else if (item === "colorPicker") menuEl.appendChild(buildColorPicker(tabGroup, this.accessor.tabGroupColorPalette));
14449
+ else if (item === "collapse") menuEl.appendChild(this.buildCollapseItem(tabGroup, close));
14450
+ else if (item === "close") menuEl.appendChild(buildItem("Close All", close, () => {
14451
+ group.panels.filter((p) => tabGroup.containsPanel(p.id)).forEach((p) => p.api.close());
14452
+ }));
14453
+ else if (isItemConfig(item)) this.appendConfigItem(menuEl, item, { tabGroup }, group, close, renderers);
14454
+ } catch (err) {
14455
+ renderers.dispose();
14456
+ throw err;
14457
+ }
14412
14458
  popupService.openPopover(menuEl, {
14413
14459
  x: event.clientX,
14414
14460
  y: event.clientY,
14415
14461
  zIndex: popoverZIndexFor(event.target, group)
14416
- });
14462
+ }, { onClose: () => renderers.dispose() });
14417
14463
  }
14418
14464
  };
14419
14465
  const ContextMenuModule = defineModule({
@@ -14703,6 +14749,7 @@ var OverlayRenderContainer = class extends CompositeDisposable {
14703
14749
  const observerDisposable = new MutableDisposable();
14704
14750
  const correctLayerPosition = () => {
14705
14751
  if (panel.api.location.type === "floating") queueMicrotask(() => {
14752
+ if (disposable.isDisposed) return;
14706
14753
  const floatingGroup = this.accessor.getFloatingWindowForGroup(panel.api.group);
14707
14754
  if (!floatingGroup) return;
14708
14755
  const element = floatingGroup.overlay.element;
@@ -14937,7 +14984,7 @@ var PopupService = class extends CompositeDisposable {
14937
14984
  newRoot.prepend(this._element);
14938
14985
  this._root = newRoot;
14939
14986
  }
14940
- openPopover(element, position) {
14987
+ openPopover(element, position, options) {
14941
14988
  var _position$zIndex;
14942
14989
  this.close();
14943
14990
  const wrapper = this._window.document.createElement("div");
@@ -14952,14 +14999,14 @@ var PopupService = class extends CompositeDisposable {
14952
14999
  this._element.appendChild(wrapper);
14953
15000
  this._active = wrapper;
14954
15001
  const POINTERDOWN_GRACE_MS = 200;
14955
- this._activeDisposable.value = createDismissableLayer({
15002
+ this._activeDisposable.value = new CompositeDisposable(createDismissableLayer({
14956
15003
  window: this._window,
14957
15004
  onDismiss: () => this.close(),
14958
15005
  elements: () => this._active ? [this._active] : [],
14959
15006
  keys: ["Enter"],
14960
15007
  pointerDownGraceMs: POINTERDOWN_GRACE_MS,
14961
15008
  resize: true
14962
- });
15009
+ }), (options === null || options === void 0 ? void 0 : options.onClose) ? Disposable.from(options.onClose) : Disposable.NONE);
14963
15010
  this._window.requestAnimationFrame(() => {
14964
15011
  shiftAbsoluteElementIntoView(wrapper, this._root);
14965
15012
  });
@@ -16271,7 +16318,9 @@ var DockviewComponent = class extends BaseGrid {
16271
16318
  this._onWillDrop = new Emitter();
16272
16319
  this.onWillDrop = this._onWillDrop.event;
16273
16320
  this._mutationDepth = 0;
16321
+ this._syncMutationDepth = 0;
16274
16322
  this._pendingLocationChanges = /* @__PURE__ */ new Map();
16323
+ this._openingPopoutWindows = /* @__PURE__ */ new Set();
16275
16324
  this._origin = "user";
16276
16325
  this._originDepth = 0;
16277
16326
  this._onWillMutateLayout = new Emitter();
@@ -16355,6 +16404,10 @@ var DockviewComponent = class extends BaseGrid {
16355
16404
  });
16356
16405
  }));
16357
16406
  this.popupService = new PopupService(this.element);
16407
+ this.addDisposables(this.popupService, Disposable.from(() => {
16408
+ for (const opening of this._openingPopoutWindows) opening.dispose();
16409
+ this._openingPopoutWindows.clear();
16410
+ }));
16358
16411
  this._api = new DockviewApi(this);
16359
16412
  this.disableResizing = true;
16360
16413
  this.element.remove();
@@ -16503,9 +16556,15 @@ var DockviewComponent = class extends BaseGrid {
16503
16556
  const popoutWindowDisposable = new CompositeDisposable(_window, _window.onDidClose(() => {
16504
16557
  popoutWindowDisposable.dispose();
16505
16558
  }));
16559
+ this._openingPopoutWindows.add(popoutWindowDisposable);
16506
16560
  const openError = getPopoutUrlError(popoutUrl);
16507
16561
  return (openError ? Promise.resolve(null) : _window.open()).then((popoutContainer) => {
16508
16562
  var _options$referenceGro, _options$overridePopo4;
16563
+ this._openingPopoutWindows.delete(popoutWindowDisposable);
16564
+ if (this.isDisposed) {
16565
+ popoutWindowDisposable.dispose();
16566
+ return false;
16567
+ }
16509
16568
  if (_window.isDisposed) {
16510
16569
  const failure = _window.failure;
16511
16570
  if (failure && !this.isDisposed) {
@@ -16699,6 +16758,7 @@ var DockviewComponent = class extends BaseGrid {
16699
16758
  for (const { panel, from } of movedPanels) this.fireDidMovePanel(panel, from);
16700
16759
  return true;
16701
16760
  }).catch((err) => {
16761
+ this._openingPopoutWindows.delete(popoutWindowDisposable);
16702
16762
  console.error("dockview: failed to create popout.", err);
16703
16763
  return false;
16704
16764
  });
@@ -17238,6 +17298,7 @@ var DockviewComponent = class extends BaseGrid {
17238
17298
  group.dispose();
17239
17299
  this._groups.delete(group.id);
17240
17300
  this._onDidRemoveGroup.fire(group);
17301
+ this.activateFallbackGroupIfRemoved(group);
17241
17302
  });
17242
17303
  }
17243
17304
  setEdgeGroupCollapsed(group, collapsed) {
@@ -17434,6 +17495,7 @@ var DockviewComponent = class extends BaseGrid {
17434
17495
  const record = this._groups.get(temporaryGroup.api.id);
17435
17496
  this._groups.delete(temporaryGroup.api.id);
17436
17497
  temporaryGroupDisposables.push(Disposable.from(() => {
17498
+ var _this$headerActionsSe2;
17437
17499
  /**
17438
17500
  * Reclaim the group's own resources, never its panels.
17439
17501
  * Staging is driven by the ids in `data.panels` while
@@ -17451,6 +17513,7 @@ var DockviewComponent = class extends BaseGrid {
17451
17513
  for (const panel of temporaryGroup.panels.slice()) temporaryGroup.model.removePanel(panel);
17452
17514
  });
17453
17515
  record === null || record === void 0 || record.disposable.dispose();
17516
+ (_this$headerActionsSe2 = this.headerActionsService) === null || _this$headerActionsSe2 === void 0 || _this$headerActionsSe2.disposeGroup(temporaryGroup);
17454
17517
  temporaryGroup.dispose();
17455
17518
  }));
17456
17519
  return temporaryGroup;
@@ -18115,9 +18178,12 @@ var DockviewComponent = class extends BaseGrid {
18115
18178
  */
18116
18179
  mutation(kind, func) {
18117
18180
  const close = this.openMutation(kind);
18181
+ this._syncMutationDepth++;
18118
18182
  try {
18119
18183
  return func();
18120
18184
  } finally {
18185
+ this._syncMutationDepth--;
18186
+ if (this._syncMutationDepth === 0) this.releaseDisposedActiveGroup();
18121
18187
  close();
18122
18188
  }
18123
18189
  }
@@ -18164,6 +18230,7 @@ var DockviewComponent = class extends BaseGrid {
18164
18230
  return () => {
18165
18231
  this._mutationDepth--;
18166
18232
  if (this._mutationDepth === 0) {
18233
+ this.releaseDisposedActiveGroup();
18167
18234
  this.flushLocationChanges();
18168
18235
  this._onDidMutateLayout.fire({
18169
18236
  kind,
@@ -18172,6 +18239,11 @@ var DockviewComponent = class extends BaseGrid {
18172
18239
  }
18173
18240
  };
18174
18241
  }
18242
+ /** Covers removals with `skipActive` that disposed the active group. */
18243
+ releaseDisposedActiveGroup() {
18244
+ var _this$_activeGroup;
18245
+ if (!this.isDisposed && ((_this$_activeGroup = this._activeGroup) === null || _this$_activeGroup === void 0 ? void 0 : _this$_activeGroup.model.isDisposed)) this.activateFallbackGroupIfRemoved(this._activeGroup);
18246
+ }
18175
18247
  /**
18176
18248
  * Coalesce a panel's `onDidLocationChange` to the end of the enclosing
18177
18249
  * transaction, or fire it immediately when no transaction is in flight.
@@ -18309,7 +18381,7 @@ var DockviewComponent = class extends BaseGrid {
18309
18381
  skipSetActiveGroup: true
18310
18382
  }));
18311
18383
  if (!removedPanel) throw new Error(`dockview: No panel with id ${sourceItemId}`);
18312
- if (!options.keepEmptyGroups && sourceGroup.model.size === 0) this.doRemoveGroup(sourceGroup, { skipActive: true });
18384
+ if (!options.keepEmptyGroups && sourceGroup.model.size === 0 && sourceGroup !== destinationGroup) this.doRemoveGroup(sourceGroup, { skipActive: true });
18313
18385
  const isDestinationGroupEmpty = destinationGroup.model.size === 0;
18314
18386
  this.movingLock(() => {
18315
18387
  var _options$skipSetActiv;
@@ -18474,6 +18546,7 @@ var DockviewComponent = class extends BaseGrid {
18474
18546
  const from = options.from.group;
18475
18547
  const to = options.to.group;
18476
18548
  const target = options.to.position;
18549
+ if (target === "center" && from === to) return;
18477
18550
  let source = from;
18478
18551
  let mergedPanels;
18479
18552
  if (target === "center") {
@@ -19505,6 +19578,7 @@ var PaneviewComponent = class extends Resizable {
19505
19578
  const queue = [];
19506
19579
  const width = this.width;
19507
19580
  const height = this.height;
19581
+ this.paneview.dispose();
19508
19582
  this.paneview = new Paneview(this.element, {
19509
19583
  orientation: "VERTICAL",
19510
19584
  descriptor: {
@@ -19568,7 +19642,11 @@ var PaneviewComponent = class extends Resizable {
19568
19642
  clear() {
19569
19643
  for (const [_, value] of this._viewDisposables.entries()) value.dispose();
19570
19644
  this._viewDisposables.clear();
19645
+ const width = this.width;
19646
+ const height = this.height;
19571
19647
  this.paneview.dispose();
19648
+ this.paneview = new Paneview(this.element, { orientation: "VERTICAL" });
19649
+ this.layout(width, height);
19572
19650
  }
19573
19651
  doAddPanel(panel) {
19574
19652
  const disposable = new CompositeDisposable(panel.onDidDrop((event) => {