From 847fcc06e4903482d7edb778a157a6b755aa66d8 Mon Sep 17 00:00:00 2001 From: Andrew Telnov Date: Fri, 28 Jun 2024 15:45:53 +0300 Subject: [PATCH 1/2] Add an API method that would return survey data with or without pages and panels fix #8421 --- src/jsonobject.ts | 2 +- src/survey-element.ts | 41 ++++++++++++++++++++--------------------- src/survey.ts | 6 ++++++ tests/surveytests.ts | 24 ++++++++++++++++++++++++ 4 files changed, 51 insertions(+), 22 deletions(-) diff --git a/src/jsonobject.ts b/src/jsonobject.ts index e86e589c9c..550718cfec 100644 --- a/src/jsonobject.ts +++ b/src/jsonobject.ts @@ -1714,7 +1714,7 @@ export class JsonObject { options?: ISaveToJSONOptions | boolean ): any { if (!obj || !obj.getType) return obj; - if (typeof obj.getData === "function") return obj.getData(); + if (!obj.isSurvey && typeof obj.getData === "function") return obj.getData(); var result = {}; if (property != null && !property.className) { (result)[JsonObject.typePropertyName] = property.getObjType( diff --git a/src/survey-element.ts b/src/survey-element.ts index 7ad1ab8bbc..184032d8ae 100644 --- a/src/survey-element.ts +++ b/src/survey-element.ts @@ -37,6 +37,26 @@ export abstract class SurveyElementCore extends Base implements ILocalizableOwne protected createLocTitleProperty(): LocalizableString { return this.createLocalizableString("title", this, true); } + /** + * Returns `true` if the survey element is a page. + * @see Base.getType + */ + public get isPage(): boolean { return false; } + /** + * Returns `true` if the survey element is a panel. + * @see Base.getType + */ + public get isPanel(): boolean { return false; } + /** + * Returns `true` if the survey element is a question. + * @see Base.getType + */ + public get isQuestion(): boolean { return false; } + /** + * Returns `true` if the element is a survey. + * @see Base.getType + */ + public get isSurvey(): boolean { return false; } /** * A title for the survey element. If `title` is undefined, the `name` property value is displayed instead. * @@ -671,27 +691,6 @@ export class SurveyElement extends SurveyElementCore implements ISurvey public setVisibleIndex(index: number): number { return 0; } - /** - * Returns `true` if the survey element is a page. - * @see Base.getType - */ - public get isPage(): boolean { - return false; - } - /** - * Returns `true` if the survey element is a panel. - * @see Base.getType - */ - public get isPanel(): boolean { - return false; - } - /** - * Returns `true` if the survey element is a question. - * @see Base.getType - */ - public get isQuestion(): boolean { - return false; - } public delete(doDispose: boolean): void { } //ILocalizableOwner locOwner: ILocalizableOwner; diff --git a/src/survey.ts b/src/survey.ts index cf720aa3c6..269259e3e5 100644 --- a/src/survey.ts +++ b/src/survey.ts @@ -2901,6 +2901,12 @@ export class SurveyModel extends SurveyElementCore this.runConditions(); this.updateAllQuestionsValue(clearData); } + public get isSurvey(): boolean { return true; } + public getData(options?: { includePages?: boolean, includePanels?: boolean}): any { + const opt = options || { includePages: false, includePanels: false }; + if(!opt.includePages && !opt.includePanels) return this.data; + return this.getStructuredData(!!opt.includePages, !opt.includePanels ? (opt.includePages ? 1 : 0) : -1); + } public getStructuredData(includePages: boolean = true, level: number = -1): any { if (level === 0) return this.data; const data: any = {}; diff --git a/tests/surveytests.ts b/tests/surveytests.ts index 9d27e805e7..2a646f8dec 100644 --- a/tests/surveytests.ts +++ b/tests/surveytests.ts @@ -17956,6 +17956,30 @@ QUnit.test("getStructuredData function", function (assert) { }, "includePages: false, level: 3"); }); +QUnit.test("getData function", function (assert) { + const survey = new SurveyModel(structedDataSurveyJSON); + survey.setValue("q1", 100); + survey.setValue("q2", 200); + survey.setValue("q3", 300); + survey.setValue("q21", 2100); + survey.setValue("q22", 2200); + const data = survey.data; + assert.deepEqual(survey.getData(), data, "survey.getData()"); + assert.deepEqual(survey.getData({}), data, "survey.getData({})"); + assert.deepEqual(survey.getData({ includePages: false, includePanels: false }), data, "survey.getData({ includePages: false, includePanels: false })"); + assert.deepEqual(survey.getData({ includePages: true, includePanels: false }), { + page1: { q1: 100, q2: 200, q3: 300 }, + page2: { q21: 2100, q22: 2200 }, + }, "survey.getData({ includePages: true, includePanels: false })"); + assert.deepEqual(survey.getData({ includePages: true, includePanels: true }), { + page1: { q1: 100, panel1: { q2: 200, panel2: { q3: 300 } } }, + page2: { q21: 2100, panel21: { q22: 2200 } }, + }, "survey.getData({ includePages: true, includePanels: true })"); + assert.deepEqual(survey.getData({ includePages: false, includePanels: true }), { + q1: 100, panel1: { q2: 200, panel2: { q3: 300 } }, + q21: 2100, panel21: { q22: 2200 }, + }, "survey.getData({ includePages: true, includePanels: true })"); +}); QUnit.test("setStructuredData function", function (assert) { const survey = new SurveyModel(structedDataSurveyJSON); survey.setStructuredData({ From 6fb05ad9330859e1987ec5da2663a13ef2975f70 Mon Sep 17 00:00:00 2001 From: RomanTsukanov Date: Thu, 4 Jul 2024 14:25:38 +0400 Subject: [PATCH 2/2] Add a description --- src/survey.ts | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/src/survey.ts b/src/survey.ts index 269259e3e5..5437b6123a 100644 --- a/src/survey.ts +++ b/src/survey.ts @@ -2902,7 +2902,20 @@ export class SurveyModel extends SurveyElementCore this.updateAllQuestionsValue(clearData); } public get isSurvey(): boolean { return true; } - public getData(options?: { includePages?: boolean, includePanels?: boolean}): any { + /** + * Returns an object with survey results. + * + * If you want to get a survey results object that mirrors the survey structure, call the `getData()` method with an object that has the `includePages` and `includePanels` properties enabled. Without this object, the `getData()` method returns the [`data`](https://surveyjs.io/form-library/documentation/api-reference/survey-data-model#data) property value. + * + * ```js + * import { Model } from "survey-core"; + * + * const surveyJson = { ... }; + * const survey = new Model(surveyJson); + * survey.getData({ includePages: true, includePanels: true }); + * ``` + */ + public getData(options?: { includePages?: boolean, includePanels?: boolean }): any { const opt = options || { includePages: false, includePanels: false }; if(!opt.includePages && !opt.includePanels) return this.data; return this.getStructuredData(!!opt.includePages, !opt.includePanels ? (opt.includePages ? 1 : 0) : -1);