Skip to content

Commit c4f46a1

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

File tree

1 file changed

+45
-19
lines changed

1 file changed

+45
-19
lines changed

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

+45-19
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,14 +1154,26 @@ export class DockviewComponent
11421154
const serializedPopoutGroups = data.popoutGroups ?? [];
11431155

11441156
for (const serializedPopoutGroup of serializedPopoutGroups) {
1145-
const { data, position } = serializedPopoutGroup;
1157+
const { data, position, gridReferenceGroup } =
1158+
serializedPopoutGroup;
11461159

11471160
const group = createGroupFromSerializedState(data);
11481161

1149-
this.addPopoutGroup(group, {
1150-
skipRemoveGroup: true,
1151-
position: position ?? undefined,
1152-
});
1162+
if (!gridReferenceGroup) {
1163+
/**
1164+
* workaround to handle <= v1.9.2
1165+
*/
1166+
this.doAddGroup(group, [0]);
1167+
}
1168+
1169+
this.addPopoutGroup(
1170+
this.getPanel(gridReferenceGroup) ?? group,
1171+
{
1172+
skipRemoveGroup: true,
1173+
position: position ?? undefined,
1174+
overridePopoutGroup: group,
1175+
}
1176+
);
11531177
}
11541178

11551179
for (const floatingGroup of this._floatingGroups) {
@@ -1557,7 +1581,9 @@ export class DockviewComponent
15571581
if (selectedGroup) {
15581582
if (!options?.skipDispose) {
15591583
if (!options?.skipPopoutAssociated) {
1560-
this.removeGroup(selectedGroup.referenceGroup);
1584+
if (this._groups.has(selectedGroup.referenceGroup.id)) {
1585+
this.removeGroup(selectedGroup.referenceGroup);
1586+
}
15611587
}
15621588

15631589
selectedGroup.popoutGroup.dispose();

0 commit comments

Comments
 (0)