@researchdatabox/sails-ng-common 0.0.1-beta.9700 → 0.0.1-beta.9909
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/src/config/component/cancel-button.model.d.ts +2 -0
- package/dist/src/config/component/cancel-button.model.js +3 -1
- package/dist/src/config/component/cancel-button.outline.d.ts +10 -0
- package/dist/src/config/component/delete-button.model.d.ts +4 -4
- package/dist/src/config/component/delete-button.model.js +5 -5
- package/dist/src/config/component/delete-button.outline.d.ts +32 -4
- package/dist/src/config/component/question-tree.helper.d.ts +21 -24
- package/dist/src/config/component/question-tree.helper.js +125 -132
- package/dist/src/config/component/question-tree.outline.d.ts +6 -3
- package/dist/src/config/component/question-tree.outline.js +1 -1
- package/dist/src/config/component/save-button.outline.d.ts +2 -0
- package/dist/src/config/form-component.outline.d.ts +1 -1
- package/dist/src/config/form-override.model.d.ts +2 -1
- package/dist/src/config/form-override.model.js +7 -3
- package/dist/src/index.d.ts +1 -0
- package/dist/src/index.js +2 -1
- package/dist/src/report.model.d.ts +43 -0
- package/dist/src/validation/form.model.d.ts +21 -0
- package/dist/src/validation/form.model.js +1 -1
- package/dist/src/validation/helpers.js +12 -3
- package/dist/src/validation/validators-support.js +20 -2
- package/dist/src/validation/validators.js +47 -2
- package/package.json +9 -9
|
@@ -9,6 +9,8 @@ export declare class CancelButtonFieldComponentConfig extends FieldComponentConf
|
|
|
9
9
|
cancelButtonMessage?: string;
|
|
10
10
|
confirmButtonMessage?: string;
|
|
11
11
|
buttonCssClasses?: string;
|
|
12
|
+
redirectLocation?: string;
|
|
13
|
+
redirectDelaySeconds?: number;
|
|
12
14
|
constructor();
|
|
13
15
|
}
|
|
14
16
|
export declare class CancelButtonFieldComponentDefinition extends FieldComponentDefinition implements CancelButtonFieldComponentDefinitionOutline {
|
|
@@ -12,6 +12,8 @@ class CancelButtonFieldComponentConfig extends field_component_model_1.FieldComp
|
|
|
12
12
|
cancelButtonMessage;
|
|
13
13
|
confirmButtonMessage;
|
|
14
14
|
buttonCssClasses;
|
|
15
|
+
redirectLocation;
|
|
16
|
+
redirectDelaySeconds;
|
|
15
17
|
constructor() {
|
|
16
18
|
super();
|
|
17
19
|
}
|
|
@@ -53,4 +55,4 @@ exports.CancelButtonDefaults = {
|
|
|
53
55
|
},
|
|
54
56
|
},
|
|
55
57
|
};
|
|
56
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
58
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FuY2VsLWJ1dHRvbi5tb2RlbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb25maWcvY29tcG9uZW50L2NhbmNlbC1idXR0b24ubW9kZWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsb0VBQTBGO0FBRTFGLGtFQUFrRTtBQUVsRSxzREFBd0g7QUFDeEgsbUVBS2lDO0FBRWpDLDZCQUE2QjtBQUU3QixNQUFhLGdDQUNYLFNBQVEsNENBQW9CO0lBRTVCLG1CQUFtQixDQUFVO0lBQzdCLGlCQUFpQixDQUFVO0lBQzNCLG1CQUFtQixDQUFVO0lBQzdCLG9CQUFvQixDQUFVO0lBQzlCLGdCQUFnQixDQUFVO0lBQzFCLGdCQUFnQixDQUFVO0lBQzFCLG9CQUFvQixDQUFVO0lBRTlCO1FBQ0UsS0FBSyxFQUFFLENBQUM7SUFDVixDQUFDO0NBQ0Y7QUFkRCw0RUFjQztBQUVELE1BQWEsb0NBQ1gsU0FBUSxnREFBd0I7SUFHaEMsS0FBSyxHQUFHLGlEQUF5QixDQUFDO0lBQ2xDLE1BQU0sQ0FBMkM7SUFFakQ7UUFDRSxLQUFLLEVBQUUsQ0FBQztJQUNWLENBQUM7SUFFRCxLQUFLLENBQUMsTUFBTSxDQUFDLE9BQWlDO1FBQzVDLE1BQU0sT0FBTyxDQUFDLHlDQUF5QyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2hFLENBQUM7Q0FDRjtBQWRELG9GQWNDO0FBRUQsa0NBQWtDO0FBRWxDLE1BQWEsbUNBQ1gsU0FBUSw4Q0FBdUI7SUFHL0IsU0FBUyxDQUErQztJQUN4RCxLQUFLLENBQVM7SUFDZCxNQUFNLENBQTBDO0lBRWhEO1FBQ0UsS0FBSyxFQUFFLENBQUM7SUFDVixDQUFDO0lBRUQsS0FBSyxDQUFDLE1BQU0sQ0FBQyxPQUFpQztRQUM1QyxNQUFNLE9BQU8sQ0FBQyx3Q0FBd0MsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMvRCxDQUFDO0NBQ0Y7QUFmRCxrRkFlQztBQUVZLFFBQUEsZUFBZSxHQUFHO0lBQzdCLEVBQUUsSUFBSSxFQUFFLHlDQUF3QixFQUFFLEdBQUcsRUFBRSxnQ0FBZ0MsRUFBRTtJQUN6RSxFQUFFLElBQUksRUFBRSw2Q0FBNEIsRUFBRSxHQUFHLEVBQUUsb0NBQW9DLEVBQUUsS0FBSyxFQUFFLGlEQUF5QixFQUFFO0lBQ25ILEVBQUUsSUFBSSxFQUFFLDRDQUEyQixFQUFFLEdBQUcsRUFBRSxtQ0FBbUMsRUFBRSxLQUFLLEVBQUUsaURBQXlCLEVBQUU7Q0FDbEgsQ0FBQztBQUNXLFFBQUEsb0JBQW9CLEdBQUc7SUFDbEMsQ0FBQyw0Q0FBMkIsQ0FBQyxFQUFFO1FBQzdCLENBQUMsaURBQXlCLENBQUMsRUFBRTtZQUMzQixDQUFDLDZDQUE0QixDQUFDLEVBQUUsaURBQXlCO1NBQzFEO0tBQ0Y7Q0FDRixDQUFDIn0=
|
|
@@ -27,6 +27,16 @@ export interface CancelButtonFieldComponentConfigFrame extends FieldComponentCon
|
|
|
27
27
|
* Example: 'btn-warning' or 'btn btn-warning'.
|
|
28
28
|
*/
|
|
29
29
|
buttonCssClasses?: string;
|
|
30
|
+
/**
|
|
31
|
+
* The relative url to redirect to.
|
|
32
|
+
* Leave empty to use the browser's location.back.
|
|
33
|
+
*/
|
|
34
|
+
redirectLocation?: string;
|
|
35
|
+
/**
|
|
36
|
+
* The delay before redirecting.
|
|
37
|
+
* Default is 3 seconds delay.
|
|
38
|
+
*/
|
|
39
|
+
redirectDelaySeconds?: number;
|
|
30
40
|
}
|
|
31
41
|
export interface CancelButtonFieldComponentConfigOutline extends CancelButtonFieldComponentConfigFrame, FieldComponentConfigOutline {
|
|
32
42
|
}
|
|
@@ -4,14 +4,14 @@ import { FormComponentDefinition } from '../form-component.model';
|
|
|
4
4
|
import { FormConfigVisitorOutline } from '../visitor/base.outline';
|
|
5
5
|
import { DeleteButtonFieldComponentConfigOutline, DeleteButtonFieldComponentDefinitionOutline, DeleteButtonFormComponentDefinitionOutline } from './delete-button.outline';
|
|
6
6
|
export declare class DeleteButtonFieldComponentConfig extends FieldComponentConfig implements DeleteButtonFieldComponentConfigOutline {
|
|
7
|
-
buttonCssClasses?: string;
|
|
8
|
-
closeOnDelete?: boolean;
|
|
9
|
-
redirectLocation?: string;
|
|
10
|
-
redirectDelaySeconds?: number;
|
|
11
7
|
confirmationMessage?: string;
|
|
12
8
|
confirmationTitle?: string;
|
|
13
9
|
cancelButtonMessage?: string;
|
|
14
10
|
confirmButtonMessage?: string;
|
|
11
|
+
buttonCssClasses?: string;
|
|
12
|
+
closeOnDelete?: boolean;
|
|
13
|
+
redirectLocation?: string;
|
|
14
|
+
redirectDelaySeconds?: number;
|
|
15
15
|
}
|
|
16
16
|
export declare class DeleteButtonFieldComponentDefinition extends FieldComponentDefinition implements DeleteButtonFieldComponentDefinitionOutline {
|
|
17
17
|
class: "DeleteButtonComponent";
|
|
@@ -6,14 +6,14 @@ const form_component_model_1 = require("../form-component.model");
|
|
|
6
6
|
const shared_outline_1 = require("../shared.outline");
|
|
7
7
|
const delete_button_outline_1 = require("./delete-button.outline");
|
|
8
8
|
class DeleteButtonFieldComponentConfig extends field_component_model_1.FieldComponentConfig {
|
|
9
|
-
buttonCssClasses;
|
|
10
|
-
closeOnDelete;
|
|
11
|
-
redirectLocation;
|
|
12
|
-
redirectDelaySeconds;
|
|
13
9
|
confirmationMessage;
|
|
14
10
|
confirmationTitle;
|
|
15
11
|
cancelButtonMessage;
|
|
16
12
|
confirmButtonMessage;
|
|
13
|
+
buttonCssClasses;
|
|
14
|
+
closeOnDelete;
|
|
15
|
+
redirectLocation;
|
|
16
|
+
redirectDelaySeconds;
|
|
17
17
|
}
|
|
18
18
|
exports.DeleteButtonFieldComponentConfig = DeleteButtonFieldComponentConfig;
|
|
19
19
|
class DeleteButtonFieldComponentDefinition extends field_component_model_1.FieldComponentDefinition {
|
|
@@ -45,4 +45,4 @@ exports.DeleteButtonDefaults = {
|
|
|
45
45
|
},
|
|
46
46
|
},
|
|
47
47
|
};
|
|
48
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
48
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVsZXRlLWJ1dHRvbi5tb2RlbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb25maWcvY29tcG9uZW50L2RlbGV0ZS1idXR0b24ubW9kZWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsb0VBQTBGO0FBRTFGLGtFQUFrRTtBQUVsRSxzREFBd0g7QUFDeEgsbUVBS2lDO0FBRWpDLE1BQWEsZ0NBQWlDLFNBQVEsNENBQW9CO0lBQ3hFLG1CQUFtQixDQUFVO0lBQzdCLGlCQUFpQixDQUFVO0lBQzNCLG1CQUFtQixDQUFVO0lBQzdCLG9CQUFvQixDQUFVO0lBQzlCLGdCQUFnQixDQUFVO0lBQzFCLGFBQWEsQ0FBVztJQUN4QixnQkFBZ0IsQ0FBVTtJQUMxQixvQkFBb0IsQ0FBVTtDQUMvQjtBQVRELDRFQVNDO0FBRUQsTUFBYSxvQ0FDWCxTQUFRLGdEQUF3QjtJQUdoQyxLQUFLLEdBQUcsaURBQXlCLENBQUM7SUFDbEMsTUFBTSxDQUEyQztJQUVqRCxLQUFLLENBQUMsTUFBTSxDQUFDLE9BQWlDO1FBQzVDLE1BQU0sT0FBTyxDQUFDLHlDQUF5QyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2hFLENBQUM7Q0FDRjtBQVZELG9GQVVDO0FBRUQsTUFBYSxtQ0FDWCxTQUFRLDhDQUF1QjtJQUcvQixTQUFTLENBQStDO0lBQ3hELEtBQUssQ0FBUztJQUNkLE1BQU0sQ0FBMEM7SUFFaEQsS0FBSyxDQUFDLE1BQU0sQ0FBQyxPQUFpQztRQUM1QyxNQUFNLE9BQU8sQ0FBQyx3Q0FBd0MsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMvRCxDQUFDO0NBQ0Y7QUFYRCxrRkFXQztBQUVZLFFBQUEsZUFBZSxHQUFHO0lBQzdCLEVBQUUsSUFBSSxFQUFFLHlDQUF3QixFQUFFLEdBQUcsRUFBRSxnQ0FBZ0MsRUFBRTtJQUN6RSxFQUFFLElBQUksRUFBRSw2Q0FBNEIsRUFBRSxHQUFHLEVBQUUsb0NBQW9DLEVBQUUsS0FBSyxFQUFFLGlEQUF5QixFQUFFO0lBQ25ILEVBQUUsSUFBSSxFQUFFLDRDQUEyQixFQUFFLEdBQUcsRUFBRSxtQ0FBbUMsRUFBRSxLQUFLLEVBQUUsaURBQXlCLEVBQUU7Q0FDbEgsQ0FBQztBQUVXLFFBQUEsb0JBQW9CLEdBQUc7SUFDbEMsQ0FBQyw0Q0FBMkIsQ0FBQyxFQUFFO1FBQzdCLENBQUMsaURBQXlCLENBQUMsRUFBRTtZQUMzQixDQUFDLDZDQUE0QixDQUFDLEVBQUUsaURBQXlCO1NBQzFEO0tBQ0Y7Q0FDRixDQUFDIn0=
|
|
@@ -5,14 +5,42 @@ import { FieldComponentConfigFrameKindType, FieldComponentConfigKindType, FieldC
|
|
|
5
5
|
export declare const DeleteButtonComponentName: "DeleteButtonComponent";
|
|
6
6
|
export type DeleteButtonComponentNameType = typeof DeleteButtonComponentName;
|
|
7
7
|
export interface DeleteButtonFieldComponentConfigFrame extends FieldComponentConfigFrame {
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
8
|
+
/**
|
|
9
|
+
* An optional confirmation message shown to the user before cancelling.
|
|
10
|
+
* If not set, the cancel action proceeds without confirmation.
|
|
11
|
+
*/
|
|
12
12
|
confirmationMessage?: string;
|
|
13
|
+
/**
|
|
14
|
+
* The title of the confirmation dialog.
|
|
15
|
+
*/
|
|
13
16
|
confirmationTitle?: string;
|
|
17
|
+
/**
|
|
18
|
+
* The label for the cancel button in the confirmation dialog.
|
|
19
|
+
*/
|
|
14
20
|
cancelButtonMessage?: string;
|
|
21
|
+
/**
|
|
22
|
+
* The label for the confirm button in the confirmation dialog.
|
|
23
|
+
*/
|
|
15
24
|
confirmButtonMessage?: string;
|
|
25
|
+
/**
|
|
26
|
+
* CSS classes to apply to the main cancel button element.
|
|
27
|
+
* Example: 'btn-warning' or 'btn btn-warning'.
|
|
28
|
+
*/
|
|
29
|
+
buttonCssClasses?: string;
|
|
30
|
+
/**
|
|
31
|
+
* Whether to 'close' the form by redirecting on a successful delete. Default false.
|
|
32
|
+
*/
|
|
33
|
+
closeOnDelete?: boolean;
|
|
34
|
+
/**
|
|
35
|
+
* The relative url to redirect to on a successful delete if closeOnDelete is true.
|
|
36
|
+
* Leave empty to use the browser's location.back.
|
|
37
|
+
*/
|
|
38
|
+
redirectLocation?: string;
|
|
39
|
+
/**
|
|
40
|
+
* The delay before redirecting on a successful delete if closeOnDelete is true.
|
|
41
|
+
* Default is 3 seconds delay.
|
|
42
|
+
*/
|
|
43
|
+
redirectDelaySeconds?: number;
|
|
16
44
|
}
|
|
17
45
|
export interface DeleteButtonFieldComponentConfigOutline extends DeleteButtonFieldComponentConfigFrame, FieldComponentConfigOutline {
|
|
18
46
|
}
|
|
@@ -6,29 +6,7 @@ export declare class QuestionTreeHelper {
|
|
|
6
6
|
private readonly logName;
|
|
7
7
|
private readonly defaultQuestionTreeLabelPrefix;
|
|
8
8
|
private readonly logger;
|
|
9
|
-
private readonly propertiesHelper;
|
|
10
9
|
constructor(logger: ILogger);
|
|
11
|
-
/**
|
|
12
|
-
* Convert the question tree rules to a JSONata expression to control the visibility.
|
|
13
|
-
* @param lineagePath The question tree lineage paths.
|
|
14
|
-
* @param rule The current question rule.
|
|
15
|
-
* @return The JSONata expression.
|
|
16
|
-
*/
|
|
17
|
-
questionTreeRuleToExpression(lineagePath: LineagePaths, rule: QuestionTreeQuestionRules): string;
|
|
18
|
-
/**
|
|
19
|
-
* Build the JSONata reference / identifier from the question tree lineage path and qauestion id.
|
|
20
|
-
* @param lineagePath The question tree lineage paths.
|
|
21
|
-
* @param questionId The question id.
|
|
22
|
-
* @return The JSONata reference / identifier.
|
|
23
|
-
*/
|
|
24
|
-
questionReference(lineagePath: LineagePaths, questionId: string): string;
|
|
25
|
-
/**
|
|
26
|
-
* Convert the visibility JSONata rule expression to a JSONata expression to set the model.value.
|
|
27
|
-
* @param ruleExpression The visibility JSONata rule expression.
|
|
28
|
-
* @param questionReference The JSONata question reference / identifier.
|
|
29
|
-
* @return The JSONata expression to set the model.value.
|
|
30
|
-
*/
|
|
31
|
-
questionTreeModelValueExpression(ruleExpression: string, questionReference: string): string;
|
|
32
10
|
validateQuestions(questions: QuestionTreeQuestion[]): {
|
|
33
11
|
errors: string[];
|
|
34
12
|
questionAnswerValuesMap: {
|
|
@@ -52,10 +30,29 @@ export declare class QuestionTreeHelper {
|
|
|
52
30
|
* @param name The question tree name.
|
|
53
31
|
* @param lineagePath The question tree lineage path.
|
|
54
32
|
* @param item The question tree component config.
|
|
55
|
-
* @param
|
|
33
|
+
* @param modelData The full question tree model data.
|
|
34
|
+
* @param questionId The question config to transform.
|
|
35
|
+
* @param questions The questions config.
|
|
56
36
|
* @return A reusable form definition representing the question and available answers.
|
|
57
37
|
*/
|
|
58
|
-
transformQuestionConfig(name: string
|
|
38
|
+
transformQuestionConfig(name: string, lineagePath: LineagePaths, item: QuestionTreeFieldComponentDefinitionOutline, modelData: unknown, questionId: string, questions: QuestionTreeQuestion[]): ReusableFormComponentDefinitionFrame;
|
|
39
|
+
private questionLabelPrefix;
|
|
59
40
|
private questionLabelKey;
|
|
60
41
|
private questionHelpKey;
|
|
42
|
+
private questionAnswerLabelKey;
|
|
61
43
|
}
|
|
44
|
+
/**
|
|
45
|
+
* Determine whether a question should be 'activated' based on the provided question tree form model data.
|
|
46
|
+
* - An activated question is visible and can have a non-null data model. A question is active if its rules evaluate to true.
|
|
47
|
+
* - A deactivated question is not visible and its form model data must be null.
|
|
48
|
+
* @param questionId The question id.
|
|
49
|
+
* @param questions The questions config.
|
|
50
|
+
* @param data The current question tree form data.
|
|
51
|
+
*/
|
|
52
|
+
export declare function isQuestionTreeQuestionActivated(questionId: string, questions: QuestionTreeQuestion[], data: Record<string, unknown>): boolean;
|
|
53
|
+
/**
|
|
54
|
+
* Determine whether a rule is true given the data.
|
|
55
|
+
* @param rule The question tree question rule to check.
|
|
56
|
+
* @param data The question tree data.
|
|
57
|
+
*/
|
|
58
|
+
export declare function isQuestionTreeQuestionRuleTrue(rule: QuestionTreeQuestionRules, data: Record<string, unknown>): boolean;
|
|
@@ -1,81 +1,15 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.QuestionTreeHelper = void 0;
|
|
4
|
-
|
|
4
|
+
exports.isQuestionTreeQuestionActivated = isQuestionTreeQuestionActivated;
|
|
5
|
+
exports.isQuestionTreeQuestionRuleTrue = isQuestionTreeQuestionRuleTrue;
|
|
6
|
+
const helpers_1 = require("../helpers");
|
|
5
7
|
class QuestionTreeHelper {
|
|
6
8
|
logName = "QuestionTreeHelper";
|
|
7
9
|
defaultQuestionTreeLabelPrefix = "questiontree";
|
|
8
10
|
logger;
|
|
9
|
-
propertiesHelper;
|
|
10
11
|
constructor(logger) {
|
|
11
12
|
this.logger = logger;
|
|
12
|
-
this.propertiesHelper = new common_model_1.PropertiesHelper();
|
|
13
|
-
}
|
|
14
|
-
/**
|
|
15
|
-
* Convert the question tree rules to a JSONata expression to control the visibility.
|
|
16
|
-
* @param lineagePath The question tree lineage paths.
|
|
17
|
-
* @param rule The current question rule.
|
|
18
|
-
* @return The JSONata expression.
|
|
19
|
-
*/
|
|
20
|
-
questionTreeRuleToExpression(lineagePath, rule) {
|
|
21
|
-
switch (rule.op) {
|
|
22
|
-
case "true":
|
|
23
|
-
return 'true';
|
|
24
|
-
case "and":
|
|
25
|
-
return rule.args.map(arg => `(${this.questionTreeRuleToExpression(lineagePath, arg)})`).join(' and ');
|
|
26
|
-
case "or":
|
|
27
|
-
return rule.args.map(arg => `(${this.questionTreeRuleToExpression(lineagePath, arg)})`).join(' or ');
|
|
28
|
-
case "in":
|
|
29
|
-
case "notin":
|
|
30
|
-
case "only":
|
|
31
|
-
// Build the jsonata format identifier.
|
|
32
|
-
// Use the question tree angular component path, plus the question id as the path.
|
|
33
|
-
const identifierString = this.questionReference(lineagePath, rule.q);
|
|
34
|
-
// The value can be converted to a json array for the jsonata expression.
|
|
35
|
-
const values = (Array.isArray(rule.a) ? rule.a : [rule.a]).map(i => this.propertiesHelper.toFieldReference(i));
|
|
36
|
-
const valueString = JSON.stringify(values);
|
|
37
|
-
if (rule.op === "in") {
|
|
38
|
-
return `$count(${identifierString}[][$ in ${valueString}]) > 0`;
|
|
39
|
-
}
|
|
40
|
-
else if (rule.op === "only") {
|
|
41
|
-
return `${identifierString}[] = ${valueString}`;
|
|
42
|
-
}
|
|
43
|
-
else if (rule.op === "notin") {
|
|
44
|
-
return `$count(${identifierString}[][$not($ in ${valueString})]) = $count(${identifierString})`;
|
|
45
|
-
}
|
|
46
|
-
throw new Error(`${this.logName} unknown rule ${JSON.stringify(rule)}.`);
|
|
47
|
-
default:
|
|
48
|
-
throw new Error(`${this.logName} unknown rule ${JSON.stringify(rule)}.`);
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
/**
|
|
52
|
-
* Build the JSONata reference / identifier from the question tree lineage path and qauestion id.
|
|
53
|
-
* @param lineagePath The question tree lineage paths.
|
|
54
|
-
* @param questionId The question id.
|
|
55
|
-
* @return The JSONata reference / identifier.
|
|
56
|
-
*/
|
|
57
|
-
questionReference(lineagePath, questionId) {
|
|
58
|
-
const path = [...lineagePath.dataModel, questionId];
|
|
59
|
-
return `formData.${this.propertiesHelper.lineagePathToExpressionIdentifiers([...path])}`;
|
|
60
|
-
}
|
|
61
|
-
/**
|
|
62
|
-
* Convert the visibility JSONata rule expression to a JSONata expression to set the model.value.
|
|
63
|
-
* @param ruleExpression The visibility JSONata rule expression.
|
|
64
|
-
* @param questionReference The JSONata question reference / identifier.
|
|
65
|
-
* @return The JSONata expression to set the model.value.
|
|
66
|
-
*/
|
|
67
|
-
questionTreeModelValueExpression(ruleExpression, questionReference) {
|
|
68
|
-
// NOTE: A Question Tree component model.value could be set to null based on either of two criteria:
|
|
69
|
-
// 1) Using the rule expression:
|
|
70
|
-
// - If the rule expression is true, then component should be visible, use the existing model value.
|
|
71
|
-
// - If the rule expression is false, then component should be hidden, so set the model.value to null.
|
|
72
|
-
// 2) Using the visible state of the component:
|
|
73
|
-
// - If the component is visible, use the existing data model value.
|
|
74
|
-
// - If the component is hidden, set the model.value to null.
|
|
75
|
-
// Chose to use the rule expression, as it is directly responsible for the changes.
|
|
76
|
-
// However, there could be edge cases where the rule expression is not enough,
|
|
77
|
-
// and the field.ui-attribute.changed might need to be used instead.
|
|
78
|
-
return `(${ruleExpression} ? ${questionReference} : null)`;
|
|
79
13
|
}
|
|
80
14
|
validateQuestions(questions) {
|
|
81
15
|
// Prepare question and answer info to assist checking for valid structure
|
|
@@ -179,71 +113,34 @@ class QuestionTreeHelper {
|
|
|
179
113
|
* @param name The question tree name.
|
|
180
114
|
* @param lineagePath The question tree lineage path.
|
|
181
115
|
* @param item The question tree component config.
|
|
182
|
-
* @param
|
|
116
|
+
* @param modelData The full question tree model data.
|
|
117
|
+
* @param questionId The question config to transform.
|
|
118
|
+
* @param questions The questions config.
|
|
183
119
|
* @return A reusable form definition representing the question and available answers.
|
|
184
120
|
*/
|
|
185
|
-
transformQuestionConfig(name, lineagePath, item,
|
|
121
|
+
transformQuestionConfig(name, lineagePath, item, modelData, questionId, questions) {
|
|
186
122
|
if (!lineagePath.angularComponentsJsonPointer) {
|
|
187
123
|
throw new Error(`${this.logName}: Did not provide lineage path JSON pointer ${JSON.stringify({
|
|
188
124
|
name, lineagePath, item
|
|
189
125
|
})}`);
|
|
190
126
|
}
|
|
191
|
-
|
|
127
|
+
if (modelData !== undefined && ((0, helpers_1.guessType)(modelData) !== 'object' || typeof modelData !== 'object')) {
|
|
128
|
+
throw new Error(`${this.logName}: Expected model data to be an object, but got ${modelData}`);
|
|
129
|
+
}
|
|
130
|
+
const question = questions.find(q => q.id === questionId);
|
|
131
|
+
if (question === undefined) {
|
|
132
|
+
throw new Error(`${this.logName}: Could not find question id ${questionId}`);
|
|
133
|
+
}
|
|
134
|
+
const id = questionId;
|
|
192
135
|
const answersMax = question.answersMax;
|
|
193
136
|
const answers = question.answers;
|
|
194
|
-
const
|
|
195
|
-
const ruleExpression = this.questionTreeRuleToExpression(lineagePath, rules);
|
|
196
|
-
const questionReference = this.questionReference(lineagePath, id);
|
|
197
|
-
const modelValueExpression = this.questionTreeModelValueExpression(ruleExpression, questionReference);
|
|
198
|
-
// TODO: Component visibility is based on the rule expressions, but the record data can change this.
|
|
199
|
-
// For now, the visibility change due to record data is done on the client only.
|
|
200
|
-
// It might be necessary to calculate the visibility on the server-side using the record data.
|
|
201
|
-
const isVisible = !ruleExpression || ruleExpression === 'true';
|
|
202
|
-
// Notes:
|
|
203
|
-
// - condition is always executed, should be true or false, if true, then evals template
|
|
204
|
-
// - The condition should restrict to the question tree.
|
|
205
|
-
// - use formData in the template to get the current value of a component of the question tree
|
|
206
|
-
// - Both the layout and component have `visible` properties, so they both need to be set.
|
|
207
|
-
const configCondition = `${lineagePath.angularComponentsJsonPointer}::field.value.changed`;
|
|
208
|
-
const expressions = isVisible ? undefined : [
|
|
209
|
-
{
|
|
210
|
-
// Show and hide the layout based on the rules for the question.
|
|
211
|
-
name: `${name}-${id}-layoutvis-qt`,
|
|
212
|
-
config: {
|
|
213
|
-
template: ruleExpression,
|
|
214
|
-
conditionKind: 'jsonpointer',
|
|
215
|
-
condition: configCondition,
|
|
216
|
-
target: `layout.visible`
|
|
217
|
-
}
|
|
218
|
-
},
|
|
219
|
-
{
|
|
220
|
-
// TODO: if the layout is changed to also control the component visibility, this expression can be removed.
|
|
221
|
-
// Show and hide the component based on the rules for the question.
|
|
222
|
-
name: `${name}-${id}-compvis-qt`,
|
|
223
|
-
config: {
|
|
224
|
-
template: ruleExpression,
|
|
225
|
-
conditionKind: 'jsonpointer',
|
|
226
|
-
condition: configCondition,
|
|
227
|
-
target: `component.visible`
|
|
228
|
-
}
|
|
229
|
-
},
|
|
230
|
-
{
|
|
231
|
-
// Set the component value to null based on the rules for the question.
|
|
232
|
-
name: `${name}-${id}-modval-qt`,
|
|
233
|
-
config: {
|
|
234
|
-
template: modelValueExpression,
|
|
235
|
-
conditionKind: 'jsonpointer',
|
|
236
|
-
condition: configCondition,
|
|
237
|
-
target: `model.value`
|
|
238
|
-
}
|
|
239
|
-
},
|
|
240
|
-
];
|
|
137
|
+
const isVisible = isQuestionTreeQuestionActivated(id, questions, modelData);
|
|
241
138
|
// build reusable component
|
|
242
139
|
const hasOneAnswer = answersMax === 1;
|
|
243
140
|
const componentOptions = answers.map(a => {
|
|
244
|
-
return { value: a.value, label:
|
|
141
|
+
return { value: a.value, label: this.questionAnswerLabelKey(name, id, a.value, a.label) };
|
|
245
142
|
});
|
|
246
|
-
const questionLabel =
|
|
143
|
+
const questionLabel = this.questionLabelKey(name, id, question.label);
|
|
247
144
|
const questionHelpText = this.questionHelpKey(name, id);
|
|
248
145
|
const componentAnswerOne = {
|
|
249
146
|
overrides: { reusableFormName: "questiontree-answer-one" },
|
|
@@ -254,9 +151,11 @@ class QuestionTreeHelper {
|
|
|
254
151
|
{
|
|
255
152
|
name: "questiontree_answer_one",
|
|
256
153
|
overrides: { replaceName: id },
|
|
257
|
-
layout: {
|
|
154
|
+
layout: {
|
|
155
|
+
class: "DefaultLayout",
|
|
156
|
+
config: { label: questionLabel, helpText: questionHelpText, visible: isVisible }
|
|
157
|
+
},
|
|
258
158
|
component: { class: "RadioInputComponent", config: { options: componentOptions, visible: isVisible } },
|
|
259
|
-
expressions: expressions,
|
|
260
159
|
},
|
|
261
160
|
],
|
|
262
161
|
},
|
|
@@ -272,9 +171,11 @@ class QuestionTreeHelper {
|
|
|
272
171
|
{
|
|
273
172
|
name: 'questiontree_answer_one_more',
|
|
274
173
|
overrides: { replaceName: id },
|
|
275
|
-
layout: {
|
|
174
|
+
layout: {
|
|
175
|
+
class: 'DefaultLayout',
|
|
176
|
+
config: { label: questionLabel, helpText: questionHelpText, visible: isVisible }
|
|
177
|
+
},
|
|
276
178
|
component: { class: 'CheckboxInputComponent', config: { options: componentOptions, visible: isVisible } },
|
|
277
|
-
expressions: expressions,
|
|
278
179
|
},
|
|
279
180
|
],
|
|
280
181
|
},
|
|
@@ -282,17 +183,109 @@ class QuestionTreeHelper {
|
|
|
282
183
|
};
|
|
283
184
|
return hasOneAnswer ? componentAnswerOne : componentAnswerMore;
|
|
284
185
|
}
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
186
|
+
questionLabelPrefix(componentName) {
|
|
187
|
+
return (componentName ?? "").trim().replace(/^@+/, "") || this.defaultQuestionTreeLabelPrefix;
|
|
188
|
+
}
|
|
189
|
+
questionLabelKey(componentName, questionId, questionLabel) {
|
|
190
|
+
if (!!questionLabel?.trim()) {
|
|
191
|
+
return questionLabel;
|
|
288
192
|
}
|
|
289
|
-
const keyPrefix = (componentName
|
|
290
|
-
return `@${keyPrefix}-item-${
|
|
193
|
+
const keyPrefix = this.questionLabelPrefix(componentName);
|
|
194
|
+
return `@${keyPrefix}-item-${questionId}-label`;
|
|
291
195
|
}
|
|
292
196
|
questionHelpKey(componentName, questionId) {
|
|
293
|
-
const keyPrefix = (componentName
|
|
197
|
+
const keyPrefix = this.questionLabelPrefix(componentName);
|
|
294
198
|
return `@${keyPrefix}-item-${questionId}-help`;
|
|
295
199
|
}
|
|
200
|
+
questionAnswerLabelKey(componentName, questionId, answerValue, answerLabel) {
|
|
201
|
+
if (!!answerLabel?.trim()) {
|
|
202
|
+
return answerLabel;
|
|
203
|
+
}
|
|
204
|
+
const keyPrefix = this.questionLabelPrefix(componentName);
|
|
205
|
+
return `@${keyPrefix}-item-${questionId}-${answerValue}-label`;
|
|
206
|
+
}
|
|
296
207
|
}
|
|
297
208
|
exports.QuestionTreeHelper = QuestionTreeHelper;
|
|
298
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVlc3Rpb24tdHJlZS5oZWxwZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvY29uZmlnL2NvbXBvbmVudC9xdWVzdGlvbi10cmVlLmhlbHBlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFTQSwwREFBeUQ7QUFJekQsTUFBYSxrQkFBa0I7SUFDWixPQUFPLEdBQUcsb0JBQW9CLENBQUM7SUFDL0IsOEJBQThCLEdBQUcsY0FBYyxDQUFDO0lBQ2hELE1BQU0sQ0FBVTtJQUNoQixnQkFBZ0IsQ0FBbUI7SUFFcEQsWUFBWSxNQUFlO1FBQ3pCLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLCtCQUFnQixFQUFFLENBQUM7SUFDakQsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0ksNEJBQTRCLENBQUMsV0FBeUIsRUFBRSxJQUErQjtRQUM1RixRQUFRLElBQUksQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUNoQixLQUFLLE1BQU07Z0JBQ1QsT0FBTyxNQUFNLENBQUM7WUFDaEIsS0FBSyxLQUFLO2dCQUNSLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLElBQUksQ0FBQyw0QkFBNEIsQ0FBQyxXQUFXLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUN4RyxLQUFLLElBQUk7Z0JBQ1AsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksSUFBSSxDQUFDLDRCQUE0QixDQUFDLFdBQVcsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ3ZHLEtBQUssSUFBSSxDQUFDO1lBQ1YsS0FBSyxPQUFPLENBQUM7WUFDYixLQUFLLE1BQU07Z0JB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
|
|
209
|
+
/**
|
|
210
|
+
* Determine whether a question should be 'activated' based on the provided question tree form model data.
|
|
211
|
+
* - An activated question is visible and can have a non-null data model. A question is active if its rules evaluate to true.
|
|
212
|
+
* - A deactivated question is not visible and its form model data must be null.
|
|
213
|
+
* @param questionId The question id.
|
|
214
|
+
* @param questions The questions config.
|
|
215
|
+
* @param data The current question tree form data.
|
|
216
|
+
*/
|
|
217
|
+
function isQuestionTreeQuestionActivated(questionId, questions, data) {
|
|
218
|
+
const questionIdsToCheck = [questionId];
|
|
219
|
+
while (questionIdsToCheck.length > 0) {
|
|
220
|
+
const currentQuestionId = questionIdsToCheck.shift();
|
|
221
|
+
const currentQuestion = questions.find(q => q.id === currentQuestionId);
|
|
222
|
+
if (currentQuestion === undefined) {
|
|
223
|
+
return false;
|
|
224
|
+
}
|
|
225
|
+
const rulesToCheck = [currentQuestion?.rules];
|
|
226
|
+
while (rulesToCheck.length > 0) {
|
|
227
|
+
const currentRule = rulesToCheck.shift();
|
|
228
|
+
if (currentRule === undefined) {
|
|
229
|
+
return false;
|
|
230
|
+
}
|
|
231
|
+
if (!isQuestionTreeQuestionRuleTrue(currentRule, data)) {
|
|
232
|
+
return false;
|
|
233
|
+
}
|
|
234
|
+
switch (currentRule?.op) {
|
|
235
|
+
case "true":
|
|
236
|
+
continue;
|
|
237
|
+
case "and":
|
|
238
|
+
rulesToCheck.push(...currentRule.args);
|
|
239
|
+
continue;
|
|
240
|
+
case "or":
|
|
241
|
+
rulesToCheck.push(...currentRule.args.filter(rule => isQuestionTreeQuestionRuleTrue(rule, data)));
|
|
242
|
+
continue;
|
|
243
|
+
case "in":
|
|
244
|
+
case "notin":
|
|
245
|
+
case "only":
|
|
246
|
+
if (currentRule.q) {
|
|
247
|
+
questionIdsToCheck.push(currentRule.q);
|
|
248
|
+
}
|
|
249
|
+
continue;
|
|
250
|
+
default:
|
|
251
|
+
throw new Error(`Unknown question tree question rule ${JSON.stringify(currentRule)}.`);
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
return true;
|
|
256
|
+
}
|
|
257
|
+
/**
|
|
258
|
+
* Determine whether a rule is true given the data.
|
|
259
|
+
* @param rule The question tree question rule to check.
|
|
260
|
+
* @param data The question tree data.
|
|
261
|
+
*/
|
|
262
|
+
function isQuestionTreeQuestionRuleTrue(rule, data) {
|
|
263
|
+
switch (rule.op) {
|
|
264
|
+
case "true":
|
|
265
|
+
return true;
|
|
266
|
+
case "and":
|
|
267
|
+
return rule.args.every(rule => isQuestionTreeQuestionRuleTrue(rule, data));
|
|
268
|
+
case "or":
|
|
269
|
+
return rule.args.some(rule => isQuestionTreeQuestionRuleTrue(rule, data));
|
|
270
|
+
case "in":
|
|
271
|
+
const valueIn = data?.[rule.q] ?? "";
|
|
272
|
+
const actualIn = Array.isArray(valueIn) ? valueIn : [valueIn];
|
|
273
|
+
const expectedIn = Array.isArray(rule.a) ? rule.a : [rule.a];
|
|
274
|
+
return expectedIn.every(e => actualIn.filter(a => !!a).includes(e));
|
|
275
|
+
case "notin":
|
|
276
|
+
const valueNotIn = data?.[rule.q] ?? "";
|
|
277
|
+
const actualNotIn = Array.isArray(valueNotIn) ? valueNotIn : [valueNotIn];
|
|
278
|
+
const expectedNotIn = Array.isArray(rule.a) ? rule.a : [rule.a];
|
|
279
|
+
return expectedNotIn.every(e => !actualNotIn.filter(a => !!a).includes(e));
|
|
280
|
+
case "only":
|
|
281
|
+
const valueOnly = data?.[rule.q] ?? "";
|
|
282
|
+
const actualOnly = Array.isArray(valueOnly) ? valueOnly : [valueOnly];
|
|
283
|
+
const expectedOnly = Array.isArray(rule.a) ? rule.a : [rule.a];
|
|
284
|
+
return actualOnly.length === expectedOnly.length &&
|
|
285
|
+
expectedOnly.every(e => actualOnly.filter(a => !!a).includes(e)) &&
|
|
286
|
+
actualOnly.every(a => expectedOnly.filter(e => !!e).includes(a));
|
|
287
|
+
default:
|
|
288
|
+
throw new Error(`Unknown question tree question rule ${JSON.stringify(rule)}.`);
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVlc3Rpb24tdHJlZS5oZWxwZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvY29uZmlnL2NvbXBvbmVudC9xdWVzdGlvbi10cmVlLmhlbHBlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUE4UUEsMEVBeUNDO0FBT0Qsd0VBa0NDO0FBdFZELHdDQUFxQztBQUVyQyxNQUFhLGtCQUFrQjtJQUNaLE9BQU8sR0FBRyxvQkFBb0IsQ0FBQztJQUMvQiw4QkFBOEIsR0FBRyxjQUFjLENBQUM7SUFDaEQsTUFBTSxDQUFVO0lBRWpDLFlBQVksTUFBZTtRQUN6QixJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztJQUN2QixDQUFDO0lBRU0saUJBQWlCLENBQUMsU0FBaUM7UUFDeEQsMEVBQTBFO1FBQzFFLE1BQU0sdUJBQXVCLEdBQUcsTUFBTSxDQUFDLFdBQVcsQ0FDaEQsU0FBUyxFQUFFLEdBQUcsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDLEVBQUUsRUFBRSxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQ3hGLENBQUM7UUFFRixNQUFNLE1BQU0sR0FBYSxFQUFFLENBQUM7UUFDNUIsTUFBTSxvQkFBb0IsR0FBRyxJQUFJLEdBQUcsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLHVCQUF1QixDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNuSCxJQUFJLG9CQUFvQixDQUFDLElBQUksR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUNsQyxNQUFNLENBQUMsSUFBSSxDQUFDLCtDQUErQyxLQUFLLENBQUMsSUFBSSxDQUFD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SUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsOEJBQThCLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUM7UUFFNUUsS0FBSyxJQUFJO1lBQ1AsTUFBTSxPQUFPLEdBQUcsSUFBSSxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNyQyxNQUFNLFFBQVEsR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDOUQsTUFBTSxVQUFVLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzdELE9BQU8sVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFdEUsS0FBSyxPQUFPO1lBQ1YsTUFBTSxVQUFVLEdBQUcsSUFBSSxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUN4QyxNQUFNLFdBQVcsR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDMUUsTUFBTSxhQUFhLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2hFLE9BQU8sYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUU3RSxLQUFLLE1BQU07WUFDVCxNQUFNLFNBQVMsR0FBRyxJQUFJLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ3ZDLE1BQU0sVUFBVSxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUN0RSxNQUFNLFlBQVksR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDL0QsT0FBTyxVQUFVLENBQUMsTUFBTSxLQUFLLFlBQVksQ0FBQyxNQUFNO2dCQUM5QyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ2hFLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRXJFO1lBQ0UsTUFBTSxJQUFJLEtBQUssQ0FBQyx1Q0FBdUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDcEYsQ0FBQztBQUNILENBQUMifQ==
|
|
@@ -13,7 +13,8 @@ export interface QuestionTreeOutcome {
|
|
|
13
13
|
value: QuestionTreeOutcomeValue;
|
|
14
14
|
/**
|
|
15
15
|
* The optional translation message to use as the label, or the actual label text.
|
|
16
|
-
* Leave out or set 'falsy' to use a translation message id of
|
|
16
|
+
* Leave out or set 'falsy' to use a translation message id of
|
|
17
|
+
* `${question-tree-name}-outcome-${outcome-value}-label`.
|
|
17
18
|
*/
|
|
18
19
|
label?: string | null;
|
|
19
20
|
}
|
|
@@ -29,7 +30,8 @@ export interface QuestionTreeMeta {
|
|
|
29
30
|
/**
|
|
30
31
|
* The key is an available property value.
|
|
31
32
|
* The optional value is the translation message id.
|
|
32
|
-
* Set value 'falsy' to use a translation message id of
|
|
33
|
+
* Set value 'falsy' to use a translation message id of
|
|
34
|
+
* `${question-tree-name}-meta-${outcome-meta-property-key}-${outcome-meta-property-value}-label`.
|
|
33
35
|
*/
|
|
34
36
|
[key: string]: string | null;
|
|
35
37
|
};
|
|
@@ -50,7 +52,8 @@ export interface QuestionTreeQuestionAnswer {
|
|
|
50
52
|
value: string;
|
|
51
53
|
/**
|
|
52
54
|
* The optional translation message to use as the label, or the actual label text.
|
|
53
|
-
* Leave out or set 'falsy' to use a translation message id of
|
|
55
|
+
* Leave out or set 'falsy' to use a translation message id of
|
|
56
|
+
* `${question-tree-name}-item-${question-id}-${answer-id}-label`.
|
|
54
57
|
*/
|
|
55
58
|
label?: string | null;
|
|
56
59
|
/**
|
|
@@ -6,4 +6,4 @@ exports.QuestionTreeOutcomeInfoKey = 'questiontree-outcome-info';
|
|
|
6
6
|
exports.QuestionTreeComponentName = `QuestionTreeComponent`;
|
|
7
7
|
/* QuestionTree Model */
|
|
8
8
|
exports.QuestionTreeModelName = `QuestionTreeModel`;
|
|
9
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
9
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVlc3Rpb24tdHJlZS5vdXRsaW5lLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2NvbmZpZy9jb21wb25lbnQvcXVlc3Rpb24tdHJlZS5vdXRsaW5lLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQTZNYSxRQUFBLDBCQUEwQixHQUFHLDJCQUFvQyxDQUFDO0FBaUQvRSw0QkFBNEI7QUFFZixRQUFBLHlCQUF5QixHQUFHLHVCQUFnQyxDQUFDO0FBNkMxRSx3QkFBd0I7QUFFWCxRQUFBLHFCQUFxQixHQUFHLG1CQUE0QixDQUFDIn0=
|
|
@@ -34,10 +34,12 @@ export interface SaveButtonFieldComponentConfigFrame extends FieldComponentConfi
|
|
|
34
34
|
closeOnSave?: boolean;
|
|
35
35
|
/**
|
|
36
36
|
* The relative url to redirect to on a successful save if closeOnSave is true.
|
|
37
|
+
* Leave empty to use the browser's location.back.
|
|
37
38
|
*/
|
|
38
39
|
redirectLocation?: string;
|
|
39
40
|
/**
|
|
40
41
|
* The delay before redirecting on a successful save if closeOnSave is true.
|
|
42
|
+
* Default is 3 seconds delay.
|
|
41
43
|
*/
|
|
42
44
|
redirectDelaySeconds?: number;
|
|
43
45
|
}
|
|
@@ -123,7 +123,7 @@ export declare const FormExpressionsTargetFieldDisabled: "field.disabled";
|
|
|
123
123
|
type FormExpressionsTargetFieldDisabledType = typeof FormExpressionsTargetFieldDisabled;
|
|
124
124
|
interface FormExpressionsTargetFieldDisabledConfigFrame {
|
|
125
125
|
/**
|
|
126
|
-
* A convenience target that sets all of `component.
|
|
126
|
+
* A convenience target that sets all of `component.disabled`, `layout.disabled`, and `model.disabled`.
|
|
127
127
|
*/
|
|
128
128
|
target: FormExpressionsTargetFieldDisabledType;
|
|
129
129
|
}
|