diff --git a/packages/survey-angular-ui/src/components/paneldynamic-actions/paneldynamic-add-btn.component.html b/packages/survey-angular-ui/src/components/paneldynamic-actions/paneldynamic-add-btn.component.html index 0c1d11e496..ba24a8f674 100644 --- a/packages/survey-angular-ui/src/components/paneldynamic-actions/paneldynamic-add-btn.component.html +++ b/packages/survey-angular-ui/src/components/paneldynamic-actions/paneldynamic-add-btn.component.html @@ -1,3 +1,3 @@ - \ No newline at end of file diff --git a/packages/survey-core/src/question_paneldynamic.ts b/packages/survey-core/src/question_paneldynamic.ts index 9ab9baa417..5aa947960e 100644 --- a/packages/survey-core/src/question_paneldynamic.ts +++ b/packages/survey-core/src/question_paneldynamic.ts @@ -303,10 +303,14 @@ export class QuestionPanelDynamicModel extends Question const res = this.visiblePanelsCore[i].getFirstQuestionToFocus(withError); if (!!res) return res; } + if(this.showAddPanelButton && (!withError || this.currentErrorCount > 0)) return this; return null; } - - public setSurveyImpl(value: ISurveyImpl, isLight?: boolean) { + protected getFirstInputElementId(): string { + if(this.showAddPanelButton) return this.addButtonId; + return super.getFirstInputElementId(); + } + public setSurveyImpl(value: ISurveyImpl, isLight?: boolean): void { super.setSurveyImpl(value, isLight); this.setTemplatePanelSurveyImpl(); this.setPanelsSurveyImpl(); @@ -1075,6 +1079,9 @@ export class QuestionPanelDynamicModel extends Question public set allowAddPanel(val: boolean) { this.setPropertyValue("allowAddPanel", val); } + public get addButtonId(): string { + return this.id + "addPanel"; + } /** * Specifies the position of newly added panels. * @@ -1789,13 +1796,14 @@ export class QuestionPanelDynamicModel extends Question } } this.updateIsReady(); - if (this.isReadOnly || !this.allowAddPanel) { + if (!this.showAddPanelButton) { this.updateNoEntriesTextDefaultLoc(); } this.updateFooterActions(); this.isBuildingPanelsFirstTime = false; this.releaseAnimations(); } + private get showAddPanelButton(): boolean { return this.allowAddPanel && !this.isReadOnly; } private get wasNotRenderedInSurvey(): boolean { return !this.hasPanelBuildFirstTime && !this.wasRendered && !!this.survey; } diff --git a/packages/survey-core/tests/question_paneldynamic_tests.ts b/packages/survey-core/tests/question_paneldynamic_tests.ts index d11e0850ab..c86a095daa 100644 --- a/packages/survey-core/tests/question_paneldynamic_tests.ts +++ b/packages/survey-core/tests/question_paneldynamic_tests.ts @@ -7380,4 +7380,23 @@ QUnit.test("Always focus on error in duplicated value, Bug8228", function (asser assert.ok(focusedQuestionId, "Focus on the question"); SurveyElement.FocusElement = oldFunc; -}); \ No newline at end of file +}); +QUnit.test("getFirstQuestionToFocus, Bug#8764", function (assert) { + const survey = new SurveyModel({ + elements: [ + { type: "paneldynamic", name: "panel", panelCount: 1, + templateElements: [{ type: "text", name: "q1" }, { type: "text", name: "q2", isRequired: true }] + } + ] + }); + const panel = survey.getQuestionByName("panel"); + panel.validate(true); + assert.equal(panel.getFirstQuestionToFocus(false).name, "q1", "#1"); + assert.equal(panel.getFirstQuestionToFocus(true).name, "q2", "#2"); + panel.panelCount = 0; + assert.equal(panel.getFirstQuestionToFocus(false).name, "panel", "#3"); + assert.notOk(panel.getFirstQuestionToFocus(true), "#4"); + panel.isRequired = true; + panel.validate(true); + assert.equal(panel.getFirstQuestionToFocus(true).name, "panel", "#5"); +}); diff --git a/packages/survey-react-ui/src/components/paneldynamic-actions/paneldynamic-add-btn.tsx b/packages/survey-react-ui/src/components/paneldynamic-actions/paneldynamic-add-btn.tsx index 6188aee68a..406fa51ab1 100644 --- a/packages/survey-react-ui/src/components/paneldynamic-actions/paneldynamic-add-btn.tsx +++ b/packages/survey-react-ui/src/components/paneldynamic-actions/paneldynamic-add-btn.tsx @@ -25,7 +25,7 @@ export class SurveyQuestionPanelDynamicAddButton extends SurveyQuestionPanelDyna if (!this.question.canAddPanel) return null; const btnText = this.renderLocString(this.question.locPanelAddText); return ( - ); diff --git a/packages/survey-vue3-ui/src/components/paneldynamic-actions/PaneldynamicAddBtn.vue b/packages/survey-vue3-ui/src/components/paneldynamic-actions/PaneldynamicAddBtn.vue index dfd4555b31..fe5da7e30b 100644 --- a/packages/survey-vue3-ui/src/components/paneldynamic-actions/PaneldynamicAddBtn.vue +++ b/packages/survey-vue3-ui/src/components/paneldynamic-actions/PaneldynamicAddBtn.vue @@ -1,6 +1,7 @@