dockview-core 3.0.1 → 3.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 (58) hide show
  1. package/dist/cjs/api/dockviewGroupPanelApi.d.ts +1 -2
  2. package/dist/cjs/api/dockviewGroupPanelApi.js +1 -17
  3. package/dist/cjs/dockview/components/tab/defaultTab.js +0 -3
  4. package/dist/cjs/dockview/components/titlebar/tabsContainer.js +15 -6
  5. package/dist/cjs/dockview/dockviewComponent.d.ts +1 -1
  6. package/dist/cjs/dockview/dockviewComponent.js +15 -2
  7. package/dist/cjs/dockview/dockviewGroupPanel.js +3 -0
  8. package/dist/cjs/gridview/baseComponentGridview.d.ts +1 -1
  9. package/dist/cjs/gridview/baseComponentGridview.js +4 -2
  10. package/dist/cjs/gridview/gridviewComponent.d.ts +1 -1
  11. package/dist/cjs/gridview/gridviewComponent.js +2 -2
  12. package/dist/cjs/paneview/paneviewComponent.d.ts +1 -1
  13. package/dist/cjs/paneview/paneviewComponent.js +6 -2
  14. package/dist/cjs/splitview/splitview.d.ts +1 -1
  15. package/dist/cjs/splitview/splitview.js +3 -3
  16. package/dist/cjs/splitview/splitviewComponent.d.ts +1 -1
  17. package/dist/cjs/splitview/splitviewComponent.js +6 -2
  18. package/dist/dockview-core.amd.js +57 -39
  19. package/dist/dockview-core.amd.js.map +1 -1
  20. package/dist/dockview-core.amd.min.js +2 -2
  21. package/dist/dockview-core.amd.min.js.map +1 -1
  22. package/dist/dockview-core.amd.min.noStyle.js +2 -2
  23. package/dist/dockview-core.amd.min.noStyle.js.map +1 -1
  24. package/dist/dockview-core.amd.noStyle.js +56 -38
  25. package/dist/dockview-core.amd.noStyle.js.map +1 -1
  26. package/dist/dockview-core.cjs.js +57 -39
  27. package/dist/dockview-core.cjs.js.map +1 -1
  28. package/dist/dockview-core.esm.js +57 -39
  29. package/dist/dockview-core.esm.js.map +1 -1
  30. package/dist/dockview-core.esm.min.js +2 -2
  31. package/dist/dockview-core.esm.min.js.map +1 -1
  32. package/dist/dockview-core.js +57 -39
  33. package/dist/dockview-core.js.map +1 -1
  34. package/dist/dockview-core.min.js +2 -2
  35. package/dist/dockview-core.min.js.map +1 -1
  36. package/dist/dockview-core.min.noStyle.js +2 -2
  37. package/dist/dockview-core.min.noStyle.js.map +1 -1
  38. package/dist/dockview-core.noStyle.js +56 -38
  39. package/dist/dockview-core.noStyle.js.map +1 -1
  40. package/dist/esm/api/dockviewGroupPanelApi.d.ts +1 -2
  41. package/dist/esm/api/dockviewGroupPanelApi.js +1 -16
  42. package/dist/esm/dockview/components/tab/defaultTab.js +0 -3
  43. package/dist/esm/dockview/components/titlebar/tabsContainer.js +15 -6
  44. package/dist/esm/dockview/dockviewComponent.d.ts +1 -1
  45. package/dist/esm/dockview/dockviewComponent.js +15 -2
  46. package/dist/esm/dockview/dockviewGroupPanel.js +3 -0
  47. package/dist/esm/gridview/baseComponentGridview.d.ts +1 -1
  48. package/dist/esm/gridview/baseComponentGridview.js +4 -2
  49. package/dist/esm/gridview/gridviewComponent.d.ts +1 -1
  50. package/dist/esm/gridview/gridviewComponent.js +2 -2
  51. package/dist/esm/paneview/paneviewComponent.d.ts +1 -1
  52. package/dist/esm/paneview/paneviewComponent.js +6 -2
  53. package/dist/esm/splitview/splitview.d.ts +1 -1
  54. package/dist/esm/splitview/splitview.js +3 -3
  55. package/dist/esm/splitview/splitviewComponent.d.ts +1 -1
  56. package/dist/esm/splitview/splitviewComponent.js +6 -2
  57. package/dist/styles/dockview.css +2 -2
  58. package/package.json +1 -1
@@ -31,11 +31,10 @@ export interface DockviewGroupPanelFloatingChangeEvent {
31
31
  }
32
32
  export declare class DockviewGroupPanelApiImpl extends GridviewPanelApiImpl {
33
33
  private readonly accessor;
34
- private readonly _mutableDisposable;
35
34
  private _group;
36
35
  readonly _onDidLocationChange: Emitter<DockviewGroupPanelFloatingChangeEvent>;
37
36
  readonly onDidLocationChange: Event<DockviewGroupPanelFloatingChangeEvent>;
38
- private readonly _onDidActivePanelChange;
37
+ readonly _onDidActivePanelChange: Emitter<DockviewGroupChangeEvent>;
39
38
  readonly onDidActivePanelChange: Event<DockviewGroupChangeEvent>;
40
39
  get location(): DockviewGroupLocation;
41
40
  constructor(id: string, accessor: DockviewComponent);
@@ -1,6 +1,5 @@
1
1
  import { positionToDirection } from '../dnd/droptarget';
2
2
  import { Emitter } from '../events';
3
- import { MutableDisposable } from '../lifecycle';
4
3
  import { GridviewPanelApiImpl } from './gridviewPanelApi';
5
4
  const NOT_INITIALIZED_MESSAGE = 'dockview: DockviewGroupPanelApiImpl not initialized';
6
5
  export class DockviewGroupPanelApiImpl extends GridviewPanelApiImpl {
@@ -13,12 +12,11 @@ export class DockviewGroupPanelApiImpl extends GridviewPanelApiImpl {
13
12
  constructor(id, accessor) {
14
13
  super(id, '__dockviewgroup__');
15
14
  this.accessor = accessor;
16
- this._mutableDisposable = new MutableDisposable();
17
15
  this._onDidLocationChange = new Emitter();
18
16
  this.onDidLocationChange = this._onDidLocationChange.event;
19
17
  this._onDidActivePanelChange = new Emitter();
20
18
  this.onDidActivePanelChange = this._onDidActivePanelChange.event;
21
- this.addDisposables(this._onDidLocationChange, this._onDidActivePanelChange, this._mutableDisposable);
19
+ this.addDisposables(this._onDidLocationChange, this._onDidActivePanelChange);
22
20
  }
23
21
  close() {
24
22
  if (!this._group) {
@@ -76,19 +74,6 @@ export class DockviewGroupPanelApiImpl extends GridviewPanelApiImpl {
76
74
  }
77
75
  }
78
76
  initialize(group) {
79
- /**
80
- * TODO: Annoying initialization order caveat, find a better way to initialize and avoid needing null checks
81
- *
82
- * Due to the order on initialization we know that the model isn't defined until later in the same stack-frame of setup.
83
- * By queuing a microtask we can ensure the setup is completed within the same stack-frame, but after everything else has
84
- * finished ensuring the `model` is defined.
85
- */
86
77
  this._group = group;
87
- queueMicrotask(() => {
88
- this._mutableDisposable.value =
89
- this._group.model.onDidActivePanelChange((event) => {
90
- this._onDidActivePanelChange.fire(event);
91
- });
92
- });
93
78
  }
94
79
  }
@@ -16,9 +16,6 @@ export class DefaultTab extends CompositeDisposable {
16
16
  this.action.appendChild(createCloseButton());
17
17
  this._element.appendChild(this._content);
18
18
  this._element.appendChild(this.action);
19
- this.addDisposables(addDisposableListener(this.action, 'pointerdown', (ev) => {
20
- ev.preventDefault();
21
- }));
22
19
  this.render();
23
20
  }
24
21
  init(params) {
@@ -156,6 +156,9 @@ export class TabsContainer extends CompositeDisposable {
156
156
  delete(id) {
157
157
  const index = this.tabs.findIndex((tab) => tab.value.panel.id === id);
158
158
  const tabToRemove = this.tabs.splice(index, 1)[0];
159
+ if (!tabToRemove) {
160
+ throw new Error(`dockview: Tab not found`);
161
+ }
159
162
  const { value, disposable } = tabToRemove;
160
163
  disposable.dispose();
161
164
  value.dispose();
@@ -177,6 +180,9 @@ export class TabsContainer extends CompositeDisposable {
177
180
  const disposable = new CompositeDisposable(tab.onDragStart((event) => {
178
181
  this._onTabDragStart.fire({ nativeEvent: event, panel });
179
182
  }), tab.onChanged((event) => {
183
+ if (event.defaultPrevented) {
184
+ return;
185
+ }
180
186
  const isFloatingGroupsEnabled = !this.accessor.options.disableFloatingGroups;
181
187
  const isFloatingWithOnePanel = this.group.api.location.type === 'floating' &&
182
188
  this.size === 1;
@@ -194,12 +200,15 @@ export class TabsContainer extends CompositeDisposable {
194
200
  });
195
201
  return;
196
202
  }
197
- const isLeftClick = event.button === 0;
198
- if (!isLeftClick || event.defaultPrevented) {
199
- return;
200
- }
201
- if (this.group.activePanel !== panel) {
202
- this.group.model.openPanel(panel);
203
+ switch (event.button) {
204
+ case 0: // left click or touch
205
+ if (this.group.activePanel !== panel) {
206
+ this.group.model.openPanel(panel);
207
+ }
208
+ break;
209
+ case 1: // middle click
210
+ panel.api.close();
211
+ break;
203
212
  }
204
213
  }), tab.onDrop((event) => {
205
214
  this._onDrop.fire({
@@ -207,7 +207,7 @@ export declare class DockviewComponent extends BaseGrid<DockviewGroupPanel> impl
207
207
  get api(): DockviewApi;
208
208
  get gap(): number;
209
209
  get floatingGroups(): DockviewFloatingGroupPanel[];
210
- constructor(parentElement: HTMLElement, options: DockviewComponentOptions);
210
+ constructor(container: HTMLElement, options: DockviewComponentOptions);
211
211
  setVisible(panel: DockviewGroupPanel, visible: boolean): void;
212
212
  addPopoutGroup(itemToPopout: DockviewPanel | DockviewGroupPanel, options?: DockviewPopoutGroupOptions): Promise<boolean>;
213
213
  addFloatingGroup(item: DockviewPanel | DockviewGroupPanel, options?: FloatingGroupOptionsInternal): void;
@@ -73,9 +73,9 @@ export class DockviewComponent extends BaseGrid {
73
73
  get floatingGroups() {
74
74
  return this._floatingGroups;
75
75
  }
76
- constructor(parentElement, options) {
76
+ constructor(container, options) {
77
77
  var _a;
78
- super(parentElement, {
78
+ super(container, {
79
79
  proportionalLayout: true,
80
80
  orientation: Orientation.HORIZONTAL,
81
81
  styles: options.hideBorders
@@ -412,6 +412,9 @@ export class DockviewComponent extends BaseGrid {
412
412
  addDisposableWindowListener(_window.window, 'resize', () => {
413
413
  group.layout(_window.window.innerWidth, _window.window.innerHeight);
414
414
  }), overlayRenderContainer, Disposable.from(() => {
415
+ if (this.isDisposed) {
416
+ return; // cleanup may run after instance is disposed
417
+ }
415
418
  if (isGroupAddedToDom &&
416
419
  this.getPanel(referenceGroup.id)) {
417
420
  this.movingLock(() => moveGroupWithoutDestroying({
@@ -431,6 +434,16 @@ export class DockviewComponent extends BaseGrid {
431
434
  group.model.renderContainer =
432
435
  this.overlayRenderContainer;
433
436
  returnedGroup = group;
437
+ const alreadyRemoved = !this._popoutGroups.find((p) => p.popoutGroup === group);
438
+ if (alreadyRemoved) {
439
+ /**
440
+ * If this popout group was explicitly removed then we shouldn't run the additional
441
+ * steps. To tell if the running of this disposable is the result of this popout group
442
+ * being explicitly removed we can check if this popout group is still referenced in
443
+ * the `this._popoutGroups` list.
444
+ */
445
+ return;
446
+ }
434
447
  if (floatingBox) {
435
448
  this.addFloatingGroup(group, {
436
449
  height: floatingBox.height,
@@ -67,6 +67,9 @@ export class DockviewGroupPanel extends GridviewPanel {
67
67
  }, new DockviewGroupPanelApiImpl(id, accessor));
68
68
  this.api.initialize(this); // cannot use 'this' after after 'super' call
69
69
  this._model = new DockviewGroupPanelModel(this.element, accessor, id, options, this);
70
+ this.addDisposables(this.model.onDidActivePanelChange((event) => {
71
+ this.api._onDidActivePanelChange.fire(event);
72
+ }));
70
73
  }
71
74
  focus() {
72
75
  if (!this.api.isActive) {
@@ -81,7 +81,7 @@ export declare abstract class BaseGrid<T extends IGridPanelView> extends Resizab
81
81
  get activeGroup(): T | undefined;
82
82
  get locked(): boolean;
83
83
  set locked(value: boolean);
84
- constructor(parentElement: HTMLElement, options: BaseGridOptions);
84
+ constructor(container: HTMLElement, options: BaseGridOptions);
85
85
  abstract toJSON(): object;
86
86
  abstract fromJSON(data: any): void;
87
87
  abstract clear(): void;
@@ -58,9 +58,9 @@ export class BaseGrid extends Resizable {
58
58
  set locked(value) {
59
59
  this.gridview.locked = value;
60
60
  }
61
- constructor(parentElement, options) {
61
+ constructor(container, options) {
62
62
  var _a;
63
- super(parentElement, options.disableAutoResizing);
63
+ super(document.createElement('div'), options.disableAutoResizing);
64
64
  this._id = nextLayoutId.next();
65
65
  this._groups = new Map();
66
66
  this._onDidRemove = new Emitter();
@@ -79,6 +79,8 @@ export class BaseGrid extends Resizable {
79
79
  this.element.style.width = '100%';
80
80
  this._classNames = new Classnames(this.element);
81
81
  this._classNames.setClassNames((_a = options.className) !== null && _a !== void 0 ? _a : '');
82
+ // the container is owned by the third-party, do not modify/delete it
83
+ container.appendChild(this.element);
82
84
  this.gridview = new Gridview(!!options.proportionalLayout, options.styles, options.orientation, options.locked, options.margin);
83
85
  this.gridview.locked = !!options.locked;
84
86
  this.element.appendChild(this.gridview.element);
@@ -61,7 +61,7 @@ export declare class GridviewComponent extends BaseGrid<GridviewPanel> implement
61
61
  get options(): GridviewComponentOptions;
62
62
  get deserializer(): IPanelDeserializer | undefined;
63
63
  set deserializer(value: IPanelDeserializer | undefined);
64
- constructor(parentElement: HTMLElement, options: GridviewComponentOptions);
64
+ constructor(container: HTMLElement, options: GridviewComponentOptions);
65
65
  updateOptions(options: Partial<GridviewComponentOptions>): void;
66
66
  removePanel(panel: GridviewPanel): void;
67
67
  /**
@@ -19,9 +19,9 @@ export class GridviewComponent extends BaseGrid {
19
19
  set deserializer(value) {
20
20
  this._deserializer = value;
21
21
  }
22
- constructor(parentElement, options) {
22
+ constructor(container, options) {
23
23
  var _a;
24
- super(parentElement, {
24
+ super(container, {
25
25
  proportionalLayout: (_a = options.proportionalLayout) !== null && _a !== void 0 ? _a : true,
26
26
  orientation: options.orientation,
27
27
  styles: options.hideBorders
@@ -110,7 +110,7 @@ export declare class PaneviewComponent extends Resizable implements IPaneviewCom
110
110
  get height(): number;
111
111
  get width(): number;
112
112
  get options(): PaneviewComponentOptions;
113
- constructor(parentElement: HTMLElement, options: PaneviewComponentOptions);
113
+ constructor(container: HTMLElement, options: PaneviewComponentOptions);
114
114
  setVisible(panel: PaneviewPanel, visible: boolean): void;
115
115
  focus(): void;
116
116
  updateOptions(options: Partial<PaneviewComponentOptions>): void;
@@ -56,9 +56,9 @@ export class PaneviewComponent extends Resizable {
56
56
  get options() {
57
57
  return this._options;
58
58
  }
59
- constructor(parentElement, options) {
59
+ constructor(container, options) {
60
60
  var _a;
61
- super(parentElement, options.disableAutoResizing);
61
+ super(document.createElement('div'), options.disableAutoResizing);
62
62
  this._id = nextLayoutId.next();
63
63
  this._disposable = new MutableDisposable();
64
64
  this._viewDisposables = new Map();
@@ -74,9 +74,13 @@ export class PaneviewComponent extends Resizable {
74
74
  this.onDidRemoveView = this._onDidRemoveView.event;
75
75
  this._onUnhandledDragOverEvent = new Emitter();
76
76
  this.onUnhandledDragOverEvent = this._onUnhandledDragOverEvent.event;
77
+ this.element.style.height = '100%';
78
+ this.element.style.width = '100%';
77
79
  this.addDisposables(this._onDidLayoutChange, this._onDidLayoutfromJSON, this._onDidDrop, this._onDidAddView, this._onDidRemoveView, this._onUnhandledDragOverEvent);
78
80
  this._classNames = new Classnames(this.element);
79
81
  this._classNames.setClassNames((_a = options.className) !== null && _a !== void 0 ? _a : '');
82
+ // the container is owned by the third-party, do not modify/delete it
83
+ container.appendChild(this.element);
80
84
  this._options = options;
81
85
  this.paneview = new Paneview(this.element, {
82
86
  // only allow paneview in the vertical orientation for now
@@ -14,7 +14,7 @@ export interface ISplitviewStyles {
14
14
  separatorBorder: string;
15
15
  }
16
16
  export interface SplitViewOptions {
17
- orientation: Orientation;
17
+ orientation?: Orientation;
18
18
  descriptor?: ISplitViewDescriptor;
19
19
  proportionalLayout?: boolean;
20
20
  styles?: ISplitviewStyles;
@@ -114,7 +114,7 @@ export class Splitview {
114
114
  this._margin = value;
115
115
  }
116
116
  constructor(container, options) {
117
- var _a;
117
+ var _a, _b;
118
118
  this.container = container;
119
119
  this.viewItems = [];
120
120
  this.sashes = [];
@@ -212,9 +212,9 @@ export class Splitview {
212
212
  //
213
213
  return delta;
214
214
  };
215
- this._orientation = options.orientation;
215
+ this._orientation = (_a = options.orientation) !== null && _a !== void 0 ? _a : Orientation.VERTICAL;
216
216
  this.element = this.createContainer();
217
- this.margin = (_a = options.margin) !== null && _a !== void 0 ? _a : 0;
217
+ this.margin = (_b = options.margin) !== null && _b !== void 0 ? _b : 0;
218
218
  this.proportionalLayout =
219
219
  options.proportionalLayout === undefined
220
220
  ? true
@@ -83,7 +83,7 @@ export declare class SplitviewComponent extends Resizable implements ISplitviewC
83
83
  get maximumSize(): number;
84
84
  get height(): number;
85
85
  get width(): number;
86
- constructor(parentElement: HTMLElement, options: SplitviewComponentOptions);
86
+ constructor(container: HTMLElement, options: SplitviewComponentOptions);
87
87
  updateOptions(options: Partial<SplitviewComponentOptions>): void;
88
88
  focus(): void;
89
89
  movePanel(from: number, to: number): void;
@@ -44,9 +44,9 @@ export class SplitviewComponent extends Resizable {
44
44
  ? this.splitview.size
45
45
  : this.splitview.orthogonalSize;
46
46
  }
47
- constructor(parentElement, options) {
47
+ constructor(container, options) {
48
48
  var _a;
49
- super(parentElement, options.disableAutoResizing);
49
+ super(document.createElement('div'), options.disableAutoResizing);
50
50
  this._splitviewChangeDisposable = new MutableDisposable();
51
51
  this._panels = new Map();
52
52
  this._onDidLayoutfromJSON = new Emitter();
@@ -57,8 +57,12 @@ export class SplitviewComponent extends Resizable {
57
57
  this.onDidRemoveView = this._onDidRemoveView.event;
58
58
  this._onDidLayoutChange = new Emitter();
59
59
  this.onDidLayoutChange = this._onDidLayoutChange.event;
60
+ this.element.style.height = '100%';
61
+ this.element.style.width = '100%';
60
62
  this._classNames = new Classnames(this.element);
61
63
  this._classNames.setClassNames((_a = options.className) !== null && _a !== void 0 ? _a : '');
64
+ // the container is owned by the third-party, do not modify/delete it
65
+ container.appendChild(this.element);
62
66
  this._options = options;
63
67
  this.splitview = new Splitview(this.element, options);
64
68
  this.addDisposables(this._onDidAddView, this._onDidLayoutfromJSON, this._onDidRemoveView, this._onDidLayoutChange);
@@ -243,7 +243,7 @@
243
243
  .dockview-theme-replit .dv-groupview.dv-inactive-group {
244
244
  border: 1px solid transparent;
245
245
  }
246
- .dockview-theme-replit .vertical > .sash-container > .sash:not(.disabled)::after {
246
+ .dockview-theme-replit .dv-vertical > .dv-sash-container > .dv-sash:not(.disabled)::after {
247
247
  content: "";
248
248
  height: 4px;
249
249
  width: 40px;
@@ -254,7 +254,7 @@
254
254
  background-color: var(--dv-separator-handle-background-color);
255
255
  position: absolute;
256
256
  }
257
- .dockview-theme-replit .vertical > .sash-container > .sash:not(.disabled):hover::after {
257
+ .dockview-theme-replit .dv-vertical > .dv-sash-container > .dv-sash:not(.disabled):hover::after {
258
258
  background-color: var(--dv-separator-handle-hover-background-color);
259
259
  }
260
260
  .dockview-theme-replit .dv-horizontal > .dv-sash-container > .dv-sash:not(.disabled)::after {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dockview-core",
3
- "version": "3.0.1",
3
+ "version": "3.1.0",
4
4
  "description": "Zero dependency layout manager supporting tabs, grids and splitviews",
5
5
  "keywords": [
6
6
  "splitview",