dockview 1.4.3 → 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 (122) hide show
  1. package/README.md +1 -1
  2. package/dist/cjs/dockview/components/tab/defaultTab.d.ts +1 -0
  3. package/dist/cjs/dockview/components/tab/defaultTab.js +6 -3
  4. package/dist/cjs/dockview/components/tab/defaultTab.js.map +1 -1
  5. package/dist/cjs/dockview/components/watermark/watermark.js +3 -1
  6. package/dist/cjs/dockview/components/watermark/watermark.js.map +1 -1
  7. package/dist/cjs/dockview/defaultGroupPanelView.d.ts +1 -5
  8. package/dist/cjs/dockview/defaultGroupPanelView.js +5 -20
  9. package/dist/cjs/dockview/defaultGroupPanelView.js.map +1 -1
  10. package/dist/cjs/dockview/dockviewComponent.d.ts +1 -1
  11. package/dist/cjs/dockview/dockviewComponent.js +7 -18
  12. package/dist/cjs/dockview/dockviewComponent.js.map +1 -1
  13. package/dist/cjs/dockview/options.d.ts +5 -0
  14. package/dist/cjs/groupview/groupview.d.ts +16 -15
  15. package/dist/cjs/groupview/groupview.js +24 -33
  16. package/dist/cjs/groupview/groupview.js.map +1 -1
  17. package/dist/cjs/groupview/tab.d.ts +1 -0
  18. package/dist/cjs/groupview/tab.js +2 -1
  19. package/dist/cjs/groupview/tab.js.map +1 -1
  20. package/dist/cjs/groupview/titlebar/tabsContainer.js +1 -1
  21. package/dist/cjs/groupview/titlebar/tabsContainer.js.map +1 -1
  22. package/dist/cjs/groupview/types.d.ts +0 -4
  23. package/dist/cjs/index.d.ts +1 -0
  24. package/dist/cjs/index.js.map +1 -1
  25. package/dist/cjs/paneview/defaultPaneviewHeader.d.ts +3 -0
  26. package/dist/cjs/paneview/defaultPaneviewHeader.js +29 -5
  27. package/dist/cjs/paneview/defaultPaneviewHeader.js.map +1 -1
  28. package/dist/cjs/paneview/draggablePaneviewPanel.d.ts +3 -1
  29. package/dist/cjs/paneview/draggablePaneviewPanel.js +24 -9
  30. package/dist/cjs/paneview/draggablePaneviewPanel.js.map +1 -1
  31. package/dist/cjs/paneview/options.d.ts +2 -0
  32. package/dist/cjs/paneview/paneviewComponent.d.ts +12 -1
  33. package/dist/cjs/paneview/paneviewComponent.js +13 -1
  34. package/dist/cjs/paneview/paneviewComponent.js.map +1 -1
  35. package/dist/cjs/react/deserializer.js +13 -5
  36. package/dist/cjs/react/deserializer.js.map +1 -1
  37. package/dist/cjs/react/dockview/defaultTab.d.ts +4 -0
  38. package/dist/cjs/react/dockview/defaultTab.js +73 -0
  39. package/dist/cjs/react/dockview/defaultTab.js.map +1 -0
  40. package/dist/cjs/react/dockview/dockview.d.ts +3 -0
  41. package/dist/cjs/react/dockview/dockview.js +45 -3
  42. package/dist/cjs/react/dockview/dockview.js.map +1 -1
  43. package/dist/cjs/react/dockview/groupControlsRenderer.d.ts +43 -0
  44. package/dist/cjs/react/dockview/groupControlsRenderer.js +87 -0
  45. package/dist/cjs/react/dockview/groupControlsRenderer.js.map +1 -0
  46. package/dist/cjs/react/dockview/reactContentPart.d.ts +1 -16
  47. package/dist/cjs/react/dockview/reactContentPart.js +2 -18
  48. package/dist/cjs/react/dockview/reactContentPart.js.map +1 -1
  49. package/dist/cjs/react/dockview/reactHeaderPart.d.ts +2 -0
  50. package/dist/cjs/react/dockview/reactHeaderPart.js +4 -0
  51. package/dist/cjs/react/dockview/reactHeaderPart.js.map +1 -1
  52. package/dist/cjs/react/index.d.ts +2 -2
  53. package/dist/cjs/react/index.js +1 -2
  54. package/dist/cjs/react/index.js.map +1 -1
  55. package/dist/cjs/react/paneview/paneview.d.ts +2 -0
  56. package/dist/cjs/react/paneview/paneview.js +9 -0
  57. package/dist/cjs/react/paneview/paneview.js.map +1 -1
  58. package/dist/cjs/react/react.d.ts +1 -0
  59. package/dist/cjs/react/react.js +12 -2
  60. package/dist/cjs/react/react.js.map +1 -1
  61. package/dist/cjs/react/svg.d.ts +3 -0
  62. package/dist/cjs/react/svg.js +36 -0
  63. package/dist/cjs/react/svg.js.map +1 -0
  64. package/dist/cjs/svg.d.ts +3 -0
  65. package/dist/cjs/svg.js +44 -0
  66. package/dist/cjs/svg.js.map +1 -0
  67. package/dist/dockview.amd.js +327 -113
  68. package/dist/dockview.amd.min.js +2 -2
  69. package/dist/dockview.amd.min.noStyle.js +2 -2
  70. package/dist/dockview.amd.noStyle.js +326 -112
  71. package/dist/dockview.cjs.js +327 -113
  72. package/dist/dockview.esm.js +327 -112
  73. package/dist/dockview.esm.min.js +2 -2
  74. package/dist/dockview.js +327 -113
  75. package/dist/dockview.min.js +2 -2
  76. package/dist/dockview.min.noStyle.js +2 -2
  77. package/dist/dockview.noStyle.js +326 -112
  78. package/dist/esm/dockview/components/tab/defaultTab.d.ts +1 -0
  79. package/dist/esm/dockview/components/tab/defaultTab.js +5 -2
  80. package/dist/esm/dockview/components/watermark/watermark.js +3 -1
  81. package/dist/esm/dockview/defaultGroupPanelView.d.ts +1 -5
  82. package/dist/esm/dockview/defaultGroupPanelView.js +5 -16
  83. package/dist/esm/dockview/dockviewComponent.d.ts +1 -1
  84. package/dist/esm/dockview/dockviewComponent.js +7 -18
  85. package/dist/esm/dockview/options.d.ts +5 -0
  86. package/dist/esm/groupview/groupview.d.ts +16 -15
  87. package/dist/esm/groupview/groupview.js +23 -32
  88. package/dist/esm/groupview/tab.d.ts +1 -0
  89. package/dist/esm/groupview/tab.js +2 -1
  90. package/dist/esm/groupview/titlebar/tabsContainer.js +1 -1
  91. package/dist/esm/groupview/types.d.ts +0 -4
  92. package/dist/esm/index.d.ts +1 -0
  93. package/dist/esm/paneview/defaultPaneviewHeader.d.ts +3 -0
  94. package/dist/esm/paneview/defaultPaneviewHeader.js +29 -5
  95. package/dist/esm/paneview/draggablePaneviewPanel.d.ts +3 -1
  96. package/dist/esm/paneview/draggablePaneviewPanel.js +24 -9
  97. package/dist/esm/paneview/options.d.ts +2 -0
  98. package/dist/esm/paneview/paneviewComponent.d.ts +12 -1
  99. package/dist/esm/paneview/paneviewComponent.js +9 -1
  100. package/dist/esm/react/deserializer.js +13 -5
  101. package/dist/esm/react/dockview/defaultTab.d.ts +4 -0
  102. package/dist/esm/react/dockview/defaultTab.js +34 -0
  103. package/dist/esm/react/dockview/dockview.d.ts +3 -0
  104. package/dist/esm/react/dockview/dockview.js +30 -1
  105. package/dist/esm/react/dockview/groupControlsRenderer.d.ts +43 -0
  106. package/dist/esm/react/dockview/groupControlsRenderer.js +68 -0
  107. package/dist/esm/react/dockview/reactContentPart.d.ts +1 -16
  108. package/dist/esm/react/dockview/reactContentPart.js +2 -14
  109. package/dist/esm/react/dockview/reactHeaderPart.d.ts +2 -0
  110. package/dist/esm/react/dockview/reactHeaderPart.js +4 -0
  111. package/dist/esm/react/index.d.ts +2 -2
  112. package/dist/esm/react/index.js +1 -2
  113. package/dist/esm/react/paneview/paneview.d.ts +2 -0
  114. package/dist/esm/react/paneview/paneview.js +9 -0
  115. package/dist/esm/react/react.d.ts +1 -0
  116. package/dist/esm/react/react.js +12 -2
  117. package/dist/esm/react/svg.d.ts +3 -0
  118. package/dist/esm/react/svg.js +7 -0
  119. package/dist/esm/svg.d.ts +3 -0
  120. package/dist/esm/svg.js +31 -0
  121. package/dist/styles/dockview.css +155 -42
  122. package/package.json +2 -2
@@ -4,8 +4,9 @@ import { Droptarget, Position } from '../dnd/droptarget';
4
4
  import { Emitter } from '../events';
5
5
  import { PaneviewPanel, } from './paneviewPanel';
6
6
  export class DraggablePaneviewPanel extends PaneviewPanel {
7
- constructor(id, component, headerComponent, orientation, isExpanded, disableDnd) {
7
+ constructor(accessor, id, component, headerComponent, orientation, isExpanded, disableDnd) {
8
8
  super(id, component, headerComponent, orientation, isExpanded, true);
9
+ this.accessor = accessor;
9
10
  this._onDidDrop = new Emitter();
10
11
  this.onDidDrop = this._onDidDrop.event;
11
12
  if (!disableDnd) {
@@ -17,10 +18,11 @@ export class DraggablePaneviewPanel extends PaneviewPanel {
17
18
  return;
18
19
  }
19
20
  const id = this.id;
21
+ const accessorId = this.accessor.id;
20
22
  this.header.draggable = true;
21
23
  this.handler = new (class PaneDragHandler extends DragHandler {
22
24
  getData() {
23
- LocalSelectionTransfer.getInstance().setData([new PaneTransfer('paneview', id)], PaneTransfer.prototype);
25
+ LocalSelectionTransfer.getInstance().setData([new PaneTransfer(accessorId, id)], PaneTransfer.prototype);
24
26
  return {
25
27
  dispose: () => {
26
28
  LocalSelectionTransfer.getInstance().clearData(PaneTransfer.prototype);
@@ -30,12 +32,22 @@ export class DraggablePaneviewPanel extends PaneviewPanel {
30
32
  })(this.header);
31
33
  this.target = new Droptarget(this.element, {
32
34
  validOverlays: 'vertical',
33
- canDisplayOverlay: () => {
35
+ canDisplayOverlay: (event) => {
34
36
  const data = getPaneData();
35
- if (!data) {
36
- return true;
37
+ if (data) {
38
+ if (data.paneId !== this.id &&
39
+ data.viewId === this.accessor.id) {
40
+ return true;
41
+ }
37
42
  }
38
- return data.paneId !== this.id;
43
+ if (this.accessor.options.showDndOverlay) {
44
+ return this.accessor.options.showDndOverlay({
45
+ nativeEvent: event,
46
+ getData: getPaneData,
47
+ panel: this,
48
+ });
49
+ }
50
+ return false;
39
51
  },
40
52
  });
41
53
  this.addDisposables(this._onDidDrop, this.handler, this.target, this.target.onDrop((event) => {
@@ -44,8 +56,10 @@ export class DraggablePaneviewPanel extends PaneviewPanel {
44
56
  }
45
57
  onDrop(event) {
46
58
  const data = getPaneData();
47
- if (!data) {
48
- this._onDidDrop.fire(Object.assign(Object.assign({}, event), { panel: this, getData: () => getPaneData() }));
59
+ if (!data || data.viewId !== this.accessor.id) {
60
+ // if there is no local drag event for this panel
61
+ // or if the drag event was creating by another Paneview instance
62
+ this._onDidDrop.fire(Object.assign(Object.assign({}, event), { panel: this, getData: getPaneData }));
49
63
  return;
50
64
  }
51
65
  const containerApi = this._params
@@ -53,7 +67,8 @@ export class DraggablePaneviewPanel extends PaneviewPanel {
53
67
  const panelId = data.paneId;
54
68
  const existingPanel = containerApi.getPanel(panelId);
55
69
  if (!existingPanel) {
56
- this._onDidDrop.fire(Object.assign(Object.assign({}, event), { panel: this, getData: () => getPaneData() }));
70
+ // if the panel doesn't exist
71
+ this._onDidDrop.fire(Object.assign(Object.assign({}, event), { panel: this, getData: getPaneData }));
57
72
  return;
58
73
  }
59
74
  const allPanels = containerApi.panels;
@@ -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>;
@@ -79,6 +88,8 @@ export interface IPaneviewComponent extends IDisposable {
79
88
  }
80
89
  export declare class PaneviewComponent extends CompositeDisposable implements IPaneviewComponent {
81
90
  private element;
91
+ private readonly _id;
92
+ private _options;
82
93
  private _disposable;
83
94
  private _viewDisposables;
84
95
  private _paneview;
@@ -92,6 +103,7 @@ export declare class PaneviewComponent extends CompositeDisposable implements IP
92
103
  readonly onDidAddView: Event<PaneviewPanel>;
93
104
  private readonly _onDidRemoveView;
94
105
  readonly onDidRemoveView: Event<PaneviewPanel>;
106
+ get id(): string;
95
107
  get panels(): PaneviewPanel[];
96
108
  set paneview(value: Paneview);
97
109
  get paneview(): Paneview;
@@ -99,7 +111,6 @@ export declare class PaneviewComponent extends CompositeDisposable implements IP
99
111
  get maximumSize(): number;
100
112
  get height(): number;
101
113
  get width(): number;
102
- private _options;
103
114
  get options(): PaneviewComponentOptions;
104
115
  constructor(element: HTMLElement, options: PaneviewComponentOptions);
105
116
  focus(): 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;
@@ -206,6 +213,7 @@ export class PaneviewComponent extends CompositeDisposable {
206
213
  orientation: Orientation.VERTICAL,
207
214
  isExpanded: !!view.expanded,
208
215
  disableDnd: !!this.options.disableDnd,
216
+ accessor: this,
209
217
  });
210
218
  this.doAddPanel(panel);
211
219
  queue.push(() => {
@@ -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
+ };
@@ -5,6 +5,7 @@ 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 { IDockviewGroupControlProps } from './groupControlsRenderer';
8
9
  export interface IGroupPanelBaseProps<T extends {} = Record<string, any>> extends PanelParameters<T> {
9
10
  api: DockviewPanelApi;
10
11
  containerApi: DockviewApi;
@@ -28,5 +29,7 @@ export interface IDockviewReactProps {
28
29
  hideBorders?: boolean;
29
30
  className?: string;
30
31
  disableAutoResizing?: boolean;
32
+ defaultTabComponent?: React.FunctionComponent<IDockviewPanelHeaderProps>;
33
+ groupControlComponent?: React.FunctionComponent<IDockviewGroupControlProps>;
31
34
  }
32
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;