mirror of
https://github.com/mathuo/dockview
synced 2025-02-02 14:35:46 +00:00
feat: addPanel positional index
This commit is contained in:
parent
ca6f46ac8e
commit
291e76afdb
@ -5378,6 +5378,101 @@ describe('dockviewComponent', () => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
describe('addPanel', () => {
|
describe('addPanel', () => {
|
||||||
|
test('that can add panel to index with referencePanel', () => {
|
||||||
|
const container = document.createElement('div');
|
||||||
|
|
||||||
|
const dockview = new DockviewComponent(container, {
|
||||||
|
createComponent(options) {
|
||||||
|
switch (options.name) {
|
||||||
|
case 'default':
|
||||||
|
return new PanelContentPartTest(
|
||||||
|
options.id,
|
||||||
|
options.name
|
||||||
|
);
|
||||||
|
default:
|
||||||
|
throw new Error(`unsupported`);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
});
|
||||||
|
const api = new DockviewApi(dockview);
|
||||||
|
|
||||||
|
dockview.layout(1000, 1000);
|
||||||
|
|
||||||
|
const panel1 = api.addPanel({
|
||||||
|
id: 'panel_1',
|
||||||
|
component: 'default',
|
||||||
|
});
|
||||||
|
|
||||||
|
const panel2 = api.addPanel({
|
||||||
|
id: 'panel_2',
|
||||||
|
component: 'default',
|
||||||
|
position: {
|
||||||
|
referencePanel: panel1,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
const panel3 = api.addPanel({
|
||||||
|
id: 'panel_3',
|
||||||
|
component: 'default',
|
||||||
|
position: {
|
||||||
|
referencePanel: panel1,
|
||||||
|
index: 1,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
expect(panel1.api.group.panels).toEqual([panel1, panel3, panel2]);
|
||||||
|
});
|
||||||
|
|
||||||
|
test('that can add panel to index with referenceGroup', () => {
|
||||||
|
const container = document.createElement('div');
|
||||||
|
|
||||||
|
const dockview = new DockviewComponent(container, {
|
||||||
|
createComponent(options) {
|
||||||
|
switch (options.name) {
|
||||||
|
case 'default':
|
||||||
|
return new PanelContentPartTest(
|
||||||
|
options.id,
|
||||||
|
options.name
|
||||||
|
);
|
||||||
|
default:
|
||||||
|
throw new Error(`unsupported`);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
});
|
||||||
|
const api = new DockviewApi(dockview);
|
||||||
|
|
||||||
|
dockview.layout(1000, 1000);
|
||||||
|
|
||||||
|
const panel1 = api.addPanel({
|
||||||
|
id: 'panel_1',
|
||||||
|
component: 'default',
|
||||||
|
});
|
||||||
|
|
||||||
|
const panel2 = api.addPanel({
|
||||||
|
id: 'panel_2',
|
||||||
|
component: 'default',
|
||||||
|
position: {
|
||||||
|
referencePanel: panel1,
|
||||||
|
index: 1,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
const panel3 = api.addPanel({
|
||||||
|
id: 'panel_3',
|
||||||
|
component: 'default',
|
||||||
|
position: {
|
||||||
|
referenceGroup: panel1.api.group,
|
||||||
|
index: 1,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
expect(panel1.api.group.panels).toEqual([panel1, panel3, panel2]);
|
||||||
|
|
||||||
|
panel1.api.moveTo({ index: 1 });
|
||||||
|
|
||||||
|
expect(panel1.api.group.panels).toEqual([panel3, panel1, panel2]);
|
||||||
|
});
|
||||||
|
|
||||||
test('that can add panel', () => {
|
test('that can add panel', () => {
|
||||||
const container = document.createElement('div');
|
const container = document.createElement('div');
|
||||||
|
|
||||||
|
@ -9,6 +9,15 @@ import { Emitter, Event } from '../events';
|
|||||||
import { MutableDisposable } from '../lifecycle';
|
import { MutableDisposable } from '../lifecycle';
|
||||||
import { GridviewPanelApi, GridviewPanelApiImpl } from './gridviewPanelApi';
|
import { GridviewPanelApi, GridviewPanelApiImpl } from './gridviewPanelApi';
|
||||||
|
|
||||||
|
export interface DockviewGroupMoveParams {
|
||||||
|
group?: DockviewGroupPanel;
|
||||||
|
position?: Position;
|
||||||
|
/**
|
||||||
|
* The index to place the panel within a group, only applicable if the placement is within an existing group
|
||||||
|
*/
|
||||||
|
index?: number;
|
||||||
|
}
|
||||||
|
|
||||||
export interface DockviewGroupPanelApi extends GridviewPanelApi {
|
export interface DockviewGroupPanelApi extends GridviewPanelApi {
|
||||||
readonly onDidLocationChange: Event<DockviewGroupPanelFloatingChangeEvent>;
|
readonly onDidLocationChange: Event<DockviewGroupPanelFloatingChangeEvent>;
|
||||||
readonly onDidActivePanelChange: Event<DockviewGroupChangeEvent>;
|
readonly onDidActivePanelChange: Event<DockviewGroupChangeEvent>;
|
||||||
@ -17,7 +26,7 @@ export interface DockviewGroupPanelApi extends GridviewPanelApi {
|
|||||||
* If you require the Window object
|
* If you require the Window object
|
||||||
*/
|
*/
|
||||||
getWindow(): Window;
|
getWindow(): Window;
|
||||||
moveTo(options: { group?: DockviewGroupPanel; position?: Position }): void;
|
moveTo(options: DockviewGroupMoveParams): void;
|
||||||
maximize(): void;
|
maximize(): void;
|
||||||
isMaximized(): boolean;
|
isMaximized(): boolean;
|
||||||
exitMaximized(): void;
|
exitMaximized(): void;
|
||||||
@ -28,7 +37,8 @@ export interface DockviewGroupPanelFloatingChangeEvent {
|
|||||||
readonly location: DockviewGroupLocation;
|
readonly location: DockviewGroupLocation;
|
||||||
}
|
}
|
||||||
|
|
||||||
const NOT_INITIALIZED_MESSAGE = 'dockview: DockviewGroupPanelApiImpl not initialized';
|
const NOT_INITIALIZED_MESSAGE =
|
||||||
|
'dockview: DockviewGroupPanelApiImpl not initialized';
|
||||||
|
|
||||||
export class DockviewGroupPanelApiImpl extends GridviewPanelApiImpl {
|
export class DockviewGroupPanelApiImpl extends GridviewPanelApiImpl {
|
||||||
private readonly _mutableDisposable = new MutableDisposable();
|
private readonly _mutableDisposable = new MutableDisposable();
|
||||||
@ -74,7 +84,7 @@ export class DockviewGroupPanelApiImpl extends GridviewPanelApiImpl {
|
|||||||
: window;
|
: window;
|
||||||
}
|
}
|
||||||
|
|
||||||
moveTo(options: { group?: DockviewGroupPanel; position?: Position }): void {
|
moveTo(options: DockviewGroupMoveParams): void {
|
||||||
if (!this._group) {
|
if (!this._group) {
|
||||||
throw new Error(NOT_INITIALIZED_MESSAGE);
|
throw new Error(NOT_INITIALIZED_MESSAGE);
|
||||||
}
|
}
|
||||||
@ -93,6 +103,7 @@ export class DockviewGroupPanelApiImpl extends GridviewPanelApiImpl {
|
|||||||
position: options.group
|
position: options.group
|
||||||
? options.position ?? 'center'
|
? options.position ?? 'center'
|
||||||
: 'center',
|
: 'center',
|
||||||
|
index: options.index,
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -4,9 +4,11 @@ import { DockviewGroupPanel } from '../dockview/dockviewGroupPanel';
|
|||||||
import { CompositeDisposable, MutableDisposable } from '../lifecycle';
|
import { CompositeDisposable, MutableDisposable } from '../lifecycle';
|
||||||
import { DockviewPanel } from '../dockview/dockviewPanel';
|
import { DockviewPanel } from '../dockview/dockviewPanel';
|
||||||
import { DockviewComponent } from '../dockview/dockviewComponent';
|
import { DockviewComponent } from '../dockview/dockviewComponent';
|
||||||
import { Position } from '../dnd/droptarget';
|
|
||||||
import { DockviewPanelRenderer } from '../overlay/overlayRenderContainer';
|
import { DockviewPanelRenderer } from '../overlay/overlayRenderContainer';
|
||||||
import { DockviewGroupPanelFloatingChangeEvent } from './dockviewGroupPanelApi';
|
import {
|
||||||
|
DockviewGroupMoveParams,
|
||||||
|
DockviewGroupPanelFloatingChangeEvent,
|
||||||
|
} from './dockviewGroupPanelApi';
|
||||||
import { DockviewGroupLocation } from '../dockview/dockviewGroupPanelModel';
|
import { DockviewGroupLocation } from '../dockview/dockviewGroupPanelModel';
|
||||||
|
|
||||||
export interface TitleEvent {
|
export interface TitleEvent {
|
||||||
@ -25,6 +27,8 @@ export interface GroupChangedEvent {
|
|||||||
// empty
|
// empty
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export type DockviewPanelMoveParams = DockviewGroupMoveParams;
|
||||||
|
|
||||||
export interface DockviewPanelApi
|
export interface DockviewPanelApi
|
||||||
extends Omit<
|
extends Omit<
|
||||||
GridviewPanelApi,
|
GridviewPanelApi,
|
||||||
@ -50,11 +54,7 @@ export interface DockviewPanelApi
|
|||||||
close(): void;
|
close(): void;
|
||||||
setTitle(title: string): void;
|
setTitle(title: string): void;
|
||||||
setRenderer(renderer: DockviewPanelRenderer): void;
|
setRenderer(renderer: DockviewPanelRenderer): void;
|
||||||
moveTo(options: {
|
moveTo(options: DockviewPanelMoveParams): void;
|
||||||
group: DockviewGroupPanel;
|
|
||||||
position?: Position;
|
|
||||||
index?: number;
|
|
||||||
}): void;
|
|
||||||
maximize(): void;
|
maximize(): void;
|
||||||
isMaximized(): boolean;
|
isMaximized(): boolean;
|
||||||
exitMaximized(): void;
|
exitMaximized(): void;
|
||||||
@ -160,16 +160,14 @@ export class DockviewPanelApiImpl
|
|||||||
return this.group.api.getWindow();
|
return this.group.api.getWindow();
|
||||||
}
|
}
|
||||||
|
|
||||||
moveTo(options: {
|
moveTo(options: DockviewPanelMoveParams): void {
|
||||||
group: DockviewGroupPanel;
|
|
||||||
position?: Position;
|
|
||||||
index?: number;
|
|
||||||
}): void {
|
|
||||||
this.accessor.moveGroupOrPanel({
|
this.accessor.moveGroupOrPanel({
|
||||||
from: { groupId: this._group.id, panelId: this.panel.id },
|
from: { groupId: this._group.id, panelId: this.panel.id },
|
||||||
to: {
|
to: {
|
||||||
group: options.group,
|
group: options.group ?? this._group,
|
||||||
position: options.position ?? 'center',
|
position: options.group
|
||||||
|
? options.position ?? 'center'
|
||||||
|
: 'center',
|
||||||
index: options.index,
|
index: options.index,
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
@ -1387,12 +1387,15 @@ export class DockviewComponent
|
|||||||
height: options.initialHeight,
|
height: options.initialHeight,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
let index: number | undefined;
|
||||||
|
|
||||||
if (options.position) {
|
if (options.position) {
|
||||||
if (isPanelOptionsWithPanel(options.position)) {
|
if (isPanelOptionsWithPanel(options.position)) {
|
||||||
const referencePanel =
|
const referencePanel =
|
||||||
typeof options.position.referencePanel === 'string'
|
typeof options.position.referencePanel === 'string'
|
||||||
? this.getGroupPanel(options.position.referencePanel)
|
? this.getGroupPanel(options.position.referencePanel)
|
||||||
: options.position.referencePanel;
|
: options.position.referencePanel;
|
||||||
|
index = options.position.index;
|
||||||
|
|
||||||
if (!referencePanel) {
|
if (!referencePanel) {
|
||||||
throw new Error(
|
throw new Error(
|
||||||
@ -1407,6 +1410,7 @@ export class DockviewComponent
|
|||||||
? this._groups.get(options.position.referenceGroup)
|
? this._groups.get(options.position.referenceGroup)
|
||||||
?.value
|
?.value
|
||||||
: options.position.referenceGroup;
|
: options.position.referenceGroup;
|
||||||
|
index = options.position.index;
|
||||||
|
|
||||||
if (!referenceGroup) {
|
if (!referenceGroup) {
|
||||||
throw new Error(
|
throw new Error(
|
||||||
@ -1422,6 +1426,7 @@ export class DockviewComponent
|
|||||||
group.model.openPanel(panel, {
|
group.model.openPanel(panel, {
|
||||||
skipSetActive: options.inactive,
|
skipSetActive: options.inactive,
|
||||||
skipSetGroupActive: options.inactive,
|
skipSetGroupActive: options.inactive,
|
||||||
|
index,
|
||||||
});
|
});
|
||||||
|
|
||||||
if (!options.inactive) {
|
if (!options.inactive) {
|
||||||
@ -1468,6 +1473,7 @@ export class DockviewComponent
|
|||||||
group.model.openPanel(panel, {
|
group.model.openPanel(panel, {
|
||||||
skipSetActive: options.inactive,
|
skipSetActive: options.inactive,
|
||||||
skipSetGroupActive: options.inactive,
|
skipSetGroupActive: options.inactive,
|
||||||
|
index,
|
||||||
});
|
});
|
||||||
} else if (
|
} else if (
|
||||||
referenceGroup.api.location.type === 'floating' ||
|
referenceGroup.api.location.type === 'floating' ||
|
||||||
@ -1477,6 +1483,7 @@ export class DockviewComponent
|
|||||||
referenceGroup.model.openPanel(panel, {
|
referenceGroup.model.openPanel(panel, {
|
||||||
skipSetActive: options.inactive,
|
skipSetActive: options.inactive,
|
||||||
skipSetGroupActive: options.inactive,
|
skipSetGroupActive: options.inactive,
|
||||||
|
index,
|
||||||
});
|
});
|
||||||
|
|
||||||
referenceGroup.api.setSize({
|
referenceGroup.api.setSize({
|
||||||
@ -1505,6 +1512,7 @@ export class DockviewComponent
|
|||||||
group.model.openPanel(panel, {
|
group.model.openPanel(panel, {
|
||||||
skipSetActive: options.inactive,
|
skipSetActive: options.inactive,
|
||||||
skipSetGroupActive: options.inactive,
|
skipSetGroupActive: options.inactive,
|
||||||
|
index,
|
||||||
});
|
});
|
||||||
|
|
||||||
if (!options.inactive) {
|
if (!options.inactive) {
|
||||||
@ -1532,6 +1540,7 @@ export class DockviewComponent
|
|||||||
group.model.openPanel(panel, {
|
group.model.openPanel(panel, {
|
||||||
skipSetActive: options.inactive,
|
skipSetActive: options.inactive,
|
||||||
skipSetGroupActive: options.inactive,
|
skipSetGroupActive: options.inactive,
|
||||||
|
index,
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
const group = this.createGroupAtLocation(
|
const group = this.createGroupAtLocation(
|
||||||
@ -1544,6 +1553,7 @@ export class DockviewComponent
|
|||||||
group.model.openPanel(panel, {
|
group.model.openPanel(panel, {
|
||||||
skipSetActive: options.inactive,
|
skipSetActive: options.inactive,
|
||||||
skipSetGroupActive: options.inactive,
|
skipSetGroupActive: options.inactive,
|
||||||
|
index,
|
||||||
});
|
});
|
||||||
|
|
||||||
if (!options.inactive) {
|
if (!options.inactive) {
|
||||||
|
@ -326,7 +326,7 @@ export class DockviewGroupPanelModel
|
|||||||
private readonly _api: DockviewApi;
|
private readonly _api: DockviewApi;
|
||||||
|
|
||||||
get element(): HTMLElement {
|
get element(): HTMLElement {
|
||||||
throw new Error('not supported');
|
throw new Error('dockview: not supported');
|
||||||
}
|
}
|
||||||
|
|
||||||
get activePanel(): IDockviewPanel | undefined {
|
get activePanel(): IDockviewPanel | undefined {
|
||||||
|
@ -159,11 +159,19 @@ export interface PanelOptions<P extends object = Parameters> {
|
|||||||
type RelativePanel = {
|
type RelativePanel = {
|
||||||
direction?: Direction;
|
direction?: Direction;
|
||||||
referencePanel: string | IDockviewPanel;
|
referencePanel: string | IDockviewPanel;
|
||||||
|
/**
|
||||||
|
* The index to place the panel within a group, only applicable if the placement is within an existing group
|
||||||
|
*/
|
||||||
|
index?: number;
|
||||||
};
|
};
|
||||||
|
|
||||||
type RelativeGroup = {
|
type RelativeGroup = {
|
||||||
direction?: Direction;
|
direction?: Direction;
|
||||||
referenceGroup: string | DockviewGroupPanel;
|
referenceGroup: string | DockviewGroupPanel;
|
||||||
|
/**
|
||||||
|
* The index to place the panel within a group, only applicable if the placement is within an existing group
|
||||||
|
*/
|
||||||
|
index?: number;
|
||||||
};
|
};
|
||||||
|
|
||||||
type AbsolutePosition = {
|
type AbsolutePosition = {
|
||||||
|
@ -100,6 +100,7 @@ export {
|
|||||||
TitleEvent,
|
TitleEvent,
|
||||||
RendererChangedEvent,
|
RendererChangedEvent,
|
||||||
DockviewPanelApi,
|
DockviewPanelApi,
|
||||||
|
DockviewPanelMoveParams,
|
||||||
} from './api/dockviewPanelApi';
|
} from './api/dockviewPanelApi';
|
||||||
export {
|
export {
|
||||||
PanelSizeEvent,
|
PanelSizeEvent,
|
||||||
@ -110,6 +111,7 @@ export { ExpansionEvent, PaneviewPanelApi } from './api/paneviewPanelApi';
|
|||||||
export {
|
export {
|
||||||
DockviewGroupPanelApi,
|
DockviewGroupPanelApi,
|
||||||
DockviewGroupPanelFloatingChangeEvent,
|
DockviewGroupPanelFloatingChangeEvent,
|
||||||
|
DockviewGroupMoveParams,
|
||||||
} from './api/dockviewGroupPanelApi';
|
} from './api/dockviewGroupPanelApi';
|
||||||
export {
|
export {
|
||||||
CommonApi,
|
CommonApi,
|
||||||
|
Loading…
Reference in New Issue
Block a user