@researchdatabox/sails-ng-common 0.2.0 → 5.0.0-RC1

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