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.
- package/README.md +1 -1
- package/dist/cjs/dockview/components/tab/defaultTab.d.ts +1 -0
- package/dist/cjs/dockview/components/tab/defaultTab.js +6 -3
- package/dist/cjs/dockview/components/tab/defaultTab.js.map +1 -1
- package/dist/cjs/dockview/components/watermark/watermark.js +3 -1
- package/dist/cjs/dockview/components/watermark/watermark.js.map +1 -1
- package/dist/cjs/dockview/defaultGroupPanelView.d.ts +1 -5
- package/dist/cjs/dockview/defaultGroupPanelView.js +5 -20
- package/dist/cjs/dockview/defaultGroupPanelView.js.map +1 -1
- package/dist/cjs/dockview/dockviewComponent.d.ts +1 -1
- package/dist/cjs/dockview/dockviewComponent.js +7 -18
- package/dist/cjs/dockview/dockviewComponent.js.map +1 -1
- package/dist/cjs/dockview/options.d.ts +5 -0
- package/dist/cjs/groupview/groupview.d.ts +16 -15
- package/dist/cjs/groupview/groupview.js +24 -33
- package/dist/cjs/groupview/groupview.js.map +1 -1
- package/dist/cjs/groupview/tab.d.ts +1 -0
- package/dist/cjs/groupview/tab.js +2 -1
- package/dist/cjs/groupview/tab.js.map +1 -1
- package/dist/cjs/groupview/titlebar/tabsContainer.js +1 -1
- package/dist/cjs/groupview/titlebar/tabsContainer.js.map +1 -1
- package/dist/cjs/groupview/types.d.ts +0 -4
- package/dist/cjs/index.d.ts +1 -0
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/paneview/defaultPaneviewHeader.d.ts +3 -0
- package/dist/cjs/paneview/defaultPaneviewHeader.js +29 -5
- package/dist/cjs/paneview/defaultPaneviewHeader.js.map +1 -1
- package/dist/cjs/paneview/draggablePaneviewPanel.d.ts +3 -1
- package/dist/cjs/paneview/draggablePaneviewPanel.js +24 -9
- package/dist/cjs/paneview/draggablePaneviewPanel.js.map +1 -1
- package/dist/cjs/paneview/options.d.ts +2 -0
- package/dist/cjs/paneview/paneviewComponent.d.ts +12 -1
- package/dist/cjs/paneview/paneviewComponent.js +13 -1
- package/dist/cjs/paneview/paneviewComponent.js.map +1 -1
- package/dist/cjs/react/deserializer.js +13 -5
- package/dist/cjs/react/deserializer.js.map +1 -1
- package/dist/cjs/react/dockview/defaultTab.d.ts +4 -0
- package/dist/cjs/react/dockview/defaultTab.js +73 -0
- package/dist/cjs/react/dockview/defaultTab.js.map +1 -0
- package/dist/cjs/react/dockview/dockview.d.ts +3 -0
- package/dist/cjs/react/dockview/dockview.js +45 -3
- package/dist/cjs/react/dockview/dockview.js.map +1 -1
- package/dist/cjs/react/dockview/groupControlsRenderer.d.ts +43 -0
- package/dist/cjs/react/dockview/groupControlsRenderer.js +87 -0
- package/dist/cjs/react/dockview/groupControlsRenderer.js.map +1 -0
- package/dist/cjs/react/dockview/reactContentPart.d.ts +1 -16
- package/dist/cjs/react/dockview/reactContentPart.js +2 -18
- package/dist/cjs/react/dockview/reactContentPart.js.map +1 -1
- package/dist/cjs/react/dockview/reactHeaderPart.d.ts +2 -0
- package/dist/cjs/react/dockview/reactHeaderPart.js +4 -0
- package/dist/cjs/react/dockview/reactHeaderPart.js.map +1 -1
- package/dist/cjs/react/index.d.ts +2 -2
- package/dist/cjs/react/index.js +1 -2
- package/dist/cjs/react/index.js.map +1 -1
- package/dist/cjs/react/paneview/paneview.d.ts +2 -0
- package/dist/cjs/react/paneview/paneview.js +9 -0
- package/dist/cjs/react/paneview/paneview.js.map +1 -1
- package/dist/cjs/react/react.d.ts +1 -0
- package/dist/cjs/react/react.js +12 -2
- package/dist/cjs/react/react.js.map +1 -1
- package/dist/cjs/react/svg.d.ts +3 -0
- package/dist/cjs/react/svg.js +36 -0
- package/dist/cjs/react/svg.js.map +1 -0
- package/dist/cjs/svg.d.ts +3 -0
- package/dist/cjs/svg.js +44 -0
- package/dist/cjs/svg.js.map +1 -0
- package/dist/dockview.amd.js +327 -113
- package/dist/dockview.amd.min.js +2 -2
- package/dist/dockview.amd.min.noStyle.js +2 -2
- package/dist/dockview.amd.noStyle.js +326 -112
- package/dist/dockview.cjs.js +327 -113
- package/dist/dockview.esm.js +327 -112
- package/dist/dockview.esm.min.js +2 -2
- package/dist/dockview.js +327 -113
- package/dist/dockview.min.js +2 -2
- package/dist/dockview.min.noStyle.js +2 -2
- package/dist/dockview.noStyle.js +326 -112
- package/dist/esm/dockview/components/tab/defaultTab.d.ts +1 -0
- package/dist/esm/dockview/components/tab/defaultTab.js +5 -2
- package/dist/esm/dockview/components/watermark/watermark.js +3 -1
- package/dist/esm/dockview/defaultGroupPanelView.d.ts +1 -5
- package/dist/esm/dockview/defaultGroupPanelView.js +5 -16
- package/dist/esm/dockview/dockviewComponent.d.ts +1 -1
- package/dist/esm/dockview/dockviewComponent.js +7 -18
- package/dist/esm/dockview/options.d.ts +5 -0
- package/dist/esm/groupview/groupview.d.ts +16 -15
- package/dist/esm/groupview/groupview.js +23 -32
- package/dist/esm/groupview/tab.d.ts +1 -0
- package/dist/esm/groupview/tab.js +2 -1
- package/dist/esm/groupview/titlebar/tabsContainer.js +1 -1
- package/dist/esm/groupview/types.d.ts +0 -4
- package/dist/esm/index.d.ts +1 -0
- package/dist/esm/paneview/defaultPaneviewHeader.d.ts +3 -0
- package/dist/esm/paneview/defaultPaneviewHeader.js +29 -5
- package/dist/esm/paneview/draggablePaneviewPanel.d.ts +3 -1
- package/dist/esm/paneview/draggablePaneviewPanel.js +24 -9
- package/dist/esm/paneview/options.d.ts +2 -0
- package/dist/esm/paneview/paneviewComponent.d.ts +12 -1
- package/dist/esm/paneview/paneviewComponent.js +9 -1
- package/dist/esm/react/deserializer.js +13 -5
- package/dist/esm/react/dockview/defaultTab.d.ts +4 -0
- package/dist/esm/react/dockview/defaultTab.js +34 -0
- package/dist/esm/react/dockview/dockview.d.ts +3 -0
- package/dist/esm/react/dockview/dockview.js +30 -1
- package/dist/esm/react/dockview/groupControlsRenderer.d.ts +43 -0
- package/dist/esm/react/dockview/groupControlsRenderer.js +68 -0
- package/dist/esm/react/dockview/reactContentPart.d.ts +1 -16
- package/dist/esm/react/dockview/reactContentPart.js +2 -14
- package/dist/esm/react/dockview/reactHeaderPart.d.ts +2 -0
- package/dist/esm/react/dockview/reactHeaderPart.js +4 -0
- package/dist/esm/react/index.d.ts +2 -2
- package/dist/esm/react/index.js +1 -2
- package/dist/esm/react/paneview/paneview.d.ts +2 -0
- package/dist/esm/react/paneview/paneview.js +9 -0
- package/dist/esm/react/react.d.ts +1 -0
- package/dist/esm/react/react.js +12 -2
- package/dist/esm/react/svg.d.ts +3 -0
- package/dist/esm/react/svg.js +7 -0
- package/dist/esm/svg.d.ts +3 -0
- package/dist/esm/svg.js +31 -0
- package/dist/styles/dockview.css +155 -42
- 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(
|
|
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 (
|
|
36
|
-
|
|
37
|
+
if (data) {
|
|
38
|
+
if (data.paneId !== this.id &&
|
|
39
|
+
data.viewId === this.accessor.id) {
|
|
40
|
+
return true;
|
|
41
|
+
}
|
|
37
42
|
}
|
|
38
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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, (
|
|
19
|
-
tab
|
|
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
|
|
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
|
-
}
|
|
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
|
|
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
|
|
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';
|
package/dist/esm/react/index.js
CHANGED
|
@@ -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;
|