Skip to content

Commit f7b173f

Browse files
authored
Merge pull request #488 from mathuo/469-add-window-lifecycle-callbacks-1
feat: fix popout group persistance
2 parents d488e8c + c4f46a1 commit f7b173f

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

@@ -542,17 +543,21 @@ export class DockviewComponent
542543
}
543544

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

558563
const theme = getDockviewTheme(this.gridview.element);
@@ -579,21 +584,22 @@ export class DockviewComponent
579584
return options.position;
580585
}
581586

582-
if (item instanceof DockviewGroupPanel) {
583-
return item.element.getBoundingClientRect();
587+
if (itemToPopout instanceof DockviewGroupPanel) {
588+
return itemToPopout.element.getBoundingClientRect();
584589
}
585590

586-
if (item.group) {
587-
return item.group.element.getBoundingClientRect();
591+
if (itemToPopout.group) {
592+
return itemToPopout.group.element.getBoundingClientRect();
588593
}
589594
return element.getBoundingClientRect();
590595
}
591596

592597
const box: Box = getBox();
593598

594-
const groupId = this.getNextGroupId(); //item.id;
599+
const groupId =
600+
options?.overridePopoutGroup?.id ?? this.getNextGroupId(); //item.id;
595601

596-
item.api.setHidden(true);
602+
itemToPopout.api.setHidden(true);
597603

598604
const _window = new PopoutWindow(
599605
`${this.id}-${groupId}`, // unique id
@@ -636,13 +642,18 @@ export class DockviewComponent
636642
);
637643

638644
const referenceGroup =
639-
item instanceof DockviewPanel ? item.group : item;
645+
itemToPopout instanceof DockviewPanel
646+
? itemToPopout.group
647+
: itemToPopout;
640648

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

644-
if (item instanceof DockviewPanel) {
645-
const panel = referenceGroup.model.removePanel(item);
654+
if (itemToPopout instanceof DockviewPanel) {
655+
const panel =
656+
referenceGroup.model.removePanel(itemToPopout);
646657
group.model.openPanel(panel);
647658
} else {
648659
moveGroupWithoutDestroying({
@@ -1016,6 +1027,7 @@ export class DockviewComponent
10161027
(group) => {
10171028
return {
10181029
data: group.popoutGroup.toJSON() as GroupPanelViewState,
1030+
gridReferenceGroup: group.referenceGroup.id,
10191031
position: group.window.dimensions(),
10201032
};
10211033
}
@@ -1143,14 +1155,26 @@ export class DockviewComponent
11431155
const serializedPopoutGroups = data.popoutGroups ?? [];
11441156

11451157
for (const serializedPopoutGroup of serializedPopoutGroups) {
1146-
const { data, position } = serializedPopoutGroup;
1158+
const { data, position, gridReferenceGroup } =
1159+
serializedPopoutGroup;
11471160

11481161
const group = createGroupFromSerializedState(data);
11491162

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

11561180
for (const floatingGroup of this._floatingGroups) {
@@ -1558,7 +1582,9 @@ export class DockviewComponent
15581582
if (selectedGroup) {
15591583
if (!options?.skipDispose) {
15601584
if (!options?.skipPopoutAssociated) {
1561-
this.removeGroup(selectedGroup.referenceGroup);
1585+
if (this._groups.has(selectedGroup.referenceGroup.id)) {
1586+
this.removeGroup(selectedGroup.referenceGroup);
1587+
}
15621588
}
15631589

15641590
selectedGroup.popoutGroup.dispose();

0 commit comments

Comments
 (0)