dockview-core 1.13.0 → 1.14.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 (40) hide show
  1. package/dist/cjs/api/dockviewGroupPanelApi.js +4 -5
  2. package/dist/cjs/api/dockviewPanelApi.js +4 -6
  3. package/dist/cjs/dockview/dockviewComponent.js +15 -17
  4. package/dist/cjs/dockview/dockviewPanel.js +1 -10
  5. package/dist/cjs/events.d.ts +13 -2
  6. package/dist/cjs/events.js +47 -15
  7. package/dist/cjs/gridview/baseComponentGridview.d.ts +3 -4
  8. package/dist/cjs/gridview/baseComponentGridview.js +3 -7
  9. package/dist/dockview-core.amd.js +66 -53
  10. package/dist/dockview-core.amd.js.map +1 -1
  11. package/dist/dockview-core.amd.min.js +2 -2
  12. package/dist/dockview-core.amd.min.js.map +1 -1
  13. package/dist/dockview-core.amd.min.noStyle.js +2 -2
  14. package/dist/dockview-core.amd.min.noStyle.js.map +1 -1
  15. package/dist/dockview-core.amd.noStyle.js +66 -53
  16. package/dist/dockview-core.amd.noStyle.js.map +1 -1
  17. package/dist/dockview-core.cjs.js +66 -53
  18. package/dist/dockview-core.cjs.js.map +1 -1
  19. package/dist/dockview-core.esm.js +66 -53
  20. package/dist/dockview-core.esm.js.map +1 -1
  21. package/dist/dockview-core.esm.min.js +2 -2
  22. package/dist/dockview-core.esm.min.js.map +1 -1
  23. package/dist/dockview-core.js +66 -53
  24. package/dist/dockview-core.js.map +1 -1
  25. package/dist/dockview-core.min.js +2 -2
  26. package/dist/dockview-core.min.js.map +1 -1
  27. package/dist/dockview-core.min.noStyle.js +2 -2
  28. package/dist/dockview-core.min.noStyle.js.map +1 -1
  29. package/dist/dockview-core.noStyle.js +66 -53
  30. package/dist/dockview-core.noStyle.js.map +1 -1
  31. package/dist/esm/api/dockviewGroupPanelApi.js +3 -4
  32. package/dist/esm/api/dockviewPanelApi.js +4 -6
  33. package/dist/esm/dockview/components/titlebar/tabsContainer.js +1 -1
  34. package/dist/esm/dockview/dockviewComponent.js +15 -17
  35. package/dist/esm/dockview/dockviewPanel.js +1 -10
  36. package/dist/esm/events.d.ts +13 -2
  37. package/dist/esm/events.js +40 -9
  38. package/dist/esm/gridview/baseComponentGridview.d.ts +3 -4
  39. package/dist/esm/gridview/baseComponentGridview.js +4 -8
  40. package/package.json +1 -1
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * dockview-core
3
- * @version 1.13.0
3
+ * @version 1.14.0
4
4
  * @link https://github.com/mathuo/dockview
5
5
  * @license MIT
6
6
  */
@@ -155,7 +155,7 @@ class Stacktrace {
155
155
  this.value = value;
156
156
  }
157
157
  print() {
158
- console.warn(this.value);
158
+ console.warn('dockview: stacktrace', this.value);
159
159
  }
160
160
  }
161
161
  class Listener {
@@ -220,7 +220,7 @@ class Emitter {
220
220
  var _a;
221
221
  // don't check until stack of execution is completed to allow for out-of-order disposals within the same execution block
222
222
  for (const listener of this._listeners) {
223
- console.warn((_a = listener.stacktrace) === null || _a === void 0 ? void 0 : _a.print());
223
+ console.warn('dockview: stacktrace', (_a = listener.stacktrace) === null || _a === void 0 ? void 0 : _a.print());
224
224
  }
225
225
  });
226
226
  }
@@ -250,18 +250,49 @@ function addDisposableListener(element, type, listener, options) {
250
250
  },
251
251
  };
252
252
  }
253
- class TickDelayedEvent {
253
+ /**
254
+ *
255
+ * Event Emitter that fires events from a Microtask callback, only one event will fire per event-loop cycle.
256
+ *
257
+ * It's kind of like using an `asapScheduler` in RxJs with additional logic to only fire once per event-loop cycle.
258
+ * This implementation exists to avoid external dependencies.
259
+ *
260
+ * @see https://developer.mozilla.org/en-US/docs/Web/API/queueMicrotask
261
+ * @see https://rxjs.dev/api/index/const/asapScheduler
262
+ */
263
+ class AsapEvent {
254
264
  constructor() {
255
265
  this._onFired = new Emitter();
256
- this.onEvent = this._onFired.event;
266
+ this._currentFireCount = 0;
267
+ this._queued = false;
268
+ this.onEvent = (e) => {
269
+ /**
270
+ * when the event is first subscribed to take note of the current fire count
271
+ */
272
+ const fireCountAtTimeOfEventSubscription = this._currentFireCount;
273
+ return this._onFired.event(() => {
274
+ /**
275
+ * if the current fire count is greater than the fire count at event subscription
276
+ * then the event has been fired since we subscribed and it's ok to "on_next" the event.
277
+ *
278
+ * if the count is not greater then what we are recieving is an event from the microtask
279
+ * queue that was triggered before we actually subscribed and therfore we should ignore it.
280
+ */
281
+ if (this._currentFireCount > fireCountAtTimeOfEventSubscription) {
282
+ e();
283
+ }
284
+ });
285
+ };
257
286
  }
258
287
  fire() {
259
- if (this.timer) {
260
- clearTimeout(this.timer);
288
+ this._currentFireCount++;
289
+ if (this._queued) {
290
+ return;
261
291
  }
262
- this.timer = setTimeout(() => {
292
+ this._queued = true;
293
+ queueMicrotask(() => {
294
+ this._queued = false;
263
295
  this._onFired.fire();
264
- clearTimeout(this.timer);
265
296
  });
266
297
  }
267
298
  dispose() {
@@ -2579,15 +2610,14 @@ class BaseGrid extends Resizable {
2579
2610
  super(document.createElement('div'), options.disableAutoResizing);
2580
2611
  this._id = nextLayoutId$1.next();
2581
2612
  this._groups = new Map();
2582
- this._onDidLayoutChange = new Emitter();
2583
- this.onDidLayoutChange = this._onDidLayoutChange.event;
2584
2613
  this._onDidRemove = new Emitter();
2585
2614
  this.onDidRemove = this._onDidRemove.event;
2586
2615
  this._onDidAdd = new Emitter();
2587
2616
  this.onDidAdd = this._onDidAdd.event;
2588
2617
  this._onDidActiveChange = new Emitter();
2589
2618
  this.onDidActiveChange = this._onDidActiveChange.event;
2590
- this._bufferOnDidLayoutChange = new TickDelayedEvent();
2619
+ this._bufferOnDidLayoutChange = new AsapEvent();
2620
+ this.onDidLayoutChange = this._bufferOnDidLayoutChange.onEvent;
2591
2621
  this.element.style.height = '100%';
2592
2622
  this.element.style.width = '100%';
2593
2623
  options.parentElement.appendChild(this.element);
@@ -2602,13 +2632,11 @@ class BaseGrid extends Resizable {
2602
2632
  this._bufferOnDidLayoutChange.fire();
2603
2633
  }), exports.DockviewEvent.any(this.onDidAdd, this.onDidRemove, this.onDidActiveChange)(() => {
2604
2634
  this._bufferOnDidLayoutChange.fire();
2605
- }), this._bufferOnDidLayoutChange.onEvent(() => {
2606
- this._onDidLayoutChange.fire();
2607
2635
  }), this._bufferOnDidLayoutChange);
2608
2636
  }
2609
2637
  setVisible(panel, visible) {
2610
2638
  this.gridview.setViewVisible(getGridLocation(panel.element), visible);
2611
- this._onDidLayoutChange.fire();
2639
+ this._bufferOnDidLayoutChange.fire();
2612
2640
  }
2613
2641
  isVisible(panel) {
2614
2642
  return this.gridview.isViewVisible(getGridLocation(panel.element));
@@ -2714,7 +2742,6 @@ class BaseGrid extends Resizable {
2714
2742
  this._onDidActiveChange.dispose();
2715
2743
  this._onDidAdd.dispose();
2716
2744
  this._onDidRemove.dispose();
2717
- this._onDidLayoutChange.dispose();
2718
2745
  for (const group of this.groups) {
2719
2746
  group.dispose();
2720
2747
  }
@@ -5743,8 +5770,7 @@ class GridviewPanel extends BasePanelView {
5743
5770
  }
5744
5771
  }
5745
5772
 
5746
- // TODO find a better way to initialize and avoid needing null checks
5747
- const NOT_INITIALIZED_MESSAGE = 'DockviewGroupPanelApiImpl not initialized';
5773
+ const NOT_INITIALIZED_MESSAGE = 'dockview: DockviewGroupPanelApiImpl not initialized';
5748
5774
  class DockviewGroupPanelApiImpl extends GridviewPanelApiImpl {
5749
5775
  get location() {
5750
5776
  if (!this._group) {
@@ -5817,14 +5843,14 @@ class DockviewGroupPanelApiImpl extends GridviewPanelApiImpl {
5817
5843
  }
5818
5844
  }
5819
5845
  initialize(group) {
5820
- this._group = group;
5821
5846
  /**
5822
- * TODO: Annoying initialization order caveat
5847
+ * TODO: Annoying initialization order caveat, find a better way to initialize and avoid needing null checks
5823
5848
  *
5824
5849
  * Due to the order on initialization we know that the model isn't defined until later in the same stack-frame of setup.
5825
5850
  * By queuing a microtask we can ensure the setup is completed within the same stack-frame, but after everything else has
5826
5851
  * finished ensuring the `model` is defined.
5827
5852
  */
5853
+ this._group = group;
5828
5854
  queueMicrotask(() => {
5829
5855
  this._mutableDisposable.value =
5830
5856
  this._group.model.onDidActivePanelChange((event) => {
@@ -5978,12 +6004,10 @@ class DockviewPanelApiImpl extends GridviewPanelApiImpl {
5978
6004
  var _a;
5979
6005
  let _trackGroupActive = (_a = previousGroup === null || previousGroup === void 0 ? void 0 : previousGroup.isActive) !== null && _a !== void 0 ? _a : false; // prevent duplicate events with same state
5980
6006
  this.groupEventsDisposable.value = new CompositeDisposable(this.group.api.onDidVisibilityChange((event) => {
5981
- if (!event.isVisible && this.isVisible) {
5982
- this._onDidVisibilityChange.fire(event);
5983
- }
5984
- else if (event.isVisible &&
5985
- !this.isVisible &&
5986
- this.group.model.isPanelActive(this.panel)) {
6007
+ const hasBecomeHidden = !event.isVisible && this.isVisible;
6008
+ const hasBecomeVisible = event.isVisible && !this.isVisible;
6009
+ const isActivePanel = this.group.model.isPanelActive(this.panel);
6010
+ if (hasBecomeHidden || (hasBecomeVisible && isActivePanel)) {
5987
6011
  this._onDidVisibilityChange.fire(event);
5988
6012
  }
5989
6013
  }), this.group.api.onDidLocationChange((event) => {
@@ -6069,12 +6093,6 @@ class DockviewPanel extends CompositeDisposable {
6069
6093
  const didTitleChange = title !== this.title;
6070
6094
  if (didTitleChange) {
6071
6095
  this._title = title;
6072
- this.view.update({
6073
- params: {
6074
- params: this._params,
6075
- title: this.title,
6076
- },
6077
- });
6078
6096
  this.api._onDidTitleChange.fire({ title });
6079
6097
  }
6080
6098
  }
@@ -6102,10 +6120,7 @@ class DockviewPanel extends CompositeDisposable {
6102
6120
  }
6103
6121
  // update the view with the updated props
6104
6122
  this.view.update({
6105
- params: {
6106
- params: this._params,
6107
- title: this.title,
6108
- },
6123
+ params: this._params,
6109
6124
  });
6110
6125
  }
6111
6126
  updateParentGroup(group, options) {
@@ -7243,7 +7258,7 @@ class DockviewComponent extends BaseGrid {
7243
7258
  return element.getBoundingClientRect();
7244
7259
  }
7245
7260
  const box = getBox();
7246
- 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(); //item.id;
7261
+ 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();
7247
7262
  if (itemToPopout.api.location.type === 'grid') {
7248
7263
  itemToPopout.api.setVisible(false);
7249
7264
  }
@@ -7359,24 +7374,22 @@ class DockviewComponent extends BaseGrid {
7359
7374
  });
7360
7375
  }
7361
7376
  }
7362
- else {
7363
- if (this.getPanel(group.id)) {
7364
- const removedGroup = this.doRemoveGroup(group, {
7365
- skipDispose: true,
7366
- skipActive: true,
7367
- });
7368
- removedGroup.model.renderContainer =
7369
- this.overlayRenderContainer;
7370
- removedGroup.model.location = { type: 'grid' };
7371
- returnedGroup = removedGroup;
7372
- }
7377
+ else if (this.getPanel(group.id)) {
7378
+ const removedGroup = this.doRemoveGroup(group, {
7379
+ skipDispose: true,
7380
+ skipActive: true,
7381
+ });
7382
+ removedGroup.model.renderContainer =
7383
+ this.overlayRenderContainer;
7384
+ removedGroup.model.location = { type: 'grid' };
7385
+ returnedGroup = removedGroup;
7373
7386
  }
7374
7387
  }));
7375
7388
  this._popoutGroups.push(value);
7376
7389
  this.updateWatermark();
7377
7390
  })
7378
7391
  .catch((err) => {
7379
- console.error(err);
7392
+ console.error('dockview: failed to create popout window', err);
7380
7393
  });
7381
7394
  }
7382
7395
  addFloatingGroup(item, coord, options) {
@@ -7419,7 +7432,7 @@ class DockviewComponent extends BaseGrid {
7419
7432
  this.doRemoveGroup(item, {
7420
7433
  skipDispose: true,
7421
7434
  skipPopoutReturn: true,
7422
- skipPopoutAssociated: !!popoutReferenceGroup,
7435
+ skipPopoutAssociated: false,
7423
7436
  });
7424
7437
  }
7425
7438
  }
@@ -7779,7 +7792,6 @@ class DockviewComponent extends BaseGrid {
7779
7792
  clear() {
7780
7793
  const groups = Array.from(this._groups.values()).map((_) => _.value);
7781
7794
  const hasActiveGroup = !!this.activeGroup;
7782
- !!this.activePanel;
7783
7795
  for (const group of groups) {
7784
7796
  // remove the group will automatically remove the panels
7785
7797
  this.removeGroup(group, { skipActive: true });
@@ -7963,7 +7975,6 @@ class DockviewComponent extends BaseGrid {
7963
7975
  }
7964
7976
  addGroup(options) {
7965
7977
  var _a;
7966
- const group = this.createGroup(options);
7967
7978
  if (options) {
7968
7979
  let referenceGroup;
7969
7980
  if (isGroupOptionsWithPanel(options)) {
@@ -7997,6 +8008,7 @@ class DockviewComponent extends BaseGrid {
7997
8008
  const target = toTarget(options.direction || 'within');
7998
8009
  const location = getGridLocation(referenceGroup.element);
7999
8010
  const relativeLocation = getRelativeLocation(this.gridview.orientation, location, target);
8011
+ const group = this.createGroup(options);
8000
8012
  this.doAddGroup(group, relativeLocation);
8001
8013
  if (!options.skipSetActive) {
8002
8014
  this.doSetGroupAndPanelActive(group);
@@ -8004,6 +8016,7 @@ class DockviewComponent extends BaseGrid {
8004
8016
  return group;
8005
8017
  }
8006
8018
  else {
8019
+ const group = this.createGroup(options);
8007
8020
  this.doAddGroup(group);
8008
8021
  this.doSetGroupAndPanelActive(group);
8009
8022
  return group;
@@ -8284,7 +8297,7 @@ class DockviewComponent extends BaseGrid {
8284
8297
  }
8285
8298
  let id = options === null || options === void 0 ? void 0 : options.id;
8286
8299
  if (id && this._groups.has(options.id)) {
8287
- console.warn(`Duplicate group id ${options === null || options === void 0 ? void 0 : options.id}. reassigning group id to avoid errors`);
8300
+ console.warn(`dockview: Duplicate group id ${options === null || options === void 0 ? void 0 : options.id}. reassigning group id to avoid errors`);
8288
8301
  id = undefined;
8289
8302
  }
8290
8303
  if (!id) {