diff --git a/packages/dockview-core/src/__tests__/dockview/components/panel/content.spec.ts b/packages/dockview-core/src/__tests__/dockview/components/panel/content.spec.ts index 53f59fcbe..eacad7b9a 100644 --- a/packages/dockview-core/src/__tests__/dockview/components/panel/content.spec.ts +++ b/packages/dockview-core/src/__tests__/dockview/components/panel/content.spec.ts @@ -11,6 +11,8 @@ import { IDockviewPanel } from '../../../../dockview/dockviewPanel'; import { IDockviewPanelModel } from '../../../../dockview/dockviewPanelModel'; import { DockviewComponent } from '../../../../dockview/dockviewComponent'; import { OverlayRenderContainer } from '../../../../overlayRenderContainer'; +import { fromPartial } from '@total-typescript/shoehorn'; +import { DockviewGroupPanelModel } from '../../../../dockview/dockviewGroupPanelModel'; class TestContentRenderer extends CompositeDisposable @@ -26,6 +28,7 @@ class TestContentRenderer constructor(public id: string) { super(); this.element = document.createElement('div'); + this.element.id = id; } init(parameters: GroupPanelContentPartInitParameters): void { @@ -146,4 +149,40 @@ describe('contentContainer', () => { disposable.dispose(); }); + + test("that panels renderered as 'onlyWhenVisibile' are removed when closed", () => { + const cut = new ContentContainer( + fromPartial({ + overlayRenderContainer: { + detatch: jest.fn(), + }, + }), + fromPartial({}) + ); + + const panel1 = fromPartial({ + api: { + renderer: 'onlyWhenVisibile', + }, + view: { content: new TestContentRenderer('panel_1') }, + }); + + const panel2 = fromPartial({ + api: { + renderer: 'onlyWhenVisibile', + }, + view: { content: new TestContentRenderer('panel_2') }, + }); + + cut.openPanel(panel1); + + expect(panel1.view.content.element.parentElement).toBe(cut.element); + expect(cut.element.childNodes.length).toBe(1); + + cut.openPanel(panel2); + + expect(panel1.view.content.element.parentElement).toBeNull(); + expect(panel2.view.content.element.parentElement).toBe(cut.element); + expect(cut.element.childNodes.length).toBe(1); + }); }); diff --git a/packages/dockview-core/src/dockview/components/panel/content.ts b/packages/dockview-core/src/dockview/components/panel/content.ts index 91ea210cf..b98b12289 100644 --- a/packages/dockview-core/src/dockview/components/panel/content.ts +++ b/packages/dockview-core/src/dockview/components/panel/content.ts @@ -203,11 +203,11 @@ export class ContentContainer public closePanel(): void { if (this.panel) { - if (this.accessor.options.defaultRenderer === 'onlyWhenVisibile') { + if (this.panel.api.renderer === 'onlyWhenVisibile') { this._element.removeChild(this.panel.view.content.element); } - this.panel = undefined; } + this.panel = undefined; } public dispose(): void { diff --git a/packages/dockview-core/src/dockview/dockviewGroupPanelModel.ts b/packages/dockview-core/src/dockview/dockviewGroupPanelModel.ts index 9d8c9b18c..4462add04 100644 --- a/packages/dockview-core/src/dockview/dockviewGroupPanelModel.ts +++ b/packages/dockview-core/src/dockview/dockviewGroupPanelModel.ts @@ -138,7 +138,6 @@ export class DockviewGroupPanelModel { private readonly tabsContainer: ITabsContainer; private readonly contentContainer: IContentContainer; - // private readonly dropTarget: Droptarget; private _activePanel: IDockviewPanel | undefined; private watermark?: IWatermarkRenderer; private _isGroupActive = false; @@ -527,6 +526,7 @@ export class DockviewGroupPanelModel if (!skipSetGroupActive) { this.accessor.doSetGroupActive(this.groupPanel); } + this.contentContainer.renderPanel(panel, { asActive: true }); return; } diff --git a/packages/docs/sandboxes/demo-dockview/src/app.tsx b/packages/docs/sandboxes/demo-dockview/src/app.tsx index 58d0fd440..79885e0bf 100644 --- a/packages/docs/sandboxes/demo-dockview/src/app.tsx +++ b/packages/docs/sandboxes/demo-dockview/src/app.tsx @@ -14,8 +14,27 @@ import './app.scss'; const components = { default: (props: IDockviewPanelProps<{ title: string }>) => { return ( -
- {''} +
+ + {props.api.title} +
); },