Skip to content

Commit f5f0b11

Browse files
andrewtelnovnovikov82RomanTsukanov
authored
One inputPerPage feature (infinite loop) (#9197)
* Implement the basic functionality for inputPerPage * Support dynamic panel templateTitle * Finish support single input for panel dynamic * Fix compilation error * Remove wrapper panel * Remove wrapper panel in panel dynamic * Add wrapper div vs styles * Remove question.singleInputElement * Add support single input for matrix dynamic * Do not show row title for matrix dropdown * Add visibleIndex into matrix row * Implement single input for single matrix * Add choice into questionsOnPageMode property * Update navigation bar on question value changed * Do not show add button on editing empty object * Fix compilation * Do not use ReactElementFactory * Change single input root styles * Fix border issue with single matrix * Refactor getting singleInputLocTitle property * Show correct title for questions cells * FIx the issue with frame styles for cells questions * Support isAllRowRequired for single matrix * Add unit test for nested case * Implement basic functionality for nested elements * show the matrix dynamic before going to another question * Show summary for panel dynamic * Create singleInputSummary model * Support edit item in single summary model * Refactor add/remove button visibility * Refactor code related to navigation * Create new unit test on nested scenario * Fix callstack error * Correct next question * Fix infinitive loop issue * Make the nested unit test works * Fix all unit tests * Fix backward navigation in nested * Fix func name * Improve delete buttons behavior in summary * Do not show tabs in panel dynamic * Remove code for "Remove" button in the navigation bar * Fix navigation for nested questions * Add singile input navigation actions * Implement navigation doAction * Change the way we work with question.locTitle * Add styled components, #9195 * Remove add button from the summary placeholder * Use question placeholder in summary table * fixed survey widthMode, 9195 * fixed items styles, #9195 * fix breadcrumbs styles, #9195 * fix question title style, #9195 * Fix vrt test * FIx bug with text in summary for panel dynamic * Change the navigation for matrix/panel dynamic * Refactor fillSingleInputQuestionsInContainer function * Change single input action behavior * Add element.locRenderedTitle * Focus question with the error * Fix issues with validation * Call resetNavigationButton * Introduce rowText property * Fix unit tests * Change the navigation for dynamic matrix&panel * Fix `Make a horizontal scroll to show a column with an error` test * Add functional tests * singleInputRowTitle rename to singleInputTitleTemplate * #9195 - add vue components * Add survey.onCheckSingleInputPerPageMode event * Remove test.only * #9195 - fix vue reactivity * extracted simple action list * #9195 - remove inherited code from actioncontainer * #9195 - rewrite actions creation * Revert "#9195 - remove inherited code from actioncontainer" This reverts commit 71c62b4. * Revert "extracted simple action list" This reverts commit 1afad17. * #9195 - use actionbar * #9195 - question.vue resolve to merge * Fix unit test after merging * Fix lint issues * #9195 - angular-single-input * #9195 fix lint errors * fix react and vue build * #9195 - remove test code * #9195 - check if placeholder component exists * Add test on singleInputLocTitle * Update singleInputLocTitle reactivity test * #9195 - angular * fix vue markup tests * #9195 - fixed summary initial rendering * #9195 - fix angular * FIx singleInputLocTitle reactivity for panel dynamic * #9195 - fixed vue v-tests * check singleInputLocTitle reactivity on peformNext(), panel dynamic * Add descriptions * #9195 - add screenshots * replace "rowText" to "rowTitle" * #9195 - fix angular breadcrumbs --------- Co-authored-by: Aleksey Novikov <[email protected]> Co-authored-by: RomanTsukanov <[email protected]>
1 parent 2a032e6 commit f5f0b11

File tree

79 files changed

+4042
-170
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

79 files changed

+4042
-170
lines changed

.eslintignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
node_modules/
2+
playwright-report/
23
dist/
34
build/
45
build-scripts/

e2e/questionHelper.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,7 @@ export class QuestionSelect extends Question {
9191
export class QuestionText extends Question {
9292
public async fill(text: string): Promise<void> {
9393
this.scrollIntoViewIfNeeded();
94-
this.question.locator("input").fill(text);
94+
await this.question.locator("input").fill(text);
9595
}
9696
}
9797
export class QuestionComment extends Question {

e2e/questions/infinite-loop.spec.ts

Lines changed: 473 additions & 0 deletions
Large diffs are not rendered by default.

e2e/surveyHelper.ts

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,17 @@ import { expect } from "@playwright/test";
44
export class Survey {
55
public readonly completeButtonValue = "Complete";
66
public readonly nextButtonValue = "Next";
7+
public readonly previousButtonValue = "Previous";
78
constructor(public readonly page: Page) {
89
}
910
public async nextPage(): Promise<void> {
10-
await this.getNavigatorButton(this.nextButtonValue).click();
11+
await this.clicNavigatorButton(this.nextButtonValue);
12+
}
13+
public async prevPage(): Promise<void> {
14+
await this.clicNavigatorButton(this.previousButtonValue);
1115
}
1216
public async complete(): Promise<void> {
13-
await this.getNavigatorButton(this.completeButtonValue).click();
17+
await this.clicNavigatorButton(this.completeButtonValue);
1418
}
1519
public async checkNextButtonVisibility(isVisible: boolean): Promise<void> {
1620
await this.checkButtonVisibility(this.nextButtonValue, isVisible);
@@ -41,6 +45,11 @@ export class Survey {
4145
public getNavigatorButton(value: string): Locator {
4246
return this.page.locator("input[value='" + value + "']").last();
4347
}
48+
public async clicNavigatorButton(btnName: string): Promise<void> {
49+
const btn = this.getNavigatorButton(btnName);
50+
await btn.waitFor({ state: "visible" });
51+
await btn.click();
52+
}
4453
private async checkButtonVisibility(btnValue: string, isVisible: boolean): Promise<void> {
4554
const l = this.getNavigatorButton(btnValue);
4655
if (isVisible) {

package.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
"axe-playwright": "^2.1.0",
2424
"axe-testcafe": "^3.0.0",
2525
"concurrently": "^7",
26+
"cross-env": "^7.0.3",
2627
"devextreme-screenshot-comparer": "^2.0.11",
2728
"lint-staged": "^15.4.3",
2829
"eslint": "^8.57.0",
@@ -51,4 +52,4 @@
5152
"eslint --fix"
5253
]
5354
}
54-
}
55+
}

packages/survey-angular-ui/.eslintignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,3 +2,4 @@
22
build/
33
example/
44
node_modules/
5+
playwright-report/

packages/survey-angular-ui/src/angular-ui.module.ts

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,10 @@ import { FilePreviewComponent } from "./components/file/file-preview.component";
128128
import { FileItemComponent } from "./components/file/file-item.component";
129129
import { FilePageComponent } from "./components/file/file-page.component";
130130
import { SvgBundleComponent } from "./svgbundle.component";
131+
import { BreadcrumbsComponent } from "./components/breadcrumbs/breadcrumbs.component";
132+
import { SingleInputSummaryComponent } from "./components/single-input-summary/single-input-summary.component";
133+
import { MatrixDynamicPlaceholderComponent } from "./components/matrixdynamicplaceholder/matrixdynamicplaceholder.component";
134+
import { PanelDynamicPlaceholderComponent } from "./components/paneldynamicplaceholder/paneldynamicplaceholder.component";
131135

132136
@NgModule({
133137
declarations: [
@@ -147,7 +151,8 @@ import { SvgBundleComponent } from "./svgbundle.component";
147151
MatrixCellComponent, MatrixDropdownCellComponent, MatrixTableComponent, MatrixDropdownComponent,
148152
MatrixDynamicComponent, MatrixDetailButtonComponent, MatrixDynamicRemoveButtonComponent, MatrixDynamicDragDropIconComponent, MatrixRequiredHeader, ExpressionComponent, SafeResourceUrlPipe, BrandInfoComponent, QuestionErrorComponent,
149153
CustomQuestionComponent, CompositeQuestionComponent, ButtonGroupItemComponent, ButtonGroupQuestionComponent, MatrixRowComponent, ModalComponent, LogoImageComponent, SkeletonComponent, TimerPanelComponent, PaneldynamicRemoveButtonComponent,
150-
NotifierComponent, ComponentsContainerComponent, MultipleTextRowComponent, LoadingIndicatorComponent, HeaderComponent, HeaderCellComponent, HeaderMobileComponent, ChooseFileBtn, FilePreviewComponent, SvgBundleComponent, FileItemComponent, FilePageComponent
154+
NotifierComponent, ComponentsContainerComponent, MultipleTextRowComponent, LoadingIndicatorComponent, HeaderComponent, HeaderCellComponent, HeaderMobileComponent, ChooseFileBtn, FilePreviewComponent, SvgBundleComponent, FileItemComponent, FilePageComponent,
155+
BreadcrumbsComponent, SingleInputSummaryComponent, MatrixDynamicPlaceholderComponent, PanelDynamicPlaceholderComponent
151156
],
152157
imports: [
153158
CommonModule, FormsModule
@@ -170,7 +175,8 @@ import { SvgBundleComponent } from "./svgbundle.component";
170175
MatrixCellComponent, MatrixDropdownCellComponent, MatrixTableComponent, MatrixDropdownComponent,
171176
MatrixDynamicComponent, MatrixDetailButtonComponent, MatrixDynamicRemoveButtonComponent, MatrixDynamicDragDropIconComponent, MatrixRequiredHeader, ExpressionComponent, SafeResourceUrlPipe,
172177
CustomQuestionComponent, CompositeQuestionComponent, ButtonGroupQuestionComponent, ModalComponent, LogoImageComponent, SkeletonComponent, TimerPanelComponent, PaneldynamicRemoveButtonComponent,
173-
NotifierComponent, ComponentsContainerComponent, MultipleTextRowComponent, LoadingIndicatorComponent, HeaderComponent, HeaderCellComponent, HeaderMobileComponent, FilePreviewComponent, SvgBundleComponent, FileItemComponent, FilePageComponent
178+
NotifierComponent, ComponentsContainerComponent, MultipleTextRowComponent, LoadingIndicatorComponent, HeaderComponent, HeaderCellComponent, HeaderMobileComponent, FilePreviewComponent, SvgBundleComponent, FileItemComponent, FilePageComponent,
179+
BreadcrumbsComponent, SingleInputSummaryComponent, MatrixDynamicPlaceholderComponent, PanelDynamicPlaceholderComponent
174180
],
175181
providers: [PopupService],
176182
})

packages/survey-angular-ui/src/angular-ui.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,9 @@ export * from "./components/header/header.component";
123123
export * from "./components/header/header-cell.component";
124124
export * from "./components/header/header-mobile.component";
125125
export * from "./svgbundle.component";
126-
127126
export * from "./component-factory";
128-
export * from "./angular-ui.module";
127+
export * from "./angular-ui.module";
128+
export * from "./components/breadcrumbs/breadcrumbs.component";
129+
export * from "./components/single-input-summary/single-input-summary.component";
130+
export * from "./components/matrixdynamicplaceholder/matrixdynamicplaceholder.component";
131+
export * from "./components/paneldynamicplaceholder/paneldynamicplaceholder.component";
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
<div *ngIf="model.actions && model.actions.length" [class]="css.breadcrumbsRoot">
2+
<ng-container *ngFor="let item of model.actions; let itemIndex = index">
3+
<svg
4+
*ngIf="itemIndex"
5+
[class]="css.breadcrumbsSeparator"
6+
[iconName]="'arrowright-16x16'"
7+
[size]="'auto'"
8+
sv-ng-svg-icon
9+
></svg>
10+
<sv-ng-action [model]="item"></sv-ng-action>
11+
</ng-container>
12+
</div>
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
import { Component, Input } from "@angular/core";
2+
import { ActionContainer } from "survey-core";
3+
import { BaseAngular } from "../../base-angular";
4+
@Component({
5+
selector: "sv-breadcrumbs",
6+
templateUrl: "./breadcrumbs.component.html",
7+
//styles: [":host { display: none; }"],
8+
})
9+
export class BreadcrumbsComponent extends BaseAngular {
10+
@Input() model!: ActionContainer;
11+
@Input() css!: any;
12+
13+
getModel() {
14+
return this.model;
15+
}
16+
}

packages/survey-angular-ui/src/components/element-title/title-actions.component.html

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
</div>
1212
</ng-container>
1313
<ng-template #elementTitleContent>
14-
<sv-ng-string *ngIf="element.isTitleRenderedAsString" [model]="element.locTitle"></sv-ng-string>
14+
<sv-ng-string *ngIf="element.isTitleRenderedAsString" [model]="element.locRenderedTitle"></sv-ng-string>
1515
<ng-container *ngIf="!element.isTitleRenderedAsString">
1616
<span
1717
*ngIf="element.isRequireTextOnStart"
@@ -31,7 +31,7 @@
3131
[attr.aria-hidden]="true"
3232
>{{ element.requiredMark }}</span>
3333
<span *ngIf="element.isRequireTextBeforeTitle">&nbsp;</span>
34-
<sv-ng-string [model]="element.locTitle"></sv-ng-string>
34+
<sv-ng-string [model]="element.locRenderedTitle"></sv-ng-string>
3535
<span *ngIf="element.isRequireTextAfterTitle">&nbsp;</span>
3636
<span
3737
*ngIf=" element.isRequireTextAfterTitle"
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
<div [class]="question.cssClasses.noRowsSection">
2+
<div [class]="question.cssClasses.noRowsText">
3+
<sv-ng-string [model]="question.locNoRowsText"></sv-ng-string>
4+
</div>
5+
<button
6+
*ngIf="question.renderedTable.showAddRow"
7+
type="button"
8+
[class]="question.getAddRowButtonCss(true)"
9+
(click)="addRowClick()"
10+
>
11+
<sv-ng-string [model]="question.locAddRowText"></sv-ng-string>
12+
<span [class]="question.cssClasses.iconAdd"></span>
13+
</button>
14+
</div>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
import { Component, Input } from "@angular/core";
2+
import { QuestionMatrixDynamicModel } from "survey-core";
3+
import { AngularComponentFactory } from "../../component-factory";
4+
5+
@Component({
6+
selector: "sv-ng-placeholder-matrixdynamic",
7+
templateUrl: "./matrixdynamicplaceholder.component.html"
8+
})
9+
export class MatrixDynamicPlaceholderComponent {
10+
@Input() question!: QuestionMatrixDynamicModel;
11+
12+
addRowClick() {
13+
this.question.addRowUI();
14+
}
15+
}
16+
AngularComponentFactory.Instance.registerComponent("sv-ng-placeholder-matrixdynamic", MatrixDynamicPlaceholderComponent);
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
<div *ngIf="question.getShowNoEntriesPlaceholder()" [class]="question.cssClasses.noEntriesPlaceholder">
2+
<span>
3+
<sv-ng-string [model]="question.locNoEntriesText"></sv-ng-string>
4+
</span>
5+
<sv-ng-paneldynamic-add-btn *ngIf="question.canAddPanel" [data]="{ question }"></sv-ng-paneldynamic-add-btn>
6+
</div>
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
import { Component, Input } from "@angular/core";
2+
import { QuestionPanelDynamicModel } from "survey-core";
3+
import { AngularComponentFactory } from "../../component-factory";
4+
5+
@Component({
6+
selector: "sv-ng-placeholder-paneldynamic",
7+
templateUrl: "./paneldynamicplaceholder.component.html"
8+
})
9+
export class PanelDynamicPlaceholderComponent {
10+
@Input() question!: QuestionPanelDynamicModel;
11+
}
12+
AngularComponentFactory.Instance.registerComponent("sv-ng-placeholder-paneldynamic", PanelDynamicPlaceholderComponent);
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
<div *ngIf="!model.isEmpty()" [class]="css.summary">
2+
<div *ngFor="let item of model.items; index as index" [class]="css.summaryRow">
3+
<div [class]="css.summaryRowContent">
4+
<sv-ng-string [model]="item.locText"></sv-ng-string>
5+
</div>
6+
<div [class]="css.summaryRowActions">
7+
<button
8+
*ngIf="item.btnEdit"
9+
[class]="css.summaryRowActionEdit"
10+
(click)="item.btnEdit.action()"
11+
[title]="item.btnEdit.title"
12+
>
13+
<svg [iconName]="'icon-editsmall-16x16'" [size]="'auto'" sv-ng-svg-icon></svg>
14+
</button>
15+
<button
16+
*ngIf="item.showRemove && item.btnRemove"
17+
[class]="css.summaryRowActionDelete"
18+
(click)="item.btnRemove.action()"
19+
[title]="item.btnRemove.title"
20+
>
21+
<svg [iconName]="'icon-delete-16x16'" [size]="'auto'" sv-ng-svg-icon></svg>
22+
</button>
23+
</div>
24+
</div>
25+
</div>
26+
<div *ngIf="model.isEmpty()">
27+
<ng-template
28+
[component]="{
29+
name: placeholderComponent,
30+
data: {
31+
question: model.question,
32+
cssClasses: css
33+
}
34+
}"
35+
*ngIf="componentRegistered"
36+
></ng-template>
37+
<div *ngIf="!componentRegistered">
38+
<sv-ng-string [model]="model.noEntry"></sv-ng-string>
39+
</div>
40+
</div>
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
import { Component, Input } from "@angular/core";
2+
import { BaseAngular } from "../../base-angular";
3+
import { QuestionSingleInputSummary } from "survey-core";
4+
import { AngularComponentFactory } from "./../../component-factory";
5+
6+
@Component({
7+
selector: "sv-single-input-summary",
8+
templateUrl: "./single-input-summary.component.html"
9+
})
10+
export class SingleInputSummaryComponent {
11+
@Input() model!: QuestionSingleInputSummary;
12+
@Input() css!: any;
13+
14+
get placeholderComponent() { return "sv-ng-placeholder-" + this.model.question.getTemplate(); }
15+
get componentRegistered () { return AngularComponentFactory.Instance.isComponentRegistered(this.placeholderComponent); }
16+
}
17+
18+
AngularComponentFactory.Instance.registerComponent("sv-single-input-summary", SingleInputSummaryComponent);

packages/survey-angular-ui/src/question.component.html

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,24 @@
44
[attr.aria-invalid]="model.ariaInvalid" [attr.aria-label]="model.ariaLabel"
55
[attr.aria-labelledby]="model.ariaLabelledBy" [attr.aria-describedby]="model.ariaDescribedBy"
66
[attr.aria-expanded]="model.ariaExpanded">
7+
<sv-breadcrumbs
8+
*ngIf="model.singleInputHasActions"
9+
[model]="model.singleInputActions"
10+
[css]="model.cssClasses"
11+
></sv-breadcrumbs>
712
<div *ngIf="model.showErrorsAboveQuestion && model.hasVisibleErrors" [element]="model" sv-ng-errors></div>
8-
<div [element]="model" *ngIf="model.hasTitleOnLeftTop" sv-ng-element-header></div>
13+
<div [element]="model" *ngIf="!model.singleInputHideHeader && model.hasTitleOnLeftTop" sv-ng-element-header></div>
14+
<sv-single-input-summary
15+
*ngIf="!!model.singleInputSummary"
16+
[model]="model.singleInputSummary"
17+
[css]="model.cssClasses"
18+
></sv-single-input-summary>
19+
<sv-ng-element
20+
*ngIf="!model.singleInputSummary && !!singleQuestion"
21+
[model]="singleQuestion"
22+
></sv-ng-element>
923
<ng-template
24+
*ngIf="!model.singleInputSummary && !singleQuestion"
1025
[component]="{ name: getQuestionContentWrapperComponentName(), data: getQuestionContentWrapperComponentData() }">
1126
<div [class]="model.cssContent" role="presentation" [visible]="model.renderedIsExpanded">
1227
<ng-template

packages/survey-angular-ui/src/question.component.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,20 +10,30 @@ import { getComponentName } from "./question";
1010
})
1111
export class QuestionComponent extends EmbeddedViewContentComponent {
1212
@Input() model!: Question;
13+
@Input() css: any;
14+
@Input() survey: any;
1315
@ViewChild("elementContainer") rootEl?: ElementRef<HTMLDivElement>;
16+
1417
protected getModel(): Question {
1518
return this.model;
1619
}
20+
21+
get singleQuestion(): Question {
22+
return this.model.singleInputQuestion;
23+
}
24+
1725
ngAfterViewInit(): void {
1826
if (!!this.rootEl?.nativeElement) {
1927
this.model.afterRender(this.rootEl?.nativeElement);
2028
}
2129
}
30+
2231
ngOnDestroy() {
2332
if (!!this.model) {
2433
this.model.destroyResizeObserver();
2534
}
2635
}
36+
2737
public getComponentName(): string { return getComponentName(this.model); }
2838
public getQuestionContentWrapperComponentName(): string {
2939
return (<any>this.model.survey).getQuestionContentWrapperComponentName(this.model);

packages/survey-angular-ui/src/questions/matrixdynamic.component.html

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,8 @@
44
<ng-container *ngTemplateOutlet="addRowButton"></ng-container>
55
</div>
66
<sv-ng-matrix-table *ngIf="model.renderedTable?.showTable" [question]="model" [table]="model.renderedTable"></sv-ng-matrix-table>
7-
<div *ngIf="!model.renderedTable.showTable" [class]="model.cssClasses.noRowsSection">
8-
<div [class]="model.cssClasses.noRowsText" [model]="model.locNoRowsText" sv-ng-string></div>
9-
<ng-container *ngIf="model.renderedTable.showAddRow">
10-
<ng-container *ngTemplateOutlet="addRowButton"></ng-container>
11-
</ng-container>
12-
</div>
7+
<sv-ng-placeholder-matrixdynamic *ngIf="!model.renderedTable.showTable" [question]="model"></sv-ng-placeholder-matrixdynamic>
8+
139
<div *ngIf="model.renderedTable.showAddRowOnBottom" [class]="model.cssClasses.footer">
1410
<ng-container *ngTemplateOutlet="addRowButton"></ng-container>
1511
</div>

packages/survey-angular-ui/src/questions/paneldynamic.component.html

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,7 @@
22
<div *ngIf="model.hasTabbedMenu" [class]="model.getTabsContainerCss()">
33
<sv-action-bar [model]="model.tabbedMenu"></sv-action-bar>
44
</div>
5-
<div *ngIf="model.getShowNoEntriesPlaceholder()" [class]="model.cssClasses.noEntriesPlaceholder">
6-
<span [model]="model.locNoEntriesText" sv-ng-string></span>
7-
<sv-ng-paneldynamic-add-btn *ngIf="model.canAddPanel" [data]="{ question: model }"></sv-ng-paneldynamic-add-btn>
8-
</div>
5+
<sv-ng-placeholder-paneldynamic [question]="model"></sv-ng-placeholder-paneldynamic>
96
<div [class]="model.cssClasses.progress" *ngIf="model.isProgressTopShowing && model.isRangeShowing">
107
<div [class]="model.cssClasses.progressBar" [style]="{ width: model.progress }" role="progressbar"></div>
118
</div>

packages/survey-core/entries/chunks/model.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -194,6 +194,7 @@ export { PageModel } from "../../src/page";
194194
export * from "../../src/template-renderer";
195195
export { DefaultTitleModel } from "../../src/defaultTitle";
196196
export { Question } from "../../src/question";
197+
export { QuestionSingleInputSummary, QuestionSingleInputSummaryItem } from "../../src/questionSingleInputSummary";
197198
export { QuestionNonValue } from "../../src/questionnonvalue";
198199
export { QuestionEmptyModel } from "../../src/question_empty";
199200
export {

packages/survey-core/src/base-interfaces.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,11 @@ export interface ISurvey extends ITextProcessor, ISurveyErrorOwner {
110110
isDisplayMode: boolean;
111111
isDesignMode: boolean;
112112
areInvisibleElementsShowing: boolean;
113+
currentSingleQuestion: IQuestion;
114+
isSingleVisibleInput: boolean;
115+
updateNavigationElements(): void;
113116
currentSingleElement: IElement;
117+
supportsNestedSingleInput(question: IQuestion): boolean;
114118
areEmptyElementsHidden: boolean;
115119
isLoadingFromJson: boolean;
116120
isUpdateValueTextOnTyping: boolean;
@@ -381,6 +385,7 @@ export interface ITitleOwner {
381385
isRequireTextBeforeTitle: boolean;
382386
isRequireTextAfterTitle: boolean;
383387
locTitle: LocalizableString;
388+
locRenderedTitle: LocalizableString;
384389
}
385390
export interface IProgressInfo {
386391
questionCount: number;

0 commit comments

Comments
 (0)