diff --git a/src/panel.ts b/src/panel.ts index 5a2959a27a..5cd9c5eaf1 100644 --- a/src/panel.ts +++ b/src/panel.ts @@ -1981,6 +1981,9 @@ export class PanelModel extends PanelModelBase implements IElement { this.registerPropertyChangedHandlers( ["indent", "innerIndent", "rightIndent"], () => { this.onIndentChanged(); }); this.registerPropertyChangedHandlers(["colSpan"], () => { this.parent?.updateColumns(); }); + this.registerPropertyChangedHandlers(["title", "description"], () => { + this.calcHasHeader(); + }); } public getType(): string { return "panel"; @@ -1994,13 +1997,21 @@ export class PanelModel extends PanelModelBase implements IElement { } return super.getSurvey(live); } - onSurveyLoad() { + public get hasHeader(): boolean { + return this.getPropertyValue("hasHeader"); + } + private calcHasHeader(): void { + this.setPropertyValue("hasHeader", this.hasTitle || this.hasDescription && !!this.description); + } + onSurveyLoad(): void { super.onSurveyLoad(); this.onIndentChanged(); + this.calcHasHeader(); } - protected onSetData() { + protected onSetData(): void { super.onSetData(); this.onIndentChanged(); + this.calcHasHeader(); } public get isPanel(): boolean { return true; diff --git a/src/react/panel.tsx b/src/react/panel.tsx index 362dcfab9a..491317b335 100644 --- a/src/react/panel.tsx +++ b/src/react/panel.tsx @@ -57,9 +57,7 @@ export class SurveyPanel extends SurveyPanelBase { ); } protected renderHeader() { - if (!this.panel.hasTitle && !this.panel.hasDescription) { - return null; - } + if (!this.panel.hasHeader) return null; return ; } protected wrapElement(element: JSX.Element): JSX.Element { diff --git a/tests/paneltests.ts b/tests/paneltests.ts index be1338f40d..7c509f52ff 100644 --- a/tests/paneltests.ts +++ b/tests/paneltests.ts @@ -2872,4 +2872,25 @@ QUnit.test("Check if errors disappered in the closest questions on changing the q1.value = 1; assert.equal(q1.errors.length, 0, "q1.errors #3"); assert.equal(q2.errors.length, 0, "q2.errors #3"); +}); +QUnit.test("Panel hasHeader, Bug#8590", function (assert) { + const survey = new SurveyModel({ + elements: [ + { type: "panel", name: "panel1" }, + { type: "panel", name: "panel2", title: "Panel 2" }, + { type: "panel", name: "panel3", description: "Panel 3" } + ] + }); + const panel1 = survey.getPanelByName("panel1"); + const panel2 = survey.getPanelByName("panel2"); + const panel3 = survey.getPanelByName("panel3"); + assert.equal(panel1.hasHeader, false, "panel1 #1"); + assert.equal(panel2.hasHeader, true, "panel2 #1"); + assert.equal(panel3.hasHeader, true, "panel3 #1"); + panel1.title = "Panel 1"; + assert.equal(panel1.hasHeader, true, "panel1 #2"); + panel2.title = ""; + assert.equal(panel2.hasHeader, false, "panel2 #2"); + panel3.description = ""; + assert.equal(panel3.hasHeader, false, "panel3 #2"); }); \ No newline at end of file