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

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 (236) 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 +106 -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 +48 -0
  15. package/dist/src/config/component/cancel-button.model.js +58 -0
  16. package/dist/src/config/component/cancel-button.outline.d.ts +79 -0
  17. package/dist/src/config/component/cancel-button.outline.js +6 -0
  18. package/dist/src/config/component/checkbox-input.model.d.ts +67 -0
  19. package/dist/src/config/component/checkbox-input.model.js +79 -0
  20. package/dist/src/config/component/checkbox-input.outline.d.ts +87 -0
  21. package/dist/src/config/component/checkbox-input.outline.js +8 -0
  22. package/dist/src/config/component/checkbox-tree.model.d.ts +68 -0
  23. package/dist/src/config/component/checkbox-tree.model.js +80 -0
  24. package/dist/src/config/component/checkbox-tree.outline.d.ts +99 -0
  25. package/dist/src/config/component/checkbox-tree.outline.js +8 -0
  26. package/dist/src/config/component/content.model.d.ts +46 -0
  27. package/dist/src/config/component/content.model.js +56 -0
  28. package/dist/src/config/component/content.outline.d.ts +68 -0
  29. package/dist/src/config/component/content.outline.js +6 -0
  30. package/dist/src/config/component/data-location.model.d.ts +83 -0
  31. package/dist/src/config/component/data-location.model.js +95 -0
  32. package/dist/src/config/component/data-location.outline.d.ts +118 -0
  33. package/dist/src/config/component/data-location.outline.js +6 -0
  34. package/dist/src/config/component/date-input.model.d.ts +67 -0
  35. package/dist/src/config/component/date-input.model.js +80 -0
  36. package/dist/src/config/component/date-input.outline.d.ts +82 -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 +83 -0
  45. package/dist/src/config/component/delete-button.outline.js +5 -0
  46. package/dist/src/config/component/dropdown-input.model.d.ts +65 -0
  47. package/dist/src/config/component/dropdown-input.model.js +78 -0
  48. package/dist/src/config/component/dropdown-input.outline.d.ts +86 -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/integration-status.model.d.ts +49 -0
  63. package/dist/src/config/component/integration-status.model.js +65 -0
  64. package/dist/src/config/component/integration-status.outline.d.ts +55 -0
  65. package/dist/src/config/component/integration-status.outline.js +5 -0
  66. package/dist/src/config/component/map.model.d.ts +68 -0
  67. package/dist/src/config/component/map.model.js +85 -0
  68. package/dist/src/config/component/map.outline.d.ts +102 -0
  69. package/dist/src/config/component/map.outline.js +8 -0
  70. package/dist/src/config/component/pdf-list.model.d.ts +68 -0
  71. package/dist/src/config/component/pdf-list.model.js +71 -0
  72. package/dist/src/config/component/pdf-list.outline.d.ts +91 -0
  73. package/dist/src/config/component/pdf-list.outline.js +6 -0
  74. package/dist/src/config/component/publish-data-location-refresh.model.d.ts +39 -0
  75. package/dist/src/config/component/publish-data-location-refresh.model.js +52 -0
  76. package/dist/src/config/component/publish-data-location-refresh.outline.d.ts +52 -0
  77. package/dist/src/config/component/publish-data-location-refresh.outline.js +5 -0
  78. package/dist/src/config/component/publish-data-location-selector.model.d.ts +78 -0
  79. package/dist/src/config/component/publish-data-location-selector.model.js +104 -0
  80. package/dist/src/config/component/publish-data-location-selector.outline.d.ts +104 -0
  81. package/dist/src/config/component/publish-data-location-selector.outline.js +6 -0
  82. package/dist/src/config/component/question-tree.helper.d.ts +58 -0
  83. package/dist/src/config/component/question-tree.helper.js +291 -0
  84. package/dist/src/config/component/question-tree.model.d.ts +64 -0
  85. package/dist/src/config/component/question-tree.model.js +80 -0
  86. package/dist/src/config/component/question-tree.outline.d.ts +308 -0
  87. package/dist/src/config/component/question-tree.outline.js +9 -0
  88. package/dist/src/config/component/radio-input.model.d.ts +65 -0
  89. package/dist/src/config/component/radio-input.model.js +77 -0
  90. package/dist/src/config/component/radio-input.outline.d.ts +85 -0
  91. package/dist/src/config/component/radio-input.outline.js +8 -0
  92. package/dist/src/config/component/record-metadata-retriever.model.d.ts +41 -0
  93. package/dist/src/config/component/record-metadata-retriever.model.js +57 -0
  94. package/dist/src/config/component/record-metadata-retriever.outline.d.ts +47 -0
  95. package/dist/src/config/component/record-metadata-retriever.outline.js +5 -0
  96. package/dist/src/config/component/record-selector.model.d.ts +61 -0
  97. package/dist/src/config/component/record-selector.model.js +61 -0
  98. package/dist/src/config/component/record-selector.outline.d.ts +85 -0
  99. package/dist/src/config/component/record-selector.outline.js +6 -0
  100. package/dist/src/config/component/repeatable.model.d.ts +91 -0
  101. package/dist/src/config/component/repeatable.model.js +112 -0
  102. package/dist/src/config/component/repeatable.outline.d.ts +109 -0
  103. package/dist/src/config/component/repeatable.outline.js +10 -0
  104. package/dist/src/config/component/reusable.model.d.ts +42 -0
  105. package/dist/src/config/component/reusable.model.js +57 -0
  106. package/dist/src/config/component/reusable.outline.d.ts +49 -0
  107. package/dist/src/config/component/reusable.outline.js +6 -0
  108. package/dist/src/config/component/rich-text-editor.model.d.ts +65 -0
  109. package/dist/src/config/component/rich-text-editor.model.js +79 -0
  110. package/dist/src/config/component/rich-text-editor.outline.d.ts +86 -0
  111. package/dist/src/config/component/rich-text-editor.outline.js +8 -0
  112. package/dist/src/config/component/save-button.model.d.ts +49 -0
  113. package/dist/src/config/component/save-button.model.js +59 -0
  114. package/dist/src/config/component/save-button.outline.d.ts +84 -0
  115. package/dist/src/config/component/save-button.outline.js +6 -0
  116. package/dist/src/config/component/save-status.model.d.ts +42 -0
  117. package/dist/src/config/component/save-status.model.js +60 -0
  118. package/dist/src/config/component/save-status.outline.d.ts +52 -0
  119. package/dist/src/config/component/save-status.outline.js +6 -0
  120. package/dist/src/config/component/simple-input.model.d.ts +62 -0
  121. package/dist/src/config/component/simple-input.model.js +75 -0
  122. package/dist/src/config/component/simple-input.outline.d.ts +80 -0
  123. package/dist/src/config/component/simple-input.outline.js +9 -0
  124. package/dist/src/config/component/suggested-validation-summary.model.d.ts +45 -0
  125. package/dist/src/config/component/suggested-validation-summary.model.js +61 -0
  126. package/dist/src/config/component/suggested-validation-summary.outline.d.ts +51 -0
  127. package/dist/src/config/component/suggested-validation-summary.outline.js +5 -0
  128. package/dist/src/config/component/tab-content.model.d.ts +63 -0
  129. package/dist/src/config/component/tab-content.model.js +77 -0
  130. package/dist/src/config/component/tab-content.outline.d.ts +92 -0
  131. package/dist/src/config/component/tab-content.outline.js +8 -0
  132. package/dist/src/config/component/tab-nav-button.model.d.ts +45 -0
  133. package/dist/src/config/component/tab-nav-button.model.js +55 -0
  134. package/dist/src/config/component/tab-nav-button.outline.d.ts +64 -0
  135. package/dist/src/config/component/tab-nav-button.outline.js +6 -0
  136. package/dist/src/config/component/tab.model.d.ts +71 -0
  137. package/dist/src/config/component/tab.model.js +84 -0
  138. package/dist/src/config/component/tab.outline.d.ts +106 -0
  139. package/dist/src/config/component/tab.outline.js +9 -0
  140. package/dist/src/config/component/text-area.model.d.ts +63 -0
  141. package/dist/src/config/component/text-area.model.js +76 -0
  142. package/dist/src/config/component/text-area.outline.d.ts +81 -0
  143. package/dist/src/config/component/text-area.outline.js +8 -0
  144. package/dist/src/config/component/typeahead-input.model.d.ts +81 -0
  145. package/dist/src/config/component/typeahead-input.model.js +93 -0
  146. package/dist/src/config/component/typeahead-input.outline.d.ts +121 -0
  147. package/dist/src/config/component/typeahead-input.outline.js +8 -0
  148. package/dist/src/config/component/validation-summary.model.d.ts +42 -0
  149. package/dist/src/config/component/validation-summary.model.js +60 -0
  150. package/dist/src/config/component/validation-summary.outline.d.ts +57 -0
  151. package/dist/src/config/component/validation-summary.outline.js +6 -0
  152. package/dist/src/config/dictionary.model.d.ts +648 -0
  153. package/dist/src/config/dictionary.model.js +181 -0
  154. package/dist/src/config/dictionary.outline.d.ts +96 -0
  155. package/dist/src/config/dictionary.outline.js +3 -0
  156. package/dist/src/config/field-component.model.d.ts +7 -0
  157. package/dist/src/config/field-component.model.js +11 -0
  158. package/dist/src/config/field-component.outline.d.ts +20 -0
  159. package/dist/src/config/field-component.outline.js +3 -0
  160. package/dist/src/config/field-layout.model.d.ts +19 -0
  161. package/dist/src/config/field-layout.model.js +23 -0
  162. package/dist/src/config/field-layout.outline.d.ts +42 -0
  163. package/dist/src/config/field-layout.outline.js +3 -0
  164. package/dist/src/config/field-model.model.d.ts +21 -0
  165. package/dist/src/config/field-model.model.js +24 -0
  166. package/dist/src/config/field-model.outline.d.ts +63 -0
  167. package/dist/src/config/field-model.outline.js +3 -0
  168. package/dist/src/config/field.model.d.ts +12 -0
  169. package/dist/src/config/field.model.js +12 -0
  170. package/dist/src/config/field.outline.d.ts +19 -0
  171. package/dist/src/config/field.outline.js +3 -0
  172. package/dist/src/config/form-behaviour.outline.d.ts +128 -0
  173. package/dist/src/config/form-behaviour.outline.js +40 -0
  174. package/dist/src/config/form-component.model.d.ts +38 -0
  175. package/dist/src/config/form-component.model.js +36 -0
  176. package/dist/src/config/form-component.outline.d.ts +297 -0
  177. package/dist/src/config/form-component.outline.js +27 -0
  178. package/dist/src/config/form-config.model.d.ts +33 -0
  179. package/dist/src/config/form-config.model.js +36 -0
  180. package/dist/src/config/form-config.outline.d.ts +107 -0
  181. package/dist/src/config/form-config.outline.js +3 -0
  182. package/dist/src/config/form-override.model.d.ts +128 -0
  183. package/dist/src/config/form-override.model.js +1320 -0
  184. package/dist/src/config/form-override.outline.d.ts +15 -0
  185. package/dist/src/config/form-override.outline.js +3 -0
  186. package/dist/src/config/form-prehydrate.outline.d.ts +17 -0
  187. package/dist/src/config/form-prehydrate.outline.js +5 -0
  188. package/dist/src/config/form-types.model.d.ts +6 -0
  189. package/dist/src/config/form-types.model.js +23 -0
  190. package/dist/src/config/form-types.outline.d.ts +48 -0
  191. package/dist/src/config/form-types.outline.js +137 -0
  192. package/dist/src/config/helpers.d.ts +31 -0
  193. package/dist/src/config/helpers.js +122 -0
  194. package/dist/src/config/names/naming-helpers.d.ts +112 -0
  195. package/dist/src/config/names/naming-helpers.js +188 -0
  196. package/dist/src/config/names/query-helpers.d.ts +43 -0
  197. package/dist/src/config/names/query-helpers.js +59 -0
  198. package/dist/src/config/shared.outline.d.ts +54 -0
  199. package/dist/src/config/shared.outline.js +41 -0
  200. package/dist/src/config/visitor/base.model.d.ts +143 -0
  201. package/dist/src/config/visitor/base.model.js +336 -0
  202. package/dist/src/config/visitor/base.outline.d.ts +146 -0
  203. package/dist/src/config/visitor/base.outline.js +3 -0
  204. package/dist/src/config/visitor/common.model.d.ts +119 -0
  205. package/dist/src/config/visitor/common.model.js +422 -0
  206. package/dist/src/date-format-helpers.d.ts +1 -0
  207. package/dist/src/date-format-helpers.js +21 -0
  208. package/dist/src/handlebars-helpers.d.ts +264 -0
  209. package/dist/src/handlebars-helpers.js +670 -0
  210. package/dist/src/html-helpers.d.ts +15 -0
  211. package/dist/src/html-helpers.js +42 -0
  212. package/dist/src/index.d.ts +118 -0
  213. package/dist/src/index.js +145 -0
  214. package/dist/src/jsonata-helpers.d.ts +40 -0
  215. package/dist/src/jsonata-helpers.js +106 -0
  216. package/dist/src/logger.interface.d.ts +14 -0
  217. package/dist/src/logger.interface.js +3 -0
  218. package/dist/src/record.model.d.ts +35 -0
  219. package/dist/src/record.model.js +21 -0
  220. package/dist/src/report.model.d.ts +64 -0
  221. package/dist/src/report.model.js +19 -0
  222. package/dist/src/status.model.d.ts +22 -0
  223. package/dist/src/status.model.js +28 -0
  224. package/dist/src/template.outline.d.ts +79 -0
  225. package/dist/src/template.outline.js +14 -0
  226. package/dist/src/translation-helpers.d.ts +10 -0
  227. package/dist/src/translation-helpers.js +30 -0
  228. package/dist/src/validation/form.model.d.ts +323 -0
  229. package/dist/src/validation/form.model.js +31 -0
  230. package/dist/src/validation/helpers.d.ts +16 -0
  231. package/dist/src/validation/helpers.js +104 -0
  232. package/dist/src/validation/validators-support.d.ts +41 -0
  233. package/dist/src/validation/validators-support.js +183 -0
  234. package/dist/src/validation/validators.d.ts +21 -0
  235. package/dist/src/validation/validators.js +377 -0
  236. package/package.json +96 -0
@@ -0,0 +1,1320 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.FormOverride = void 0;
4
+ const simple_input_outline_1 = require("./component/simple-input.outline");
5
+ const content_outline_1 = require("./component/content.outline");
6
+ const text_area_outline_1 = require("./component/text-area.outline");
7
+ const checkbox_input_outline_1 = require("./component/checkbox-input.outline");
8
+ const radio_input_outline_1 = require("./component/radio-input.outline");
9
+ const date_input_outline_1 = require("./component/date-input.outline");
10
+ const lodash_1 = require("lodash");
11
+ const dropdown_input_outline_1 = require("./component/dropdown-input.outline");
12
+ const tab_content_outline_1 = require("./component/tab-content.outline");
13
+ const reusable_outline_1 = require("./component/reusable.outline");
14
+ const form_types_outline_1 = require("./form-types.outline");
15
+ const common_model_1 = require("./visitor/common.model");
16
+ const content_model_1 = require("./component/content.model");
17
+ const question_tree_outline_1 = require("./component/question-tree.outline");
18
+ const tab_outline_1 = require("./component/tab.outline");
19
+ const accordion_outline_1 = require("./component/accordion.outline");
20
+ const accordion_model_1 = require("./component/accordion.model");
21
+ const repeatable_outline_1 = require("./component/repeatable.outline");
22
+ const group_outline_1 = require("./component/group.outline");
23
+ const checkbox_tree_outline_1 = require("./component/checkbox-tree.outline");
24
+ const typeahead_input_outline_1 = require("./component/typeahead-input.outline");
25
+ const rich_text_editor_outline_1 = require("./component/rich-text-editor.outline");
26
+ const map_outline_1 = require("./component/map.outline");
27
+ const file_upload_outline_1 = require("./component/file-upload.outline");
28
+ const pdf_list_outline_1 = require("./component/pdf-list.outline");
29
+ const data_location_outline_1 = require("./component/data-location.outline");
30
+ const publish_data_location_selector_outline_1 = require("./component/publish-data-location-selector.outline");
31
+ const question_tree_helper_1 = require("./component/question-tree.helper");
32
+ class FormOverride {
33
+ logName = "FormOverride";
34
+ propertiesHelper;
35
+ logger;
36
+ activeReusableFormDefs;
37
+ reusableFragmentSlotNames = new Set([
38
+ 'rootExpr',
39
+ 'headersHtml',
40
+ 'cellsHtml',
41
+ 'rowsHtml',
42
+ 'itemBodyHtml',
43
+ 'labelHtml',
44
+ 'valueHtml',
45
+ 'valueExpr',
46
+ 'typeHeaderHtml',
47
+ 'locationHeaderHtml',
48
+ 'notesHeaderCellHtml',
49
+ 'iscHeaderCellHtml',
50
+ 'notesCellHtml',
51
+ 'iscCellHtml',
52
+ ]);
53
+ reusableViewTemplateKeys = {
54
+ leafPlain: 'view-template-leaf-plain',
55
+ leafDate: 'view-template-leaf-date',
56
+ leafOptionEmpty: 'view-template-leaf-option-empty',
57
+ leafOptionSingle: 'view-template-leaf-option-single',
58
+ leafOptionMulti: 'view-template-leaf-option-multi',
59
+ leafRichText: 'view-template-leaf-rich-text',
60
+ leafFileUpload: 'view-template-leaf-file-upload',
61
+ leafPDFList: 'view-template-leaf-pdf-list',
62
+ leafDataLocation: 'view-template-leaf-data-location',
63
+ leafPublishDataLocationSelector: 'view-template-leaf-publish-data-location-selector',
64
+ leafCheckboxTree: 'view-template-leaf-checkbox-tree',
65
+ groupContainer: 'view-template-group-container',
66
+ groupRowWithLabel: 'view-template-group-row-with-label',
67
+ groupRowNoLabel: 'view-template-group-row-no-label',
68
+ repeatableTable: 'view-template-repeatable-table',
69
+ repeatableList: 'view-template-repeatable-list',
70
+ };
71
+ dataLocationLeafFallbackTemplate = `{{#if [[valueExpr]]}}<div class="table-responsive mt-2"><table class="table table-bordered table-striped table-hover mb-0 rb-view-data-location"><thead><tr><th width="15%">[[typeHeaderHtml]]</th><th width="40%">[[locationHeaderHtml]]</th>[[notesHeaderCellHtml]][[iscHeaderCellHtml]]</tr></thead><tbody>{{#each [[valueExpr]]}}<tr><td>{{default this.typeLabel this.type}}</td><td>{{#if (or (eq this.type "url") (eq this.type "attachment"))}}<a href="{{default this.url this.location}}" target="_blank" rel="noopener noreferrer">{{default this.name this.location}}</a>{{else}}<span>{{default this.name this.location}}</span>{{/if}}</td>[[notesCellHtml]][[iscCellHtml]]</tr>{{/each}}</tbody></table></div>{{/if}}`;
72
+ pdfListLeafFallbackTemplate = `{{#if [[valueExpr]]}}<ul class="rb-view-pdf-list">{{#each [[valueExpr]]}}<li>{{default this.fileName this.label}}</li>{{/each}}</ul>{{/if}}`;
73
+ publishDataLocationSelectorLeafFallbackTemplate = `{{#if [[valueExpr]]}}<div class="table-responsive mt-2"><table class="table table-bordered table-striped table-hover mb-0 rb-view-publish-data-location-selector"><thead><tr><th width="15%">[[typeHeaderHtml]]</th><th width="35%">[[locationHeaderHtml]]</th>[[notesHeaderCellHtml]][[iscHeaderCellHtml]]</tr></thead><tbody>{{#each [[valueExpr]]}}{{#if this.selected}}<tr><td>{{default this.typeLabel this.type}}</td><td>{{#if (or (eq this.type "url") (eq this.type "attachment"))}}<a href="{{default this.url this.location}}" target="_blank" rel="noopener noreferrer">{{default this.name this.location}}</a>{{else}}<span>{{default this.name this.location}}</span>{{/if}}</td>[[notesCellHtml]][[iscCellHtml]]</tr>{{/if}}{{/each}}</tbody></table></div>{{/if}}`;
74
+ questionTreeHelper;
75
+ forcedViewTransformOverrideKey = '__forceViewTransform';
76
+ constructor(logger) {
77
+ this.logger = logger;
78
+ this.propertiesHelper = new common_model_1.PropertiesHelper();
79
+ this.activeReusableFormDefs = {};
80
+ this.questionTreeHelper = new question_tree_helper_1.QuestionTreeHelper(logger);
81
+ }
82
+ /**
83
+ * Defines the known transforms between two form components.
84
+ * @private
85
+ */
86
+ knownTransforms = {
87
+ [simple_input_outline_1.SimpleInputComponentName]: {
88
+ [content_outline_1.ContentComponentName]: this.sourceSimpleInputComponentTargetContentComponent,
89
+ },
90
+ [text_area_outline_1.TextAreaComponentName]: {
91
+ [content_outline_1.ContentComponentName]: this.sourceTextAreaComponentTargetContentComponent,
92
+ },
93
+ [dropdown_input_outline_1.DropdownInputComponentName]: {
94
+ [content_outline_1.ContentComponentName]: this.sourceDropdownInputComponentTargetContentComponent,
95
+ },
96
+ [checkbox_input_outline_1.CheckboxInputComponentName]: {
97
+ [content_outline_1.ContentComponentName]: this.sourceCheckboxInputComponentTargetContentComponent,
98
+ },
99
+ [radio_input_outline_1.RadioInputComponentName]: {
100
+ [content_outline_1.ContentComponentName]: this.sourceRadioInputComponentTargetContentComponent,
101
+ },
102
+ [date_input_outline_1.DateInputComponentName]: {
103
+ [content_outline_1.ContentComponentName]: this.sourceDateInputComponentTargetContentComponent,
104
+ },
105
+ [typeahead_input_outline_1.TypeaheadInputComponentName]: {
106
+ [content_outline_1.ContentComponentName]: this.sourceTypeaheadInputComponentTargetContentComponent,
107
+ },
108
+ [rich_text_editor_outline_1.RichTextEditorComponentName]: {
109
+ [content_outline_1.ContentComponentName]: this.sourceRichTextEditorComponentTargetContentComponent,
110
+ },
111
+ [file_upload_outline_1.FileUploadComponentName]: {
112
+ [content_outline_1.ContentComponentName]: this.sourceFileUploadComponentTargetContentComponent,
113
+ },
114
+ [pdf_list_outline_1.PDFListComponentName]: {
115
+ [content_outline_1.ContentComponentName]: this.sourcePDFListComponentTargetContentComponent,
116
+ },
117
+ [data_location_outline_1.DataLocationComponentName]: {
118
+ [content_outline_1.ContentComponentName]: this.sourceDataLocationComponentTargetContentComponent,
119
+ },
120
+ [publish_data_location_selector_outline_1.PublishDataLocationSelectorComponentName]: {
121
+ [content_outline_1.ContentComponentName]: this.sourcePublishDataLocationSelectorComponentTargetContentComponent,
122
+ },
123
+ [repeatable_outline_1.RepeatableComponentName]: {
124
+ [content_outline_1.ContentComponentName]: this.sourceRepeatableComponentTargetContentComponent,
125
+ },
126
+ [group_outline_1.GroupFieldComponentName]: {
127
+ [content_outline_1.ContentComponentName]: this.sourceGroupComponentTargetContentComponent,
128
+ },
129
+ [tab_outline_1.TabComponentName]: {
130
+ [accordion_outline_1.AccordionComponentName]: this.sourceTabComponentTargetAccordionComponent,
131
+ },
132
+ [checkbox_tree_outline_1.CheckboxTreeComponentName]: {
133
+ [content_outline_1.ContentComponentName]: this.sourceCheckboxTreeComponentTargetContentComponent,
134
+ },
135
+ [question_tree_outline_1.QuestionTreeComponentName]: {
136
+ [content_outline_1.ContentComponentName]: this.sourceQuestionTreeComponentTargetContentComponent,
137
+ },
138
+ };
139
+ /**
140
+ * Specifies the 'default' transforms that will be done without needing to be specified.
141
+ * The defaults can be overridden by specifying the transform in overrides.formModeClasses.
142
+ * @private
143
+ */
144
+ defaultTransforms = {
145
+ [simple_input_outline_1.SimpleInputComponentName]: {
146
+ view: {
147
+ component: content_outline_1.ContentComponentName,
148
+ },
149
+ },
150
+ [text_area_outline_1.TextAreaComponentName]: {
151
+ view: {
152
+ component: content_outline_1.ContentComponentName,
153
+ },
154
+ },
155
+ [dropdown_input_outline_1.DropdownInputComponentName]: {
156
+ view: {
157
+ component: content_outline_1.ContentComponentName,
158
+ },
159
+ },
160
+ [checkbox_input_outline_1.CheckboxInputComponentName]: {
161
+ view: {
162
+ component: content_outline_1.ContentComponentName,
163
+ },
164
+ },
165
+ [radio_input_outline_1.RadioInputComponentName]: {
166
+ view: {
167
+ component: content_outline_1.ContentComponentName,
168
+ },
169
+ },
170
+ [date_input_outline_1.DateInputComponentName]: {
171
+ view: {
172
+ component: content_outline_1.ContentComponentName,
173
+ },
174
+ },
175
+ [typeahead_input_outline_1.TypeaheadInputComponentName]: {
176
+ view: {
177
+ component: content_outline_1.ContentComponentName,
178
+ },
179
+ },
180
+ [rich_text_editor_outline_1.RichTextEditorComponentName]: {
181
+ view: {
182
+ component: content_outline_1.ContentComponentName,
183
+ },
184
+ },
185
+ [file_upload_outline_1.FileUploadComponentName]: {
186
+ view: {
187
+ component: content_outline_1.ContentComponentName,
188
+ },
189
+ },
190
+ [pdf_list_outline_1.PDFListComponentName]: {
191
+ view: {
192
+ component: content_outline_1.ContentComponentName,
193
+ },
194
+ },
195
+ [data_location_outline_1.DataLocationComponentName]: {
196
+ view: {
197
+ component: content_outline_1.ContentComponentName,
198
+ },
199
+ },
200
+ [publish_data_location_selector_outline_1.PublishDataLocationSelectorComponentName]: {
201
+ view: {
202
+ component: content_outline_1.ContentComponentName,
203
+ },
204
+ },
205
+ [repeatable_outline_1.RepeatableComponentName]: {
206
+ view: {
207
+ component: content_outline_1.ContentComponentName,
208
+ },
209
+ },
210
+ [group_outline_1.GroupFieldComponentName]: {
211
+ view: {
212
+ component: content_outline_1.ContentComponentName,
213
+ },
214
+ },
215
+ [tab_outline_1.TabComponentName]: {
216
+ view: {
217
+ component: accordion_outline_1.AccordionComponentName,
218
+ layout: accordion_outline_1.AccordionLayoutName,
219
+ },
220
+ },
221
+ [checkbox_tree_outline_1.CheckboxTreeComponentName]: {
222
+ view: {
223
+ component: content_outline_1.ContentComponentName,
224
+ },
225
+ },
226
+ [question_tree_outline_1.QuestionTreeComponentName]: {
227
+ view: {
228
+ component: content_outline_1.ContentComponentName,
229
+ },
230
+ },
231
+ };
232
+ tableCompatibleLeafComponentNames = new Set([
233
+ simple_input_outline_1.SimpleInputComponentName,
234
+ text_area_outline_1.TextAreaComponentName,
235
+ date_input_outline_1.DateInputComponentName,
236
+ dropdown_input_outline_1.DropdownInputComponentName,
237
+ checkbox_input_outline_1.CheckboxInputComponentName,
238
+ radio_input_outline_1.RadioInputComponentName,
239
+ typeahead_input_outline_1.TypeaheadInputComponentName,
240
+ rich_text_editor_outline_1.RichTextEditorComponentName,
241
+ map_outline_1.MapComponentName,
242
+ content_outline_1.ContentComponentName,
243
+ checkbox_tree_outline_1.CheckboxTreeComponentName,
244
+ data_location_outline_1.DataLocationComponentName,
245
+ publish_data_location_selector_outline_1.PublishDataLocationSelectorComponentName,
246
+ ]);
247
+ /**
248
+ * Apply any reusable form configs in the form component definitions.
249
+ * @param items The form component definitions.
250
+ * @param reusableFormDefs
251
+ * @protected
252
+ */
253
+ applyOverridesReusable(items, reusableFormDefs, visitedReusableFormNames = new Set()) {
254
+ const reusableFormDefNames = Object.keys(reusableFormDefs ?? {}).sort();
255
+ // Expanding the reusable form name to the associated form config requires replacing the item in the array.
256
+ // Changing the array that's currently being iterated can result in unstable or undefined behaviour.
257
+ // Instead, find the index of the first item that is a reusable component.
258
+ const index = items.findIndex(item => (0, form_types_outline_1.isTypeReusableComponent)(item, reusableFormDefNames));
259
+ // When there are no more items to expand, return the updated items array.
260
+ if (index === -1) {
261
+ return items;
262
+ }
263
+ // Update the items array to remove the reusable component and replace it with the form config it represents.
264
+ const item = items[index];
265
+ if ((0, form_types_outline_1.isTypeReusableComponent)(item, reusableFormDefNames)) {
266
+ const expandedItems = this.applyOverrideReusableExpand(item, reusableFormDefs, visitedReusableFormNames);
267
+ const newItems = [...items];
268
+ newItems.splice(index, 1, ...expandedItems);
269
+ items = newItems;
270
+ }
271
+ else {
272
+ throw new Error(`Somehow the isReusableComponent was true earlier, but is now false, for the same item. Logic error?`);
273
+ }
274
+ // Continue until there are no more reusable components to expand.
275
+ return this.applyOverridesReusable(items, reusableFormDefs, visitedReusableFormNames);
276
+ }
277
+ /**
278
+ * Expand a reusable form config definition to the actual form component definition(s).
279
+ * @param item The reusable form component definition.
280
+ * @param reusableFormDefs
281
+ * @protected
282
+ */
283
+ applyOverrideReusableExpand(item, reusableFormDefs, visitedReusableFormNames = new Set()) {
284
+ const reusableFormName = item?.overrides?.reusableFormName ?? '';
285
+ if (visitedReusableFormNames.has(reusableFormName)) {
286
+ const visitedPath = [...visitedReusableFormNames, reusableFormName].join(' -> ');
287
+ throw new Error(`Circular reusable form reference detected for '${reusableFormName}'. Expansion path: ${visitedPath}.`);
288
+ }
289
+ visitedReusableFormNames.add(reusableFormName);
290
+ const expandedItemsRaw = Object.keys(reusableFormDefs).includes(reusableFormName)
291
+ ? reusableFormDefs[reusableFormName]
292
+ : [];
293
+ try {
294
+ const expandedItems = this.applyOverridesReusable(expandedItemsRaw, reusableFormDefs, visitedReusableFormNames);
295
+ const additionalItemsRaw = item.component.config?.componentDefinitions ?? [];
296
+ const additionalItems = this.applyOverridesReusable(additionalItemsRaw, reusableFormDefs, visitedReusableFormNames);
297
+ const expandedItemNames = expandedItems.map(i => i.name);
298
+ const extraAdditionalItems = additionalItems.filter(i => !expandedItemNames.includes(i.name));
299
+ if (extraAdditionalItems.length > 0) {
300
+ throw new Error('Invalid usage of reusable form config. ' +
301
+ `Each item in the ${reusable_outline_1.ReusableComponentName} componentDefinitions must have a name that matches an item in the reusable form config '${reusableFormName}'. ` +
302
+ `Names '${extraAdditionalItems.map(i => i.name)}' did not match any reusable form config items. ` +
303
+ `Available names are '${expandedItems
304
+ .map(i => i.name)
305
+ .sort()
306
+ .join(', ')}'.`);
307
+ }
308
+ const preserveWrapperExpressions = expandedItems.length === 1 && item.expressions !== undefined;
309
+ const result = [];
310
+ for (const expandedItem of expandedItems) {
311
+ const additionalItemsMatched = additionalItems.filter(additionalItem => expandedItem.name === additionalItem.name);
312
+ if (additionalItemsMatched.length > 1) {
313
+ throw new Error('Invalid usage of reusable form config. ' +
314
+ `Each item in the ${reusable_outline_1.ReusableComponentName} componentDefinitions must have a unique name. ` +
315
+ `These names were not unique '${Array.from(new Set(additionalItemsMatched.map(i => i.name)))
316
+ .sort()
317
+ .join(', ')}'.`);
318
+ }
319
+ if (additionalItemsMatched.length === 1) {
320
+ const additionalItem = additionalItemsMatched[0];
321
+ const known = {
322
+ component: { reusable: expandedItem.component.class, additional: additionalItem.component.class },
323
+ model: { reusable: expandedItem.model?.class, additional: additionalItem.model?.class },
324
+ layout: { reusable: expandedItem.layout?.class, additional: additionalItem.layout?.class },
325
+ };
326
+ for (const [key, values] of Object.entries(known)) {
327
+ const reusableValue = values.reusable;
328
+ const additionalValue = values.additional;
329
+ if (reusableValue && additionalValue && reusableValue !== additionalValue) {
330
+ throw new Error('Invalid usage of reusable form config. The class must match the reusable form config. ' +
331
+ "To change the class, use 'formModeClasses'. " +
332
+ `The ${key} class in reusable form config '${reusableFormName}' item '${expandedItem.name}' ` +
333
+ `is '${reusableValue}' given class was '${additionalValue}'.`);
334
+ }
335
+ }
336
+ }
337
+ const newItem = (0, lodash_1.mergeWith)({}, expandedItem, additionalItemsMatched.length === 1 ? additionalItemsMatched[0] : {}, (objValue, srcValue, key) => {
338
+ if (key === 'expressions' && Array.isArray(srcValue)) {
339
+ return srcValue;
340
+ }
341
+ return undefined;
342
+ });
343
+ if (preserveWrapperExpressions) {
344
+ newItem.expressions = item.expressions;
345
+ }
346
+ // Apply replaceName during reusable expansion so downstream data-model path binding
347
+ // uses the final component name rather than the reusable template name.
348
+ if (additionalItemsMatched.length === 1 && additionalItemsMatched[0].overrides?.replaceName !== undefined) {
349
+ newItem.name = additionalItemsMatched[0].overrides?.replaceName;
350
+ }
351
+ result.push(newItem);
352
+ }
353
+ return result;
354
+ }
355
+ finally {
356
+ visitedReusableFormNames.delete(reusableFormName);
357
+ }
358
+ }
359
+ /**
360
+ * Apply any overrides that transform a component into another component.
361
+ * @param source The original component.
362
+ * @param formMode The current form mode.
363
+ * @returns The transformed form component.
364
+ */
365
+ applyOverrideTransform(source, formMode, options) {
366
+ const original = (0, lodash_1.cloneDeep)(source);
367
+ const phase = options?.phase ?? 'construct';
368
+ this.activeReusableFormDefs = options?.reusableFormDefs ?? {};
369
+ // Get the component class name, this is also used as the form component identifier.
370
+ const originalComponentClassName = original.component.class;
371
+ // Get the provided transforms for the provided form mode.
372
+ let transforms = original?.overrides?.formModeClasses?.[formMode] ?? {};
373
+ // Apply any default transform for the provided form mode.
374
+ const deferViewModeContentFlatteningAtConstruct = phase === 'construct' &&
375
+ formMode === 'view' &&
376
+ new Set([repeatable_outline_1.RepeatableComponentName, group_outline_1.GroupFieldComponentName]).has(originalComponentClassName);
377
+ const shouldForceViewTransform = original?.overrides?.[this.forcedViewTransformOverrideKey] === true;
378
+ const skipAutomaticViewTransform = formMode === 'view' &&
379
+ !shouldForceViewTransform &&
380
+ this.hasExplicitAllowedMode(original?.constraints, 'view');
381
+ if (originalComponentClassName in this.defaultTransforms &&
382
+ !deferViewModeContentFlatteningAtConstruct &&
383
+ !skipAutomaticViewTransform) {
384
+ const defaultTransform = this.defaultTransforms[originalComponentClassName] ?? {};
385
+ if (formMode in defaultTransform) {
386
+ const defaultTransformClasses = defaultTransform[formMode] ?? {};
387
+ transforms = (0, lodash_1.merge)({}, defaultTransformClasses, transforms);
388
+ }
389
+ }
390
+ const transformComponentClassName = transforms?.component;
391
+ // Check that the transform is valid.
392
+ if (!transformComponentClassName && (transforms.model || transforms.layout)) {
393
+ throw new Error('A transform must specify the component class when specifying other classes.' +
394
+ `Form component name '${source.name}' model class '${transforms.model}' layout class '${transforms.layout}'.`);
395
+ }
396
+ // Get the known transformations for the source form component definition.
397
+ const sourceKnownTransforms = this.knownTransforms[originalComponentClassName] ?? {};
398
+ // Return the source unmodified if there are no transforms specified.
399
+ // Return the source unmodified if the transformation is to the same component
400
+ const isTransformExpected = transformComponentClassName &&
401
+ transformComponentClassName !== originalComponentClassName &&
402
+ Object.keys(transforms).length > 0;
403
+ // If a transform was provided, check that it is a known transform.
404
+ if (isTransformExpected && !(transformComponentClassName in sourceKnownTransforms)) {
405
+ throw new Error(`Invalid form config override config. ` +
406
+ `The source component class '${originalComponentClassName}' does ` +
407
+ `not define a transform to target component class '${transformComponentClassName}'.`);
408
+ }
409
+ // Check the transform function specified.
410
+ const transformFunc = isTransformExpected ? sourceKnownTransforms[transformComponentClassName] : null;
411
+ if (isTransformExpected && !transformFunc) {
412
+ throw new Error('The known form mode override component class transforms are invalid. ' +
413
+ `The function to execute must be provided for source component class '${originalComponentClassName}' ` +
414
+ `and target component class '${transformComponentClassName}'.`);
415
+ }
416
+ // Apply the transform.
417
+ const hasTransform = !!transformComponentClassName && !!transformFunc;
418
+ const result = hasTransform ? transformFunc.call(this, original, formMode) : original;
419
+ // Use 'replaceName' to update the form component name.
420
+ if (original.overrides?.replaceName !== undefined) {
421
+ result.name = original.overrides?.replaceName;
422
+ }
423
+ // Remove the 'overrides' property, as it has been applied and so should not be present in the form config.
424
+ if ('overrides' in result) {
425
+ delete result['overrides'];
426
+ }
427
+ if (isTransformExpected) {
428
+ this.logger.info(`Component '${source?.name}' ${hasTransform ? 'transformed' : 'unmodified'} ` +
429
+ `from '${originalComponentClassName}' to '${transformComponentClassName}'.`);
430
+ }
431
+ return result;
432
+ }
433
+ /* Additional Question Tree */
434
+ /**
435
+ * Create reusable components from the question tree questions DSL.
436
+ * @param name The form component name.
437
+ * @param lineagePath The form component lineage path.
438
+ * @param item The question tree component.
439
+ * @param modelData The question tree model data.
440
+ * @private
441
+ */
442
+ applyQuestionTreeDsl(name, lineagePath, item, modelData) {
443
+ if (!name) {
444
+ throw new Error(`${this.logName}: A name is required to apply the question tree DSL.`);
445
+ }
446
+ const availableOutcomeValues = (item.config?.availableOutcomes ?? []).map(i => i.value);
447
+ const availableMeta = item.config?.availableMeta ?? {};
448
+ const questions = item.config?.questions ?? [];
449
+ // Prepare question and answer info to assist checking for valid structure
450
+ const { errors, questionAnswerValuesMap } = this.questionTreeHelper.validateQuestions(questions);
451
+ const result = [];
452
+ questions.forEach((question, questionIndex) => {
453
+ // validate
454
+ errors.push(...this.questionTreeHelper.validateQuestion(question, questionIndex, availableOutcomeValues, availableMeta, questionAnswerValuesMap));
455
+ // Transform rules DSL to expressions.
456
+ result.push(this.questionTreeHelper.transformQuestionConfig(name, lineagePath, item, modelData, question.id, questions));
457
+ });
458
+ if (errors.length > 0) {
459
+ throw new Error(`${this.logName}: Question tree is not valid: ${errors.join(' ')}`);
460
+ }
461
+ // Add hidden inputs for outcome info.
462
+ // This component allows the outcome and details to be stored within the question tree data model.
463
+ const outcomeComponent = {
464
+ name: question_tree_outline_1.QuestionTreeOutcomeInfoKey,
465
+ component: { class: "SimpleInputComponent", config: { type: "hidden", visible: false } },
466
+ layout: { class: "DefaultLayout", config: { visible: false } },
467
+ };
468
+ result.push(outcomeComponent);
469
+ return result;
470
+ }
471
+ /**
472
+ * Check that only the allowed form component frames have been used.
473
+ * @param items The form components after reusable components have been applied.
474
+ * @private
475
+ */
476
+ applyQuestionTreeFrames(items) {
477
+ const result = [];
478
+ for (const item of items) {
479
+ if ((0, form_types_outline_1.isTypeFormComponentDefinitionName)(item, simple_input_outline_1.SimpleInputComponentName)) {
480
+ result.push(item);
481
+ continue;
482
+ }
483
+ if ((0, form_types_outline_1.isTypeFormComponentDefinitionName)(item, checkbox_input_outline_1.CheckboxInputComponentName)) {
484
+ result.push(item);
485
+ continue;
486
+ }
487
+ if ((0, form_types_outline_1.isTypeFormComponentDefinitionName)(item, radio_input_outline_1.RadioInputComponentName)) {
488
+ result.push(item);
489
+ continue;
490
+ }
491
+ if ((0, form_types_outline_1.isTypeFormComponentDefinitionName)(item, reusable_outline_1.ReusableComponentName)) {
492
+ result.push(item);
493
+ continue;
494
+ }
495
+ throw new Error(`${this.logName}: Invalid form component frame ${item.name} class ${item.component.class} in Question Tree.`);
496
+ }
497
+ return result;
498
+ }
499
+ /* Transforms between components */
500
+ resolveReusableViewTemplate(templateKey, fallbackTemplate) {
501
+ const reusableDefs = this.activeReusableFormDefs ?? {};
502
+ const reusableEntry = reusableDefs[templateKey];
503
+ if (!Array.isArray(reusableEntry)) {
504
+ this.logger.debug(`Reusable view template key '${templateKey}' missing, using fallback template.`);
505
+ return fallbackTemplate;
506
+ }
507
+ if (reusableEntry.length !== 1) {
508
+ this.logger.debug(`Reusable view template key '${templateKey}' must contain exactly one component definition, found ${reusableEntry.length}. Using fallback template.`);
509
+ return fallbackTemplate;
510
+ }
511
+ const reusableDef = reusableEntry[0];
512
+ const reusableClassName = reusableDef?.component?.class;
513
+ if (reusableClassName !== content_outline_1.ContentComponentName) {
514
+ this.logger.debug(`Reusable view template key '${templateKey}' expected class '${content_outline_1.ContentComponentName}', got '${reusableClassName ?? ''}'. Using fallback template.`);
515
+ return fallbackTemplate;
516
+ }
517
+ const template = reusableDef.component.config?.template?.trim?.() ?? '';
518
+ if (template.length === 0) {
519
+ this.logger.debug(`Reusable view template key '${templateKey}' has empty ContentComponent template, using fallback template.`);
520
+ return fallbackTemplate;
521
+ }
522
+ return template;
523
+ }
524
+ substituteReusableTemplateSlots(template, slots) {
525
+ let resolved = template;
526
+ for (const [slot, value] of Object.entries(slots)) {
527
+ if (!this.reusableFragmentSlotNames.has(slot)) {
528
+ continue;
529
+ }
530
+ resolved = resolved.split(`[[${slot}]]`).join(value);
531
+ resolved = resolved.split(`{{${slot}}}`).join(value);
532
+ resolved = resolved.split(`{{{${slot}}}}`).join(value);
533
+ }
534
+ return resolved;
535
+ }
536
+ sourceSimpleInputComponentTargetContentComponent(source, formMode) {
537
+ const target = this.commonContentComponent(source, formMode);
538
+ this.commonContentPlain(source, target);
539
+ const sourceConfig = source.component?.config;
540
+ if (sourceConfig?.type === 'hidden') {
541
+ if (target.component.config) {
542
+ target.component.config.visible = false;
543
+ }
544
+ const targetLayoutConfig = target.layout?.config;
545
+ if (targetLayoutConfig) {
546
+ targetLayoutConfig.visible = false;
547
+ }
548
+ }
549
+ return target;
550
+ }
551
+ sourceTextAreaComponentTargetContentComponent(source, formMode) {
552
+ const target = this.commonContentComponent(source, formMode);
553
+ if (target.component.config !== undefined && source.model?.config?.value !== undefined) {
554
+ target.component.config.content = source.model.config.value;
555
+ target.component.config.template = `<span>{{{plaintextToHtml content}}}</span>`;
556
+ }
557
+ return target;
558
+ }
559
+ sourceDropdownInputComponentTargetContentComponent(source, formMode) {
560
+ const target = this.commonContentComponent(source, formMode);
561
+ if (target.component.config !== undefined && source.model?.config?.value !== undefined) {
562
+ const value = source.model.config.value;
563
+ const options = source.component.config?.options ?? [];
564
+ const values = value === null || value === undefined
565
+ ? []
566
+ : Array.isArray(value)
567
+ ? value.map(item => String(item))
568
+ : [String(value)];
569
+ this.commonContentOptionList(target, values, options);
570
+ }
571
+ return target;
572
+ }
573
+ sourceCheckboxInputComponentTargetContentComponent(source, formMode) {
574
+ const target = this.commonContentComponent(source, formMode);
575
+ if (target.component.config !== undefined && source.model?.config?.value !== undefined) {
576
+ // Checkbox value can be string, null, array. If string or array, get the labels.
577
+ // Can have 0, 1, or more values.
578
+ const values = source.model.config.value === null
579
+ ? []
580
+ : Array.isArray(source.model.config.value)
581
+ ? source.model.config.value
582
+ : [source.model.config.value];
583
+ const options = source.component.config?.options ?? [];
584
+ this.commonContentOptionList(target, values, options);
585
+ }
586
+ return target;
587
+ }
588
+ sourceRadioInputComponentTargetContentComponent(source, formMode) {
589
+ const target = this.commonContentComponent(source, formMode);
590
+ if (target.component.config !== undefined && source.model?.config?.value !== undefined) {
591
+ // Radio value can be string, null, array. If string or array, get the labels.
592
+ // Can have 0 or 1 values.
593
+ const values = source.model.config.value === null
594
+ ? []
595
+ : Array.isArray(source.model.config.value)
596
+ ? source.model.config.value
597
+ : [source.model.config.value];
598
+ const options = source.component.config?.options ?? [];
599
+ this.commonContentOptionList(target, values, options);
600
+ }
601
+ return target;
602
+ }
603
+ sourceDateInputComponentTargetContentComponent(source, formMode) {
604
+ const target = this.commonContentComponent(source, formMode);
605
+ if (target.component.config !== undefined && source.model?.config?.value !== undefined) {
606
+ const configuredDateFormat = source.component?.config?.dateFormat?.trim?.() || 'YYYY/MM/DD';
607
+ target.component.config.content = source.model.config.value;
608
+ target.component.config.template = `<span data-value="{{content}}">{{formatDate content "${configuredDateFormat}"}}</span>`;
609
+ }
610
+ return target;
611
+ }
612
+ sourceTypeaheadInputComponentTargetContentComponent(source, formMode) {
613
+ const target = this.commonContentComponent(source, formMode);
614
+ if (!target.component.config || source.model?.config?.value === undefined) {
615
+ return target;
616
+ }
617
+ const value = source.model.config.value;
618
+ const displayValue = value && typeof value === 'object' && 'label' in value
619
+ ? value.label
620
+ : typeof value === 'string'
621
+ ? value
622
+ : '';
623
+ target.component.config.content = displayValue;
624
+ target.component.config.template = this.resolveReusableViewTemplate(this.reusableViewTemplateKeys.leafPlain, `<span>{{content}}</span>`);
625
+ return target;
626
+ }
627
+ sourceRichTextEditorComponentTargetContentComponent(source, formMode) {
628
+ const target = this.commonContentComponent(source, formMode);
629
+ const outputFormat = source.component?.config?.outputFormat ?? 'html';
630
+ if (!target.component.config || source.model?.config?.value === undefined) {
631
+ return target;
632
+ }
633
+ target.component.config.content = source.model.config.value;
634
+ const fallbackTemplate = `{{{markdownToHtml content "${this.escapeForHandlebarsLiteral(outputFormat)}"}}}`;
635
+ target.component.config.template = this.resolveReusableViewTemplate(this.reusableViewTemplateKeys.leafRichText, fallbackTemplate);
636
+ target.component.config = {
637
+ ...target.component.config,
638
+ outputFormat,
639
+ };
640
+ return target;
641
+ }
642
+ sourceFileUploadComponentTargetContentComponent(source, formMode) {
643
+ const target = this.commonContentComponent(source, formMode);
644
+ if (!target.component.config || source.model?.config?.value === undefined) {
645
+ return target;
646
+ }
647
+ target.component.config.content = source.model.config.value;
648
+ const uploadTemplate = this.resolveReusableViewTemplate(this.reusableViewTemplateKeys.leafFileUpload, `<ul class="rb-view-file-upload">{{#each [[valueExpr]]}<li>{{#if (attachmentDownloadUrl this oid branding portal)}}<a href="{{attachmentDownloadUrl this oid branding portal}}" target="_blank" rel="noopener noreferrer">{{default this.name this.fileId}}</a>{{else}}{{default this.name this.fileId}}{{/if}}{{#if this.notes}}<div class="text-muted"><small>{{this.notes}}</small></div>{{/if}}</li>{{/each}}</ul>`);
649
+ target.component.config.template = this.substituteReusableTemplateSlots(uploadTemplate, { valueExpr: 'content' });
650
+ return target;
651
+ }
652
+ sourceDataLocationComponentTargetContentComponent(source, formMode) {
653
+ const target = this.commonContentComponent(source, formMode);
654
+ if (!target.component.config || source.model?.config?.value === undefined) {
655
+ return target;
656
+ }
657
+ target.component.config.content = source.model.config.value;
658
+ const template = this.resolveReusableViewTemplate(this.reusableViewTemplateKeys.leafDataLocation, this.dataLocationLeafFallbackTemplate);
659
+ const componentConfig = source.component?.config;
660
+ const typeHeader = componentConfig?.typeHeader ?? 'Type';
661
+ const locationHeader = componentConfig?.locationHeader ?? 'Location';
662
+ const notesHeader = componentConfig?.notesHeader ?? 'Notes';
663
+ const iscHeader = componentConfig?.iscHeader ?? 'Information Security Classification';
664
+ const notesEnabled = componentConfig?.notesEnabled !== false;
665
+ const iscEnabled = componentConfig?.iscEnabled === true;
666
+ target.component.config.template = this.substituteReusableTemplateSlots(template, {
667
+ valueExpr: 'content',
668
+ typeHeaderHtml: `{{t "${this.escapeForHandlebarsLiteral(typeHeader)}"}}`,
669
+ locationHeaderHtml: `{{t "${this.escapeForHandlebarsLiteral(locationHeader)}"}}`,
670
+ notesHeaderCellHtml: notesEnabled ? `<th width="20%">{{t "${this.escapeForHandlebarsLiteral(notesHeader)}"}}</th>` : '',
671
+ iscHeaderCellHtml: iscEnabled ? `<th width="20%">{{t "${this.escapeForHandlebarsLiteral(iscHeader)}"}}</th>` : '',
672
+ notesCellHtml: notesEnabled ? `<td>{{default this.notes ""}}</td>` : '',
673
+ iscCellHtml: iscEnabled ? `<td>{{default this.isc ""}}</td>` : '',
674
+ });
675
+ return target;
676
+ }
677
+ sourcePDFListComponentTargetContentComponent(source, formMode) {
678
+ const target = this.commonContentComponent(source, formMode);
679
+ if (!target.component.config || source.model?.config?.value === undefined) {
680
+ return target;
681
+ }
682
+ target.component.config.content = source.model.config.value;
683
+ const template = this.resolveReusableViewTemplate(this.reusableViewTemplateKeys.leafPDFList, this.pdfListLeafFallbackTemplate);
684
+ target.component.config.template = this.substituteReusableTemplateSlots(template, {
685
+ valueExpr: 'content',
686
+ });
687
+ return target;
688
+ }
689
+ sourcePublishDataLocationSelectorComponentTargetContentComponent(source, formMode) {
690
+ const target = this.commonContentComponent(source, formMode);
691
+ if (!target.component.config || source.model?.config?.value === undefined) {
692
+ return target;
693
+ }
694
+ target.component.config.content = source.model.config.value;
695
+ const template = this.resolveReusableViewTemplate(this.reusableViewTemplateKeys.leafPublishDataLocationSelector, this.publishDataLocationSelectorLeafFallbackTemplate);
696
+ const componentConfig = source.component?.config;
697
+ const typeHeader = componentConfig?.typeHeader ?? 'Type';
698
+ const locationHeader = componentConfig?.locationHeader ?? 'Location';
699
+ const notesHeader = componentConfig?.notesHeader ?? 'Notes';
700
+ const iscHeader = componentConfig?.iscHeader ?? 'Information Security Classification';
701
+ const notesEnabled = componentConfig?.notesEnabled !== false;
702
+ const iscEnabled = componentConfig?.iscEnabled === true;
703
+ target.component.config.template = this.substituteReusableTemplateSlots(template, {
704
+ valueExpr: 'content',
705
+ typeHeaderHtml: `{{t "${this.escapeForHandlebarsLiteral(typeHeader)}"}}`,
706
+ locationHeaderHtml: `{{t "${this.escapeForHandlebarsLiteral(locationHeader)}"}}`,
707
+ notesHeaderCellHtml: notesEnabled ? `<th width="20%">{{t "${this.escapeForHandlebarsLiteral(notesHeader)}"}}</th>` : '',
708
+ iscHeaderCellHtml: iscEnabled ? `<th width="20%">{{t "${this.escapeForHandlebarsLiteral(iscHeader)}"}}</th>` : '',
709
+ notesCellHtml: notesEnabled ? `<td>{{default this.notes ""}}</td>` : '',
710
+ iscCellHtml: iscEnabled ? `<td>{{default this.isc ""}}</td>` : '',
711
+ });
712
+ return target;
713
+ }
714
+ sourceCheckboxTreeComponentTargetContentComponent(source, formMode) {
715
+ const target = this.commonContentComponent(source, formMode);
716
+ if (!target.component.config) {
717
+ return target;
718
+ }
719
+ if (source.model?.config?.value !== undefined) {
720
+ target.component.config.content = source.model.config.value;
721
+ }
722
+ target.component.config.template = this.resolveReusableViewTemplate(this.reusableViewTemplateKeys.leafCheckboxTree, `<ul>{{#each content}}<li>{{default this.label this.notation}}</li>{{/each}}</ul>`);
723
+ return target;
724
+ }
725
+ sourceQuestionTreeComponentTargetContentComponent(source, formMode) {
726
+ const target = this.commonContentComponent(source, formMode);
727
+ if (!target.component.config) {
728
+ return target;
729
+ }
730
+ const answers = this.buildQuestionTreeViewRows(source);
731
+ target.component.config.content = answers;
732
+ target.component.config.template =
733
+ '{{#if content}}<div class="rb-view-group">{{#each content}}<div class="rb-view-row"><div class="rb-view-label">{{#with @root}}{{t ../questionLabel}}{{/with}}</div><div class="rb-view-value">{{#if answerLabels}}<ul>{{#each answerLabels}}<li>{{#with @root}}{{t ../label}}{{/with}}</li>{{/each}}</ul>{{else}}{{#with @root}}{{t ../answerLabel}}{{/with}}{{/if}}</div></div>{{/each}}</div>{{/if}}';
734
+ return target;
735
+ }
736
+ isDeepEmpty(value) {
737
+ if (value === null || value === undefined || value === '') {
738
+ return true;
739
+ }
740
+ if (Array.isArray(value)) {
741
+ return value.every(item => this.isDeepEmpty(item));
742
+ }
743
+ if (typeof value === 'object') {
744
+ return Object.values(value).every(val => this.isDeepEmpty(val));
745
+ }
746
+ return false;
747
+ }
748
+ buildQuestionTreeViewRows(source) {
749
+ const questions = source.component?.config?.questions ?? [];
750
+ const valueMap = (source.model?.config?.value ?? {});
751
+ const childComponentMap = new Map((source.component?.config?.componentDefinitions ?? []).map((componentDefinition) => [componentDefinition.name, componentDefinition]));
752
+ const rows = [];
753
+ for (const question of questions) {
754
+ const childComponent = childComponentMap.get(question.id);
755
+ const selectedValues = this.normaliseQuestionTreeAnswerValues(valueMap[question.id] ??
756
+ childComponent?.model?.config?.value ??
757
+ childComponent?.component?.config?.content);
758
+ if (selectedValues.length === 0) {
759
+ continue;
760
+ }
761
+ const answerLabels = selectedValues.map((value) => this.resolveQuestionTreeAnswerLabel(source.name, question, childComponent, value));
762
+ if (answerLabels.length === 0) {
763
+ continue;
764
+ }
765
+ rows.push({
766
+ questionLabel: this.resolveQuestionTreeQuestionLabel(source.name, question),
767
+ ...(answerLabels.length === 1 ? { answerLabel: answerLabels[0] } : { answerLabels: answerLabels.map((label) => ({ label })) }),
768
+ });
769
+ }
770
+ return rows;
771
+ }
772
+ normaliseQuestionTreeAnswerValues(value) {
773
+ if (Array.isArray(value)) {
774
+ return value.filter((item) => typeof item === 'string' && item.trim().length > 0);
775
+ }
776
+ if (typeof value === 'string' && value.trim().length > 0) {
777
+ return [value];
778
+ }
779
+ return [];
780
+ }
781
+ resolveQuestionTreeQuestionLabel(componentName, question) {
782
+ if (typeof question.label === 'string' && question.label.trim().length > 0) {
783
+ return question.label;
784
+ }
785
+ const keyPrefix = (componentName ?? '').trim().replace(/^@+/, '') || 'questiontree';
786
+ return `@${keyPrefix}-item-${question.id}-label`;
787
+ }
788
+ resolveQuestionTreeAnswerLabel(componentName, question, childComponent, answerValue) {
789
+ const generatedOptionLabel = childComponent?.component?.config
790
+ ?.options
791
+ ?.find((option) => option.value === answerValue)?.label;
792
+ if (typeof generatedOptionLabel === 'string' && generatedOptionLabel.trim().length > 0) {
793
+ return generatedOptionLabel;
794
+ }
795
+ const matchedAnswer = question.answers.find((answer) => answer.value === answerValue);
796
+ if (!matchedAnswer) {
797
+ return answerValue;
798
+ }
799
+ return this.resolveQuestionTreeAnswerLabelFromConfig(componentName, question.id, matchedAnswer);
800
+ }
801
+ resolveQuestionTreeAnswerLabelFromConfig(componentName, questionId, answer) {
802
+ if (typeof answer.label === 'string' && answer.label.trim().length > 0) {
803
+ return answer.label;
804
+ }
805
+ const keyPrefix = (componentName ?? '').trim().replace(/^@+/, '') || 'questiontree';
806
+ return `@${keyPrefix}-${questionId}-${answer.value}`;
807
+ }
808
+ sourceRepeatableComponentTargetContentComponent(source, formMode) {
809
+ const target = this.commonContentComponent(source, formMode);
810
+ if (target.component.config) {
811
+ const rawArray = Array.isArray(source.model?.config?.value) ? source.model?.config?.value : [];
812
+ target.component.config.content = rawArray.filter(item => !this.isDeepEmpty(item));
813
+ target.component.config.template = this.generateTemplateForComponent(source, 'content');
814
+ }
815
+ return target;
816
+ }
817
+ extractDescendantValues(component) {
818
+ const values = {};
819
+ const traverse = (comp) => {
820
+ if (comp.name) {
821
+ let valueToSet = '';
822
+ if (comp.model && comp.model.config) {
823
+ const modelValue = comp.model.config.value;
824
+ const defaultValue = comp.model.config.defaultValue;
825
+ valueToSet = modelValue !== undefined ? modelValue : (defaultValue !== undefined ? defaultValue : '');
826
+ }
827
+ values[comp.name] = valueToSet;
828
+ }
829
+ const config = comp.component?.config;
830
+ if (config) {
831
+ if (Array.isArray(config.componentDefinitions)) {
832
+ config.componentDefinitions.forEach(traverse);
833
+ }
834
+ if (Array.isArray(config.tabs)) {
835
+ config.tabs.forEach(traverse);
836
+ }
837
+ if (Array.isArray(config.panels)) {
838
+ config.panels.forEach(traverse);
839
+ }
840
+ // Reusable component elements within a group
841
+ if (config.elementTemplate) {
842
+ traverse(config.elementTemplate);
843
+ }
844
+ }
845
+ };
846
+ // Do not capture the group's own value, just start traversing its children.
847
+ // (If the group had a value, we wouldn't need to rebuild it from descendants).
848
+ const rootConfig = component.component?.config;
849
+ if (rootConfig) {
850
+ if (Array.isArray(rootConfig.componentDefinitions)) {
851
+ rootConfig.componentDefinitions.forEach(traverse);
852
+ }
853
+ if (Array.isArray(rootConfig.tabs)) {
854
+ rootConfig.tabs.forEach(traverse);
855
+ }
856
+ if (Array.isArray(rootConfig.panels)) {
857
+ rootConfig.panels.forEach(traverse);
858
+ }
859
+ }
860
+ return values;
861
+ }
862
+ sourceGroupComponentTargetContentComponent(source, formMode) {
863
+ const target = this.commonContentComponent(source, formMode);
864
+ if (target.component.config) {
865
+ const contentValue = source.model?.config?.value;
866
+ target.component.config.content =
867
+ contentValue && typeof contentValue === 'object' && !this.isDeepEmpty(contentValue)
868
+ ? contentValue
869
+ : this.extractDescendantValues(source);
870
+ target.component.config.template = this.generateTemplateForComponent(source, 'content');
871
+ }
872
+ return target;
873
+ }
874
+ generateTemplateForComponent(component, rootExpr) {
875
+ const className = component?.component?.class;
876
+ if (className === repeatable_outline_1.RepeatableComponentName) {
877
+ return this.generateRepeatableTemplate(component, rootExpr);
878
+ }
879
+ if (className === group_outline_1.GroupFieldComponentName) {
880
+ return this.generateGroupTemplate(component, rootExpr);
881
+ }
882
+ return this.renderLeafValue(component, rootExpr, []);
883
+ }
884
+ generateRepeatableTemplate(component, rootExpr) {
885
+ const elementTemplate = component?.component?.config?.elementTemplate;
886
+ if (!elementTemplate) {
887
+ return `<div class="rb-view-repeatable rb-view-repeatable-list"></div>`;
888
+ }
889
+ const groupChildren = this.getRenderableGroupChildren(elementTemplate);
890
+ const tableEligible = !!groupChildren && this.isTableEligibleGroupChildren(groupChildren);
891
+ this.logger.debug(`Repeatable view transform '${component.name}' using ${tableEligible ? 'table' : 'fallback'} layout.`);
892
+ if (tableEligible && groupChildren) {
893
+ return this.renderRepeatableTable(groupChildren, rootExpr);
894
+ }
895
+ return this.renderRepeatableFallback(elementTemplate, rootExpr);
896
+ }
897
+ generateGroupTemplate(component, rootExpr) {
898
+ const children = this.getRenderableGroupChildren(component) ?? [];
899
+ const rows = children.map(child => this.renderLabelValueRow(child, rootExpr)).join('');
900
+ const template = this.resolveReusableViewTemplate(this.reusableViewTemplateKeys.groupContainer, `<div class="rb-view-group">[[rowsHtml]]</div>`);
901
+ return this.substituteReusableTemplateSlots(template, { rowsHtml: rows });
902
+ }
903
+ renderRepeatableTable(children, rootExpr) {
904
+ const headers = children.map(child => `<th>${this.resolveTranslatedLabel(child)}</th>`).join('');
905
+ const cells = children.map(child => `<td>${this.renderLeafValue(child, 'this', [child.name])}</td>`).join('');
906
+ const template = this.resolveReusableViewTemplate(this.reusableViewTemplateKeys.repeatableTable, `{{#if [[rootExpr]]}}<div class="rb-view-repeatable rb-view-repeatable-table-wrapper"><table class="table table-striped table-sm rb-view-repeatable-table"><thead><tr>[[headersHtml]]</tr></thead><tbody>{{#each [[rootExpr]]}}<tr>[[cellsHtml]]</tr>{{/each}}</tbody></table></div>{{/if}}`);
907
+ return this.substituteReusableTemplateSlots(template, { rootExpr, headersHtml: headers, cellsHtml: cells });
908
+ }
909
+ renderRepeatableFallback(elementTemplate, rootExpr) {
910
+ const itemBody = this.renderComponentBody(elementTemplate, 'this');
911
+ const elementClassName = elementTemplate?.component?.class ?? '';
912
+ const itemClass = elementClassName === group_outline_1.GroupFieldComponentName || elementClassName === repeatable_outline_1.RepeatableComponentName
913
+ ? 'rb-view-repeatable-card'
914
+ : 'rb-view-repeatable-card rb-view-repeatable-card--leaf';
915
+ const template = this.resolveReusableViewTemplate(this.reusableViewTemplateKeys.repeatableList, `{{#if [[rootExpr]]}}<div class="rb-view-repeatable rb-view-repeatable-list">{{#each [[rootExpr]]}}<div class="[[itemClass]]">[[itemBodyHtml]]</div>{{/each}}</div>{{/if}}`);
916
+ return this.substituteReusableTemplateSlots(template, { rootExpr, itemBodyHtml: itemBody, itemClass });
917
+ }
918
+ renderComponentBody(component, rootExpr) {
919
+ const className = component?.component?.class;
920
+ if (className === group_outline_1.GroupFieldComponentName) {
921
+ const children = this.getRenderableGroupChildren(component) ?? [];
922
+ return children.map(child => this.renderLabelValueRow(child, rootExpr)).join('');
923
+ }
924
+ if (className === repeatable_outline_1.RepeatableComponentName) {
925
+ const nestedRoot = this.buildNestedExpression(rootExpr, component?.name);
926
+ return this.generateRepeatableTemplate(component, nestedRoot);
927
+ }
928
+ return this.renderLeafValue(component, rootExpr, component?.name ? [component.name] : []);
929
+ }
930
+ renderLabelValueRow(component, rootExpr) {
931
+ const label = this.resolveTranslatedLabel(component);
932
+ const valueExpr = this.renderComponentBody(component, rootExpr);
933
+ if (label.trim().length === 0) {
934
+ const template = this.resolveReusableViewTemplate(this.reusableViewTemplateKeys.groupRowNoLabel, `<div class="rb-view-row"><div class="rb-view-value">[[valueHtml]]</div></div>`);
935
+ return this.substituteReusableTemplateSlots(template, { valueHtml: valueExpr });
936
+ }
937
+ const template = this.resolveReusableViewTemplate(this.reusableViewTemplateKeys.groupRowWithLabel, `<div class="rb-view-row"><div class="rb-view-label">[[labelHtml]]</div><div class="rb-view-value">[[valueHtml]]</div></div>`);
938
+ return this.substituteReusableTemplateSlots(template, { labelHtml: label, valueHtml: valueExpr });
939
+ }
940
+ renderLeafValue(component, rootExpr, pathParts) {
941
+ const className = component?.component?.class ?? '';
942
+ const expression = this.safeValueExpression(rootExpr, pathParts);
943
+ if (className === file_upload_outline_1.FileUploadComponentName) {
944
+ const fileTemplate = this.resolveReusableViewTemplate(this.reusableViewTemplateKeys.leafFileUpload, `<ul class="rb-view-file-upload">{{#each [[valueExpr]]}<li>{{#if (attachmentDownloadUrl this oid branding portal)}}<a href="{{attachmentDownloadUrl this oid branding portal}}" target="_blank" rel="noopener noreferrer">{{default this.name this.fileId}}</a>{{else}}{{default this.name this.fileId}}{{/if}}{{#if this.notes}}<div class="text-muted"><small>{{this.notes}}</small></div>{{/if}}</li>{{/each}}</ul>`);
945
+ return this.substituteReusableTemplateSlots(fileTemplate, { valueExpr: expression });
946
+ }
947
+ if (className === pdf_list_outline_1.PDFListComponentName) {
948
+ const pdfListTemplate = this.resolveReusableViewTemplate(this.reusableViewTemplateKeys.leafPDFList, this.pdfListLeafFallbackTemplate);
949
+ return this.substituteReusableTemplateSlots(pdfListTemplate, { valueExpr: expression });
950
+ }
951
+ if (className === data_location_outline_1.DataLocationComponentName) {
952
+ const dataLocationTemplate = this.resolveReusableViewTemplate(this.reusableViewTemplateKeys.leafDataLocation, this.dataLocationLeafFallbackTemplate);
953
+ return this.substituteReusableTemplateSlots(dataLocationTemplate, { valueExpr: expression });
954
+ }
955
+ if (className === publish_data_location_selector_outline_1.PublishDataLocationSelectorComponentName) {
956
+ const publishDataLocationSelectorTemplate = this.resolveReusableViewTemplate(this.reusableViewTemplateKeys.leafPublishDataLocationSelector, this.publishDataLocationSelectorLeafFallbackTemplate);
957
+ return this.substituteReusableTemplateSlots(publishDataLocationSelectorTemplate, { valueExpr: expression });
958
+ }
959
+ if (className === content_outline_1.ContentComponentName) {
960
+ const template = component?.component?.config && 'template' in component.component.config
961
+ ? component.component.config.template
962
+ : undefined;
963
+ const trimmedTemplate = (template ?? '').trim();
964
+ if (trimmedTemplate === this.reusableViewTemplateKeys.leafCheckboxTree ||
965
+ trimmedTemplate === 'view-template-leaf-checkbox-tree' ||
966
+ trimmedTemplate.includes('<ul>{{#each content}}<li>{{default this.label this.notation}}</li>{{/each}}</ul>')) {
967
+ return `<ul>{{#each ${expression}}}<li>{{default this.label this.notation}}</li>{{/each}}</ul>`;
968
+ }
969
+ if (trimmedTemplate === this.reusableViewTemplateKeys.leafDate ||
970
+ trimmedTemplate === 'view-template-leaf-date' ||
971
+ trimmedTemplate.includes('{{formatDate content')) {
972
+ const formatMatch = trimmedTemplate.match(/\{\{\s*formatDate\s+content\s+"([^"]+)"\s*\}\}/);
973
+ const templateFormat = formatMatch?.[1];
974
+ const dateValueTemplate = `{{default ${expression} ""}}`;
975
+ if (templateFormat) {
976
+ return `<span data-value="${dateValueTemplate}">{{formatDate ${expression} "${templateFormat}"}}</span>`;
977
+ }
978
+ return `<span data-value="${dateValueTemplate}">{{formatDate ${expression}}}</span>`;
979
+ }
980
+ if (trimmedTemplate === '{{content}}' ||
981
+ trimmedTemplate === '{{{content}}}' ||
982
+ trimmedTemplate === '<span>{{content}}</span>') {
983
+ return this.renderDisplayValue(expression);
984
+ }
985
+ return this.renderDisplayValue(expression);
986
+ }
987
+ if (className === checkbox_tree_outline_1.CheckboxTreeComponentName) {
988
+ const template = this.resolveReusableViewTemplate(this.reusableViewTemplateKeys.leafCheckboxTree, `<ul>{{#each [[valueExpr]]}}<li>{{default this.label this.notation}}</li>{{/each}}</ul>`);
989
+ return this.substituteReusableTemplateSlots(template, { valueExpr: expression });
990
+ }
991
+ if (className === text_area_outline_1.TextAreaComponentName) {
992
+ return `<span>{{{plaintextToHtml ${expression}}}}</span>`;
993
+ }
994
+ if (className === typeahead_input_outline_1.TypeaheadInputComponentName) {
995
+ return this.renderTypeaheadValue(expression, component);
996
+ }
997
+ if (className === dropdown_input_outline_1.DropdownInputComponentName ||
998
+ className === checkbox_input_outline_1.CheckboxInputComponentName ||
999
+ className === radio_input_outline_1.RadioInputComponentName) {
1000
+ const options = this.getOptionLabelPairs(component);
1001
+ if (className === checkbox_input_outline_1.CheckboxInputComponentName) {
1002
+ return this.renderOptionListValue(expression, options);
1003
+ }
1004
+ return this.renderOptionSingleValue(expression, options);
1005
+ }
1006
+ return `{{default ${expression} ""}}`;
1007
+ }
1008
+ renderTypeaheadValue(expression, component) {
1009
+ const arrayItem = this.renderTypeaheadScalarValue('this', component);
1010
+ const singleValue = this.renderTypeaheadScalarValue(expression, component);
1011
+ return `{{#if ${expression}}}{{#if (isArray ${expression})}}<ul>{{#each ${expression}}}<li>${arrayItem}</li>{{/each}}</ul>{{else}}${singleValue}{{/if}}{{/if}}`;
1012
+ }
1013
+ renderTypeaheadScalarValue(expression, component) {
1014
+ const fields = this.getTypeaheadDisplayFields(component);
1015
+ return this.renderDisplayScalarValue(expression, fields);
1016
+ }
1017
+ renderDisplayValue(expression) {
1018
+ const fields = this.getCommonDisplayFields();
1019
+ const arrayItem = this.renderDisplayScalarValue('this', fields);
1020
+ const singleValue = this.renderDisplayScalarValue(expression, fields);
1021
+ return `{{#if ${expression}}}{{#if (isArray ${expression})}}<ul>{{#each ${expression}}}<li>${arrayItem}</li>{{/each}}</ul>{{else}}${singleValue}{{/if}}{{/if}}`;
1022
+ }
1023
+ renderDisplayScalarValue(expression, fields) {
1024
+ const objectBranches = fields.map(field => `{{#if (get ${expression} "${this.escapeForHandlebarsLiteral(field)}" "")}}` +
1025
+ `<span>{{{plaintextToHtml (get ${expression} "${this.escapeForHandlebarsLiteral(field)}" "")}}}</span>` +
1026
+ '{{else}}').join('');
1027
+ return `{{#if (isObject ${expression})}}${objectBranches}` +
1028
+ `{{{renderMetadataValue ${expression}}}}${'{{/if}}'.repeat(fields.length)}` +
1029
+ `{{else}}<span>{{{plaintextToHtml ${expression}}}}</span>{{/if}}`;
1030
+ }
1031
+ getTypeaheadDisplayFields(component) {
1032
+ const componentConfig = component?.component?.config;
1033
+ const fields = [
1034
+ componentConfig?.labelField,
1035
+ ...this.getCommonDisplayFields(),
1036
+ componentConfig?.valueField,
1037
+ ];
1038
+ return Array.from(new Set(fields.filter((field) => typeof field === 'string' && field.trim().length > 0)));
1039
+ }
1040
+ getCommonDisplayFields() {
1041
+ return ['label', 'name', 'title', 'dc_title', 'dc_description', 'utf8_name', 'value'];
1042
+ }
1043
+ getOptionLabelPairs(component) {
1044
+ const componentConfig = component?.component?.config;
1045
+ return (componentConfig?.options ?? [])
1046
+ .filter(option => option?.value !== undefined && option?.label !== undefined)
1047
+ .map(option => ({
1048
+ value: String(option.value),
1049
+ label: String(option.label),
1050
+ }));
1051
+ }
1052
+ renderOptionSingleValue(expression, options) {
1053
+ if (options.length === 0) {
1054
+ return `{{default ${expression} ""}}`;
1055
+ }
1056
+ const optionBranches = options.map(option => `{{#if (eq ${expression} "${this.escapeForHandlebarsLiteral(option.value)}")}}` +
1057
+ `<span data-value="{{default ${expression} ""}}">{{t "${this.escapeForHandlebarsLiteral(option.label)}"}}</span>` +
1058
+ '{{else}}').join('');
1059
+ return `${optionBranches}<span>{{default ${expression} ""}}</span>${'{{/if}}'.repeat(options.length)}`;
1060
+ }
1061
+ renderOptionListValue(expression, options) {
1062
+ if (options.length === 0) {
1063
+ return `{{default ${expression} ""}}`;
1064
+ }
1065
+ const singleValue = this.renderOptionSingleValue(expression, options);
1066
+ const optionBranches = options.map(option => `{{#if (eq this "${this.escapeForHandlebarsLiteral(option.value)}")}}` +
1067
+ `<li data-value="{{this}}">{{t "${this.escapeForHandlebarsLiteral(option.label)}"}}</li>` +
1068
+ '{{else}}').join('');
1069
+ return `{{#if ${expression}}}{{#if (isArray ${expression})}}<ul>{{#each ${expression}}}${optionBranches}` +
1070
+ `<li>{{this}}</li>${'{{/if}}'.repeat(options.length)}{{/each}}</ul>{{else}}${singleValue}{{/if}}{{/if}}`;
1071
+ }
1072
+ getGroupChildren(component) {
1073
+ if (component?.component?.class !== group_outline_1.GroupFieldComponentName) {
1074
+ return null;
1075
+ }
1076
+ const componentDefinitions = component?.component?.config && 'componentDefinitions' in component.component.config
1077
+ ? component.component.config
1078
+ .componentDefinitions
1079
+ : [];
1080
+ return componentDefinitions ?? [];
1081
+ }
1082
+ isViewRenderableComponent(component) {
1083
+ const componentConfig = component?.component?.config;
1084
+ if (componentConfig?.visible === false || componentConfig?.type === 'hidden') {
1085
+ return false;
1086
+ }
1087
+ const layoutConfig = component?.layout?.config;
1088
+ return layoutConfig?.visible !== false;
1089
+ }
1090
+ getRenderableGroupChildren(component) {
1091
+ const children = this.getGroupChildren(component);
1092
+ if (!children) {
1093
+ return null;
1094
+ }
1095
+ return children.filter(child => this.isViewRenderableComponent(child));
1096
+ }
1097
+ isTableEligibleGroupChildren(children) {
1098
+ const names = new Set();
1099
+ for (const child of children) {
1100
+ const childName = child?.name?.trim?.() ?? '';
1101
+ if (childName.length === 0 || names.has(childName)) {
1102
+ this.logger.debug(`Repeatable view transform table eligibility failed due to duplicate/empty child name '${child?.name ?? ''}'.`);
1103
+ return false;
1104
+ }
1105
+ names.add(childName);
1106
+ const className = child?.component?.class ?? '';
1107
+ if (!this.tableCompatibleLeafComponentNames.has(className) || className === file_upload_outline_1.FileUploadComponentName) {
1108
+ this.logger.debug(`Repeatable view transform table eligibility failed for class '${className}'.`);
1109
+ return false;
1110
+ }
1111
+ }
1112
+ return children.length > 0;
1113
+ }
1114
+ resolveTranslatedLabel(component) {
1115
+ const layoutConfig = component?.layout?.config;
1116
+ const componentConfig = component?.component?.config;
1117
+ const rawLabel = componentConfig?.label ?? layoutConfig?.label;
1118
+ const label = typeof rawLabel === 'string' ? rawLabel.trim() : '';
1119
+ if (label.length > 0) {
1120
+ return `{{t "${this.escapeForHandlebarsLiteral(label)}"}}`;
1121
+ }
1122
+ const name = typeof component?.name === 'string' ? component.name.trim() : '';
1123
+ return this.escapeForHandlebarsLiteral(name);
1124
+ }
1125
+ safeValueExpression(rootExpr, pathParts) {
1126
+ const cleanedParts = (pathParts ?? []).filter(part => typeof part === 'string' && part.trim().length > 0);
1127
+ if (cleanedParts.length === 0) {
1128
+ return rootExpr;
1129
+ }
1130
+ return `(get ${rootExpr} "${this.escapeForHandlebarsLiteral(cleanedParts.join('.'))}" "")`;
1131
+ }
1132
+ buildNestedExpression(rootExpr, part) {
1133
+ if (!part || part.trim().length === 0) {
1134
+ return rootExpr;
1135
+ }
1136
+ return `(get ${rootExpr} "${this.escapeForHandlebarsLiteral(part)}" "")`;
1137
+ }
1138
+ escapeForHandlebarsLiteral(value) {
1139
+ return value.replace(/\\/g, '\\\\').replace(/"/g, '\\"');
1140
+ }
1141
+ sourceTabComponentTargetAccordionComponent(source, formMode) {
1142
+ const frame = {
1143
+ name: source.name,
1144
+ component: {
1145
+ class: accordion_outline_1.AccordionComponentName,
1146
+ config: {
1147
+ panels: [],
1148
+ startingOpenMode: 'all-open',
1149
+ },
1150
+ },
1151
+ layout: {
1152
+ class: accordion_outline_1.AccordionLayoutName,
1153
+ config: {},
1154
+ },
1155
+ module: source.module,
1156
+ expressions: source.expressions,
1157
+ constraints: source.constraints,
1158
+ overrides: source.overrides,
1159
+ };
1160
+ const target = this.propertiesHelper.sharedConstructFormComponent(frame);
1161
+ if (!(0, form_types_outline_1.isTypeFormComponentDefinitionName)(target, accordion_outline_1.AccordionComponentName)) {
1162
+ throw new Error(`Could not create class for form component class name '${accordion_outline_1.AccordionComponentName}': ${JSON.stringify(target)}.`);
1163
+ }
1164
+ target.component.config = new accordion_model_1.AccordionFieldComponentConfig();
1165
+ if (!target.layout) {
1166
+ throw new Error(`Could not create layout class for '${accordion_outline_1.AccordionComponentName}'.`);
1167
+ }
1168
+ target.layout.config = target.layout.config ?? new accordion_model_1.AccordionFieldLayoutConfig();
1169
+ this.propertiesHelper.sharedPopulateFieldComponentConfig(target.component.config, source.component?.config);
1170
+ this.propertiesHelper.sharedPopulateFieldLayoutConfig(target.layout.config, source.layout?.config);
1171
+ target.component.config.startingOpenMode = 'all-open';
1172
+ target.component.config.panels = [];
1173
+ const tabs = source.component?.config?.tabs ?? [];
1174
+ tabs.forEach((tab, index) => {
1175
+ if (!(0, form_types_outline_1.isTypeFormComponentDefinitionName)(tab, tab_content_outline_1.TabContentComponentName)) {
1176
+ this.logger.warn(`Tab to accordion transform skipped invalid tab at index ${index} for component '${source.name}'.`);
1177
+ return;
1178
+ }
1179
+ if (!this.isModeAllowed(tab.constraints, formMode)) {
1180
+ return;
1181
+ }
1182
+ const buttonLabelCandidate = tab.layout?.config?.buttonLabel;
1183
+ const tabNameCandidate = tab.name;
1184
+ const buttonLabel = typeof buttonLabelCandidate === 'string' && buttonLabelCandidate.trim().length > 0
1185
+ ? buttonLabelCandidate
1186
+ : typeof tabNameCandidate === 'string' && tabNameCandidate.trim().length > 0
1187
+ ? tabNameCandidate
1188
+ : `${index}`;
1189
+ const panelFrame = {
1190
+ name: tab.name ?? `panel-${index}`,
1191
+ constraints: tab.constraints,
1192
+ component: {
1193
+ class: accordion_outline_1.AccordionPanelComponentName,
1194
+ config: {
1195
+ componentDefinitions: tab.component?.config?.componentDefinitions ?? [],
1196
+ },
1197
+ },
1198
+ layout: {
1199
+ class: accordion_outline_1.AccordionPanelLayoutName,
1200
+ config: {
1201
+ buttonLabel,
1202
+ },
1203
+ },
1204
+ };
1205
+ const panel = this.propertiesHelper.sharedConstructFormComponent(panelFrame);
1206
+ if (!(0, form_types_outline_1.isTypeFormComponentDefinitionName)(panel, accordion_outline_1.AccordionPanelComponentName)) {
1207
+ this.logger.warn(`Tab to accordion transform skipped panel at index ${index} for component '${source.name}'.`);
1208
+ return;
1209
+ }
1210
+ panel.component.config = panel.component.config ?? new accordion_model_1.AccordionPanelFieldComponentConfig();
1211
+ if (!panel.layout) {
1212
+ throw new Error(`Could not create layout class for '${accordion_outline_1.AccordionPanelComponentName}'.`);
1213
+ }
1214
+ panel.layout.config = panel.layout.config ?? new accordion_model_1.AccordionPanelFieldLayoutConfig();
1215
+ this.propertiesHelper.sharedPopulateFieldComponentConfig(panel.component.config, panelFrame.component.config);
1216
+ // sharedPopulateFieldComponentConfig only maps common fields, so preserve panel children explicitly.
1217
+ panel.component.config.componentDefinitions = (panelFrame.component.config?.componentDefinitions ??
1218
+ []);
1219
+ this.propertiesHelper.sharedPopulateFieldLayoutConfig(panel.layout.config, panelFrame.layout?.config);
1220
+ this.propertiesHelper.setPropOverride('buttonLabel', panel.layout.config, panelFrame.layout?.config);
1221
+ target.component.config?.panels.push(panel);
1222
+ });
1223
+ return target;
1224
+ }
1225
+ isModeAllowed(constraints, formMode) {
1226
+ const allowModes = constraints?.allowModes;
1227
+ if (!Array.isArray(allowModes) || allowModes.length === 0) {
1228
+ return true;
1229
+ }
1230
+ return allowModes.includes(formMode);
1231
+ }
1232
+ hasExplicitAllowedMode(constraints, mode) {
1233
+ const allowModes = constraints?.allowModes;
1234
+ return Array.isArray(allowModes) && allowModes.includes(mode);
1235
+ }
1236
+ forceAllowModeForTransformedTree(componentDefinition, formMode) {
1237
+ if (!componentDefinition || typeof componentDefinition !== 'object') {
1238
+ return;
1239
+ }
1240
+ const constraints = componentDefinition.constraints ?? { authorization: { allowRoles: [] }, allowModes: [] };
1241
+ constraints.allowModes = Array.isArray(constraints.allowModes) ? constraints.allowModes : [];
1242
+ if (!constraints.allowModes.includes(formMode)) {
1243
+ constraints.allowModes.push(formMode);
1244
+ }
1245
+ componentDefinition.constraints = constraints;
1246
+ const nested = componentDefinition?.component?.config;
1247
+ if (!nested || typeof nested !== 'object') {
1248
+ return;
1249
+ }
1250
+ (nested.componentDefinitions ?? []).forEach((child) => this.forceAllowModeForTransformedTree(child, formMode));
1251
+ (nested.tabs ?? []).forEach((child) => this.forceAllowModeForTransformedTree(child, formMode));
1252
+ (nested.panels ?? []).forEach((child) => this.forceAllowModeForTransformedTree(child, formMode));
1253
+ if (nested.elementTemplate) {
1254
+ this.forceAllowModeForTransformedTree(nested.elementTemplate, formMode);
1255
+ }
1256
+ }
1257
+ commonContentComponent(source, formMode) {
1258
+ const frame = {
1259
+ name: source.name,
1260
+ component: {
1261
+ class: 'ContentComponent',
1262
+ config: {},
1263
+ },
1264
+ module: source.module,
1265
+ expressions: source.expressions,
1266
+ constraints: source.constraints,
1267
+ overrides: source.overrides,
1268
+ };
1269
+ // Set the optional properties only if the source has them.
1270
+ if (source.layout) {
1271
+ frame.layout = source.layout;
1272
+ }
1273
+ const target = this.propertiesHelper.sharedConstructFormComponent(frame);
1274
+ if (!(0, form_types_outline_1.isTypeFormComponentDefinitionName)(target, content_outline_1.ContentComponentName)) {
1275
+ throw new Error(`Could not create class for form component class name 'ContentComponent': ${JSON.stringify(target)}.`);
1276
+ }
1277
+ target.component.config = new content_model_1.ContentFieldComponentConfig();
1278
+ // TODO: does it make sense to copy all shared properties? The css classes might need to be different?
1279
+ this.propertiesHelper.sharedPopulateFieldComponentConfig(target.component.config, source.component.config);
1280
+ if (target.layout) {
1281
+ target.layout.config = target.layout.config ?? {};
1282
+ this.propertiesHelper.sharedPopulateFieldLayoutConfig(target.layout.config, source.layout?.config);
1283
+ }
1284
+ return target;
1285
+ }
1286
+ commonContentOptionList(target, values, options) {
1287
+ if (!target.component.config) {
1288
+ return;
1289
+ }
1290
+ const targetCompConf = target.component.config;
1291
+ if (values.length === 0) {
1292
+ // Empty
1293
+ targetCompConf.content = undefined;
1294
+ targetCompConf.template = this.resolveReusableViewTemplate(this.reusableViewTemplateKeys.leafOptionEmpty, `<span></span>`);
1295
+ }
1296
+ else if (values.length === 1) {
1297
+ // One value
1298
+ const value = values[0];
1299
+ const label = options?.find(option => option.value === value)?.label ?? value;
1300
+ targetCompConf.content = { value, label };
1301
+ targetCompConf.template = this.resolveReusableViewTemplate(this.reusableViewTemplateKeys.leafOptionSingle, `<span data-value="{{content.value}}">{{#with @root}}{{t content.label}}{{/with}}</span>`);
1302
+ }
1303
+ else {
1304
+ // More than one value
1305
+ targetCompConf.content = values.map(value => options?.find(option => option.value === value) ?? {
1306
+ label: value,
1307
+ value: value,
1308
+ });
1309
+ targetCompConf.template = this.resolveReusableViewTemplate(this.reusableViewTemplateKeys.leafOptionMulti, `<ul>{{#each content}}<li data-value="{{this.value}}">{{#with @root}}{{t ../label}}{{/with}}</li>{{/each}}</ul>`);
1310
+ }
1311
+ }
1312
+ commonContentPlain(source, target) {
1313
+ if (target.component.config !== undefined && source.model?.config?.value !== undefined) {
1314
+ target.component.config.content = source.model.config.value;
1315
+ target.component.config.template = this.resolveReusableViewTemplate(this.reusableViewTemplateKeys.leafPlain, `<span>{{content}}</span>`);
1316
+ }
1317
+ }
1318
+ }
1319
+ exports.FormOverride = FormOverride;
1320
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS1vdmVycmlkZS5tb2RlbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb25maWcvZm9ybS1vdmVycmlkZS5tb2RlbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSwyRUFBdUg7QUFDdkgsaUVBSXFDO0FBTXJDLHFFQUE4RztBQUM5RywrRUFJNEM7QUFDNUMseUVBSXlDO0FBQ3pDLHVFQUFpSDtBQUVqSCxtQ0FBMkY7QUFFM0YsK0VBRzRDO0FBQzVDLHlFQUEwRTtBQUUxRSxtRUFBMkc7QUFFM0csNkRBQWtHO0FBQ2xHLHlEQUEwRDtBQUUxRCw2REFBd0U7QUFDeEUsNkVBTzJDO0FBQzNDLHlEQUE4RjtBQUM5RixxRUFTdUM7QUFDdkMsaUVBS3FDO0FBQ3JDLHVFQUFtSDtBQUNuSCw2REFBeUc7QUFDekcsNkVBQTBIO0FBQzFILGlGQUFnSTtBQUNoSSxtRkFBaUk7QUFDakkseURBQTJEO0FBQzNELHlFQUFvSDtBQUNwSCxtRUFBMkc7QUFDM0csNkVBQTBIO0FBQzFILCtHQUc0RDtBQUs1RCwyRUFBb0U7QUFHcEUsTUFBYSxZQUFZO0lBQ2IsT0FBTyxHQUFHLGNBQWMsQ0FBQztJQUMzQixnQkFBZ0IsQ0FBbUI7SUFDbkMsTUFBTSxDQUFVO0lBQ2hCLHNCQUFzQixDQUEwQjtJQUN2Qyx5QkFBeUIsR0FBRyxJQUFJLEdBQUcsQ0FBUztRQUMzRCxVQUFVO1FBQ1YsYUFBYTtRQUNiLFdBQVc7UUFDWCxVQUFVO1FBQ1YsY0FBYztRQUNkLFdBQVc7UUFDWCxXQUFXO1FBQ1gsV0FBVztRQUNYLGdCQUFnQjtRQUNoQixvQkFBb0I7UUFDcEIscUJBQXFCO1FBQ3JCLG1CQUFtQjtRQUNuQixlQUFlO1FBQ2YsYUFBYTtLQUNkLENBQUMsQ0FBQztJQUNjLHdCQUF3QixHQUFHO1FBQzFDLFNBQVMsRUFBRSwwQkFBMEI7UUFDckMsUUFBUSxFQUFFLHlCQUF5QjtRQUNuQyxlQUFlLEVBQUUsaUNBQWlDO1FBQ2xELGdCQUFn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