dockview-core 1.17.2 → 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 (132) hide show
  1. package/dist/cjs/api/component.api.d.ts +3 -3
  2. package/dist/cjs/api/dockviewGroupPanelApi.d.ts +10 -8
  3. package/dist/cjs/api/dockviewGroupPanelApi.js +1 -0
  4. package/dist/cjs/api/dockviewPanelApi.d.ts +6 -14
  5. package/dist/cjs/api/dockviewPanelApi.js +5 -3
  6. package/dist/cjs/dnd/abstractDragHandler.js +1 -1
  7. package/dist/cjs/dnd/dnd.d.ts +2 -2
  8. package/dist/cjs/dnd/droptarget.js +4 -4
  9. package/dist/cjs/dockview/components/panel/content.d.ts +2 -2
  10. package/dist/cjs/dockview/components/panel/content.js +3 -1
  11. package/dist/cjs/dockview/components/tab/defaultTab.d.ts +3 -3
  12. package/dist/cjs/dockview/components/tab/tab.js +4 -4
  13. package/dist/cjs/dockview/components/titlebar/tabsContainer.js +5 -9
  14. package/dist/cjs/dockview/components/titlebar/voidContainer.js +1 -2
  15. package/dist/cjs/dockview/components/watermark/watermark.d.ts +1 -4
  16. package/dist/cjs/dockview/components/watermark/watermark.js +2 -34
  17. package/dist/cjs/dockview/dockviewComponent.d.ts +33 -16
  18. package/dist/cjs/dockview/dockviewComponent.js +103 -38
  19. package/dist/cjs/dockview/dockviewGroupPanel.js +16 -12
  20. package/dist/cjs/dockview/dockviewGroupPanelModel.d.ts +4 -3
  21. package/dist/cjs/dockview/dockviewGroupPanelModel.js +10 -10
  22. package/dist/cjs/dockview/dockviewPanel.d.ts +4 -4
  23. package/dist/cjs/dockview/dockviewPanelModel.d.ts +1 -1
  24. package/dist/cjs/dockview/options.d.ts +12 -0
  25. package/dist/cjs/dockview/options.js +1 -0
  26. package/dist/cjs/dom.d.ts +11 -1
  27. package/dist/cjs/dom.js +19 -1
  28. package/dist/cjs/gridview/baseComponentGridview.d.ts +8 -3
  29. package/dist/cjs/gridview/baseComponentGridview.js +8 -8
  30. package/dist/cjs/gridview/basePanelView.d.ts +1 -1
  31. package/dist/cjs/gridview/branchNode.d.ts +1 -1
  32. package/dist/cjs/gridview/branchNode.js +1 -1
  33. package/dist/cjs/gridview/gridview.d.ts +9 -1
  34. package/dist/cjs/gridview/gridview.js +51 -7
  35. package/dist/cjs/gridview/gridviewPanel.d.ts +4 -0
  36. package/dist/cjs/gridview/gridviewPanel.js +60 -32
  37. package/dist/cjs/gridview/leafNode.d.ts +1 -1
  38. package/dist/cjs/index.d.ts +8 -9
  39. package/dist/cjs/index.js +14 -7
  40. package/dist/cjs/overlay/overlay.d.ts +6 -3
  41. package/dist/cjs/overlay/overlay.js +15 -0
  42. package/dist/cjs/paneview/defaultPaneviewHeader.d.ts +1 -1
  43. package/dist/cjs/paneview/defaultPaneviewHeader.js +5 -3
  44. package/dist/cjs/paneview/paneview.d.ts +3 -3
  45. package/dist/cjs/paneview/paneview.js +3 -3
  46. package/dist/cjs/paneview/paneviewComponent.d.ts +2 -2
  47. package/dist/cjs/paneview/paneviewPanel.d.ts +2 -2
  48. package/dist/cjs/paneview/paneviewPanel.js +3 -3
  49. package/dist/cjs/popoutWindow.js +23 -16
  50. package/dist/cjs/splitview/splitview.d.ts +6 -6
  51. package/dist/cjs/splitview/splitview.js +18 -17
  52. package/dist/cjs/splitview/splitviewComponent.d.ts +2 -2
  53. package/dist/cjs/splitview/viewItem.d.ts +1 -1
  54. package/dist/cjs/svg.js +1 -1
  55. package/dist/dockview-core.amd.js +346 -210
  56. package/dist/dockview-core.amd.js.map +1 -1
  57. package/dist/dockview-core.amd.min.js +2 -2
  58. package/dist/dockview-core.amd.min.js.map +1 -1
  59. package/dist/dockview-core.amd.min.noStyle.js +2 -2
  60. package/dist/dockview-core.amd.min.noStyle.js.map +1 -1
  61. package/dist/dockview-core.amd.noStyle.js +345 -209
  62. package/dist/dockview-core.amd.noStyle.js.map +1 -1
  63. package/dist/dockview-core.cjs.js +346 -210
  64. package/dist/dockview-core.cjs.js.map +1 -1
  65. package/dist/dockview-core.esm.js +347 -209
  66. package/dist/dockview-core.esm.js.map +1 -1
  67. package/dist/dockview-core.esm.min.js +2 -2
  68. package/dist/dockview-core.esm.min.js.map +1 -1
  69. package/dist/dockview-core.js +346 -210
  70. package/dist/dockview-core.js.map +1 -1
  71. package/dist/dockview-core.min.js +2 -2
  72. package/dist/dockview-core.min.js.map +1 -1
  73. package/dist/dockview-core.min.noStyle.js +2 -2
  74. package/dist/dockview-core.min.noStyle.js.map +1 -1
  75. package/dist/dockview-core.noStyle.js +345 -209
  76. package/dist/dockview-core.noStyle.js.map +1 -1
  77. package/dist/esm/api/component.api.d.ts +3 -3
  78. package/dist/esm/api/dockviewGroupPanelApi.d.ts +10 -8
  79. package/dist/esm/api/dockviewGroupPanelApi.js +1 -0
  80. package/dist/esm/api/dockviewPanelApi.d.ts +6 -14
  81. package/dist/esm/api/dockviewPanelApi.js +5 -3
  82. package/dist/esm/dnd/abstractDragHandler.js +1 -1
  83. package/dist/esm/dnd/dnd.d.ts +2 -2
  84. package/dist/esm/dnd/droptarget.js +4 -4
  85. package/dist/esm/dockview/components/panel/content.d.ts +2 -2
  86. package/dist/esm/dockview/components/panel/content.js +4 -2
  87. package/dist/esm/dockview/components/tab/defaultTab.d.ts +3 -3
  88. package/dist/esm/dockview/components/tab/tab.js +4 -4
  89. package/dist/esm/dockview/components/titlebar/tabsContainer.js +5 -9
  90. package/dist/esm/dockview/components/titlebar/voidContainer.js +1 -2
  91. package/dist/esm/dockview/components/watermark/watermark.d.ts +1 -4
  92. package/dist/esm/dockview/components/watermark/watermark.js +2 -34
  93. package/dist/esm/dockview/dockviewComponent.d.ts +33 -16
  94. package/dist/esm/dockview/dockviewComponent.js +102 -37
  95. package/dist/esm/dockview/dockviewGroupPanel.js +16 -12
  96. package/dist/esm/dockview/dockviewGroupPanelModel.d.ts +4 -3
  97. package/dist/esm/dockview/dockviewGroupPanelModel.js +10 -10
  98. package/dist/esm/dockview/dockviewPanel.d.ts +4 -4
  99. package/dist/esm/dockview/dockviewPanelModel.d.ts +1 -1
  100. package/dist/esm/dockview/options.d.ts +12 -0
  101. package/dist/esm/dockview/options.js +1 -0
  102. package/dist/esm/dom.d.ts +11 -1
  103. package/dist/esm/dom.js +14 -0
  104. package/dist/esm/gridview/baseComponentGridview.d.ts +8 -3
  105. package/dist/esm/gridview/baseComponentGridview.js +8 -4
  106. package/dist/esm/gridview/basePanelView.d.ts +1 -1
  107. package/dist/esm/gridview/branchNode.d.ts +1 -1
  108. package/dist/esm/gridview/branchNode.js +1 -1
  109. package/dist/esm/gridview/gridview.d.ts +9 -1
  110. package/dist/esm/gridview/gridview.js +51 -7
  111. package/dist/esm/gridview/gridviewPanel.d.ts +4 -0
  112. package/dist/esm/gridview/gridviewPanel.js +40 -12
  113. package/dist/esm/gridview/leafNode.d.ts +1 -1
  114. package/dist/esm/index.d.ts +8 -9
  115. package/dist/esm/index.js +5 -6
  116. package/dist/esm/overlay/overlay.d.ts +6 -3
  117. package/dist/esm/overlay/overlay.js +11 -0
  118. package/dist/esm/paneview/defaultPaneviewHeader.d.ts +1 -1
  119. package/dist/esm/paneview/defaultPaneviewHeader.js +5 -3
  120. package/dist/esm/paneview/paneview.d.ts +3 -3
  121. package/dist/esm/paneview/paneview.js +3 -3
  122. package/dist/esm/paneview/paneviewComponent.d.ts +2 -2
  123. package/dist/esm/paneview/paneviewPanel.d.ts +2 -2
  124. package/dist/esm/paneview/paneviewPanel.js +3 -3
  125. package/dist/esm/popoutWindow.js +24 -17
  126. package/dist/esm/splitview/splitview.d.ts +6 -6
  127. package/dist/esm/splitview/splitview.js +18 -17
  128. package/dist/esm/splitview/splitviewComponent.d.ts +2 -2
  129. package/dist/esm/splitview/viewItem.d.ts +1 -1
  130. package/dist/esm/svg.js +1 -1
  131. package/dist/styles/dockview.css +111 -151
  132. package/package.json +1 -1
@@ -110,6 +110,8 @@ export class DockviewComponent extends BaseGrid {
110
110
  this.onDidActivePanelChange = this._onDidActivePanelChange.event;
111
111
  this._onDidMovePanel = new Emitter();
112
112
  this.onDidMovePanel = this._onDidMovePanel.event;
113
+ this._onDidMaximizedGroupChange = new Emitter();
114
+ this.onDidMaximizedGroupChange = this._onDidMaximizedGroupChange.event;
113
115
  this._floatingGroups = [];
114
116
  this._popoutGroups = [];
115
117
  this._onDidRemoveGroup = new Emitter();
@@ -136,6 +138,11 @@ export class DockviewComponent extends BaseGrid {
136
138
  if (!this._moving) {
137
139
  this._onDidActiveGroupChange.fire(event);
138
140
  }
141
+ }), this.onDidMaximizedChange((event) => {
142
+ this._onDidMaximizedGroupChange.fire({
143
+ group: event.panel,
144
+ isMaximized: event.isMaximized,
145
+ });
139
146
  }), Event.any(this.onDidAdd, this.onDidRemove)(() => {
140
147
  this.updateWatermark();
141
148
  }), Event.any(this.onDidAddPanel, this.onDidRemovePanel, this.onDidAddGroup, this.onDidRemove, this.onDidMovePanel, this.onDidActivePanelChange)(() => {
@@ -234,8 +241,28 @@ export class DockviewComponent extends BaseGrid {
234
241
  this._api = new DockviewApi(this);
235
242
  this.updateWatermark();
236
243
  }
244
+ setVisible(panel, visible) {
245
+ switch (panel.api.location.type) {
246
+ case 'grid':
247
+ super.setVisible(panel, visible);
248
+ break;
249
+ case 'floating': {
250
+ const item = this.floatingGroups.find((floatingGroup) => floatingGroup.group === panel);
251
+ if (item) {
252
+ item.overlay.setVisible(visible);
253
+ panel.api._onDidVisibilityChange.fire({
254
+ isVisible: visible,
255
+ });
256
+ }
257
+ break;
258
+ }
259
+ case 'popout':
260
+ console.warn('dockview: You cannot hide a group that is in a popout window');
261
+ break;
262
+ }
263
+ }
237
264
  addPopoutGroup(itemToPopout, options) {
238
- var _a, _b, _c;
265
+ var _a, _b, _c, _d, _e;
239
266
  if (itemToPopout instanceof DockviewPanel &&
240
267
  itemToPopout.group.size === 1) {
241
268
  return this.addPopoutGroup(itemToPopout.group, options);
@@ -256,12 +283,9 @@ export class DockviewComponent extends BaseGrid {
256
283
  }
257
284
  const box = getBox();
258
285
  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();
259
- if (itemToPopout.api.location.type === 'grid') {
260
- itemToPopout.api.setVisible(false);
261
- }
262
286
  const _window = new PopoutWindow(`${this.id}-${groupId}`, // unique id
263
287
  theme !== null && theme !== void 0 ? theme : '', {
264
- url: (_c = options === null || options === void 0 ? void 0 : options.popoutUrl) !== null && _c !== void 0 ? _c : '/popout.html',
288
+ 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',
265
289
  left: window.screenX + box.left,
266
290
  top: window.screenY + box.top,
267
291
  width: box.width,
@@ -275,13 +299,12 @@ export class DockviewComponent extends BaseGrid {
275
299
  return _window
276
300
  .open()
277
301
  .then((popoutContainer) => {
278
- var _a;
279
302
  if (_window.isDisposed) {
280
- return;
303
+ return false;
281
304
  }
282
305
  if (popoutContainer === null) {
283
306
  popoutWindowDisposable.dispose();
284
- return;
307
+ return false;
285
308
  }
286
309
  const gready = document.createElement('div');
287
310
  gready.className = 'dv-overlay-render-container';
@@ -290,30 +313,45 @@ export class DockviewComponent extends BaseGrid {
290
313
  ? itemToPopout.group
291
314
  : itemToPopout;
292
315
  const referenceLocation = itemToPopout.api.location.type;
293
- const group = (_a = options === null || options === void 0 ? void 0 : options.overridePopoutGroup) !== null && _a !== void 0 ? _a : this.createGroup({ id: groupId });
294
- group.model.renderContainer = overlayRenderContainer;
295
- if (!(options === null || options === void 0 ? void 0 : options.overridePopoutGroup)) {
296
- this._onDidAddGroup.fire(group);
316
+ /**
317
+ * The group that is being added doesn't already exist within the DOM, the most likely occurance
318
+ * of this case is when being called from the `fromJSON(...)` method
319
+ */
320
+ const isGroupAddedToDom = referenceGroup.element.parentElement !== null;
321
+ let group;
322
+ if (!isGroupAddedToDom) {
323
+ group = referenceGroup;
297
324
  }
298
- if (itemToPopout instanceof DockviewPanel) {
299
- this.movingLock(() => {
300
- const panel = referenceGroup.model.removePanel(itemToPopout);
301
- group.model.openPanel(panel);
302
- });
325
+ else if (options === null || options === void 0 ? void 0 : options.overridePopoutGroup) {
326
+ group = options.overridePopoutGroup;
303
327
  }
304
328
  else {
305
- this.movingLock(() => moveGroupWithoutDestroying({
306
- from: referenceGroup,
307
- to: group,
308
- }));
309
- switch (referenceLocation) {
310
- case 'grid':
311
- referenceGroup.api.setVisible(false);
312
- break;
313
- case 'floating':
314
- case 'popout':
315
- this.removeGroup(referenceGroup);
316
- break;
329
+ group = this.createGroup({ id: groupId });
330
+ this._onDidAddGroup.fire(group);
331
+ }
332
+ group.model.renderContainer = overlayRenderContainer;
333
+ group.layout(_window.window.innerWidth, _window.window.innerHeight);
334
+ if (!(options === null || options === void 0 ? void 0 : options.overridePopoutGroup) && isGroupAddedToDom) {
335
+ if (itemToPopout instanceof DockviewPanel) {
336
+ this.movingLock(() => {
337
+ const panel = referenceGroup.model.removePanel(itemToPopout);
338
+ group.model.openPanel(panel);
339
+ });
340
+ }
341
+ else {
342
+ this.movingLock(() => moveGroupWithoutDestroying({
343
+ from: referenceGroup,
344
+ to: group,
345
+ }));
346
+ switch (referenceLocation) {
347
+ case 'grid':
348
+ referenceGroup.api.setVisible(false);
349
+ break;
350
+ case 'floating':
351
+ case 'popout':
352
+ this.removeGroup(referenceGroup);
353
+ break;
354
+ }
317
355
  }
318
356
  }
319
357
  popoutContainer.classList.add('dv-dockview');
@@ -323,7 +361,12 @@ export class DockviewComponent extends BaseGrid {
323
361
  group.model.location = {
324
362
  type: 'popout',
325
363
  getWindow: () => _window.window,
364
+ popoutUrl: options === null || options === void 0 ? void 0 : options.popoutUrl,
326
365
  };
366
+ if (isGroupAddedToDom &&
367
+ itemToPopout.api.location.type === 'grid') {
368
+ itemToPopout.api.setVisible(false);
369
+ }
327
370
  this.doSetGroupAndPanelActive(group);
328
371
  popoutWindowDisposable.addDisposables(group.api.onDidActiveChange((event) => {
329
372
  var _a;
@@ -335,10 +378,13 @@ export class DockviewComponent extends BaseGrid {
335
378
  (_a = _window.window) === null || _a === void 0 ? void 0 : _a.focus();
336
379
  }));
337
380
  let returnedGroup;
381
+ const isValidReferenceGroup = isGroupAddedToDom &&
382
+ referenceGroup &&
383
+ this.getPanel(referenceGroup.id);
338
384
  const value = {
339
385
  window: _window,
340
386
  popoutGroup: group,
341
- referenceGroup: this.getPanel(referenceGroup.id)
387
+ referenceGroup: isValidReferenceGroup
342
388
  ? referenceGroup.id
343
389
  : undefined,
344
390
  disposable: {
@@ -355,9 +401,10 @@ export class DockviewComponent extends BaseGrid {
355
401
  * window dimensions
356
402
  */
357
403
  addDisposableWindowListener(_window.window, 'resize', () => {
358
- group.layout(window.innerWidth, window.innerHeight);
404
+ group.layout(_window.window.innerWidth, _window.window.innerHeight);
359
405
  }), overlayRenderContainer, Disposable.from(() => {
360
- if (this.getPanel(referenceGroup.id)) {
406
+ if (isGroupAddedToDom &&
407
+ this.getPanel(referenceGroup.id)) {
361
408
  this.movingLock(() => moveGroupWithoutDestroying({
362
409
  from: group,
363
410
  to: referenceGroup,
@@ -372,21 +419,27 @@ export class DockviewComponent extends BaseGrid {
372
419
  }
373
420
  }
374
421
  else if (this.getPanel(group.id)) {
375
- const removedGroup = this.doRemoveGroup(group, {
422
+ this.doRemoveGroup(group, {
376
423
  skipDispose: true,
377
424
  skipActive: true,
425
+ skipPopoutReturn: true,
378
426
  });
427
+ const removedGroup = group;
379
428
  removedGroup.model.renderContainer =
380
429
  this.overlayRenderContainer;
381
430
  removedGroup.model.location = { type: 'grid' };
382
431
  returnedGroup = removedGroup;
432
+ this.doAddGroup(removedGroup, [0]);
433
+ this.doSetGroupAndPanelActive(removedGroup);
383
434
  }
384
435
  }));
385
436
  this._popoutGroups.push(value);
386
437
  this.updateWatermark();
438
+ return true;
387
439
  })
388
440
  .catch((err) => {
389
441
  console.error('dockview: failed to create popout window', err);
442
+ return false;
390
443
  });
391
444
  }
392
445
  addFloatingGroup(item, options) {
@@ -490,7 +543,7 @@ export class DockviewComponent extends BaseGrid {
490
543
  : (_c = (_b = this.options.floatingGroupBounds) === null || _b === void 0 ? void 0 : _b.minimumWidthWithinViewport) !== null && _c !== void 0 ? _c : DEFAULT_FLOATING_GROUP_OVERFLOW_SIZE, minimumInViewportHeight: this.options.floatingGroupBounds === 'boundedWithinViewport'
491
544
  ? undefined
492
545
  : (_e = (_d = this.options.floatingGroupBounds) === null || _d === void 0 ? void 0 : _d.minimumHeightWithinViewport) !== null && _e !== void 0 ? _e : DEFAULT_FLOATING_GROUP_OVERFLOW_SIZE }));
493
- const el = group.element.querySelector('.void-container');
546
+ const el = group.element.querySelector('.dv-void-container');
494
547
  if (!el) {
495
548
  throw new Error('failed to find drag handle');
496
549
  }
@@ -684,6 +737,9 @@ export class DockviewComponent extends BaseGrid {
684
737
  data: group.popoutGroup.toJSON(),
685
738
  gridReferenceGroup: group.referenceGroup,
686
739
  position: group.window.dimensions(),
740
+ url: group.popoutGroup.api.location.type === 'popout'
741
+ ? group.popoutGroup.api.location.popoutUrl
742
+ : undefined,
687
743
  };
688
744
  });
689
745
  const result = {
@@ -770,16 +826,16 @@ export class DockviewComponent extends BaseGrid {
770
826
  }
771
827
  const serializedPopoutGroups = (_b = data.popoutGroups) !== null && _b !== void 0 ? _b : [];
772
828
  for (const serializedPopoutGroup of serializedPopoutGroups) {
773
- const { data, position, gridReferenceGroup } = serializedPopoutGroup;
829
+ const { data, position, gridReferenceGroup, url } = serializedPopoutGroup;
774
830
  const group = createGroupFromSerializedState(data);
775
831
  this.addPopoutGroup((_c = (gridReferenceGroup
776
832
  ? this.getPanel(gridReferenceGroup)
777
833
  : undefined)) !== null && _c !== void 0 ? _c : group, {
778
- skipRemoveGroup: true,
779
834
  position: position !== null && position !== void 0 ? position : undefined,
780
835
  overridePopoutGroup: gridReferenceGroup
781
836
  ? group
782
837
  : undefined,
838
+ popoutUrl: url,
783
839
  });
784
840
  }
785
841
  for (const floatingGroup of this._floatingGroups) {
@@ -793,6 +849,7 @@ export class DockviewComponent extends BaseGrid {
793
849
  }
794
850
  }
795
851
  catch (err) {
852
+ console.error('dockview: failed to deserialize layout. Reverting changes', err);
796
853
  /**
797
854
  * Takes all the successfully created groups and remove all of their panels.
798
855
  */
@@ -860,11 +917,13 @@ export class DockviewComponent extends BaseGrid {
860
917
  width: options.initialWidth,
861
918
  height: options.initialHeight,
862
919
  };
920
+ let index;
863
921
  if (options.position) {
864
922
  if (isPanelOptionsWithPanel(options.position)) {
865
923
  const referencePanel = typeof options.position.referencePanel === 'string'
866
924
  ? this.getGroupPanel(options.position.referencePanel)
867
925
  : options.position.referencePanel;
926
+ index = options.position.index;
868
927
  if (!referencePanel) {
869
928
  throw new Error(`referencePanel '${options.position.referencePanel}' does not exist`);
870
929
  }
@@ -875,6 +934,7 @@ export class DockviewComponent extends BaseGrid {
875
934
  typeof options.position.referenceGroup === 'string'
876
935
  ? (_a = this._groups.get(options.position.referenceGroup)) === null || _a === void 0 ? void 0 : _a.value
877
936
  : options.position.referenceGroup;
937
+ index = options.position.index;
878
938
  if (!referenceGroup) {
879
939
  throw new Error(`referenceGroup '${options.position.referenceGroup}' does not exist`);
880
940
  }
@@ -885,6 +945,7 @@ export class DockviewComponent extends BaseGrid {
885
945
  group.model.openPanel(panel, {
886
946
  skipSetActive: options.inactive,
887
947
  skipSetGroupActive: options.inactive,
948
+ index,
888
949
  });
889
950
  if (!options.inactive) {
890
951
  this.doSetGroupAndPanelActive(group);
@@ -914,6 +975,7 @@ export class DockviewComponent extends BaseGrid {
914
975
  group.model.openPanel(panel, {
915
976
  skipSetActive: options.inactive,
916
977
  skipSetGroupActive: options.inactive,
978
+ index,
917
979
  });
918
980
  }
919
981
  else if (referenceGroup.api.location.type === 'floating' ||
@@ -922,6 +984,7 @@ export class DockviewComponent extends BaseGrid {
922
984
  referenceGroup.model.openPanel(panel, {
923
985
  skipSetActive: options.inactive,
924
986
  skipSetGroupActive: options.inactive,
987
+ index,
925
988
  });
926
989
  referenceGroup.api.setSize({
927
990
  width: initial === null || initial === void 0 ? void 0 : initial.width,
@@ -942,6 +1005,7 @@ export class DockviewComponent extends BaseGrid {
942
1005
  group.model.openPanel(panel, {
943
1006
  skipSetActive: options.inactive,
944
1007
  skipSetGroupActive: options.inactive,
1008
+ index,
945
1009
  });
946
1010
  if (!options.inactive) {
947
1011
  this.doSetGroupAndPanelActive(group);
@@ -960,6 +1024,7 @@ export class DockviewComponent extends BaseGrid {
960
1024
  group.model.openPanel(panel, {
961
1025
  skipSetActive: options.inactive,
962
1026
  skipSetGroupActive: options.inactive,
1027
+ index,
963
1028
  });
964
1029
  }
965
1030
  else {
@@ -970,6 +1035,7 @@ export class DockviewComponent extends BaseGrid {
970
1035
  group.model.openPanel(panel, {
971
1036
  skipSetActive: options.inactive,
972
1037
  skipSetGroupActive: options.inactive,
1038
+ index,
973
1039
  });
974
1040
  if (!options.inactive) {
975
1041
  this.doSetGroupAndPanelActive(group);
@@ -979,7 +1045,6 @@ export class DockviewComponent extends BaseGrid {
979
1045
  }
980
1046
  removePanel(panel, options = {
981
1047
  removeEmptyGroup: true,
982
- skipDispose: false,
983
1048
  }) {
984
1049
  const group = panel.group;
985
1050
  if (!group) {
@@ -7,30 +7,34 @@ export class DockviewGroupPanel extends GridviewPanel {
7
7
  get minimumWidth() {
8
8
  var _a;
9
9
  const activePanelMinimumWidth = (_a = this.activePanel) === null || _a === void 0 ? void 0 : _a.minimumWidth;
10
- return typeof activePanelMinimumWidth === 'number'
11
- ? activePanelMinimumWidth
12
- : MINIMUM_DOCKVIEW_GROUP_PANEL_WIDTH;
10
+ if (typeof activePanelMinimumWidth === 'number') {
11
+ return activePanelMinimumWidth;
12
+ }
13
+ return super.__minimumWidth();
13
14
  }
14
15
  get minimumHeight() {
15
16
  var _a;
16
17
  const activePanelMinimumHeight = (_a = this.activePanel) === null || _a === void 0 ? void 0 : _a.minimumHeight;
17
- return typeof activePanelMinimumHeight === 'number'
18
- ? activePanelMinimumHeight
19
- : MINIMUM_DOCKVIEW_GROUP_PANEL_HEIGHT;
18
+ if (typeof activePanelMinimumHeight === 'number') {
19
+ return activePanelMinimumHeight;
20
+ }
21
+ return super.__minimumHeight();
20
22
  }
21
23
  get maximumWidth() {
22
24
  var _a;
23
25
  const activePanelMaximumWidth = (_a = this.activePanel) === null || _a === void 0 ? void 0 : _a.maximumWidth;
24
- return typeof activePanelMaximumWidth === 'number'
25
- ? activePanelMaximumWidth
26
- : Number.MAX_SAFE_INTEGER;
26
+ if (typeof activePanelMaximumWidth === 'number') {
27
+ return activePanelMaximumWidth;
28
+ }
29
+ return super.__maximumWidth();
27
30
  }
28
31
  get maximumHeight() {
29
32
  var _a;
30
33
  const activePanelMaximumHeight = (_a = this.activePanel) === null || _a === void 0 ? void 0 : _a.maximumHeight;
31
- return typeof activePanelMaximumHeight === 'number'
32
- ? activePanelMaximumHeight
33
- : Number.MAX_SAFE_INTEGER;
34
+ if (typeof activePanelMaximumHeight === 'number') {
35
+ return activePanelMaximumHeight;
36
+ }
37
+ return super.__maximumHeight();
34
38
  }
35
39
  get panels() {
36
40
  return this._model.panels;
@@ -120,6 +120,7 @@ export type DockviewGroupLocation = {
120
120
  } | {
121
121
  type: 'popout';
122
122
  getWindow: () => Window;
123
+ popoutUrl?: string;
123
124
  };
124
125
  export declare class WillShowOverlayLocationEvent implements IDockviewEvent {
125
126
  private readonly event;
@@ -143,7 +144,7 @@ export declare class WillShowOverlayLocationEvent implements IDockviewEvent {
143
144
  }
144
145
  export declare class DockviewGroupPanelModel extends CompositeDisposable implements IDockviewGroupPanelModel {
145
146
  private readonly container;
146
- private accessor;
147
+ private readonly accessor;
147
148
  id: string;
148
149
  private readonly options;
149
150
  private readonly groupPanel;
@@ -158,11 +159,12 @@ export declare class DockviewGroupPanelModel extends CompositeDisposable impleme
158
159
  private _prefixHeaderActions;
159
160
  private _location;
160
161
  private mostRecentlyUsed;
162
+ private _overwriteRenderContainer;
161
163
  private readonly _onDidChange;
162
164
  readonly onDidChange: Event<IViewSize | undefined>;
163
165
  private _width;
164
166
  private _height;
165
- private _panels;
167
+ private readonly _panels;
166
168
  private readonly _panelDisposables;
167
169
  private readonly _onMove;
168
170
  readonly onMove: Event<GroupMoveEvent>;
@@ -204,7 +206,6 @@ export declare class DockviewGroupPanelModel extends CompositeDisposable impleme
204
206
  set location(value: DockviewGroupLocation);
205
207
  constructor(container: HTMLElement, accessor: DockviewComponent, id: string, options: GroupOptions, groupPanel: DockviewGroupPanel);
206
208
  focusContent(): void;
207
- private _overwriteRenderContainer;
208
209
  set renderContainer(value: OverlayRenderContainer | null);
209
210
  get renderContainer(): OverlayRenderContainer;
210
211
  initialize(): void;
@@ -74,7 +74,7 @@ export class WillShowOverlayLocationEvent {
74
74
  }
75
75
  export class DockviewGroupPanelModel extends CompositeDisposable {
76
76
  get element() {
77
- throw new Error('not supported');
77
+ throw new Error('dockview: not supported');
78
78
  }
79
79
  get activePanel() {
80
80
  return this._activePanel;
@@ -84,7 +84,7 @@ export class DockviewGroupPanelModel extends CompositeDisposable {
84
84
  }
85
85
  set locked(value) {
86
86
  this._locked = value;
87
- toggleClass(this.container, 'locked-groupview', value === 'no-drop-target' || value);
87
+ toggleClass(this.container, 'dv-locked-groupview', value === 'no-drop-target' || value);
88
88
  }
89
89
  get isActive() {
90
90
  return this._isGroupActive;
@@ -155,6 +155,7 @@ export class DockviewGroupPanelModel extends CompositeDisposable {
155
155
  this._locked = false;
156
156
  this._location = { type: 'grid' };
157
157
  this.mostRecentlyUsed = [];
158
+ this._overwriteRenderContainer = null;
158
159
  this._onDidChange = new Emitter();
159
160
  this.onDidChange = this._onDidChange.event;
160
161
  this._width = 0;
@@ -185,8 +186,7 @@ export class DockviewGroupPanelModel extends CompositeDisposable {
185
186
  this.onDidActivePanelChange = this._onDidActivePanelChange.event;
186
187
  this._onUnhandledDragOverEvent = new Emitter();
187
188
  this.onUnhandledDragOverEvent = this._onUnhandledDragOverEvent.event;
188
- this._overwriteRenderContainer = null;
189
- toggleClass(this.container, 'groupview', true);
189
+ toggleClass(this.container, 'dv-groupview', true);
190
190
  this._api = new DockviewApi(this.accessor);
191
191
  this.tabsContainer = new TabsContainer(this.accessor, this.groupPanel);
192
192
  this.contentContainer = new ContentContainer(this.accessor, this);
@@ -418,7 +418,10 @@ export class DockviewGroupPanelModel extends CompositeDisposable {
418
418
  this.doClose(panel);
419
419
  }
420
420
  doClose(panel) {
421
- this.accessor.removePanel(panel);
421
+ const isLast = this.panels.length === 1 && this.accessor.groups.length === 1;
422
+ this.accessor.removePanel(panel, isLast && this.accessor.options.noPanelsOverlay === 'emptyGroup'
423
+ ? { removeEmptyGroup: false }
424
+ : undefined);
422
425
  }
423
426
  isPanelActive(panel) {
424
427
  return this._activePanel === panel;
@@ -431,8 +434,8 @@ export class DockviewGroupPanelModel extends CompositeDisposable {
431
434
  return;
432
435
  }
433
436
  this._isGroupActive = isGroupActive;
434
- toggleClass(this.container, 'active-group', isGroupActive);
435
- toggleClass(this.container, 'inactive-group', !isGroupActive);
437
+ toggleClass(this.container, 'dv-active-group', isGroupActive);
438
+ toggleClass(this.container, 'dv-inactive-group', !isGroupActive);
436
439
  this.tabsContainer.setActive(this.isActive);
437
440
  if (!this._activePanel && this.panels.length > 0) {
438
441
  this.doSetActivePanel(this.panels[0]);
@@ -524,7 +527,6 @@ export class DockviewGroupPanelModel extends CompositeDisposable {
524
527
  }
525
528
  updateContainer() {
526
529
  var _a, _b;
527
- toggleClass(this.container, 'empty', this.isEmpty);
528
530
  this.panels.forEach((panel) => panel.runEvents());
529
531
  if (this.isEmpty && !this.watermark) {
530
532
  const watermark = this.accessor.createWatermarkComponent();
@@ -538,14 +540,12 @@ export class DockviewGroupPanelModel extends CompositeDisposable {
538
540
  this.accessor.doSetGroupActive(this.groupPanel);
539
541
  }
540
542
  });
541
- this.tabsContainer.hide();
542
543
  this.contentContainer.element.appendChild(this.watermark.element);
543
544
  }
544
545
  if (!this.isEmpty && this.watermark) {
545
546
  this.watermark.element.remove();
546
547
  (_b = (_a = this.watermark).dispose) === null || _b === void 0 ? void 0 : _b.call(_a);
547
548
  this.watermark = undefined;
548
- this.tabsContainer.show();
549
549
  }
550
550
  }
551
551
  canDisplayOverlay(event, position, target) {
@@ -37,10 +37,10 @@ export declare class DockviewPanel extends CompositeDisposable implements IDockv
37
37
  private _params?;
38
38
  private _title;
39
39
  private _renderer;
40
- private _minimumWidth;
41
- private _minimumHeight;
42
- private _maximumWidth;
43
- private _maximumHeight;
40
+ private readonly _minimumWidth;
41
+ private readonly _minimumHeight;
42
+ private readonly _maximumWidth;
43
+ private readonly _maximumHeight;
44
44
  get params(): Parameters | undefined;
45
45
  get title(): string | undefined;
46
46
  get group(): DockviewGroupPanel;
@@ -7,7 +7,7 @@ export interface IDockviewPanelModel extends IDisposable {
7
7
  readonly contentComponent: string;
8
8
  readonly tabComponent?: string;
9
9
  readonly content: IContentRenderer;
10
- readonly tab?: ITabRenderer;
10
+ readonly tab: ITabRenderer;
11
11
  update(event: PanelUpdateEvent): void;
12
12
  layout(width: number, height: number): void;
13
13
  init(params: GroupPanelPartInitParameters): void;
@@ -50,6 +50,10 @@ export interface DockviewOptions {
50
50
  * Pixel gap between groups
51
51
  */
52
52
  gap?: number;
53
+ /**
54
+ * Define the behaviour of the dock when there are no panels to display. Defaults to `watermark`.
55
+ */
56
+ noPanelsOverlay?: 'emptyGroup' | 'watermark';
53
57
  }
54
58
  export interface DockviewDndOverlayEvent {
55
59
  nativeEvent: DragEvent;
@@ -102,10 +106,18 @@ export interface PanelOptions<P extends object = Parameters> {
102
106
  type RelativePanel = {
103
107
  direction?: Direction;
104
108
  referencePanel: string | IDockviewPanel;
109
+ /**
110
+ * The index to place the panel within a group, only applicable if the placement is within an existing group
111
+ */
112
+ index?: number;
105
113
  };
106
114
  type RelativeGroup = {
107
115
  direction?: Direction;
108
116
  referenceGroup: string | DockviewGroupPanel;
117
+ /**
118
+ * The index to place the panel within a group, only applicable if the placement is within an existing group
119
+ */
120
+ index?: number;
109
121
  };
110
122
  type AbsolutePosition = {
111
123
  direction: Omit<Direction, 'within'>;
@@ -33,6 +33,7 @@ export const PROPERTY_KEYS = (() => {
33
33
  disableDnd: undefined,
34
34
  gap: undefined,
35
35
  className: undefined,
36
+ noPanelsOverlay: undefined,
36
37
  };
37
38
  return Object.keys(properties);
38
39
  })();
package/dist/esm/dom.d.ts CHANGED
@@ -1,5 +1,15 @@
1
1
  import { Event as DockviewEvent } from './events';
2
- import { IDisposable } from './lifecycle';
2
+ import { IDisposable, CompositeDisposable } from './lifecycle';
3
+ export interface OverflowEvent {
4
+ hasScrollX: boolean;
5
+ hasScrollY: boolean;
6
+ }
7
+ export declare class OverflowObserver extends CompositeDisposable {
8
+ private readonly _onDidChange;
9
+ readonly onDidChange: DockviewEvent<OverflowEvent>;
10
+ private _value;
11
+ constructor(el: HTMLElement);
12
+ }
3
13
  export declare function watchElementResize(element: HTMLElement, cb: (entry: ResizeObserverEntry) => void): IDisposable;
4
14
  export declare const removeClasses: (element: HTMLElement, ...classes: string[]) => void;
5
15
  export declare const addClasses: (element: HTMLElement, ...classes: string[]) => void;
package/dist/esm/dom.js CHANGED
@@ -1,5 +1,19 @@
1
1
  import { Emitter, addDisposableListener, addDisposableWindowListener, } from './events';
2
2
  import { CompositeDisposable } from './lifecycle';
3
+ export class OverflowObserver extends CompositeDisposable {
4
+ constructor(el) {
5
+ super();
6
+ this._onDidChange = new Emitter();
7
+ this.onDidChange = this._onDidChange.event;
8
+ this._value = null;
9
+ this.addDisposables(this._onDidChange, watchElementResize(el, (entry) => {
10
+ const hasScrollX = entry.target.scrollWidth > entry.target.clientWidth;
11
+ const hasScrollY = entry.target.scrollHeight > entry.target.clientHeight;
12
+ this._value = { hasScrollX, hasScrollY };
13
+ this._onDidChange.fire(this._value);
14
+ }));
15
+ }
16
+ }
3
17
  export function watchElementResize(element, cb) {
4
18
  const observer = new ResizeObserver((entires) => {
5
19
  /**
@@ -8,6 +8,10 @@ import { MovementOptions2 } from '../dockview/options';
8
8
  import { Resizable } from '../resizable';
9
9
  export type Direction = 'left' | 'right' | 'above' | 'below' | 'within';
10
10
  export declare function toTarget(direction: Direction): Position;
11
+ export interface MaximizedChanged<T extends IGridPanelView> {
12
+ panel: T;
13
+ isMaximized: boolean;
14
+ }
11
15
  export interface BaseGridOptions {
12
16
  readonly proportionalLayout: boolean;
13
17
  readonly orientation: Orientation;
@@ -33,6 +37,8 @@ export interface IBaseGrid<T extends IGridPanelView> extends IDisposable {
33
37
  readonly activeGroup: T | undefined;
34
38
  readonly size: number;
35
39
  readonly groups: T[];
40
+ readonly onDidMaximizedChange: Event<MaximizedChanged<T>>;
41
+ readonly onDidLayoutChange: Event<void>;
36
42
  getPanel(id: string): T | undefined;
37
43
  toJSON(): object;
38
44
  fromJSON(data: any): void;
@@ -44,8 +50,6 @@ export interface IBaseGrid<T extends IGridPanelView> extends IDisposable {
44
50
  isMaximizedGroup(panel: T): boolean;
45
51
  exitMaximizedGroup(): void;
46
52
  hasMaximizedGroup(): boolean;
47
- readonly onDidMaximizedGroupChange: Event<void>;
48
- readonly onDidLayoutChange: Event<void>;
49
53
  }
50
54
  export declare abstract class BaseGrid<T extends IGridPanelView> extends Resizable implements IBaseGrid<T> {
51
55
  private readonly _id;
@@ -56,6 +60,8 @@ export declare abstract class BaseGrid<T extends IGridPanelView> extends Resizab
56
60
  readonly onDidRemove: Event<T>;
57
61
  private readonly _onDidAdd;
58
62
  readonly onDidAdd: Event<T>;
63
+ private readonly _onDidMaximizedChange;
64
+ readonly onDidMaximizedChange: Event<MaximizedChanged<T>>;
59
65
  private readonly _onDidActiveChange;
60
66
  readonly onDidActiveChange: Event<T | undefined>;
61
67
  protected readonly _bufferOnDidLayoutChange: AsapEvent;
@@ -86,7 +92,6 @@ export declare abstract class BaseGrid<T extends IGridPanelView> extends Resizab
86
92
  isMaximizedGroup(panel: T): boolean;
87
93
  exitMaximizedGroup(): void;
88
94
  hasMaximizedGroup(): boolean;
89
- get onDidMaximizedGroupChange(): Event<void>;
90
95
  protected doAddGroup(group: T, location?: number[], size?: number): void;
91
96
  protected doRemoveGroup(group: T, options?: {
92
97
  skipActive?: boolean;