Skip to content

Commit 5e116c8

Browse files
authored
Merge pull request #812 from mathuo/809-standardize-framework-components-1
chore: align api with existing components
2 parents 20eb30e + 5173922 commit 5e116c8

File tree

15 files changed

+262
-275
lines changed

15 files changed

+262
-275
lines changed

packages/dockview-core/src/api/component.api.ts

+10-14
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ import {
4040
} from '../dockview/dockviewGroupPanel';
4141
import { Emitter, Event } from '../events';
4242
import { IDockviewPanel } from '../dockview/dockviewPanel';
43-
import { PaneviewDropEvent } from '../paneview/draggablePaneviewPanel';
43+
import { PaneviewDidDropEvent } from '../paneview/draggablePaneviewPanel';
4444
import {
4545
GroupDragEvent,
4646
TabDragEvent,
@@ -51,7 +51,10 @@ import {
5151
DockviewWillDropEvent,
5252
WillShowOverlayLocationEvent,
5353
} from '../dockview/dockviewGroupPanelModel';
54-
import { PaneviewComponentOptions } from '../paneview/options';
54+
import {
55+
PaneviewComponentOptions,
56+
PaneviewDndOverlayEvent,
57+
} from '../paneview/options';
5558
import { SplitviewComponentOptions } from '../splitview/options';
5659
import { GridviewComponentOptions } from '../gridview/options';
5760

@@ -294,19 +297,12 @@ export class PaneviewApi implements CommonApi<SerializedPaneview> {
294297
/**
295298
* Invoked when a Drag'n'Drop event occurs that the component was unable to handle. Exposed for custom Drag'n'Drop functionality.
296299
*/
297-
get onDidDrop(): Event<PaneviewDropEvent> {
298-
const emitter = new Emitter<PaneviewDropEvent>();
299-
300-
const disposable = this.component.onDidDrop((e) => {
301-
emitter.fire({ ...e, api: this });
302-
});
303-
304-
emitter.dispose = () => {
305-
disposable.dispose();
306-
emitter.dispose();
307-
};
300+
get onDidDrop(): Event<PaneviewDidDropEvent> {
301+
return this.component.onDidDrop;
302+
}
308303

309-
return emitter.event;
304+
get onUnhandledDragOverEvent(): Event<PaneviewDndOverlayEvent> {
305+
return this.component.onUnhandledDragOverEvent;
310306
}
311307

312308
constructor(private readonly component: IPaneviewComponent) {}

packages/dockview-core/src/dockview/options.ts

+8-15
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import { DockviewPanelRenderer } from '../overlay/overlayRenderContainer';
1616
import { IGroupHeaderProps } from './framework';
1717
import { FloatingGroupOptions } from './dockviewComponent';
1818
import { Contraints } from '../gridview/gridviewPanel';
19+
import { AcceptableEvent, IAcceptableEvent } from '../events';
1920

2021
export interface IHeaderActionsRenderer extends IDisposable {
2122
readonly element: HTMLElement;
@@ -65,34 +66,26 @@ export interface DockviewOptions {
6566
noPanelsOverlay?: 'emptyGroup' | 'watermark';
6667
}
6768

68-
export interface DockviewDndOverlayEvent {
69+
export interface DockviewDndOverlayEvent extends IAcceptableEvent {
6970
nativeEvent: DragEvent;
7071
target: DockviewGroupDropLocation;
7172
position: Position;
7273
group?: DockviewGroupPanel;
7374
getData: () => PanelTransfer | undefined;
74-
//
75-
isAccepted: boolean;
76-
accept(): void;
7775
}
7876

79-
export class DockviewUnhandledDragOverEvent implements DockviewDndOverlayEvent {
80-
private _isAccepted = false;
81-
82-
get isAccepted(): boolean {
83-
return this._isAccepted;
84-
}
85-
77+
export class DockviewUnhandledDragOverEvent
78+
extends AcceptableEvent
79+
implements DockviewDndOverlayEvent
80+
{
8681
constructor(
8782
readonly nativeEvent: DragEvent,
8883
readonly target: DockviewGroupDropLocation,
8984
readonly position: Position,
9085
readonly getData: () => PanelTransfer | undefined,
9186
readonly group?: DockviewGroupPanel
92-
) {}
93-
94-
accept(): void {
95-
this._isAccepted = true;
87+
) {
88+
super();
9689
}
9790
}
9891

packages/dockview-core/src/events.ts

+17
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,23 @@ export class DockviewEvent implements IDockviewEvent {
4141
}
4242
}
4343

44+
export interface IAcceptableEvent {
45+
readonly isAccepted: boolean;
46+
accept(): void;
47+
}
48+
49+
export class AcceptableEvent implements IAcceptableEvent {
50+
private _isAccepted = false;
51+
52+
get isAccepted(): boolean {
53+
return this._isAccepted;
54+
}
55+
56+
accept(): void {
57+
this._isAccepted = true;
58+
}
59+
}
60+
4461
class LeakageMonitor {
4562
readonly events = new Map<Event<any>, Stacktrace>();
4663

packages/dockview-core/src/index.ts

+3-1
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ export * from './gridview/baseComponentGridview';
4141

4242
export {
4343
DraggablePaneviewPanel,
44-
PaneviewDropEvent,
44+
PaneviewDidDropEvent as PaneviewDropEvent,
4545
} from './paneview/draggablePaneviewPanel';
4646

4747
export * from './dockview/components/panel/content';
@@ -80,6 +80,8 @@ export {
8080
PaneviewOptions,
8181
PaneviewFrameworkOptions,
8282
PROPERTY_KEYS_PANEVIEW,
83+
PaneviewUnhandledDragOverEvent,
84+
PaneviewDndOverlayEvent,
8385
} from './paneview/options';
8486

8587
export * from './gridview/gridviewPanel';

packages/dockview-core/src/paneview/draggablePaneviewPanel.ts

+24-12
Original file line numberDiff line numberDiff line change
@@ -6,17 +6,21 @@ import {
66
PaneTransfer,
77
} from '../dnd/dataTransfer';
88
import { Droptarget, DroptargetEvent } from '../dnd/droptarget';
9-
import { Emitter } from '../events';
9+
import { Emitter, Event } from '../events';
1010
import { IDisposable } from '../lifecycle';
1111
import { Orientation } from '../splitview/splitview';
12+
import {
13+
PaneviewDndOverlayEvent,
14+
PaneviewUnhandledDragOverEvent,
15+
} from './options';
1216
import { IPaneviewComponent } from './paneviewComponent';
1317
import {
1418
IPaneviewPanel,
1519
PanePanelInitParameter,
1620
PaneviewPanel,
1721
} from './paneviewPanel';
1822

19-
export interface PaneviewDropEvent extends DroptargetEvent {
23+
export interface PaneviewDidDropEvent extends DroptargetEvent {
2024
panel: IPaneviewPanel;
2125
getData: () => PaneTransfer | undefined;
2226
api: PaneviewApi;
@@ -26,9 +30,14 @@ export abstract class DraggablePaneviewPanel extends PaneviewPanel {
2630
private handler: DragHandler | undefined;
2731
private target: Droptarget | undefined;
2832

29-
private readonly _onDidDrop = new Emitter<PaneviewDropEvent>();
33+
private readonly _onDidDrop = new Emitter<PaneviewDidDropEvent>();
3034
readonly onDidDrop = this._onDidDrop.event;
3135

36+
private readonly _onUnhandledDragOverEvent =
37+
new Emitter<PaneviewDndOverlayEvent>();
38+
readonly onUnhandledDragOverEvent: Event<PaneviewDndOverlayEvent> =
39+
this._onUnhandledDragOverEvent.event;
40+
3241
constructor(
3342
private readonly accessor: IPaneviewComponent,
3443
id: string,
@@ -40,6 +49,8 @@ export abstract class DraggablePaneviewPanel extends PaneviewPanel {
4049
) {
4150
super(id, component, headerComponent, orientation, isExpanded, true);
4251

52+
this.addDisposables(this._onDidDrop, this._onUnhandledDragOverEvent);
53+
4354
if (!disableDnd) {
4455
this.initDragFeatures();
4556
}
@@ -76,7 +87,7 @@ export abstract class DraggablePaneviewPanel extends PaneviewPanel {
7687
overlayModel: {
7788
activationSize: { type: 'percentage', value: 50 },
7889
},
79-
canDisplayOverlay: (event) => {
90+
canDisplayOverlay: (event, position) => {
8091
const data = getPaneData();
8192

8293
if (data) {
@@ -88,15 +99,16 @@ export abstract class DraggablePaneviewPanel extends PaneviewPanel {
8899
}
89100
}
90101

91-
if (this.accessor.options.showDndOverlay) {
92-
return this.accessor.options.showDndOverlay({
93-
nativeEvent: event,
94-
getData: getPaneData,
95-
panel: this,
96-
});
97-
}
102+
const firedEvent = new PaneviewUnhandledDragOverEvent(
103+
event,
104+
position,
105+
getPaneData,
106+
this
107+
);
108+
109+
this._onUnhandledDragOverEvent.fire(firedEvent);
98110

99-
return false;
111+
return firedEvent.isAccepted;
100112
},
101113
});
102114

packages/dockview-core/src/paneview/options.ts

+25-4
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
1+
import { PaneTransfer } from '../dnd/dataTransfer';
2+
import { Position } from '../dnd/droptarget';
13
import { CreateComponentOptions } from '../dockview/options';
2-
import { PaneviewDndOverlayEvent } from './paneviewComponent';
3-
import { IPanePart } from './paneviewPanel';
4+
import { AcceptableEvent, IAcceptableEvent } from '../events';
5+
import { IPanePart, IPaneviewPanel } from './paneviewPanel';
46

57
export interface PaneviewOptions {
68
disableAutoResizing?: boolean;
79
disableDnd?: boolean;
8-
showDndOverlay?: (event: PaneviewDndOverlayEvent) => boolean;
910
className?: string;
1011
}
1112

@@ -27,9 +28,29 @@ export const PROPERTY_KEYS_PANEVIEW: (keyof PaneviewOptions)[] = (() => {
2728
const properties: Record<keyof PaneviewOptions, undefined> = {
2829
disableAutoResizing: undefined,
2930
disableDnd: undefined,
30-
showDndOverlay: undefined,
3131
className: undefined,
3232
};
3333

3434
return Object.keys(properties) as (keyof PaneviewOptions)[];
3535
})();
36+
37+
export interface PaneviewDndOverlayEvent extends IAcceptableEvent {
38+
nativeEvent: DragEvent;
39+
position: Position;
40+
panel: IPaneviewPanel;
41+
getData: () => PaneTransfer | undefined;
42+
}
43+
44+
export class PaneviewUnhandledDragOverEvent
45+
extends AcceptableEvent
46+
implements PaneviewDndOverlayEvent
47+
{
48+
constructor(
49+
readonly nativeEvent: DragEvent,
50+
readonly position: Position,
51+
readonly getData: () => PaneTransfer | undefined,
52+
readonly panel: IPaneviewPanel
53+
) {
54+
super();
55+
}
56+
}

packages/dockview-core/src/paneview/paneviewComponent.ts

+21-15
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,12 @@ import {
66
MutableDisposable,
77
} from '../lifecycle';
88
import { LayoutPriority, Orientation, Sizing } from '../splitview/splitview';
9-
import { PaneviewComponentOptions } from './options';
9+
import { PaneviewComponentOptions, PaneviewDndOverlayEvent } from './options';
1010
import { Paneview } from './paneview';
1111
import { IPanePart, PaneviewPanel, IPaneviewPanel } from './paneviewPanel';
1212
import {
1313
DraggablePaneviewPanel,
14-
PaneviewDropEvent,
14+
PaneviewDidDropEvent,
1515
} from './draggablePaneviewPanel';
1616
import { DefaultHeader } from './defaultPaneviewHeader';
1717
import { sequentialNumberGenerator } from '../math';
@@ -22,12 +22,6 @@ import { Classnames } from '../dom';
2222

2323
const nextLayoutId = sequentialNumberGenerator();
2424

25-
export interface PaneviewDndOverlayEvent {
26-
nativeEvent: DragEvent;
27-
panel: IPaneviewPanel;
28-
getData: () => PaneTransfer | undefined;
29-
}
30-
3125
export interface SerializedPaneviewPanel {
3226
snap?: boolean;
3327
priority?: LayoutPriority;
@@ -106,9 +100,10 @@ export interface IPaneviewComponent extends IDisposable {
106100
readonly options: PaneviewComponentOptions;
107101
readonly onDidAddView: Event<PaneviewPanel>;
108102
readonly onDidRemoveView: Event<PaneviewPanel>;
109-
readonly onDidDrop: Event<PaneviewDropEvent>;
103+
readonly onDidDrop: Event<PaneviewDidDropEvent>;
110104
readonly onDidLayoutChange: Event<void>;
111105
readonly onDidLayoutFromJSON: Event<void>;
106+
readonly onUnhandledDragOverEvent: Event<PaneviewDndOverlayEvent>;
112107
addPanel<T extends object = Parameters>(
113108
options: AddPaneviewComponentOptions<T>
114109
): IPaneviewPanel;
@@ -137,15 +132,20 @@ export class PaneviewComponent extends Resizable implements IPaneviewComponent {
137132
private readonly _onDidLayoutChange = new Emitter<void>();
138133
readonly onDidLayoutChange: Event<void> = this._onDidLayoutChange.event;
139134

140-
private readonly _onDidDrop = new Emitter<PaneviewDropEvent>();
141-
readonly onDidDrop: Event<PaneviewDropEvent> = this._onDidDrop.event;
135+
private readonly _onDidDrop = new Emitter<PaneviewDidDropEvent>();
136+
readonly onDidDrop: Event<PaneviewDidDropEvent> = this._onDidDrop.event;
142137

143138
private readonly _onDidAddView = new Emitter<PaneviewPanel>();
144139
readonly onDidAddView = this._onDidAddView.event;
145140

146141
private readonly _onDidRemoveView = new Emitter<PaneviewPanel>();
147142
readonly onDidRemoveView = this._onDidRemoveView.event;
148143

144+
private readonly _onUnhandledDragOverEvent =
145+
new Emitter<PaneviewDndOverlayEvent>();
146+
readonly onUnhandledDragOverEvent: Event<PaneviewDndOverlayEvent> =
147+
this._onUnhandledDragOverEvent.event;
148+
149149
private readonly _classNames: Classnames;
150150

151151
get id(): string {
@@ -204,7 +204,8 @@ export class PaneviewComponent extends Resizable implements IPaneviewComponent {
204204
this._onDidLayoutfromJSON,
205205
this._onDidDrop,
206206
this._onDidAddView,
207-
this._onDidRemoveView
207+
this._onDidRemoveView,
208+
this._onUnhandledDragOverEvent
208209
);
209210

210211
this._classNames = new Classnames(this.element);
@@ -442,9 +443,14 @@ export class PaneviewComponent extends Resizable implements IPaneviewComponent {
442443
}
443444

444445
private doAddPanel(panel: PaneFramework): void {
445-
const disposable = panel.onDidDrop((event) => {
446-
this._onDidDrop.fire(event);
447-
});
446+
const disposable = new CompositeDisposable(
447+
panel.onDidDrop((event) => {
448+
this._onDidDrop.fire(event);
449+
}),
450+
panel.onUnhandledDragOverEvent((event) => {
451+
this._onUnhandledDragOverEvent.fire(event);
452+
})
453+
);
448454

449455
this._viewDisposables.set(panel.id, disposable);
450456
}

packages/dockview/src/paneview/paneview.tsx

-11
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
import React from 'react';
22
import {
33
PaneviewPanelApi,
4-
PaneviewDndOverlayEvent,
54
PaneviewApi,
65
PaneviewDropEvent,
76
createPaneview,
@@ -32,7 +31,6 @@ export interface IPaneviewReactProps extends PaneviewOptions {
3231
string,
3332
React.FunctionComponent<IPaneviewPanelProps>
3433
>;
35-
showDndOverlay?: (event: PaneviewDndOverlayEvent) => boolean;
3634
onDidDrop?(event: PaneviewDropEvent): void;
3735
}
3836

@@ -177,15 +175,6 @@ export const PaneviewReact = React.forwardRef(
177175
};
178176
}, [props.onDidDrop]);
179177

180-
React.useEffect(() => {
181-
if (!paneviewRef.current) {
182-
return;
183-
}
184-
paneviewRef.current.updateOptions({
185-
showDndOverlay: props.showDndOverlay,
186-
});
187-
}, [props.showDndOverlay]);
188-
189178
return (
190179
<div
191180
className={props.className}

packages/docs/docs/advanced/nested.mdx

+1-1
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,6 @@ import { CodeRunner } from '@site/src/components/ui/codeRunner';
88
# Nested Dockviews
99

1010
You can safely create multiple dockview instances within one page and nest dockviews within other dockviews.
11-
If you wish to interact with the drop event from one dockview instance in another dockview instance you can implement the `showDndOverlay` and `onDidDrop` props on `DockviewReact`.
11+
If you wish to interact with the drop event from one dockview instance in another dockview instance you can implement the `api.onUnhandledDragOverEvent` and `onDidDrop` props on `DockviewReact`.
1212

1313
<CodeRunner id="dockview/nested" />

0 commit comments

Comments
 (0)