Skip to content

Commit 41a8c9e

Browse files
committed
feat: fix popout group persistance
1 parent 0bca63b commit 41a8c9e

File tree

1 file changed

+35
-16
lines changed

1 file changed

+35
-16
lines changed

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

+35-16
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,7 @@ export interface SerializedFloatingGroup {
110110

111111
export interface SerializedPopoutGroup {
112112
data: GroupPanelViewState;
113+
gridReferenceGroup: string;
113114
position: Box | null;
114115
}
115116

@@ -541,17 +542,21 @@ export class DockviewComponent
541542
}
542543

543544
addPopoutGroup(
544-
item: DockviewPanel | DockviewGroupPanel,
545+
itemToPopout: DockviewPanel | DockviewGroupPanel,
545546
options?: {
546547
skipRemoveGroup?: boolean;
547548
position?: Box;
548549
popoutUrl?: string;
549550
onDidOpen?: (event: { id: string; window: Window }) => void;
550551
onWillClose?: (event: { id: string; window: Window }) => void;
552+
overridePopoutGroup?: DockviewGroupPanel;
551553
}
552554
): Promise<void> {
553-
if (item instanceof DockviewPanel && item.group.size === 1) {
554-
return this.addPopoutGroup(item.group);
555+
if (
556+
itemToPopout instanceof DockviewPanel &&
557+
itemToPopout.group.size === 1
558+
) {
559+
return this.addPopoutGroup(itemToPopout.group);
555560
}
556561

557562
const theme = getDockviewTheme(this.gridview.element);
@@ -578,21 +583,22 @@ export class DockviewComponent
578583
return options.position;
579584
}
580585

581-
if (item instanceof DockviewGroupPanel) {
582-
return item.element.getBoundingClientRect();
586+
if (itemToPopout instanceof DockviewGroupPanel) {
587+
return itemToPopout.element.getBoundingClientRect();
583588
}
584589

585-
if (item.group) {
586-
return item.group.element.getBoundingClientRect();
590+
if (itemToPopout.group) {
591+
return itemToPopout.group.element.getBoundingClientRect();
587592
}
588593
return element.getBoundingClientRect();
589594
}
590595

591596
const box: Box = getBox();
592597

593-
const groupId = this.getNextGroupId(); //item.id;
598+
const groupId =
599+
options?.overridePopoutGroup?.id ?? this.getNextGroupId(); //item.id;
594600

595-
item.api.setHidden(true);
601+
itemToPopout.api.setHidden(true);
596602

597603
const _window = new PopoutWindow(
598604
`${this.id}-${groupId}`, // unique id
@@ -635,13 +641,18 @@ export class DockviewComponent
635641
);
636642

637643
const referenceGroup =
638-
item instanceof DockviewPanel ? item.group : item;
644+
itemToPopout instanceof DockviewPanel
645+
? itemToPopout.group
646+
: itemToPopout;
639647

640-
const group = this.createGroup({ id: groupId });
648+
const group =
649+
options?.overridePopoutGroup ??
650+
this.createGroup({ id: groupId });
641651
group.model.renderContainer = overlayRenderContainer;
642652

643-
if (item instanceof DockviewPanel) {
644-
const panel = referenceGroup.model.removePanel(item);
653+
if (itemToPopout instanceof DockviewPanel) {
654+
const panel =
655+
referenceGroup.model.removePanel(itemToPopout);
645656
group.model.openPanel(panel);
646657
} else {
647658
moveGroupWithoutDestroying({
@@ -1015,6 +1026,7 @@ export class DockviewComponent
10151026
(group) => {
10161027
return {
10171028
data: group.popoutGroup.toJSON() as GroupPanelViewState,
1029+
gridReferenceGroup: group.referenceGroup.id,
10181030
position: group.window.dimensions(),
10191031
};
10201032
}
@@ -1142,13 +1154,18 @@ export class DockviewComponent
11421154
const serializedPopoutGroups = data.popoutGroups ?? [];
11431155

11441156
for (const serializedPopoutGroup of serializedPopoutGroups) {
1145-
const { data, position } = serializedPopoutGroup;
1157+
const {
1158+
data,
1159+
position,
1160+
gridReferenceGroup: referenceGroup,
1161+
} = serializedPopoutGroup;
11461162

11471163
const group = createGroupFromSerializedState(data);
11481164

1149-
this.addPopoutGroup(group, {
1165+
this.addPopoutGroup(this.getPanel(referenceGroup) ?? group, {
11501166
skipRemoveGroup: true,
11511167
position: position ?? undefined,
1168+
overridePopoutGroup: group,
11521169
});
11531170
}
11541171

@@ -1557,7 +1574,9 @@ export class DockviewComponent
15571574
if (selectedGroup) {
15581575
if (!options?.skipDispose) {
15591576
if (!options?.skipPopoutAssociated) {
1560-
this.removeGroup(selectedGroup.referenceGroup);
1577+
if (this._groups.has(selectedGroup.referenceGroup.id)) {
1578+
this.removeGroup(selectedGroup.referenceGroup);
1579+
}
15611580
}
15621581

15631582
selectedGroup.popoutGroup.dispose();

0 commit comments

Comments
 (0)