dockview 1.4.1 → 1.5.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 (156) hide show
  1. package/README.md +4 -195
  2. package/dist/cjs/api/component.api.d.ts +8 -3
  3. package/dist/cjs/api/component.api.js +16 -4
  4. package/dist/cjs/api/component.api.js.map +1 -1
  5. package/dist/cjs/dnd/droptarget.d.ts +1 -2
  6. package/dist/cjs/dockview/components/tab/defaultTab.d.ts +1 -0
  7. package/dist/cjs/dockview/components/tab/defaultTab.js +6 -3
  8. package/dist/cjs/dockview/components/tab/defaultTab.js.map +1 -1
  9. package/dist/cjs/dockview/components/watermark/watermark.js +3 -1
  10. package/dist/cjs/dockview/components/watermark/watermark.js.map +1 -1
  11. package/dist/cjs/dockview/defaultGroupPanelView.d.ts +1 -5
  12. package/dist/cjs/dockview/defaultGroupPanelView.js +5 -20
  13. package/dist/cjs/dockview/defaultGroupPanelView.js.map +1 -1
  14. package/dist/cjs/dockview/deserializer.d.ts +0 -12
  15. package/dist/cjs/dockview/deserializer.js +0 -52
  16. package/dist/cjs/dockview/deserializer.js.map +1 -1
  17. package/dist/cjs/dockview/dockviewComponent.d.ts +6 -8
  18. package/dist/cjs/dockview/dockviewComponent.js +84 -58
  19. package/dist/cjs/dockview/dockviewComponent.js.map +1 -1
  20. package/dist/cjs/dockview/options.d.ts +11 -1
  21. package/dist/cjs/gridview/baseComponentGridview.d.ts +4 -2
  22. package/dist/cjs/gridview/baseComponentGridview.js +1 -1
  23. package/dist/cjs/gridview/baseComponentGridview.js.map +1 -1
  24. package/dist/cjs/gridview/gridviewComponent.d.ts +1 -0
  25. package/dist/cjs/gridview/gridviewComponent.js +26 -18
  26. package/dist/cjs/gridview/gridviewComponent.js.map +1 -1
  27. package/dist/cjs/groupview/groupview.d.ts +20 -18
  28. package/dist/cjs/groupview/groupview.js +44 -41
  29. package/dist/cjs/groupview/groupview.js.map +1 -1
  30. package/dist/cjs/groupview/groupviewPanel.d.ts +2 -2
  31. package/dist/cjs/groupview/groupviewPanel.js.map +1 -1
  32. package/dist/cjs/groupview/tab.d.ts +1 -0
  33. package/dist/cjs/groupview/tab.js +3 -1
  34. package/dist/cjs/groupview/tab.js.map +1 -1
  35. package/dist/cjs/groupview/titlebar/tabsContainer.d.ts +3 -5
  36. package/dist/cjs/groupview/titlebar/tabsContainer.js +3 -5
  37. package/dist/cjs/groupview/titlebar/tabsContainer.js.map +1 -1
  38. package/dist/cjs/groupview/types.d.ts +0 -4
  39. package/dist/cjs/index.d.ts +2 -0
  40. package/dist/cjs/index.js +1 -0
  41. package/dist/cjs/index.js.map +1 -1
  42. package/dist/cjs/paneview/defaultPaneviewHeader.d.ts +3 -0
  43. package/dist/cjs/paneview/defaultPaneviewHeader.js +32 -6
  44. package/dist/cjs/paneview/defaultPaneviewHeader.js.map +1 -1
  45. package/dist/cjs/paneview/draggablePaneviewPanel.d.ts +3 -1
  46. package/dist/cjs/paneview/draggablePaneviewPanel.js +24 -9
  47. package/dist/cjs/paneview/draggablePaneviewPanel.js.map +1 -1
  48. package/dist/cjs/paneview/options.d.ts +2 -0
  49. package/dist/cjs/paneview/paneviewComponent.d.ts +14 -1
  50. package/dist/cjs/paneview/paneviewComponent.js +32 -17
  51. package/dist/cjs/paneview/paneviewComponent.js.map +1 -1
  52. package/dist/cjs/react/deserializer.js +13 -5
  53. package/dist/cjs/react/deserializer.js.map +1 -1
  54. package/dist/cjs/react/dockview/defaultTab.d.ts +4 -0
  55. package/dist/cjs/react/dockview/defaultTab.js +73 -0
  56. package/dist/cjs/react/dockview/defaultTab.js.map +1 -0
  57. package/dist/cjs/react/dockview/dockview.d.ts +5 -3
  58. package/dist/cjs/react/dockview/dockview.js +45 -3
  59. package/dist/cjs/react/dockview/dockview.js.map +1 -1
  60. package/dist/cjs/react/dockview/groupControlsRenderer.d.ts +43 -0
  61. package/dist/cjs/react/dockview/groupControlsRenderer.js +87 -0
  62. package/dist/cjs/react/dockview/groupControlsRenderer.js.map +1 -0
  63. package/dist/cjs/react/dockview/reactContentPart.d.ts +1 -16
  64. package/dist/cjs/react/dockview/reactContentPart.js +2 -18
  65. package/dist/cjs/react/dockview/reactContentPart.js.map +1 -1
  66. package/dist/cjs/react/dockview/reactHeaderPart.d.ts +2 -0
  67. package/dist/cjs/react/dockview/reactHeaderPart.js +4 -0
  68. package/dist/cjs/react/dockview/reactHeaderPart.js.map +1 -1
  69. package/dist/cjs/react/index.d.ts +2 -2
  70. package/dist/cjs/react/index.js +1 -2
  71. package/dist/cjs/react/index.js.map +1 -1
  72. package/dist/cjs/react/paneview/paneview.d.ts +2 -0
  73. package/dist/cjs/react/paneview/paneview.js +9 -0
  74. package/dist/cjs/react/paneview/paneview.js.map +1 -1
  75. package/dist/cjs/react/react.d.ts +1 -0
  76. package/dist/cjs/react/react.js +12 -2
  77. package/dist/cjs/react/react.js.map +1 -1
  78. package/dist/cjs/react/svg.d.ts +3 -0
  79. package/dist/cjs/react/svg.js +36 -0
  80. package/dist/cjs/react/svg.js.map +1 -0
  81. package/dist/cjs/splitview/splitviewComponent.d.ts +2 -0
  82. package/dist/cjs/splitview/splitviewComponent.js +20 -17
  83. package/dist/cjs/splitview/splitviewComponent.js.map +1 -1
  84. package/dist/cjs/svg.d.ts +3 -0
  85. package/dist/cjs/svg.js +44 -0
  86. package/dist/cjs/svg.js.map +1 -0
  87. package/dist/dockview.amd.js +454 -204
  88. package/dist/dockview.amd.min.js +2 -2
  89. package/dist/dockview.amd.min.noStyle.js +2 -2
  90. package/dist/dockview.amd.noStyle.js +453 -203
  91. package/dist/dockview.cjs.js +454 -204
  92. package/dist/dockview.esm.js +449 -198
  93. package/dist/dockview.esm.min.js +2 -2
  94. package/dist/dockview.js +454 -204
  95. package/dist/dockview.min.js +2 -2
  96. package/dist/dockview.min.noStyle.js +2 -2
  97. package/dist/dockview.noStyle.js +453 -203
  98. package/dist/esm/api/component.api.d.ts +8 -3
  99. package/dist/esm/api/component.api.js +16 -4
  100. package/dist/esm/dnd/droptarget.d.ts +1 -2
  101. package/dist/esm/dockview/components/tab/defaultTab.d.ts +1 -0
  102. package/dist/esm/dockview/components/tab/defaultTab.js +5 -2
  103. package/dist/esm/dockview/components/watermark/watermark.js +3 -1
  104. package/dist/esm/dockview/defaultGroupPanelView.d.ts +1 -5
  105. package/dist/esm/dockview/defaultGroupPanelView.js +5 -16
  106. package/dist/esm/dockview/deserializer.d.ts +0 -12
  107. package/dist/esm/dockview/deserializer.js +1 -27
  108. package/dist/esm/dockview/dockviewComponent.d.ts +6 -8
  109. package/dist/esm/dockview/dockviewComponent.js +56 -41
  110. package/dist/esm/dockview/options.d.ts +11 -1
  111. package/dist/esm/gridview/baseComponentGridview.d.ts +4 -2
  112. package/dist/esm/gridview/baseComponentGridview.js +1 -1
  113. package/dist/esm/gridview/gridviewComponent.d.ts +1 -0
  114. package/dist/esm/gridview/gridviewComponent.js +15 -7
  115. package/dist/esm/groupview/groupview.d.ts +20 -18
  116. package/dist/esm/groupview/groupview.js +42 -40
  117. package/dist/esm/groupview/groupviewPanel.d.ts +2 -2
  118. package/dist/esm/groupview/tab.d.ts +1 -0
  119. package/dist/esm/groupview/tab.js +3 -1
  120. package/dist/esm/groupview/titlebar/tabsContainer.d.ts +3 -5
  121. package/dist/esm/groupview/titlebar/tabsContainer.js +3 -5
  122. package/dist/esm/groupview/types.d.ts +0 -4
  123. package/dist/esm/index.d.ts +2 -0
  124. package/dist/esm/index.js +1 -0
  125. package/dist/esm/paneview/defaultPaneviewHeader.d.ts +3 -0
  126. package/dist/esm/paneview/defaultPaneviewHeader.js +32 -6
  127. package/dist/esm/paneview/draggablePaneviewPanel.d.ts +3 -1
  128. package/dist/esm/paneview/draggablePaneviewPanel.js +24 -9
  129. package/dist/esm/paneview/options.d.ts +2 -0
  130. package/dist/esm/paneview/paneviewComponent.d.ts +14 -1
  131. package/dist/esm/paneview/paneviewComponent.js +17 -6
  132. package/dist/esm/react/deserializer.js +13 -5
  133. package/dist/esm/react/dockview/defaultTab.d.ts +4 -0
  134. package/dist/esm/react/dockview/defaultTab.js +34 -0
  135. package/dist/esm/react/dockview/dockview.d.ts +5 -3
  136. package/dist/esm/react/dockview/dockview.js +30 -1
  137. package/dist/esm/react/dockview/groupControlsRenderer.d.ts +43 -0
  138. package/dist/esm/react/dockview/groupControlsRenderer.js +68 -0
  139. package/dist/esm/react/dockview/reactContentPart.d.ts +1 -16
  140. package/dist/esm/react/dockview/reactContentPart.js +2 -14
  141. package/dist/esm/react/dockview/reactHeaderPart.d.ts +2 -0
  142. package/dist/esm/react/dockview/reactHeaderPart.js +4 -0
  143. package/dist/esm/react/index.d.ts +2 -2
  144. package/dist/esm/react/index.js +1 -2
  145. package/dist/esm/react/paneview/paneview.d.ts +2 -0
  146. package/dist/esm/react/paneview/paneview.js +9 -0
  147. package/dist/esm/react/react.d.ts +1 -0
  148. package/dist/esm/react/react.js +12 -2
  149. package/dist/esm/react/svg.d.ts +3 -0
  150. package/dist/esm/react/svg.js +7 -0
  151. package/dist/esm/splitview/splitviewComponent.d.ts +2 -0
  152. package/dist/esm/splitview/splitviewComponent.js +9 -6
  153. package/dist/esm/svg.d.ts +3 -0
  154. package/dist/esm/svg.js +31 -0
  155. package/dist/styles/dockview.css +158 -40
  156. package/package.json +2 -2
@@ -1,4 +1,5 @@
1
1
  import { FrameworkFactory } from '../types';
2
+ import { PaneviewDndOverlayEvent } from './paneviewComponent';
2
3
  import { IPaneBodyPart, IPaneHeaderPart, PaneviewPanel } from './paneviewPanel';
3
4
  export interface PaneviewComponentOptions {
4
5
  components?: {
@@ -22,4 +23,5 @@ export interface PaneviewComponentOptions {
22
23
  body: FrameworkFactory<IPaneBodyPart>;
23
24
  };
24
25
  disableDnd?: boolean;
26
+ showDndOverlay?: (event: PaneviewDndOverlayEvent) => boolean;
25
27
  }
@@ -5,6 +5,12 @@ import { PaneviewComponentOptions } from './options';
5
5
  import { Paneview } from './paneview';
6
6
  import { IPaneBodyPart, IPaneHeaderPart, PaneviewPanel, IPaneviewPanel } from './paneviewPanel';
7
7
  import { DraggablePaneviewPanel, PaneviewDropEvent2 } from './draggablePaneviewPanel';
8
+ import { PaneTransfer } from '../dnd/dataTransfer';
9
+ export interface PaneviewDndOverlayEvent {
10
+ nativeEvent: DragEvent;
11
+ panel: IPaneviewPanel;
12
+ getData: () => PaneTransfer | undefined;
13
+ }
8
14
  export interface SerializedPaneviewPanel {
9
15
  snap?: boolean;
10
16
  priority?: LayoutPriority;
@@ -37,6 +43,7 @@ export declare class PaneFramework extends DraggablePaneviewPanel {
37
43
  orientation: Orientation;
38
44
  isExpanded: boolean;
39
45
  disableDnd: boolean;
46
+ accessor: IPaneviewComponent;
40
47
  });
41
48
  getBodyComponent(): IPaneBodyPart;
42
49
  getHeaderComponent(): IPaneHeaderPart;
@@ -56,11 +63,13 @@ export interface AddPaneviewComponentOptions {
56
63
  size?: number;
57
64
  }
58
65
  export interface IPaneviewComponent extends IDisposable {
66
+ readonly id: string;
59
67
  readonly width: number;
60
68
  readonly height: number;
61
69
  readonly minimumSize: number;
62
70
  readonly maximumSize: number;
63
71
  readonly panels: IPaneviewPanel[];
72
+ readonly options: PaneviewComponentOptions;
64
73
  readonly onDidAddView: Event<PaneviewPanel>;
65
74
  readonly onDidRemoveView: Event<PaneviewPanel>;
66
75
  readonly onDidDrop: Event<PaneviewDropEvent2>;
@@ -75,9 +84,12 @@ export interface IPaneviewComponent extends IDisposable {
75
84
  getPanel(id: string): IPaneviewPanel | undefined;
76
85
  movePanel(from: number, to: number): void;
77
86
  updateOptions(options: Partial<PaneviewComponentOptions>): void;
87
+ clear(): void;
78
88
  }
79
89
  export declare class PaneviewComponent extends CompositeDisposable implements IPaneviewComponent {
80
90
  private element;
91
+ private readonly _id;
92
+ private _options;
81
93
  private _disposable;
82
94
  private _viewDisposables;
83
95
  private _paneview;
@@ -91,6 +103,7 @@ export declare class PaneviewComponent extends CompositeDisposable implements IP
91
103
  readonly onDidAddView: Event<PaneviewPanel>;
92
104
  private readonly _onDidRemoveView;
93
105
  readonly onDidRemoveView: Event<PaneviewPanel>;
106
+ get id(): string;
94
107
  get panels(): PaneviewPanel[];
95
108
  set paneview(value: Paneview);
96
109
  get paneview(): Paneview;
@@ -98,7 +111,6 @@ export declare class PaneviewComponent extends CompositeDisposable implements IP
98
111
  get maximumSize(): number;
99
112
  get height(): number;
100
113
  get width(): number;
101
- private _options;
102
114
  get options(): PaneviewComponentOptions;
103
115
  constructor(element: HTMLElement, options: PaneviewComponentOptions);
104
116
  focus(): void;
@@ -110,6 +122,7 @@ export declare class PaneviewComponent extends CompositeDisposable implements IP
110
122
  layout(width: number, height: number): void;
111
123
  toJSON(): SerializedPaneview;
112
124
  fromJSON(serializedPaneview: SerializedPaneview): void;
125
+ clear(): void;
113
126
  private doAddPanel;
114
127
  private doRemovePanel;
115
128
  dispose(): void;
@@ -6,9 +6,11 @@ import { Orientation, Sizing, } from '../splitview/core/splitview';
6
6
  import { Paneview } from './paneview';
7
7
  import { DraggablePaneviewPanel, } from './draggablePaneviewPanel';
8
8
  import { DefaultHeader } from './defaultPaneviewHeader';
9
+ import { sequentialNumberGenerator } from '../math';
10
+ const nextLayoutId = sequentialNumberGenerator();
9
11
  export class PaneFramework extends DraggablePaneviewPanel {
10
12
  constructor(options) {
11
- super(options.id, options.component, options.headerComponent, options.orientation, options.isExpanded, options.disableDnd);
13
+ super(options.accessor, options.id, options.component, options.headerComponent, options.orientation, options.isExpanded, options.disableDnd);
12
14
  this.options = options;
13
15
  }
14
16
  getBodyComponent() {
@@ -22,6 +24,7 @@ export class PaneviewComponent extends CompositeDisposable {
22
24
  constructor(element, options) {
23
25
  super();
24
26
  this.element = element;
27
+ this._id = nextLayoutId.next();
25
28
  this._disposable = new MutableDisposable();
26
29
  this._viewDisposables = new Map();
27
30
  this._onDidLayoutfromJSON = new Emitter();
@@ -48,6 +51,9 @@ export class PaneviewComponent extends CompositeDisposable {
48
51
  });
49
52
  this.addDisposables(this._disposable);
50
53
  }
54
+ get id() {
55
+ return this._id;
56
+ }
51
57
  get panels() {
52
58
  return this.paneview.getPanes();
53
59
  }
@@ -112,6 +118,7 @@ export class PaneviewComponent extends CompositeDisposable {
112
118
  orientation: Orientation.VERTICAL,
113
119
  isExpanded: !!options.isExpanded,
114
120
  disableDnd: !!this.options.disableDnd,
121
+ accessor: this,
115
122
  });
116
123
  this.doAddPanel(view);
117
124
  const size = typeof options.size === 'number' ? options.size : Sizing.Distribute;
@@ -170,13 +177,9 @@ export class PaneviewComponent extends CompositeDisposable {
170
177
  };
171
178
  }
172
179
  fromJSON(serializedPaneview) {
180
+ this.clear();
173
181
  const { views, size } = serializedPaneview;
174
182
  const queue = [];
175
- for (const [_, value] of this._viewDisposables.entries()) {
176
- value.dispose();
177
- }
178
- this._viewDisposables.clear();
179
- this.paneview.dispose();
180
183
  this.paneview = new Paneview(this.element, {
181
184
  orientation: Orientation.VERTICAL,
182
185
  descriptor: {
@@ -210,6 +213,7 @@ export class PaneviewComponent extends CompositeDisposable {
210
213
  orientation: Orientation.VERTICAL,
211
214
  isExpanded: !!view.expanded,
212
215
  disableDnd: !!this.options.disableDnd,
216
+ accessor: this,
213
217
  });
214
218
  this.doAddPanel(panel);
215
219
  queue.push(() => {
@@ -235,6 +239,13 @@ export class PaneviewComponent extends CompositeDisposable {
235
239
  queue.forEach((f) => f());
236
240
  this._onDidLayoutfromJSON.fire();
237
241
  }
242
+ clear() {
243
+ for (const [_, value] of this._viewDisposables.entries()) {
244
+ value.dispose();
245
+ }
246
+ this._viewDisposables.clear();
247
+ this.paneview.dispose();
248
+ }
238
249
  doAddPanel(panel) {
239
250
  const disposable = panel.onDidDrop((event) => {
240
251
  this._onDidDrop.fire(event);
@@ -8,17 +8,25 @@ export class ReactPanelDeserialzier {
8
8
  this.layout = layout;
9
9
  }
10
10
  fromJSON(panelData, group) {
11
- var _a, _b, _c;
11
+ var _a, _b, _c, _d;
12
12
  const panelId = panelData.id;
13
13
  const params = panelData.params;
14
14
  const title = panelData.title;
15
15
  const suppressClosable = panelData.suppressClosable;
16
16
  const viewData = panelData.view;
17
+ let tab;
18
+ if ((_a = viewData.tab) === null || _a === void 0 ? void 0 : _a.id) {
19
+ tab = createComponent(viewData.tab.id, viewData.tab.id, this.layout.options.tabComponents, this.layout.options.frameworkTabComponents, (_b = this.layout.options.frameworkComponentFactory) === null || _b === void 0 ? void 0 : _b.tab, () => new DefaultTab());
20
+ }
21
+ else if (this.layout.options.defaultTabComponent) {
22
+ tab = createComponent(this.layout.options.defaultTabComponent, this.layout.options.defaultTabComponent, this.layout.options.tabComponents, this.layout.options.frameworkTabComponents, (_c = this.layout.options.frameworkComponentFactory) === null || _c === void 0 ? void 0 : _c.tab, () => new DefaultTab());
23
+ }
24
+ else {
25
+ tab = new DefaultTab();
26
+ }
17
27
  const view = new DefaultGroupPanelView({
18
- content: createComponent(viewData.content.id, viewData.content.id, this.layout.options.components, this.layout.options.frameworkComponents, (_a = this.layout.options.frameworkComponentFactory) === null || _a === void 0 ? void 0 : _a.content),
19
- tab: ((_b = viewData.tab) === null || _b === void 0 ? void 0 : _b.id)
20
- ? createComponent(viewData.tab.id, viewData.tab.id, this.layout.options.tabComponents, this.layout.options.frameworkTabComponents, (_c = this.layout.options.frameworkComponentFactory) === null || _c === void 0 ? void 0 : _c.tab)
21
- : new DefaultTab(),
28
+ content: createComponent(viewData.content.id, viewData.content.id, this.layout.options.components, this.layout.options.frameworkComponents, (_d = this.layout.options.frameworkComponentFactory) === null || _d === void 0 ? void 0 : _d.content),
29
+ tab,
22
30
  });
23
31
  const panel = new DockviewGroupPanel(panelId, this.layout, new DockviewApi(this.layout), group);
24
32
  panel.init({
@@ -0,0 +1,4 @@
1
+ import { IDockviewPanelHeaderProps } from './dockview';
2
+ import * as React from 'react';
3
+ export declare type IDockviewDefaultTabProps = IDockviewPanelHeaderProps & React.DOMAttributes<HTMLDivElement>;
4
+ export declare const DockviewDefaultTab: React.FunctionComponent<IDockviewDefaultTabProps>;
@@ -0,0 +1,34 @@
1
+ var __rest = (this && this.__rest) || function (s, e) {
2
+ var t = {};
3
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
4
+ t[p] = s[p];
5
+ if (s != null && typeof Object.getOwnPropertySymbols === "function")
6
+ for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
7
+ if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
8
+ t[p[i]] = s[p[i]];
9
+ }
10
+ return t;
11
+ };
12
+ import * as React from 'react';
13
+ import { CloseButton } from '../svg';
14
+ export const DockviewDefaultTab = (_a) => {
15
+ var { api, containerApi: _containerApi, params: _params } = _a, rest = __rest(_a, ["api", "containerApi", "params"]);
16
+ const onClose = React.useCallback((event) => {
17
+ event.stopPropagation();
18
+ api.close();
19
+ }, [api]);
20
+ const onClick = React.useCallback((event) => {
21
+ api.setActive();
22
+ if (rest.onClick) {
23
+ rest.onClick(event);
24
+ }
25
+ }, [api, rest.onClick]);
26
+ const iconClassname = React.useMemo(() => {
27
+ const cn = ['dockview-react-tab-action'];
28
+ return cn.join(',');
29
+ }, [api.suppressClosable]);
30
+ return (React.createElement("div", Object.assign({}, rest, { onClick: onClick, className: "dockview-react-tab" }),
31
+ React.createElement("span", { className: "dockview-react-tab-title" }, api.title),
32
+ React.createElement("div", { className: iconClassname, onClick: onClose },
33
+ React.createElement(CloseButton, null))));
34
+ };
@@ -1,11 +1,11 @@
1
1
  import * as React from 'react';
2
2
  import { DockviewDropEvent } from '../../dockview/dockviewComponent';
3
- import { TabContextMenuEvent } from '../../dockview/options';
3
+ import { DockviewDndOverlayEvent, TabContextMenuEvent } from '../../dockview/options';
4
4
  import { DockviewPanelApi } from '../../api/groupPanelApi';
5
5
  import { DockviewApi } from '../../api/component.api';
6
6
  import { IWatermarkPanelProps } from './reactWatermarkPart';
7
7
  import { PanelCollection, PanelParameters } from '../types';
8
- import { DockviewDropTargets } from '../../groupview/dnd';
8
+ import { IDockviewGroupControlProps } from './groupControlsRenderer';
9
9
  export interface IGroupPanelBaseProps<T extends {} = Record<string, any>> extends PanelParameters<T> {
10
10
  api: DockviewPanelApi;
11
11
  containerApi: DockviewApi;
@@ -25,9 +25,11 @@ export interface IDockviewReactProps {
25
25
  tabHeight?: number;
26
26
  onTabContextMenu?: (event: TabContextMenuEvent) => void;
27
27
  onDidDrop?: (event: DockviewDropEvent) => void;
28
- showDndOverlay?: (event: DragEvent, target: DockviewDropTargets) => boolean;
28
+ showDndOverlay?: (event: DockviewDndOverlayEvent) => boolean;
29
29
  hideBorders?: boolean;
30
30
  className?: string;
31
31
  disableAutoResizing?: boolean;
32
+ defaultTabComponent?: React.FunctionComponent<IDockviewPanelHeaderProps>;
33
+ groupControlComponent?: React.FunctionComponent<IDockviewGroupControlProps>;
32
34
  }
33
35
  export declare const DockviewReact: React.ForwardRefExoticComponent<IDockviewReactProps & React.RefAttributes<HTMLDivElement>>;
@@ -7,6 +7,15 @@ import { usePortalsLifecycle } from '../react';
7
7
  import { DockviewApi } from '../../api/component.api';
8
8
  import { ReactWatermarkPart } from './reactWatermarkPart';
9
9
  import { watchElementResize } from '../../dom';
10
+ import { ReactGroupControlsRendererPart, } from './groupControlsRenderer';
11
+ import { DEFAULT_TAB_IDENTIFIER } from '../../dockview/components/tab/defaultTab';
12
+ function createGroupControlElement(component, store) {
13
+ return component
14
+ ? (groupPanel) => {
15
+ return new ReactGroupControlsRendererPart(component, store, groupPanel);
16
+ }
17
+ : undefined;
18
+ }
10
19
  export const DockviewReact = React.forwardRef((props, ref) => {
11
20
  const domRef = React.useRef(null);
12
21
  const dockviewRef = React.useRef();
@@ -56,12 +65,15 @@ export const DockviewReact = React.forwardRef((props, ref) => {
56
65
  const dockview = new DockviewComponent(element, {
57
66
  frameworkComponentFactory: factory,
58
67
  frameworkComponents: props.components,
59
- frameworkTabComponents: props.tabComponents,
68
+ frameworkTabComponents: Object.assign(Object.assign({}, (props.tabComponents || {})), { [DEFAULT_TAB_IDENTIFIER]: props.defaultTabComponent }),
60
69
  tabHeight: props.tabHeight,
61
70
  watermarkFrameworkComponent: props.watermarkComponent,
71
+ defaultTabComponent: DEFAULT_TAB_IDENTIFIER,
62
72
  styles: props.hideBorders
63
73
  ? { separatorBorder: 'transparent' }
64
74
  : undefined,
75
+ showDndOverlay: props.showDndOverlay,
76
+ createGroupControlElement: createGroupControlElement(props.groupControlComponent, { addPortal }),
65
77
  });
66
78
  (_a = domRef.current) === null || _a === void 0 ? void 0 : _a.appendChild(dockview.element);
67
79
  dockview.deserializer = new ReactPanelDeserialzier(dockview);
@@ -138,6 +150,23 @@ export const DockviewReact = React.forwardRef((props, ref) => {
138
150
  disposable.dispose();
139
151
  };
140
152
  }, [props.onTabContextMenu]);
153
+ React.useEffect(() => {
154
+ if (!dockviewRef.current) {
155
+ return;
156
+ }
157
+ dockviewRef.current.updateOptions({
158
+ defaultTabComponent: DEFAULT_TAB_IDENTIFIER,
159
+ frameworkTabComponents: Object.assign(Object.assign({}, (props.tabComponents || {})), { [DEFAULT_TAB_IDENTIFIER]: props.defaultTabComponent }),
160
+ });
161
+ }, [props.defaultTabComponent]);
162
+ React.useEffect(() => {
163
+ if (!dockviewRef.current) {
164
+ return;
165
+ }
166
+ dockviewRef.current.updateOptions({
167
+ createGroupControlElement: createGroupControlElement(props.groupControlComponent, { addPortal }),
168
+ });
169
+ }, [props.groupControlComponent]);
141
170
  return (React.createElement("div", { className: props.className, style: { height: '100%', width: '100%' }, ref: domRef }, portals));
142
171
  });
143
172
  DockviewReact.displayName = 'DockviewComponent';
@@ -0,0 +1,43 @@
1
+ import * as React from 'react';
2
+ import { ReactPart, ReactPortalStore } from '../react';
3
+ import { PanelUpdateEvent } from '../../panel/types';
4
+ import { GroupPanel, GroupviewPanelApi } from '../../groupview/groupviewPanel';
5
+ import { DockviewApi } from '../../api/component.api';
6
+ import { IDisposable } from '../../lifecycle';
7
+ import { IDockviewPanel } from '../../groupview/groupPanel';
8
+ export interface IDockviewGroupControlProps {
9
+ api: GroupviewPanelApi;
10
+ containerApi: DockviewApi;
11
+ panels: IDockviewPanel[];
12
+ activePanel: IDockviewPanel | undefined;
13
+ isGroupActive: boolean;
14
+ }
15
+ export interface IGroupControlRenderer extends IDisposable {
16
+ readonly element: HTMLElement;
17
+ init(params: {
18
+ containerApi: DockviewApi;
19
+ api: GroupviewPanelApi;
20
+ }): void;
21
+ }
22
+ export declare class ReactGroupControlsRendererPart {
23
+ private readonly component;
24
+ private readonly reactPortalStore;
25
+ private readonly _group;
26
+ private mutableDisposable;
27
+ private _element;
28
+ private _part?;
29
+ get element(): HTMLElement;
30
+ get part(): ReactPart<IDockviewGroupControlProps> | undefined;
31
+ get group(): GroupPanel;
32
+ constructor(component: React.FunctionComponent<IDockviewGroupControlProps>, reactPortalStore: ReactPortalStore, _group: GroupPanel);
33
+ focus(): void;
34
+ init(parameters: {
35
+ containerApi: DockviewApi;
36
+ api: GroupviewPanelApi;
37
+ }): void;
38
+ update(event: PanelUpdateEvent): void;
39
+ dispose(): void;
40
+ private updatePanels;
41
+ private updateActivePanel;
42
+ private updateGroupActive;
43
+ }
@@ -0,0 +1,68 @@
1
+ import { ReactPart } from '../react';
2
+ import { CompositeDisposable, MutableDisposable, } from '../../lifecycle';
3
+ export class ReactGroupControlsRendererPart {
4
+ constructor(component, reactPortalStore, _group) {
5
+ this.component = component;
6
+ this.reactPortalStore = reactPortalStore;
7
+ this._group = _group;
8
+ this.mutableDisposable = new MutableDisposable();
9
+ this._element = document.createElement('div');
10
+ this._element.className = 'dockview-react-part';
11
+ }
12
+ get element() {
13
+ return this._element;
14
+ }
15
+ get part() {
16
+ return this._part;
17
+ }
18
+ get group() {
19
+ return this._group;
20
+ }
21
+ focus() {
22
+ // TODO
23
+ }
24
+ init(parameters) {
25
+ this.mutableDisposable.value = new CompositeDisposable(this._group.model.onDidAddPanel(() => {
26
+ this.updatePanels();
27
+ }), this._group.model.onDidRemovePanel(() => {
28
+ this.updatePanels();
29
+ }), this._group.model.onDidActivePanelChange(() => {
30
+ this.updateActivePanel();
31
+ }), parameters.api.onDidActiveChange(() => {
32
+ this.updateGroupActive();
33
+ }));
34
+ this._part = new ReactPart(this.element, this.reactPortalStore, this.component, {
35
+ api: parameters.api,
36
+ containerApi: parameters.containerApi,
37
+ panels: this._group.model.panels,
38
+ activePanel: this._group.model.activePanel,
39
+ isGroupActive: this._group.api.isActive,
40
+ });
41
+ }
42
+ update(event) {
43
+ var _a;
44
+ (_a = this._part) === null || _a === void 0 ? void 0 : _a.update(event.params);
45
+ }
46
+ dispose() {
47
+ var _a;
48
+ this.mutableDisposable.dispose();
49
+ (_a = this._part) === null || _a === void 0 ? void 0 : _a.dispose();
50
+ }
51
+ updatePanels() {
52
+ this.update({ params: { panels: this._group.model.panels } });
53
+ }
54
+ updateActivePanel() {
55
+ this.update({
56
+ params: {
57
+ activePanel: this._group.model.activePanel,
58
+ },
59
+ });
60
+ }
61
+ updateGroupActive() {
62
+ this.update({
63
+ params: {
64
+ isGroupActive: this._group.api.isActive,
65
+ },
66
+ });
67
+ }
68
+ }
@@ -1,37 +1,22 @@
1
1
  import * as React from 'react';
2
- import { IContentRenderer, GroupPanelContentPartInitParameters, ITabRenderer } from '../../groupview/types';
2
+ import { IContentRenderer, GroupPanelContentPartInitParameters } from '../../groupview/types';
3
3
  import { ReactPortalStore } from '../react';
4
4
  import { IDockviewPanelProps } from '../dockview/dockview';
5
5
  import { PanelUpdateEvent } from '../../panel/types';
6
- import { DockviewPanelApi } from '../../api/groupPanelApi';
7
- import { DockviewApi } from '../../api/component.api';
8
6
  import { GroupPanel } from '../../groupview/groupviewPanel';
9
7
  import { Event } from '../../events';
10
- export interface IGroupPanelActionbarProps {
11
- api: DockviewPanelApi;
12
- containerApi: DockviewApi;
13
- }
14
- export interface ReactContentPartContext {
15
- api: DockviewPanelApi;
16
- containerApi: DockviewApi;
17
- actionsPortalElement: HTMLElement;
18
- tabPortalElement: ITabRenderer;
19
- }
20
8
  export declare class ReactPanelContentPart implements IContentRenderer {
21
9
  readonly id: string;
22
10
  private readonly component;
23
11
  private readonly reactPortalStore;
24
12
  private _element;
25
13
  private part?;
26
- private _actionsElement;
27
- private actionsPart?;
28
14
  private _group;
29
15
  private readonly _onDidFocus;
30
16
  readonly onDidFocus: Event<void>;
31
17
  private readonly _onDidBlur;
32
18
  readonly onDidBlur: Event<void>;
33
19
  get element(): HTMLElement;
34
- get actions(): HTMLElement;
35
20
  constructor(id: string, component: React.FunctionComponent<IDockviewPanelProps>, reactPortalStore: ReactPortalStore);
36
21
  focus(): void;
37
22
  init(parameters: GroupPanelContentPartInitParameters): void;
@@ -11,30 +11,19 @@ export class ReactPanelContentPart {
11
11
  this.onDidBlur = this._onDidBlur.event;
12
12
  this._element = document.createElement('div');
13
13
  this._element.className = 'dockview-react-part';
14
- this._actionsElement = document.createElement('div');
15
- this._actionsElement.className = 'dockview-react-part';
16
14
  }
17
15
  get element() {
18
16
  return this._element;
19
17
  }
20
- get actions() {
21
- return this._actionsElement;
22
- }
23
18
  focus() {
24
19
  // TODO
25
20
  }
26
21
  init(parameters) {
27
- const context = {
28
- api: parameters.api,
29
- containerApi: parameters.containerApi,
30
- actionsPortalElement: this._actionsElement,
31
- tabPortalElement: parameters.tab,
32
- };
33
22
  this.part = new ReactPart(this.element, this.reactPortalStore, this.component, {
34
23
  params: parameters.params,
35
24
  api: parameters.api,
36
25
  containerApi: parameters.containerApi,
37
- }, context);
26
+ });
38
27
  }
39
28
  toJSON() {
40
29
  return {
@@ -52,10 +41,9 @@ export class ReactPanelContentPart {
52
41
  // noop
53
42
  }
54
43
  dispose() {
55
- var _a, _b;
44
+ var _a;
56
45
  this._onDidFocus.dispose();
57
46
  this._onDidBlur.dispose();
58
47
  (_a = this.part) === null || _a === void 0 ? void 0 : _a.dispose();
59
- (_b = this.actionsPart) === null || _b === void 0 ? void 0 : _b.dispose();
60
48
  }
61
49
  }
@@ -16,6 +16,8 @@ export declare class ReactPanelHeaderPart implements ITabRenderer {
16
16
  init(parameters: GroupPanelPartInitParameters): void;
17
17
  update(event: PanelUpdateEvent): void;
18
18
  toJSON(): {
19
+ id?: undefined;
20
+ } | {
19
21
  id: string;
20
22
  };
21
23
  layout(_width: number, _height: number): void;
@@ -1,4 +1,5 @@
1
1
  import { ReactPart } from '../react';
2
+ import { DEFAULT_TAB_IDENTIFIER } from '../../dockview/components/tab/defaultTab';
2
3
  export class ReactPanelHeaderPart {
3
4
  constructor(id, component, reactPortalStore) {
4
5
  this.id = id;
@@ -25,6 +26,9 @@ export class ReactPanelHeaderPart {
25
26
  (_a = this.part) === null || _a === void 0 ? void 0 : _a.update(event.params);
26
27
  }
27
28
  toJSON() {
29
+ if (this.id === DEFAULT_TAB_IDENTIFIER) {
30
+ return {};
31
+ }
28
32
  return {
29
33
  id: this.id,
30
34
  };
@@ -1,8 +1,8 @@
1
1
  export * from './dockview/dockview';
2
+ export * from './dockview/defaultTab';
2
3
  export * from './splitview/splitview';
3
4
  export * from './gridview/gridview';
4
- export * from './dockview/reactContentPart';
5
- export * from './dockview/reactHeaderPart';
5
+ export { IDockviewGroupControlProps } from './dockview/groupControlsRenderer';
6
6
  export { IWatermarkPanelProps } from './dockview/reactWatermarkPart';
7
7
  export * from './paneview/paneview';
8
8
  export * from './types';
@@ -1,8 +1,7 @@
1
1
  export * from './dockview/dockview';
2
+ export * from './dockview/defaultTab';
2
3
  export * from './splitview/splitview';
3
4
  export * from './gridview/gridview';
4
- export * from './dockview/reactContentPart';
5
- export * from './dockview/reactHeaderPart';
6
5
  export * from './paneview/paneview';
7
6
  export * from './types';
8
7
  export * from './react';
@@ -1,5 +1,6 @@
1
1
  import * as React from 'react';
2
2
  import { PaneviewPanelApi } from '../../api/paneviewPanelApi';
3
+ import { PaneviewDndOverlayEvent } from '../../paneview/paneviewComponent';
3
4
  import { PaneviewApi } from '../../api/component.api';
4
5
  import { PanelCollection, PanelParameters } from '../types';
5
6
  import { PaneviewDropEvent2 } from '../../paneview/draggablePaneviewPanel';
@@ -23,6 +24,7 @@ export interface IPaneviewReactProps {
23
24
  className?: string;
24
25
  disableAutoResizing?: boolean;
25
26
  disableDnd?: boolean;
27
+ showDndOverlay?: (event: PaneviewDndOverlayEvent) => boolean;
26
28
  onDidDrop?(event: PaneviewDropEvent): void;
27
29
  }
28
30
  export declare const PaneviewReact: React.ForwardRefExoticComponent<IPaneviewReactProps & React.RefAttributes<HTMLDivElement>>;
@@ -42,6 +42,7 @@ export const PaneviewReact = React.forwardRef((props, ref) => {
42
42
  createComponent,
43
43
  },
44
44
  },
45
+ showDndOverlay: props.showDndOverlay,
45
46
  });
46
47
  const api = new PaneviewApi(paneview);
47
48
  const { clientWidth, clientHeight } = domRef.current;
@@ -86,6 +87,14 @@ export const PaneviewReact = React.forwardRef((props, ref) => {
86
87
  disposable.dispose();
87
88
  };
88
89
  }, [props.onDidDrop]);
90
+ React.useEffect(() => {
91
+ if (!paneviewRef.current) {
92
+ return;
93
+ }
94
+ paneviewRef.current.updateOptions({
95
+ showDndOverlay: props.showDndOverlay,
96
+ });
97
+ }, [props.showDndOverlay]);
89
98
  return (React.createElement("div", { className: props.className, style: { height: '100%', width: '100%' }, ref: domRef }, portals));
90
99
  });
91
100
  PaneviewReact.displayName = 'PaneviewComponent';
@@ -11,6 +11,7 @@ export declare class ReactPart<P extends object, C extends object = {}> implemen
11
11
  private readonly component;
12
12
  private readonly parameters;
13
13
  private readonly context?;
14
+ private _initialProps;
14
15
  private componentInstance?;
15
16
  private ref?;
16
17
  private disposed;
@@ -41,15 +41,21 @@ export class ReactPart {
41
41
  this.component = component;
42
42
  this.parameters = parameters;
43
43
  this.context = context;
44
+ this._initialProps = {};
44
45
  this.disposed = false;
45
46
  this.createPortal();
46
47
  }
47
48
  update(props) {
48
- var _a;
49
49
  if (this.disposed) {
50
50
  throw new Error('invalid operation: resource is already disposed');
51
51
  }
52
- (_a = this.componentInstance) === null || _a === void 0 ? void 0 : _a.update(props);
52
+ if (!this.componentInstance) {
53
+ // if the component is yet to be mounted store the props
54
+ this._initialProps = Object.assign(Object.assign({}, this._initialProps), props);
55
+ }
56
+ else {
57
+ this.componentInstance.update(props);
58
+ }
53
59
  }
54
60
  createPortal() {
55
61
  if (this.disposed) {
@@ -69,6 +75,10 @@ export class ReactPart {
69
75
  componentProps: this.parameters,
70
76
  ref: (element) => {
71
77
  this.componentInstance = element;
78
+ if (Object.keys(this._initialProps).length > 0) {
79
+ this.componentInstance.update(this._initialProps);
80
+ this._initialProps = {}; // don't keep a reference to the users object once no longer required
81
+ }
72
82
  },
73
83
  });
74
84
  const node = this.context
@@ -0,0 +1,3 @@
1
+ /// <reference types="react" />
2
+ export declare const CloseButton: () => JSX.Element;
3
+ export declare const ExpandMore: () => JSX.Element;
@@ -0,0 +1,7 @@
1
+ import * as React from 'react';
2
+ export const CloseButton = () => (React.createElement("svg", { height: "11", width: "11", viewBox: "0 0 28 28", "aria-hidden": 'false', focusable: false, className: "dockview-svg" },
3
+ React.createElement("path", { d: "M2.1 27.3L0 25.2L11.55 13.65L0 2.1L2.1 0L13.65 11.55L25.2 0L27.3 2.1L15.75 13.65L27.3 25.2L25.2 27.3L13.65 15.75L2.1 27.3Z" })));
4
+ export const ExpandMore = () => {
5
+ return (React.createElement("svg", { width: "11", height: "11", viewBox: "0 0 24 15", "aria-hidden": 'false', focusable: false, className: "dockview-svg" },
6
+ React.createElement("path", { d: "M12 14.15L0 2.15L2.15 0L12 9.9L21.85 0.0499992L24 2.2L12 14.15Z" })));
7
+ };