@researchdatabox/sails-ng-common 0.0.1-beta.8936

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.
Files changed (220) hide show
  1. package/README.md +5 -0
  2. package/dist/src/config/base-field-component.model.d.ts +26 -0
  3. package/dist/src/config/base-field-component.model.js +29 -0
  4. package/dist/src/config/base-field-component.outline.d.ts +100 -0
  5. package/dist/src/config/base-field-component.outline.js +3 -0
  6. package/dist/src/config/component/accordion.model.d.ts +103 -0
  7. package/dist/src/config/component/accordion.model.js +127 -0
  8. package/dist/src/config/component/accordion.outline.d.ts +150 -0
  9. package/dist/src/config/component/accordion.outline.js +13 -0
  10. package/dist/src/config/component/action-row-layout.model.d.ts +28 -0
  11. package/dist/src/config/component/action-row-layout.model.js +35 -0
  12. package/dist/src/config/component/action-row-layout.outline.d.ts +36 -0
  13. package/dist/src/config/component/action-row-layout.outline.js +6 -0
  14. package/dist/src/config/component/cancel-button.model.d.ts +46 -0
  15. package/dist/src/config/component/cancel-button.model.js +56 -0
  16. package/dist/src/config/component/cancel-button.outline.d.ts +69 -0
  17. package/dist/src/config/component/cancel-button.outline.js +6 -0
  18. package/dist/src/config/component/checkbox-input.model.d.ts +65 -0
  19. package/dist/src/config/component/checkbox-input.model.js +78 -0
  20. package/dist/src/config/component/checkbox-input.outline.d.ts +85 -0
  21. package/dist/src/config/component/checkbox-input.outline.js +8 -0
  22. package/dist/src/config/component/checkbox-tree.model.d.ts +66 -0
  23. package/dist/src/config/component/checkbox-tree.model.js +79 -0
  24. package/dist/src/config/component/checkbox-tree.outline.d.ts +96 -0
  25. package/dist/src/config/component/checkbox-tree.outline.js +8 -0
  26. package/dist/src/config/component/content.model.d.ts +45 -0
  27. package/dist/src/config/component/content.model.js +55 -0
  28. package/dist/src/config/component/content.outline.d.ts +64 -0
  29. package/dist/src/config/component/content.outline.js +6 -0
  30. package/dist/src/config/component/data-location.model.d.ts +82 -0
  31. package/dist/src/config/component/data-location.model.js +94 -0
  32. package/dist/src/config/component/data-location.outline.d.ts +117 -0
  33. package/dist/src/config/component/data-location.outline.js +6 -0
  34. package/dist/src/config/component/date-input.model.d.ts +66 -0
  35. package/dist/src/config/component/date-input.model.js +79 -0
  36. package/dist/src/config/component/date-input.outline.d.ts +81 -0
  37. package/dist/src/config/component/date-input.outline.js +8 -0
  38. package/dist/src/config/component/default-layout.model.d.ts +22 -0
  39. package/dist/src/config/component/default-layout.model.js +30 -0
  40. package/dist/src/config/component/default-layout.outline.d.ts +29 -0
  41. package/dist/src/config/component/default-layout.outline.js +5 -0
  42. package/dist/src/config/component/delete-button.model.d.ts +46 -0
  43. package/dist/src/config/component/delete-button.model.js +48 -0
  44. package/dist/src/config/component/delete-button.outline.d.ts +55 -0
  45. package/dist/src/config/component/delete-button.outline.js +5 -0
  46. package/dist/src/config/component/dropdown-input.model.d.ts +64 -0
  47. package/dist/src/config/component/dropdown-input.model.js +77 -0
  48. package/dist/src/config/component/dropdown-input.outline.d.ts +84 -0
  49. package/dist/src/config/component/dropdown-input.outline.js +8 -0
  50. package/dist/src/config/component/file-upload.model.d.ts +67 -0
  51. package/dist/src/config/component/file-upload.model.js +81 -0
  52. package/dist/src/config/component/file-upload.outline.d.ts +93 -0
  53. package/dist/src/config/component/file-upload.outline.js +8 -0
  54. package/dist/src/config/component/group.model.d.ts +61 -0
  55. package/dist/src/config/component/group.model.js +75 -0
  56. package/dist/src/config/component/group.outline.d.ts +77 -0
  57. package/dist/src/config/component/group.outline.js +8 -0
  58. package/dist/src/config/component/inline-layout.model.d.ts +22 -0
  59. package/dist/src/config/component/inline-layout.model.js +29 -0
  60. package/dist/src/config/component/inline-layout.outline.d.ts +29 -0
  61. package/dist/src/config/component/inline-layout.outline.js +5 -0
  62. package/dist/src/config/component/map.model.d.ts +68 -0
  63. package/dist/src/config/component/map.model.js +85 -0
  64. package/dist/src/config/component/map.outline.d.ts +102 -0
  65. package/dist/src/config/component/map.outline.js +8 -0
  66. package/dist/src/config/component/pdf-list.model.d.ts +68 -0
  67. package/dist/src/config/component/pdf-list.model.js +71 -0
  68. package/dist/src/config/component/pdf-list.outline.d.ts +91 -0
  69. package/dist/src/config/component/pdf-list.outline.js +6 -0
  70. package/dist/src/config/component/publish-data-location-refresh.model.d.ts +38 -0
  71. package/dist/src/config/component/publish-data-location-refresh.model.js +51 -0
  72. package/dist/src/config/component/publish-data-location-refresh.outline.d.ts +47 -0
  73. package/dist/src/config/component/publish-data-location-refresh.outline.js +5 -0
  74. package/dist/src/config/component/publish-data-location-selector.model.d.ts +74 -0
  75. package/dist/src/config/component/publish-data-location-selector.model.js +100 -0
  76. package/dist/src/config/component/publish-data-location-selector.outline.d.ts +99 -0
  77. package/dist/src/config/component/publish-data-location-selector.outline.js +6 -0
  78. package/dist/src/config/component/question-tree.helper.d.ts +61 -0
  79. package/dist/src/config/component/question-tree.helper.js +298 -0
  80. package/dist/src/config/component/question-tree.model.d.ts +64 -0
  81. package/dist/src/config/component/question-tree.model.js +80 -0
  82. package/dist/src/config/component/question-tree.outline.d.ts +305 -0
  83. package/dist/src/config/component/question-tree.outline.js +9 -0
  84. package/dist/src/config/component/radio-input.model.d.ts +63 -0
  85. package/dist/src/config/component/radio-input.model.js +76 -0
  86. package/dist/src/config/component/radio-input.outline.d.ts +83 -0
  87. package/dist/src/config/component/radio-input.outline.js +8 -0
  88. package/dist/src/config/component/record-metadata-retriever.model.d.ts +41 -0
  89. package/dist/src/config/component/record-metadata-retriever.model.js +57 -0
  90. package/dist/src/config/component/record-metadata-retriever.outline.d.ts +47 -0
  91. package/dist/src/config/component/record-metadata-retriever.outline.js +5 -0
  92. package/dist/src/config/component/record-selector.model.d.ts +60 -0
  93. package/dist/src/config/component/record-selector.model.js +60 -0
  94. package/dist/src/config/component/record-selector.outline.d.ts +84 -0
  95. package/dist/src/config/component/record-selector.outline.js +6 -0
  96. package/dist/src/config/component/repeatable.model.d.ts +90 -0
  97. package/dist/src/config/component/repeatable.model.js +109 -0
  98. package/dist/src/config/component/repeatable.outline.d.ts +108 -0
  99. package/dist/src/config/component/repeatable.outline.js +10 -0
  100. package/dist/src/config/component/reusable.model.d.ts +42 -0
  101. package/dist/src/config/component/reusable.model.js +57 -0
  102. package/dist/src/config/component/reusable.outline.d.ts +49 -0
  103. package/dist/src/config/component/reusable.outline.js +6 -0
  104. package/dist/src/config/component/rich-text-editor.model.d.ts +65 -0
  105. package/dist/src/config/component/rich-text-editor.model.js +79 -0
  106. package/dist/src/config/component/rich-text-editor.outline.d.ts +86 -0
  107. package/dist/src/config/component/rich-text-editor.outline.js +8 -0
  108. package/dist/src/config/component/save-button.model.d.ts +45 -0
  109. package/dist/src/config/component/save-button.model.js +55 -0
  110. package/dist/src/config/component/save-button.outline.d.ts +65 -0
  111. package/dist/src/config/component/save-button.outline.js +6 -0
  112. package/dist/src/config/component/save-status.model.d.ts +42 -0
  113. package/dist/src/config/component/save-status.model.js +60 -0
  114. package/dist/src/config/component/save-status.outline.d.ts +52 -0
  115. package/dist/src/config/component/save-status.outline.js +6 -0
  116. package/dist/src/config/component/simple-input.model.d.ts +62 -0
  117. package/dist/src/config/component/simple-input.model.js +75 -0
  118. package/dist/src/config/component/simple-input.outline.d.ts +80 -0
  119. package/dist/src/config/component/simple-input.outline.js +9 -0
  120. package/dist/src/config/component/tab-content.model.d.ts +63 -0
  121. package/dist/src/config/component/tab-content.model.js +77 -0
  122. package/dist/src/config/component/tab-content.outline.d.ts +92 -0
  123. package/dist/src/config/component/tab-content.outline.js +8 -0
  124. package/dist/src/config/component/tab-nav-button.model.d.ts +45 -0
  125. package/dist/src/config/component/tab-nav-button.model.js +55 -0
  126. package/dist/src/config/component/tab-nav-button.outline.d.ts +64 -0
  127. package/dist/src/config/component/tab-nav-button.outline.js +6 -0
  128. package/dist/src/config/component/tab.model.d.ts +71 -0
  129. package/dist/src/config/component/tab.model.js +84 -0
  130. package/dist/src/config/component/tab.outline.d.ts +106 -0
  131. package/dist/src/config/component/tab.outline.js +9 -0
  132. package/dist/src/config/component/text-area.model.d.ts +63 -0
  133. package/dist/src/config/component/text-area.model.js +76 -0
  134. package/dist/src/config/component/text-area.outline.d.ts +81 -0
  135. package/dist/src/config/component/text-area.outline.js +8 -0
  136. package/dist/src/config/component/typeahead-input.model.d.ts +78 -0
  137. package/dist/src/config/component/typeahead-input.model.js +91 -0
  138. package/dist/src/config/component/typeahead-input.outline.d.ts +107 -0
  139. package/dist/src/config/component/typeahead-input.outline.js +8 -0
  140. package/dist/src/config/component/validation-summary.model.d.ts +42 -0
  141. package/dist/src/config/component/validation-summary.model.js +60 -0
  142. package/dist/src/config/component/validation-summary.outline.d.ts +57 -0
  143. package/dist/src/config/component/validation-summary.outline.js +6 -0
  144. package/dist/src/config/dictionary.model.d.ts +624 -0
  145. package/dist/src/config/dictionary.model.js +175 -0
  146. package/dist/src/config/dictionary.outline.d.ts +94 -0
  147. package/dist/src/config/dictionary.outline.js +3 -0
  148. package/dist/src/config/field-component.model.d.ts +7 -0
  149. package/dist/src/config/field-component.model.js +11 -0
  150. package/dist/src/config/field-component.outline.d.ts +20 -0
  151. package/dist/src/config/field-component.outline.js +3 -0
  152. package/dist/src/config/field-layout.model.d.ts +19 -0
  153. package/dist/src/config/field-layout.model.js +23 -0
  154. package/dist/src/config/field-layout.outline.d.ts +42 -0
  155. package/dist/src/config/field-layout.outline.js +3 -0
  156. package/dist/src/config/field-model.model.d.ts +22 -0
  157. package/dist/src/config/field-model.model.js +25 -0
  158. package/dist/src/config/field-model.outline.d.ts +63 -0
  159. package/dist/src/config/field-model.outline.js +3 -0
  160. package/dist/src/config/field.model.d.ts +12 -0
  161. package/dist/src/config/field.model.js +12 -0
  162. package/dist/src/config/field.outline.d.ts +19 -0
  163. package/dist/src/config/field.outline.js +3 -0
  164. package/dist/src/config/form-behaviour.outline.d.ts +128 -0
  165. package/dist/src/config/form-behaviour.outline.js +40 -0
  166. package/dist/src/config/form-component.model.d.ts +38 -0
  167. package/dist/src/config/form-component.model.js +36 -0
  168. package/dist/src/config/form-component.outline.d.ts +257 -0
  169. package/dist/src/config/form-component.outline.js +24 -0
  170. package/dist/src/config/form-config.model.d.ts +33 -0
  171. package/dist/src/config/form-config.model.js +36 -0
  172. package/dist/src/config/form-config.outline.d.ts +109 -0
  173. package/dist/src/config/form-config.outline.js +3 -0
  174. package/dist/src/config/form-override.model.d.ts +116 -0
  175. package/dist/src/config/form-override.model.js +1209 -0
  176. package/dist/src/config/form-override.outline.d.ts +15 -0
  177. package/dist/src/config/form-override.outline.js +3 -0
  178. package/dist/src/config/form-types.model.d.ts +6 -0
  179. package/dist/src/config/form-types.model.js +23 -0
  180. package/dist/src/config/form-types.outline.d.ts +48 -0
  181. package/dist/src/config/form-types.outline.js +137 -0
  182. package/dist/src/config/helpers.d.ts +23 -0
  183. package/dist/src/config/helpers.js +105 -0
  184. package/dist/src/config/names/naming-helpers.d.ts +71 -0
  185. package/dist/src/config/names/naming-helpers.js +72 -0
  186. package/dist/src/config/names/query-helpers.d.ts +43 -0
  187. package/dist/src/config/names/query-helpers.js +64 -0
  188. package/dist/src/config/shared.outline.d.ts +54 -0
  189. package/dist/src/config/shared.outline.js +41 -0
  190. package/dist/src/config/visitor/base.model.d.ts +137 -0
  191. package/dist/src/config/visitor/base.model.js +323 -0
  192. package/dist/src/config/visitor/base.outline.d.ts +140 -0
  193. package/dist/src/config/visitor/base.outline.js +3 -0
  194. package/dist/src/config/visitor/common.model.d.ts +119 -0
  195. package/dist/src/config/visitor/common.model.js +421 -0
  196. package/dist/src/handlebars-helpers.d.ts +224 -0
  197. package/dist/src/handlebars-helpers.js +558 -0
  198. package/dist/src/index.d.ts +109 -0
  199. package/dist/src/index.js +136 -0
  200. package/dist/src/logger.interface.d.ts +14 -0
  201. package/dist/src/logger.interface.js +3 -0
  202. package/dist/src/record.model.d.ts +35 -0
  203. package/dist/src/record.model.js +21 -0
  204. package/dist/src/report.model.d.ts +21 -0
  205. package/dist/src/report.model.js +19 -0
  206. package/dist/src/status.model.d.ts +22 -0
  207. package/dist/src/status.model.js +28 -0
  208. package/dist/src/template.outline.d.ts +49 -0
  209. package/dist/src/template.outline.js +13 -0
  210. package/dist/src/translation-helpers.d.ts +10 -0
  211. package/dist/src/translation-helpers.js +30 -0
  212. package/dist/src/validation/form.model.d.ts +247 -0
  213. package/dist/src/validation/form.model.js +31 -0
  214. package/dist/src/validation/helpers.d.ts +14 -0
  215. package/dist/src/validation/helpers.js +68 -0
  216. package/dist/src/validation/validators-support.d.ts +41 -0
  217. package/dist/src/validation/validators-support.js +141 -0
  218. package/dist/src/validation/validators.d.ts +23 -0
  219. package/dist/src/validation/validators.js +427 -0
  220. package/package.json +95 -0
@@ -0,0 +1,298 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.QuestionTreeHelper = void 0;
4
+ const common_model_1 = require("../visitor/common.model");
5
+ class QuestionTreeHelper {
6
+ logName = "QuestionTreeHelper";
7
+ defaultQuestionTreeLabelPrefix = "questiontree";
8
+ logger;
9
+ propertiesHelper;
10
+ constructor(logger) {
11
+ 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
+ }
80
+ validateQuestions(questions) {
81
+ // Prepare question and answer info to assist checking for valid structure
82
+ const questionAnswerValuesMap = Object.fromEntries(questions?.map(question => [question.id, question.answers.map(answer => answer.value)]));
83
+ const errors = [];
84
+ const duplicateQuestionIds = new Set(Object.keys(questionAnswerValuesMap).filter((e, i, a) => a.indexOf(e) !== i));
85
+ if (duplicateQuestionIds.size > 0) {
86
+ errors.push(`Question ids must be unique, these were not ${Array.from(duplicateQuestionIds).sort().join(', ')}.`);
87
+ }
88
+ return { errors, questionAnswerValuesMap };
89
+ }
90
+ /**
91
+ * Validate a question tree's questions to ensure they are internally consistent.
92
+ * @param question A question tree question definition.
93
+ * @param questionIndex The question index.
94
+ * @param availableOutcomeValues The available outcome ids.
95
+ * @param availableMeta The available meta data.
96
+ * @param questionAnswerValuesMap A map of question answer values.
97
+ * @return An array of errors, an empty array indicates no errors.
98
+ */
99
+ validateQuestion(question, questionIndex, availableOutcomeValues, availableMeta, questionAnswerValuesMap) {
100
+ const id = question.id;
101
+ const answersMin = question.answersMin;
102
+ const answersMax = question.answersMax;
103
+ const answers = question.answers;
104
+ const rules = question.rules;
105
+ const errors = [];
106
+ // validate question structure
107
+ if (!id) {
108
+ errors.push(`Question ${questionIndex + 1} has no id.`);
109
+ }
110
+ const msgQ = `Question ${questionIndex + 1} '${id}'`;
111
+ if (answersMin < 1 || answersMin > answersMax) {
112
+ errors.push(`${msgQ} answer min (${answersMin}) must be 1 or greater and equal or less than max (${answersMax}).`);
113
+ }
114
+ if (answersMax < 1 || answersMin > answersMax || answersMax > answers.length) {
115
+ errors.push(`${msgQ} answer max (${answersMax}) must be 1 or greater, equal or greater than min (${answersMin}), and equal or less than the number of answers (${answers.length}).`);
116
+ }
117
+ if (answers.length < 1) {
118
+ errors.push(`${msgQ} must have at least one answer.`);
119
+ }
120
+ if (Object.keys(rules).length === 0) {
121
+ // Must have at least one rule - add a rule that always matches, so the question always shows.
122
+ rules.op = "true";
123
+ }
124
+ // All answer outcome property keys and values must match a defined outcome.
125
+ answers.forEach((answer, answerIndex) => {
126
+ const outcome = answer.outcome;
127
+ if (outcome && !availableOutcomeValues.includes(outcome)) {
128
+ errors.push(`${msgQ} answer ${answerIndex + 1} '${answer.value}' outcome is unknown '${outcome}', available are '${availableOutcomeValues.join(', ')}'.`);
129
+ }
130
+ const meta = answer.meta ?? {};
131
+ for (const [metaKey, metaValue] of Object.entries(meta)) {
132
+ if (!(metaKey in availableMeta)) {
133
+ errors.push(`${msgQ} answer ${answerIndex + 1} '${answer.value}' meta key is unknown '${metaKey}', available are '${Object.keys(availableMeta).join(', ')}'.`);
134
+ }
135
+ if (availableMeta[metaKey] && !(metaValue in availableMeta[metaKey])) {
136
+ errors.push(`${msgQ} answer ${answerIndex + 1} '${answer.value}' meta key '${metaKey}' has unknown value '${metaValue}', available are '${Object.values(availableMeta).join(', ')}'.`);
137
+ }
138
+ }
139
+ });
140
+ // All rules that reference questions or answer values must use valid values.
141
+ const rulesToCheck = [rules];
142
+ while (rulesToCheck.length > 0) {
143
+ const currentRule = rulesToCheck.shift();
144
+ if (!currentRule) {
145
+ continue;
146
+ }
147
+ switch (currentRule.op) {
148
+ case "true":
149
+ continue;
150
+ case "and":
151
+ case "or":
152
+ rulesToCheck.push(...currentRule.args);
153
+ break;
154
+ case "in":
155
+ case "notin":
156
+ case "only":
157
+ if (!(currentRule.q in questionAnswerValuesMap)) {
158
+ errors.push(`${msgQ} rule op '${currentRule.op}' references an invalid question id '${currentRule.q}'.`);
159
+ }
160
+ const questionAnswers = questionAnswerValuesMap[currentRule.q];
161
+ for (const ruleAnswerValue of currentRule.a) {
162
+ if (!questionAnswers.includes(ruleAnswerValue)) {
163
+ errors.push(`${msgQ} rule op '${currentRule.op}' question '${currentRule.q}' references an invalid answer value '${ruleAnswerValue}'.`);
164
+ }
165
+ }
166
+ break;
167
+ default:
168
+ // Setting currentRule to a variable typed with never ensures that all possible switch cases
169
+ // are present. TypeScript compile will fail if there are any possible cases missing.
170
+ const _unexpected = currentRule;
171
+ errors.push(`${msgQ} unknown rule ${JSON.stringify(_unexpected)}.`);
172
+ break;
173
+ }
174
+ }
175
+ return errors;
176
+ }
177
+ /**
178
+ * Transform a question tree question to a reusable form definition to be used in the form config.
179
+ * @param name The question tree name.
180
+ * @param lineagePath The question tree lineage path.
181
+ * @param item The question tree component config.
182
+ * @param question The question config to transform.
183
+ * @return A reusable form definition representing the question and available answers.
184
+ */
185
+ transformQuestionConfig(name, lineagePath, item, question) {
186
+ if (!lineagePath.angularComponentsJsonPointer) {
187
+ throw new Error(`${this.logName}: Did not provide lineage path JSON pointer ${JSON.stringify({
188
+ name, lineagePath, item
189
+ })}`);
190
+ }
191
+ const id = question.id;
192
+ const answersMax = question.answersMax;
193
+ const answers = question.answers;
194
+ const rules = question.rules;
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
+ ];
241
+ // build reusable component
242
+ const hasOneAnswer = answersMax === 1;
243
+ const componentOptions = answers.map(a => {
244
+ return { value: a.value, label: a.label ?? `@${name}-${id}-${a.value}` };
245
+ });
246
+ const questionLabel = question.label !== undefined ? question.label : this.questionLabelKey(name, id);
247
+ const questionHelpText = this.questionHelpKey(name, id);
248
+ const componentAnswerOne = {
249
+ overrides: { reusableFormName: "questiontree-answer-one" },
250
+ name: "",
251
+ component: {
252
+ class: "ReusableComponent", config: {
253
+ componentDefinitions: [
254
+ {
255
+ name: "questiontree_answer_one",
256
+ overrides: { replaceName: id },
257
+ layout: { class: "DefaultLayout", config: { label: questionLabel, helpText: questionHelpText, visible: isVisible } },
258
+ component: { class: "RadioInputComponent", config: { options: componentOptions, visible: isVisible } },
259
+ expressions: expressions,
260
+ },
261
+ ],
262
+ },
263
+ },
264
+ };
265
+ const componentAnswerMore = {
266
+ overrides: { reusableFormName: "questiontree-answer-one-more" },
267
+ name: "",
268
+ component: {
269
+ class: 'ReusableComponent',
270
+ config: {
271
+ componentDefinitions: [
272
+ {
273
+ name: 'questiontree_answer_one_more',
274
+ overrides: { replaceName: id },
275
+ layout: { class: 'DefaultLayout', config: { label: questionLabel, helpText: questionHelpText, visible: isVisible } },
276
+ component: { class: 'CheckboxInputComponent', config: { options: componentOptions, visible: isVisible } },
277
+ expressions: expressions,
278
+ },
279
+ ],
280
+ },
281
+ },
282
+ };
283
+ return hasOneAnswer ? componentAnswerOne : componentAnswerMore;
284
+ }
285
+ questionLabelKey(componentName, label) {
286
+ if (label.startsWith("@")) {
287
+ return label;
288
+ }
289
+ const keyPrefix = (componentName ?? "").trim().replace(/^@+/, "") || this.defaultQuestionTreeLabelPrefix;
290
+ return `@${keyPrefix}-item-${label}-label`;
291
+ }
292
+ questionHelpKey(componentName, questionId) {
293
+ const keyPrefix = (componentName ?? "").trim().replace(/^@+/, "") || this.defaultQuestionTreeLabelPrefix;
294
+ return `@${keyPrefix}-item-${questionId}-help`;
295
+ }
296
+ }
297
+ exports.QuestionTreeHelper = QuestionTreeHelper;
298
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVlc3Rpb24tdHJlZS5oZWxwZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvY29uZmlnL2NvbXBvbmVudC9xdWVzdGlvbi10cmVlLmhlbHBlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFTQSwwREFBeUQ7QUFJekQsTUFBYSxrQkFBa0I7SUFDWixPQUFPLEdBQUcsb0JBQW9CLENBQUM7SUFDL0IsOEJBQThCLEdBQUcsY0FBYyxDQUFDO0lBQ2hELE1BQU0sQ0FBVTtJQUNoQixnQkFBZ0IsQ0FBbUI7SUFFcEQsWUFBWSxNQUFlO1FBQ3pCLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLCtCQUFnQixFQUFFLENBQUM7SUFDakQsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0ksNEJBQTRCLENBQUMsV0FBeUIsRUFBRSxJQUErQjtRQUM1RixRQUFRLElBQUksQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUNoQixLQUFLLE1BQU07Z0JBQ1QsT0FBTyxNQUFNLENBQUM7WUFDaEIsS0FBSyxLQUFLO2dCQUNSLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLElBQUksQ0FBQyw0QkFBNEIsQ0FBQyxXQUFXLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUN4RyxLQUFLLElBQUk7Z0JBQ1AsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksSUFBSSxDQUFDLDRCQUE0QixDQUFDLFdBQVcsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ3ZHLEtBQUssSUFBSSxDQUFDO1lBQ1YsS0FBSyxPQUFPLENBQUM7WUFDYixLQUFLLE1BQU07Z0JB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
@@ -0,0 +1,64 @@
1
+ import { FieldComponentConfig, FieldComponentDefinition } from "../field-component.model";
2
+ import { FieldModelConfig, FieldModelDefinition } from "../field-model.model";
3
+ import { FormComponentDefinition } from "../form-component.model";
4
+ import { FormConfigVisitorOutline } from "../visitor/base.outline";
5
+ import { QuestionTreeFieldComponentConfigOutline, QuestionTreeFieldComponentDefinitionOutline, QuestionTreeFieldModelConfigOutline, QuestionTreeFieldModelDefinitionOutline, QuestionTreeFormComponentDefinitionOutline, QuestionTreeModelValueType, QuestionTreeOutcome, QuestionTreeMeta, QuestionTreeQuestion } from "./question-tree.outline";
6
+ import { AvailableFieldLayoutDefinitionOutlines, AvailableFormComponentDefinitionOutlines } from "../dictionary.outline";
7
+ export declare class QuestionTreeFieldComponentConfig extends FieldComponentConfig implements QuestionTreeFieldComponentConfigOutline {
8
+ availableOutcomes: QuestionTreeOutcome[];
9
+ availableMeta?: QuestionTreeMeta;
10
+ questions: QuestionTreeQuestion[];
11
+ componentDefinitions: AvailableFormComponentDefinitionOutlines[];
12
+ constructor();
13
+ }
14
+ export declare class QuestionTreeFieldComponentDefinition extends FieldComponentDefinition implements QuestionTreeFieldComponentDefinitionOutline {
15
+ class: "QuestionTreeComponent";
16
+ config?: QuestionTreeFieldComponentConfigOutline;
17
+ constructor();
18
+ accept(visitor: FormConfigVisitorOutline): void;
19
+ }
20
+ export declare class QuestionTreeFieldModelConfig extends FieldModelConfig<QuestionTreeModelValueType> implements QuestionTreeFieldModelConfigOutline {
21
+ constructor();
22
+ }
23
+ export declare class QuestionTreeFieldModelDefinition extends FieldModelDefinition<QuestionTreeModelValueType> implements QuestionTreeFieldModelDefinitionOutline {
24
+ class: "QuestionTreeModel";
25
+ config?: QuestionTreeFieldModelConfigOutline;
26
+ constructor();
27
+ accept(visitor: FormConfigVisitorOutline): void;
28
+ }
29
+ export declare class QuestionTreeFormComponentDefinition extends FormComponentDefinition implements QuestionTreeFormComponentDefinitionOutline {
30
+ component: QuestionTreeFieldComponentDefinitionOutline;
31
+ model?: QuestionTreeFieldModelDefinitionOutline;
32
+ layout?: AvailableFieldLayoutDefinitionOutlines;
33
+ constructor();
34
+ accept(visitor: FormConfigVisitorOutline): void;
35
+ }
36
+ export declare const QuestionTreeMap: ({
37
+ kind: "FieldComponentConfigKind";
38
+ def: typeof QuestionTreeFieldComponentConfig;
39
+ class?: undefined;
40
+ } | {
41
+ kind: "FieldComponentDefinitionKind";
42
+ def: typeof QuestionTreeFieldComponentDefinition;
43
+ class: "QuestionTreeComponent";
44
+ } | {
45
+ kind: "FieldModelConfigKind";
46
+ def: typeof QuestionTreeFieldModelConfig;
47
+ class?: undefined;
48
+ } | {
49
+ kind: "FieldModelDefinitionKind";
50
+ def: typeof QuestionTreeFieldModelDefinition;
51
+ class: "QuestionTreeModel";
52
+ } | {
53
+ kind: "FormComponentDefinitionKind";
54
+ def: typeof QuestionTreeFormComponentDefinition;
55
+ class: "QuestionTreeComponent";
56
+ })[];
57
+ export declare const QuestionTreeDefaults: {
58
+ FormComponentDefinitionKind: {
59
+ QuestionTreeComponent: {
60
+ FieldComponentDefinitionKind: "QuestionTreeComponent";
61
+ FieldModelDefinitionKind: "QuestionTreeModel";
62
+ };
63
+ };
64
+ };
@@ -0,0 +1,80 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.QuestionTreeDefaults = exports.QuestionTreeMap = exports.QuestionTreeFormComponentDefinition = exports.QuestionTreeFieldModelDefinition = exports.QuestionTreeFieldModelConfig = exports.QuestionTreeFieldComponentDefinition = exports.QuestionTreeFieldComponentConfig = void 0;
4
+ const field_component_model_1 = require("../field-component.model");
5
+ const field_model_model_1 = require("../field-model.model");
6
+ const form_component_model_1 = require("../form-component.model");
7
+ const shared_outline_1 = require("../shared.outline");
8
+ const question_tree_outline_1 = require("./question-tree.outline");
9
+ /* QuestionTree Component */
10
+ class QuestionTreeFieldComponentConfig extends field_component_model_1.FieldComponentConfig {
11
+ availableOutcomes;
12
+ availableMeta;
13
+ questions;
14
+ componentDefinitions;
15
+ constructor() {
16
+ super();
17
+ this.availableOutcomes = [];
18
+ this.questions = [];
19
+ this.componentDefinitions = [];
20
+ }
21
+ }
22
+ exports.QuestionTreeFieldComponentConfig = QuestionTreeFieldComponentConfig;
23
+ class QuestionTreeFieldComponentDefinition extends field_component_model_1.FieldComponentDefinition {
24
+ class = question_tree_outline_1.QuestionTreeComponentName;
25
+ config;
26
+ constructor() {
27
+ super();
28
+ }
29
+ accept(visitor) {
30
+ visitor.visitQuestionTreeFieldComponentDefinition(this);
31
+ }
32
+ }
33
+ exports.QuestionTreeFieldComponentDefinition = QuestionTreeFieldComponentDefinition;
34
+ /* QuestionTree Model */
35
+ class QuestionTreeFieldModelConfig extends field_model_model_1.FieldModelConfig {
36
+ constructor() {
37
+ super();
38
+ }
39
+ }
40
+ exports.QuestionTreeFieldModelConfig = QuestionTreeFieldModelConfig;
41
+ class QuestionTreeFieldModelDefinition extends field_model_model_1.FieldModelDefinition {
42
+ class = question_tree_outline_1.QuestionTreeModelName;
43
+ config;
44
+ constructor() {
45
+ super();
46
+ }
47
+ accept(visitor) {
48
+ visitor.visitQuestionTreeFieldModelDefinition(this);
49
+ }
50
+ }
51
+ exports.QuestionTreeFieldModelDefinition = QuestionTreeFieldModelDefinition;
52
+ /* QuestionTree Form Component */
53
+ class QuestionTreeFormComponentDefinition extends form_component_model_1.FormComponentDefinition {
54
+ component;
55
+ model;
56
+ layout;
57
+ constructor() {
58
+ super();
59
+ }
60
+ accept(visitor) {
61
+ visitor.visitQuestionTreeFormComponentDefinition(this);
62
+ }
63
+ }
64
+ exports.QuestionTreeFormComponentDefinition = QuestionTreeFormComponentDefinition;
65
+ exports.QuestionTreeMap = [
66
+ { kind: shared_outline_1.FieldComponentConfigKind, def: QuestionTreeFieldComponentConfig },
67
+ { kind: shared_outline_1.FieldComponentDefinitionKind, def: QuestionTreeFieldComponentDefinition, class: question_tree_outline_1.QuestionTreeComponentName },
68
+ { kind: shared_outline_1.FieldModelConfigKind, def: QuestionTreeFieldModelConfig },
69
+ { kind: shared_outline_1.FieldModelDefinitionKind, def: QuestionTreeFieldModelDefinition, class: question_tree_outline_1.QuestionTreeModelName },
70
+ { kind: shared_outline_1.FormComponentDefinitionKind, def: QuestionTreeFormComponentDefinition, class: question_tree_outline_1.QuestionTreeComponentName },
71
+ ];
72
+ exports.QuestionTreeDefaults = {
73
+ [shared_outline_1.FormComponentDefinitionKind]: {
74
+ [question_tree_outline_1.QuestionTreeComponentName]: {
75
+ [shared_outline_1.FieldComponentDefinitionKind]: question_tree_outline_1.QuestionTreeComponentName,
76
+ [shared_outline_1.FieldModelDefinitionKind]: question_tree_outline_1.QuestionTreeModelName,
77
+ },
78
+ },
79
+ };
80
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVlc3Rpb24tdHJlZS5tb2RlbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb25maWcvY29tcG9uZW50L3F1ZXN0aW9uLXRyZWUubW9kZWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsb0VBR2tDO0FBQ2xDLDREQUc4QjtBQUM5QixrRUFBZ0U7QUFFaEUsc0RBSTJCO0FBQzNCLG1FQVVpQztBQU1qQyw0QkFBNEI7QUFFNUIsTUFBYSxnQ0FBaUMsU0FBUSw0Q0FBb0I7SUFDdEUsaUJBQWlCLENBQXdCO0lBQ3pDLGFBQWEsQ0FBb0I7SUFDakMsU0FBUyxDQUF5QjtJQUNsQyxvQkFBb0IsQ0FBNkM7SUFFakU7UUFDSSxLQUFLLEVBQUUsQ0FBQztRQUNSLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxFQUFFLENBQUM7UUFDNUIsSUFBSSxDQUFDLFNBQVMsR0FBRyxFQUFFLENBQUM7UUFDcEIsSUFBSSxDQUFDLG9CQUFvQixHQUFHLEVBQUUsQ0FBQztJQUNuQyxDQUFDO0NBQ0o7QUFaRCw0RUFZQztBQUdELE1BQWEsb0NBQXFDLFNBQVEsZ0RBQXdCO0lBQzlFLEtBQUssR0FBRyxpREFBeUIsQ0FBQztJQUNsQyxNQUFNLENBQTJDO0lBRWpEO1FBQ0ksS0FBSyxFQUFFLENBQUM7SUFDWixDQUFDO0lBRUQsTUFBTSxDQUFDLE9BQWlDO1FBQ3BDLE9BQU8sQ0FBQyx5Q0FBeUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUM1RCxDQUFDO0NBQ0o7QUFYRCxvRkFXQztBQUdELHdCQUF3QjtBQUN4QixNQUFhLDRCQUE2QixTQUFRLG9DQUE0QztJQUMxRjtRQUNJLEtBQUssRUFBRSxDQUFDO0lBQ1osQ0FBQztDQUNKO0FBSkQsb0VBSUM7QUFFRCxNQUFhLGdDQUFpQyxTQUFRLHdDQUFnRDtJQUNsRyxLQUFLLEdBQUcsNkNBQXFCLENBQUM7SUFDOUIsTUFBTSxDQUF1QztJQUU3QztRQUNJLEtBQUssRUFBRSxDQUFDO0lBQ1osQ0FBQztJQUVELE1BQU0sQ0FBQyxPQUFpQztRQUNwQyxPQUFPLENBQUMscUNBQXFDLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDeEQsQ0FBQztDQUNKO0FBWEQsNEVBV0M7QUFHRCxpQ0FBaUM7QUFDakMsTUFBYSxtQ0FBb0MsU0FBUSw4Q0FBdUI7SUFDckUsU0FBUyxDQUErQztJQUN4RCxLQUFLLENBQTJDO0lBQ2hELE1BQU0sQ0FBMEM7SUFFdkQ7UUFDSSxLQUFLLEVBQUUsQ0FBQztJQUNaLENBQUM7SUFFRCxNQUFNLENBQUMsT0FBaUM7UUFDcEMsT0FBTyxDQUFDLHdDQUF3QyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzNELENBQUM7Q0FDSjtBQVpELGtGQVlDO0FBRVksUUFBQSxlQUFlLEdBQUc7SUFDM0IsRUFBQyxJQUFJLEVBQUUseUNBQXdCLEVBQUUsR0FBRyxFQUFFLGdDQUFnQyxFQUFDO0lBQ3ZFLEVBQUMsSUFBSSxFQUFFLDZDQUE0QixFQUFFLEdBQUcsRUFBRSxvQ0FBb0MsRUFBRSxLQUFLLEVBQUUsaURBQXlCLEVBQUM7SUFDakgsRUFBQyxJQUFJLEVBQUUscUNBQW9CLEVBQUUsR0FBRyxFQUFFLDRCQUE0QixFQUFDO0lBQy9ELEVBQUMsSUFBSSxFQUFFLHlDQUF3QixFQUFFLEdBQUcsRUFBRSxnQ0FBZ0MsRUFBRSxLQUFLLEVBQUUsNkNBQXFCLEVBQUM7SUFDckcsRUFBQyxJQUFJLEVBQUUsNENBQTJCLEVBQUUsR0FBRyxFQUFFLG1DQUFtQyxFQUFFLEtBQUssRUFBRSxpREFBeUIsRUFBQztDQUNsSCxDQUFDO0FBQ1csUUFBQSxvQkFBb0IsR0FBRztJQUNoQyxDQUFDLDRDQUEyQixDQUFDLEVBQUU7UUFDM0IsQ0FBQyxpREFBeUIsQ0FBQyxFQUFFO1lBQ3pCLENBQUMsNkNBQTRCLENBQUMsRUFBRSxpREFBeUI7WUFDekQsQ0FBQyx5Q0FBd0IsQ0FBQyxFQUFFLDZDQUFxQjtTQUNwRDtLQUNKO0NBQ0osQ0FBQyJ9