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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (220) hide show
  1. package/README.md +5 -0
  2. package/dist/src/config/base-field-component.model.d.ts +26 -0
  3. package/dist/src/config/base-field-component.model.js +29 -0
  4. package/dist/src/config/base-field-component.outline.d.ts +100 -0
  5. package/dist/src/config/base-field-component.outline.js +3 -0
  6. package/dist/src/config/component/accordion.model.d.ts +103 -0
  7. package/dist/src/config/component/accordion.model.js +127 -0
  8. package/dist/src/config/component/accordion.outline.d.ts +150 -0
  9. package/dist/src/config/component/accordion.outline.js +13 -0
  10. package/dist/src/config/component/action-row-layout.model.d.ts +28 -0
  11. package/dist/src/config/component/action-row-layout.model.js +35 -0
  12. package/dist/src/config/component/action-row-layout.outline.d.ts +36 -0
  13. package/dist/src/config/component/action-row-layout.outline.js +6 -0
  14. package/dist/src/config/component/cancel-button.model.d.ts +46 -0
  15. package/dist/src/config/component/cancel-button.model.js +56 -0
  16. package/dist/src/config/component/cancel-button.outline.d.ts +69 -0
  17. package/dist/src/config/component/cancel-button.outline.js +6 -0
  18. package/dist/src/config/component/checkbox-input.model.d.ts +65 -0
  19. package/dist/src/config/component/checkbox-input.model.js +78 -0
  20. package/dist/src/config/component/checkbox-input.outline.d.ts +85 -0
  21. package/dist/src/config/component/checkbox-input.outline.js +8 -0
  22. package/dist/src/config/component/checkbox-tree.model.d.ts +66 -0
  23. package/dist/src/config/component/checkbox-tree.model.js +79 -0
  24. package/dist/src/config/component/checkbox-tree.outline.d.ts +96 -0
  25. package/dist/src/config/component/checkbox-tree.outline.js +8 -0
  26. package/dist/src/config/component/content.model.d.ts +45 -0
  27. package/dist/src/config/component/content.model.js +55 -0
  28. package/dist/src/config/component/content.outline.d.ts +64 -0
  29. package/dist/src/config/component/content.outline.js +6 -0
  30. package/dist/src/config/component/data-location.model.d.ts +82 -0
  31. package/dist/src/config/component/data-location.model.js +94 -0
  32. package/dist/src/config/component/data-location.outline.d.ts +117 -0
  33. package/dist/src/config/component/data-location.outline.js +6 -0
  34. package/dist/src/config/component/date-input.model.d.ts +66 -0
  35. package/dist/src/config/component/date-input.model.js +79 -0
  36. package/dist/src/config/component/date-input.outline.d.ts +81 -0
  37. package/dist/src/config/component/date-input.outline.js +8 -0
  38. package/dist/src/config/component/default-layout.model.d.ts +22 -0
  39. package/dist/src/config/component/default-layout.model.js +30 -0
  40. package/dist/src/config/component/default-layout.outline.d.ts +29 -0
  41. package/dist/src/config/component/default-layout.outline.js +5 -0
  42. package/dist/src/config/component/delete-button.model.d.ts +46 -0
  43. package/dist/src/config/component/delete-button.model.js +48 -0
  44. package/dist/src/config/component/delete-button.outline.d.ts +55 -0
  45. package/dist/src/config/component/delete-button.outline.js +5 -0
  46. package/dist/src/config/component/dropdown-input.model.d.ts +64 -0
  47. package/dist/src/config/component/dropdown-input.model.js +77 -0
  48. package/dist/src/config/component/dropdown-input.outline.d.ts +84 -0
  49. package/dist/src/config/component/dropdown-input.outline.js +8 -0
  50. package/dist/src/config/component/file-upload.model.d.ts +67 -0
  51. package/dist/src/config/component/file-upload.model.js +81 -0
  52. package/dist/src/config/component/file-upload.outline.d.ts +93 -0
  53. package/dist/src/config/component/file-upload.outline.js +8 -0
  54. package/dist/src/config/component/group.model.d.ts +61 -0
  55. package/dist/src/config/component/group.model.js +75 -0
  56. package/dist/src/config/component/group.outline.d.ts +77 -0
  57. package/dist/src/config/component/group.outline.js +8 -0
  58. package/dist/src/config/component/inline-layout.model.d.ts +22 -0
  59. package/dist/src/config/component/inline-layout.model.js +29 -0
  60. package/dist/src/config/component/inline-layout.outline.d.ts +29 -0
  61. package/dist/src/config/component/inline-layout.outline.js +5 -0
  62. package/dist/src/config/component/map.model.d.ts +68 -0
  63. package/dist/src/config/component/map.model.js +85 -0
  64. package/dist/src/config/component/map.outline.d.ts +102 -0
  65. package/dist/src/config/component/map.outline.js +8 -0
  66. package/dist/src/config/component/pdf-list.model.d.ts +68 -0
  67. package/dist/src/config/component/pdf-list.model.js +71 -0
  68. package/dist/src/config/component/pdf-list.outline.d.ts +91 -0
  69. package/dist/src/config/component/pdf-list.outline.js +6 -0
  70. package/dist/src/config/component/publish-data-location-refresh.model.d.ts +38 -0
  71. package/dist/src/config/component/publish-data-location-refresh.model.js +51 -0
  72. package/dist/src/config/component/publish-data-location-refresh.outline.d.ts +47 -0
  73. package/dist/src/config/component/publish-data-location-refresh.outline.js +5 -0
  74. package/dist/src/config/component/publish-data-location-selector.model.d.ts +74 -0
  75. package/dist/src/config/component/publish-data-location-selector.model.js +100 -0
  76. package/dist/src/config/component/publish-data-location-selector.outline.d.ts +99 -0
  77. package/dist/src/config/component/publish-data-location-selector.outline.js +6 -0
  78. package/dist/src/config/component/question-tree.helper.d.ts +61 -0
  79. package/dist/src/config/component/question-tree.helper.js +298 -0
  80. package/dist/src/config/component/question-tree.model.d.ts +64 -0
  81. package/dist/src/config/component/question-tree.model.js +80 -0
  82. package/dist/src/config/component/question-tree.outline.d.ts +305 -0
  83. package/dist/src/config/component/question-tree.outline.js +9 -0
  84. package/dist/src/config/component/radio-input.model.d.ts +63 -0
  85. package/dist/src/config/component/radio-input.model.js +76 -0
  86. package/dist/src/config/component/radio-input.outline.d.ts +83 -0
  87. package/dist/src/config/component/radio-input.outline.js +8 -0
  88. package/dist/src/config/component/record-metadata-retriever.model.d.ts +41 -0
  89. package/dist/src/config/component/record-metadata-retriever.model.js +57 -0
  90. package/dist/src/config/component/record-metadata-retriever.outline.d.ts +47 -0
  91. package/dist/src/config/component/record-metadata-retriever.outline.js +5 -0
  92. package/dist/src/config/component/record-selector.model.d.ts +60 -0
  93. package/dist/src/config/component/record-selector.model.js +60 -0
  94. package/dist/src/config/component/record-selector.outline.d.ts +84 -0
  95. package/dist/src/config/component/record-selector.outline.js +6 -0
  96. package/dist/src/config/component/repeatable.model.d.ts +90 -0
  97. package/dist/src/config/component/repeatable.model.js +109 -0
  98. package/dist/src/config/component/repeatable.outline.d.ts +108 -0
  99. package/dist/src/config/component/repeatable.outline.js +10 -0
  100. package/dist/src/config/component/reusable.model.d.ts +42 -0
  101. package/dist/src/config/component/reusable.model.js +57 -0
  102. package/dist/src/config/component/reusable.outline.d.ts +49 -0
  103. package/dist/src/config/component/reusable.outline.js +6 -0
  104. package/dist/src/config/component/rich-text-editor.model.d.ts +65 -0
  105. package/dist/src/config/component/rich-text-editor.model.js +79 -0
  106. package/dist/src/config/component/rich-text-editor.outline.d.ts +86 -0
  107. package/dist/src/config/component/rich-text-editor.outline.js +8 -0
  108. package/dist/src/config/component/save-button.model.d.ts +45 -0
  109. package/dist/src/config/component/save-button.model.js +55 -0
  110. package/dist/src/config/component/save-button.outline.d.ts +65 -0
  111. package/dist/src/config/component/save-button.outline.js +6 -0
  112. package/dist/src/config/component/save-status.model.d.ts +42 -0
  113. package/dist/src/config/component/save-status.model.js +60 -0
  114. package/dist/src/config/component/save-status.outline.d.ts +52 -0
  115. package/dist/src/config/component/save-status.outline.js +6 -0
  116. package/dist/src/config/component/simple-input.model.d.ts +62 -0
  117. package/dist/src/config/component/simple-input.model.js +75 -0
  118. package/dist/src/config/component/simple-input.outline.d.ts +80 -0
  119. package/dist/src/config/component/simple-input.outline.js +9 -0
  120. package/dist/src/config/component/tab-content.model.d.ts +63 -0
  121. package/dist/src/config/component/tab-content.model.js +77 -0
  122. package/dist/src/config/component/tab-content.outline.d.ts +92 -0
  123. package/dist/src/config/component/tab-content.outline.js +8 -0
  124. package/dist/src/config/component/tab-nav-button.model.d.ts +45 -0
  125. package/dist/src/config/component/tab-nav-button.model.js +55 -0
  126. package/dist/src/config/component/tab-nav-button.outline.d.ts +64 -0
  127. package/dist/src/config/component/tab-nav-button.outline.js +6 -0
  128. package/dist/src/config/component/tab.model.d.ts +71 -0
  129. package/dist/src/config/component/tab.model.js +84 -0
  130. package/dist/src/config/component/tab.outline.d.ts +106 -0
  131. package/dist/src/config/component/tab.outline.js +9 -0
  132. package/dist/src/config/component/text-area.model.d.ts +63 -0
  133. package/dist/src/config/component/text-area.model.js +76 -0
  134. package/dist/src/config/component/text-area.outline.d.ts +81 -0
  135. package/dist/src/config/component/text-area.outline.js +8 -0
  136. package/dist/src/config/component/typeahead-input.model.d.ts +78 -0
  137. package/dist/src/config/component/typeahead-input.model.js +91 -0
  138. package/dist/src/config/component/typeahead-input.outline.d.ts +107 -0
  139. package/dist/src/config/component/typeahead-input.outline.js +8 -0
  140. package/dist/src/config/component/validation-summary.model.d.ts +42 -0
  141. package/dist/src/config/component/validation-summary.model.js +60 -0
  142. package/dist/src/config/component/validation-summary.outline.d.ts +57 -0
  143. package/dist/src/config/component/validation-summary.outline.js +6 -0
  144. package/dist/src/config/dictionary.model.d.ts +624 -0
  145. package/dist/src/config/dictionary.model.js +175 -0
  146. package/dist/src/config/dictionary.outline.d.ts +94 -0
  147. package/dist/src/config/dictionary.outline.js +3 -0
  148. package/dist/src/config/field-component.model.d.ts +7 -0
  149. package/dist/src/config/field-component.model.js +11 -0
  150. package/dist/src/config/field-component.outline.d.ts +20 -0
  151. package/dist/src/config/field-component.outline.js +3 -0
  152. package/dist/src/config/field-layout.model.d.ts +19 -0
  153. package/dist/src/config/field-layout.model.js +23 -0
  154. package/dist/src/config/field-layout.outline.d.ts +42 -0
  155. package/dist/src/config/field-layout.outline.js +3 -0
  156. package/dist/src/config/field-model.model.d.ts +22 -0
  157. package/dist/src/config/field-model.model.js +25 -0
  158. package/dist/src/config/field-model.outline.d.ts +63 -0
  159. package/dist/src/config/field-model.outline.js +3 -0
  160. package/dist/src/config/field.model.d.ts +12 -0
  161. package/dist/src/config/field.model.js +12 -0
  162. package/dist/src/config/field.outline.d.ts +19 -0
  163. package/dist/src/config/field.outline.js +3 -0
  164. package/dist/src/config/form-behaviour.outline.d.ts +128 -0
  165. package/dist/src/config/form-behaviour.outline.js +40 -0
  166. package/dist/src/config/form-component.model.d.ts +38 -0
  167. package/dist/src/config/form-component.model.js +36 -0
  168. package/dist/src/config/form-component.outline.d.ts +257 -0
  169. package/dist/src/config/form-component.outline.js +24 -0
  170. package/dist/src/config/form-config.model.d.ts +33 -0
  171. package/dist/src/config/form-config.model.js +36 -0
  172. package/dist/src/config/form-config.outline.d.ts +109 -0
  173. package/dist/src/config/form-config.outline.js +3 -0
  174. package/dist/src/config/form-override.model.d.ts +116 -0
  175. package/dist/src/config/form-override.model.js +1209 -0
  176. package/dist/src/config/form-override.outline.d.ts +15 -0
  177. package/dist/src/config/form-override.outline.js +3 -0
  178. package/dist/src/config/form-types.model.d.ts +6 -0
  179. package/dist/src/config/form-types.model.js +23 -0
  180. package/dist/src/config/form-types.outline.d.ts +48 -0
  181. package/dist/src/config/form-types.outline.js +137 -0
  182. package/dist/src/config/helpers.d.ts +23 -0
  183. package/dist/src/config/helpers.js +105 -0
  184. package/dist/src/config/names/naming-helpers.d.ts +71 -0
  185. package/dist/src/config/names/naming-helpers.js +72 -0
  186. package/dist/src/config/names/query-helpers.d.ts +43 -0
  187. package/dist/src/config/names/query-helpers.js +64 -0
  188. package/dist/src/config/shared.outline.d.ts +54 -0
  189. package/dist/src/config/shared.outline.js +41 -0
  190. package/dist/src/config/visitor/base.model.d.ts +137 -0
  191. package/dist/src/config/visitor/base.model.js +323 -0
  192. package/dist/src/config/visitor/base.outline.d.ts +140 -0
  193. package/dist/src/config/visitor/base.outline.js +3 -0
  194. package/dist/src/config/visitor/common.model.d.ts +119 -0
  195. package/dist/src/config/visitor/common.model.js +421 -0
  196. package/dist/src/handlebars-helpers.d.ts +224 -0
  197. package/dist/src/handlebars-helpers.js +558 -0
  198. package/dist/src/index.d.ts +109 -0
  199. package/dist/src/index.js +136 -0
  200. package/dist/src/logger.interface.d.ts +14 -0
  201. package/dist/src/logger.interface.js +3 -0
  202. package/dist/src/record.model.d.ts +35 -0
  203. package/dist/src/record.model.js +21 -0
  204. package/dist/src/report.model.d.ts +21 -0
  205. package/dist/src/report.model.js +19 -0
  206. package/dist/src/status.model.d.ts +22 -0
  207. package/dist/src/status.model.js +28 -0
  208. package/dist/src/template.outline.d.ts +49 -0
  209. package/dist/src/template.outline.js +13 -0
  210. package/dist/src/translation-helpers.d.ts +10 -0
  211. package/dist/src/translation-helpers.js +30 -0
  212. package/dist/src/validation/form.model.d.ts +247 -0
  213. package/dist/src/validation/form.model.js +31 -0
  214. package/dist/src/validation/helpers.d.ts +14 -0
  215. package/dist/src/validation/helpers.js +68 -0
  216. package/dist/src/validation/validators-support.d.ts +41 -0
  217. package/dist/src/validation/validators-support.js +141 -0
  218. package/dist/src/validation/validators.d.ts +23 -0
  219. package/dist/src/validation/validators.js +427 -0
  220. package/package.json +95 -0
@@ -0,0 +1,421 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.FormPathHelper = exports.PropertiesHelper = void 0;
4
+ const form_component_model_1 = require("../form-component.model");
5
+ const dictionary_model_1 = require("../dictionary.model");
6
+ const naming_helpers_1 = require("../names/naming-helpers");
7
+ const shared_outline_1 = require("../shared.outline");
8
+ class PropertiesHelper {
9
+ fieldComponentMap;
10
+ fieldModelMap;
11
+ fieldLayoutMap;
12
+ formComponentMap;
13
+ kindNameDefaultsMap;
14
+ constructor() {
15
+ this.fieldComponentMap = dictionary_model_1.FieldComponentDefinitionMap;
16
+ this.fieldModelMap = dictionary_model_1.FieldModelDefinitionMap;
17
+ this.fieldLayoutMap = dictionary_model_1.FieldLayoutDefinitionMap;
18
+ this.formComponentMap = dictionary_model_1.FormComponentDefinitionMap;
19
+ this.kindNameDefaultsMap = dictionary_model_1.KindNameDefaultsMap;
20
+ }
21
+ /**
22
+ * Create a new instance of a form component.
23
+ * Populate the common form component properties.
24
+ * @param currentData The form component definition.
25
+ */
26
+ sharedConstructFormComponent(currentData) {
27
+ // The class to use is identified by the class property string values in the field definitions.
28
+ const formComponentClassString = currentData?.component?.class;
29
+ if (typeof formComponentClassString !== 'string' || formComponentClassString.trim().length === 0) {
30
+ throw new Error(`Missing required 'component.class' in form component '${currentData?.name ?? '<unknown>'}': ${JSON.stringify(currentData)}`);
31
+ }
32
+ // The class to use is identified by the class property string values in the field definitions.
33
+ // The form component is identifier the component field class string
34
+ const formComponentClass = this.formComponentMap?.get(formComponentClassString);
35
+ // Create new instance
36
+ if (!formComponentClass) {
37
+ const knownFormComponentClassNames = [...this.formComponentMap.keys()].sort().join(', ');
38
+ throw new Error(`Could not find class for form component class name '${formComponentClassString}'. ` +
39
+ `Known classes: [${knownFormComponentClassNames}]. ` +
40
+ `Item: ${JSON.stringify(currentData)}`);
41
+ }
42
+ const item = new formComponentClass();
43
+ // Set the simple properties
44
+ item.name = currentData.name;
45
+ item.module = currentData.module;
46
+ // Set the constraints
47
+ item.constraints = new form_component_model_1.FormConstraintConfig();
48
+ item.constraints.allowModes = currentData?.constraints?.allowModes ?? [];
49
+ item.constraints.authorization = new form_component_model_1.FormConstraintAuthorizationConfig();
50
+ item.constraints.authorization.allowRoles = currentData?.constraints?.authorization?.allowRoles ?? [];
51
+ // TODO: Commented out below while we decide on how to handle 'form-level' expressions
52
+ // Set the expressions
53
+ // item.expressions = new FormExpressionsConfig();
54
+ // for (const [key, value] of Object.entries(currentData.expressions ?? {})) {
55
+ // item.expressions[key] = value;
56
+ // }
57
+ // Set the overrides, as they might be used to transform this component into other components.
58
+ item.overrides = currentData.overrides;
59
+ // Create the field component class instance.
60
+ const componentClassString = currentData?.component?.class;
61
+ const componentClass = this.fieldComponentMap?.get(componentClassString);
62
+ if (!componentClass) {
63
+ throw new Error(`Could not find class for field component class string '${componentClassString}'.`);
64
+ }
65
+ item.component = new componentClass();
66
+ const sourceDefaultsMap = this.kindNameDefaultsMap.get(shared_outline_1.FormComponentDefinitionKind);
67
+ const targetDefaultsMap = sourceDefaultsMap?.get(componentClassString);
68
+ // Create the model class instance.
69
+ // If there is no model class, use the default if there is one.
70
+ const modelClassDefaultName = targetDefaultsMap?.get(shared_outline_1.FieldModelDefinitionKind);
71
+ const modelClassString = currentData?.model?.class ?? modelClassDefaultName;
72
+ const modelClass = modelClassString ? this.fieldModelMap?.get(modelClassString) : null;
73
+ if (modelClassString && !modelClass) {
74
+ throw new Error(`Could not find class for field model class string '${modelClassString}'.`);
75
+ }
76
+ const model = modelClass ? new modelClass() : undefined;
77
+ item.model = model;
78
+ if (model) {
79
+ this.setFieldClassName(currentData, 'model', modelClassString);
80
+ }
81
+ // Create the layout class instance.
82
+ // If there is no layout class, use the default if there is one.
83
+ const layoutClassDefaultName = targetDefaultsMap?.get(shared_outline_1.FieldLayoutDefinitionKind);
84
+ const layoutClassString = currentData?.layout?.class ?? layoutClassDefaultName;
85
+ const layoutClass = layoutClassString ? this.fieldLayoutMap?.get(layoutClassString) : null;
86
+ if (layoutClassString && !layoutClass) {
87
+ throw new Error(`Could not find class for field layout class string '${layoutClassString}'.`);
88
+ }
89
+ const layout = layoutClass ? new layoutClass() : undefined;
90
+ item.layout = layout;
91
+ if (layout) {
92
+ this.setFieldClassName(currentData, 'layout', layoutClassString);
93
+ }
94
+ return item;
95
+ }
96
+ /**
97
+ * Set the common field component config properties.
98
+ * @param item Set the value of the named properties on this item.
99
+ * @param config Get the value of the named properties from this config.
100
+ */
101
+ sharedPopulateFieldComponentConfig(item, config) {
102
+ this.setPropOverride('readonly', item, config);
103
+ this.setPropOverride('visible', item, config);
104
+ this.setPropOverride('editMode', item, config);
105
+ this.setPropOverride('label', item, config);
106
+ this.setPropOverride('defaultComponentCssClasses', item, config);
107
+ this.setPropOverride('hostCssClasses', item, config);
108
+ this.setPropOverride('wrapperCssClasses', item, config);
109
+ this.setPropOverride('disabled', item, config);
110
+ this.setPropOverride('autofocus', item, config);
111
+ this.setPropOverride('tooltip', item, config);
112
+ this.setPropOverride('onItemSelect', item, config);
113
+ this.setPropOverride('syncSources', item, config);
114
+ }
115
+ /**
116
+ * Set the common field model config properties.
117
+ * @param item Set the value of the named properties on this item.
118
+ * @param config Get the value of the named properties from this config.
119
+ */
120
+ sharedPopulateFieldModelConfig(item, config) {
121
+ this.setPropOverride('disableFormBinding', item, config);
122
+ this.setPropOverride('value', item, config);
123
+ this.setPropOverride('defaultValue', item, config);
124
+ this.setPropOverride('validators', item, config);
125
+ this.setPropOverride('wrapperCssClasses', item, config);
126
+ this.setPropOverride('editCssClasses', item, config);
127
+ }
128
+ /**
129
+ * Set the common field layout config properties.
130
+ * @param item Set the value of the named properties on this item.
131
+ * @param config Get the value of the named properties from this config.
132
+ */
133
+ sharedPopulateFieldLayoutConfig(item, config) {
134
+ this.sharedPopulateFieldComponentConfig(item, config);
135
+ this.setPropOverride('labelRequiredStr', item, config);
136
+ this.setPropOverride('helpText', item, config);
137
+ this.setPropOverride('cssClassesMap', item, config);
138
+ this.setPropOverride('helpTextVisibleOnInit', item, config);
139
+ this.setPropOverride('helpTextVisible', item, config);
140
+ }
141
+ /**
142
+ * Set the property on target.
143
+ * Retain the target property value if it is not undefined.
144
+ * Use the value of the property from the first source with a non-undefined property of the same name.
145
+ *
146
+ * @param target Set the name property on the target.
147
+ * @param name The property to set.
148
+ * @param sources The sources that might have the name property.
149
+ */
150
+ setPropDefault(name, target, ...sources) {
151
+ if (target === undefined || target === null) {
152
+ throw new Error('Target provided to setPropDefault was undefined or null.');
153
+ }
154
+ if (name === undefined || name === null) {
155
+ throw new Error('Property name provided to setPropDefault was undefined or null.');
156
+ }
157
+ const propValue = [target, ...sources].find(val => val?.[name] !== undefined)?.[name];
158
+ if (propValue !== undefined) {
159
+ target[name] = propValue;
160
+ }
161
+ }
162
+ /**
163
+ * Set the property on target.
164
+ * Override the value of the property from the last source with a non-undefined property of the same name.
165
+ * @param name The property to set.
166
+ * @param target Set the name property on the target.
167
+ * @param sources The sources that might have the name property.
168
+ */
169
+ setPropOverride(name, target, ...sources) {
170
+ if (target === undefined || target === null) {
171
+ throw new Error('Target provided to setPropOverride was undefined or null.');
172
+ }
173
+ if (name === undefined || name === null) {
174
+ throw new Error('Property name provided to setPropOverride was undefined or null.');
175
+ }
176
+ const propValue = [target, ...sources].findLast(val => val?.[name] !== undefined)?.[name];
177
+ if (propValue !== undefined) {
178
+ target[name] = propValue;
179
+ }
180
+ }
181
+ /**
182
+ * Convert a value to a field reference that can be used in a JSONata expression.
183
+ * @param value The value to convert.
184
+ * @return The value ready to be used as a field reference in a JSON expression.
185
+ */
186
+ toFieldReference(value) {
187
+ // Normalise the string to a form useful for comparing identifiers.
188
+ const fieldRaw = value?.toString()?.normalize("NFKC") ?? "";
189
+ // see: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/codePointAt
190
+ const fieldReference = [...fieldRaw].map((char) => {
191
+ const codePoint = char.codePointAt(0);
192
+ if (codePoint === undefined) {
193
+ return '';
194
+ }
195
+ // Numbers 0 - 9
196
+ if (codePoint >= 48 && codePoint <= 57) {
197
+ return char;
198
+ }
199
+ // Letters A - Z
200
+ if (codePoint >= 65 && codePoint <= 90) {
201
+ return char;
202
+ }
203
+ // Letters a - z
204
+ if (codePoint >= 97 && codePoint <= 122) {
205
+ return char;
206
+ }
207
+ // Selected punctuation used in identifiers - : colon 58, @ at sign 64,
208
+ // - hyphen minus 45, . full stop 46, _ low line 95
209
+ if ([58, 64, 45, 46, 95].includes(codePoint)) {
210
+ return char;
211
+ }
212
+ // Anything else is replaced with '_'
213
+ return '_';
214
+ });
215
+ return fieldReference.join('');
216
+ }
217
+ /**
218
+ * Convert a lineage path to a set of dot-separated field references for a JSONata expression.
219
+ * @param path The lineage path to convert.
220
+ * @return The path ready to be used as field references in a JSON expression.
221
+ */
222
+ lineagePathToExpressionIdentifiers(path) {
223
+ // Escape unexpected characters.
224
+ const pathFieldRefs = path.map(i => this.toFieldReference(i));
225
+ // Use backticks to build each item in the jsonata identifier.
226
+ const identifiers = pathFieldRefs.map(i => `\`${i}\``);
227
+ // Join identifiers using dot.
228
+ return identifiers.join('.');
229
+ }
230
+ setFieldClassName(currentData, fieldTypeName, className) {
231
+ if (currentData === undefined || currentData === null || className === undefined || className === null) {
232
+ return;
233
+ }
234
+ if (currentData[fieldTypeName] === undefined || currentData[fieldTypeName] === null) {
235
+ currentData[fieldTypeName] = { class: className };
236
+ return;
237
+ }
238
+ else if (currentData[fieldTypeName]?.class === undefined || currentData[fieldTypeName]?.class === null) {
239
+ currentData[fieldTypeName].class = className;
240
+ }
241
+ }
242
+ }
243
+ exports.PropertiesHelper = PropertiesHelper;
244
+ class FormPathHelper {
245
+ logName = 'FormPathHelper';
246
+ logger;
247
+ visitor;
248
+ _formPath;
249
+ constructor(logger, visitor) {
250
+ this.logger = logger;
251
+ this.visitor = visitor;
252
+ this._formPath = (0, naming_helpers_1.buildLineagePaths)();
253
+ }
254
+ /**
255
+ * Get the current form paths.
256
+ */
257
+ get formPath() {
258
+ // Return a copy so the current form paths cannot be changed.
259
+ return {
260
+ angularComponents: [...this._formPath.angularComponents],
261
+ angularComponentsJsonPointer: this._formPath.angularComponentsJsonPointer?.toString(),
262
+ dataModel: [...this._formPath.dataModel],
263
+ formConfig: [...this._formPath.formConfig],
264
+ layout: [...this._formPath.layout],
265
+ layoutJsonPointer: this._formPath.layoutJsonPointer?.toString(),
266
+ };
267
+ }
268
+ /**
269
+ * Get the current model name.
270
+ */
271
+ get modelName() {
272
+ if (this._formPath.dataModel.length > 0) {
273
+ return this._formPath.dataModel[this._formPath.dataModel.length - 1]?.toString();
274
+ }
275
+ return null;
276
+ }
277
+ reset() {
278
+ this._formPath = (0, naming_helpers_1.buildLineagePaths)();
279
+ }
280
+ /**
281
+ * Call accept on the provided item and set the current path with the given suffix.
282
+ * Set the current path to the previous value after the accept method is done.
283
+ * @param item The item to visit.
284
+ * @param more The lineage paths to add to the end of the current paths.
285
+ */
286
+ acceptFormPath(item, more) {
287
+ if (!item) {
288
+ this.logger?.warn?.(`${this.logName}: acceptFormPath requires an item: ${JSON.stringify(item)}`);
289
+ return;
290
+ }
291
+ // Copy the original lineage paths so they can be restored.
292
+ const original = (0, naming_helpers_1.buildLineagePaths)(this._formPath);
293
+ try {
294
+ this._formPath = (0, naming_helpers_1.buildLineagePaths)(original, more);
295
+ item.accept(this.visitor);
296
+ }
297
+ catch (error) {
298
+ throw error;
299
+ }
300
+ finally {
301
+ this._formPath = original;
302
+ }
303
+ }
304
+ /**
305
+ * Call accept on the properties of the form component definition outline that can be visited.
306
+ * @param item The form component definition outline.
307
+ */
308
+ acceptFormComponentDefinition(item) {
309
+ this.acceptFormPath(item.component, { formConfig: ['component'] });
310
+ if (item.model) {
311
+ this.acceptFormPath(item.model, { formConfig: ['model'] });
312
+ }
313
+ if (item.layout) {
314
+ this.acceptFormPath(item.layout, { formConfig: ['layout'] });
315
+ }
316
+ }
317
+ lineagePathsForFormConfigComponentDefinition(item, index) {
318
+ return {
319
+ formConfig: ['componentDefinitions', index.toString()],
320
+ dataModel: this.getFormPathDataModel(item),
321
+ angularComponents: this.getFormPathAngularComponents(item),
322
+ layout: this.getFormPathLayout(item),
323
+ };
324
+ }
325
+ lineagePathsForGroupFieldComponentDefinition(item, index) {
326
+ return {
327
+ formConfig: ['config', 'componentDefinitions', index.toString()],
328
+ dataModel: this.getFormPathDataModel(item),
329
+ angularComponents: this.getFormPathAngularComponents(item),
330
+ layout: this.getFormPathLayout(item),
331
+ };
332
+ }
333
+ lineagePathsForTabFieldComponentDefinition(item, index) {
334
+ return {
335
+ formConfig: ['config', 'tabs', index.toString()],
336
+ dataModel: this.getFormPathDataModel(item),
337
+ angularComponents: this.getFormPathAngularComponents(item),
338
+ layout: this.getFormPathLayout(item),
339
+ };
340
+ }
341
+ lineagePathsForTabContentFieldComponentDefinition(item, index) {
342
+ return {
343
+ formConfig: ['config', 'componentDefinitions', index.toString()],
344
+ dataModel: this.getFormPathDataModel(item),
345
+ angularComponents: this.getFormPathAngularComponents(item),
346
+ layout: this.getFormPathLayout(item),
347
+ };
348
+ }
349
+ lineagePathsForAccordionFieldComponentDefinition(item, index) {
350
+ return {
351
+ formConfig: ['config', 'panels', index.toString()],
352
+ dataModel: this.getFormPathDataModel(item),
353
+ angularComponents: this.getFormPathAngularComponents(item),
354
+ layout: this.getFormPathLayout(item),
355
+ };
356
+ }
357
+ lineagePathsForAccordionPanelFieldComponentDefinition(item, index) {
358
+ return {
359
+ formConfig: ['config', 'componentDefinitions', index.toString()],
360
+ dataModel: this.getFormPathDataModel(item),
361
+ angularComponents: this.getFormPathAngularComponents(item),
362
+ layout: this.getFormPathLayout(item),
363
+ };
364
+ }
365
+ lineagePathsForRepeatableFieldComponentDefinition(item) {
366
+ return {
367
+ formConfig: ['config', 'elementTemplate'],
368
+ dataModel: this.getFormPathDataModel(item),
369
+ angularComponents: this.getFormPathAngularComponents(item),
370
+ layout: this.getFormPathLayout(item),
371
+ };
372
+ }
373
+ lineagePathsForReusableFieldComponentDefinition(item, index) {
374
+ return {
375
+ formConfig: ['config', 'componentDefinitions', index.toString()],
376
+ dataModel: this.getFormPathDataModel(item),
377
+ angularComponents: this.getFormPathAngularComponents(item),
378
+ layout: this.getFormPathLayout(item),
379
+ };
380
+ }
381
+ lineagePathsForQuestionTreeFieldComponentDefinition(item, index) {
382
+ return {
383
+ formConfig: ['config', 'componentDefinitions', index.toString()],
384
+ dataModel: this.getFormPathDataModel(item),
385
+ angularComponents: this.getFormPathAngularComponents(item),
386
+ layout: this.getFormPathLayout(item),
387
+ };
388
+ }
389
+ getFormPathDataModel(item) {
390
+ const itemName = item?.name ?? '';
391
+ const className = item?.component?.class ?? '';
392
+ // NOTE: The repeatable elementTemplate should not be part of the data model path.
393
+ // This is done by also checking the name - it has a model, but it must have a 'falsy' name.
394
+ // TODO: does this need to cater for components that have no model but need the model data, like content component?
395
+ const dataModel = [];
396
+ const isGroupWithoutModel = className === 'GroupComponent' && (item.model === undefined || item.model === null);
397
+ if (itemName && (item.model !== undefined && item.model !== null || isGroupWithoutModel)) {
398
+ dataModel.push(itemName);
399
+ }
400
+ return dataModel;
401
+ }
402
+ getFormPathAngularComponents(item) {
403
+ const itemName = item?.name ?? '';
404
+ const angularComponents = [];
405
+ // TODO: don't include the top-level form config name
406
+ if (itemName) {
407
+ angularComponents.push(itemName);
408
+ }
409
+ return angularComponents;
410
+ }
411
+ getFormPathLayout(item) {
412
+ const itemName = item?.name ?? '';
413
+ const layout = [];
414
+ if (itemName) {
415
+ layout.push(`${itemName}-layout`);
416
+ }
417
+ return layout;
418
+ }
419
+ }
420
+ exports.FormPathHelper = FormPathHelper;
421
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbW9uLm1vZGVsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2NvbmZpZy92aXNpdG9yL2NvbW1vbi5tb2RlbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFNQSxrRUFBa0c7QUFDbEcsMERBVzZCO0FBQzdCLDREQUE0RztBQUU1RyxzREFBcUg7QUFFckgsTUFBYSxnQkFBZ0I7SUFDbkIsaUJBQWlCLENBQWtDO0lBQ25ELGFBQWEsQ0FBOEI7SUFDM0MsY0FBYyxDQUErQjtJQUM3QyxnQkFBZ0IsQ0FBc0M7SUFDdEQsbUJBQW1CLENBQTBCO0lBRXJEO1FBQ0UsSUFBSSxDQUFDLGlCQUFpQixHQUFHLDhDQUEyQixDQUFDO1FBQ3JELElBQUksQ0FBQyxhQUFhLEdBQUcsMENBQXVCLENBQUM7UUFDN0MsSUFBSSxDQUFDLGNBQWMsR0FBRywyQ0FBd0IsQ0FBQztRQUMvQyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsNkNBQTBCLENBQUM7UUFDbkQsSUFBSSxDQUFDLG1CQUFtQixHQUFHLHNDQUFtQixDQUFDO0lBQ2pELENBQUM7SUFFRDs7OztPQUlHO0lBQ0ksNEJBQTRCLENBQUMsV0FBeUM7UUFDM0UsK0ZBQStGO1FBQy9GLE1BQU0sd0JBQXdCLEdBQUcsV0FBVyxFQUFFLFNBQVMsRUFBRSxLQUFLLENBQUM7UUFDL0QsSUFBSSxPQUFPLHdCQUF3QixLQUFLLFFBQVEsSUFBSSx3QkFBd0IsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDakcsTUFBTSxJQUFJLEtBQUssQ0FDYix5REFBeUQsV0FBVyxFQUFFLElBQUksSUFBSSxXQUFXLE1BQU0sSUFBSSxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUM3SCxDQUFDO1FBQ0osQ0FBQztRQUVELCtGQUErRjtRQUMvRixvRUFBb0U7UUFDcEUsTUFBTSxrQkFBa0IsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsR0FBRyxD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
@@ -0,0 +1,224 @@
1
+ /**
2
+ * Shared Handlebars helper definitions for use in both server and client contexts.
3
+ * These helpers provide CSP-safe alternatives to lodash template expressions.
4
+ *
5
+ * Usage:
6
+ * - Server: Import and register with Handlebars.registerHelper()
7
+ * - Client: Import and register with Handlebars runtime
8
+ */
9
+ /**
10
+ * Preset mapping for locale-aware date formatting.
11
+ * Maps preset names to Luxon's built-in format options.
12
+ */
13
+ export declare const dateLocalePresetMap: Record<string, Intl.DateTimeFormatOptions>;
14
+ /**
15
+ * Helper function definitions that can be registered with Handlebars.
16
+ * Each function is a pure, deterministic helper that does not execute arbitrary code.
17
+ */
18
+ export declare const handlebarsHelperDefinitions: {
19
+ /**
20
+ * Format a date value using a custom format string.
21
+ * Supports ISO date strings and JavaScript Date instances.
22
+ * Replaces lodash template usage like: ${ DateTime.fromISO(data.date).toFormat('dd/MM/yyyy hh:mm a') }
23
+ *
24
+ * @example {{formatDate lastSaveDate "dd/MM/yyyy hh:mm a"}}
25
+ */
26
+ formatDate: (dateValue: string | Date, formatOrOptions?: string | Record<string, unknown>) => string;
27
+ /**
28
+ * Format a date value using locale-aware presets.
29
+ * Supports ISO date strings and JavaScript Date instances.
30
+ *
31
+ * @example {{formatDateLocale lastSaveDate "DATETIME_MED"}}
32
+ */
33
+ formatDateLocale: (dateValue: string | Date, presetNameOrOptions?: string | Record<string, unknown>, localeOrOptions?: string | Record<string, unknown>) => string;
34
+ /**
35
+ * Parse a date string (pass-through for chaining).
36
+ *
37
+ * @example {{parseDateString dateString}}
38
+ */
39
+ parseDateString: (dateString: string) => string;
40
+ /**
41
+ * Get a nested property from an object using dot notation.
42
+ * Replaces lodash template usage like: ${ _.get(data, 'metadata.contributor_ci', '') }
43
+ *
44
+ * @example {{get this "metadata.contributor_ci.text_full_name"}}
45
+ */
46
+ get: (obj: unknown, path: string, defaultValue?: unknown) => unknown;
47
+ /**
48
+ * Check if a value is empty (null, undefined, empty string, empty array, empty object).
49
+ *
50
+ * @example {{#if (isEmpty value)}}empty{{/if}}
51
+ */
52
+ isEmpty: (value: unknown) => boolean;
53
+ /**
54
+ * Check if a value is undefined.
55
+ *
56
+ * @example {{#if (isUndefined value)}}undefined{{/if}}
57
+ */
58
+ isUndefined: (value: unknown) => boolean;
59
+ /**
60
+ * Check if a value is null.
61
+ *
62
+ * @example {{#if (isNull value)}}null{{/if}}
63
+ */
64
+ isNull: (value: unknown) => boolean;
65
+ /**
66
+ * Check if a value is defined (not undefined and not null).
67
+ *
68
+ * @example {{#if (isDefined value)}}defined{{/if}}
69
+ */
70
+ isDefined: (value: unknown) => boolean;
71
+ /**
72
+ * Check if a value is an array.
73
+ *
74
+ * @example {{#if (isArray value)}}is array{{/if}}
75
+ */
76
+ isArray: (value: unknown) => boolean;
77
+ /**
78
+ * Check if a value is a plain object.
79
+ *
80
+ * @example {{#if (isObject value)}}is object{{/if}}
81
+ */
82
+ isObject: (value: unknown) => boolean;
83
+ /**
84
+ * Strict equality comparison.
85
+ *
86
+ * @example {{#if (eq status "active")}}active{{/if}}
87
+ */
88
+ eq: (a: unknown, b: unknown) => boolean;
89
+ /**
90
+ * Not equal comparison.
91
+ *
92
+ * @example {{#if (ne status "inactive")}}not inactive{{/if}}
93
+ */
94
+ ne: (a: unknown, b: unknown) => boolean;
95
+ /**
96
+ * Logical AND - returns true if all arguments are truthy.
97
+ * Note: The last argument is the Handlebars options hash, which is removed.
98
+ *
99
+ * @example {{#if (and condition1 condition2)}}both true{{/if}}
100
+ */
101
+ and: (...args: unknown[]) => boolean;
102
+ /**
103
+ * Logical OR - returns true if any argument is truthy.
104
+ * Note: The last argument is the Handlebars options hash, which is removed.
105
+ *
106
+ * @example {{#if (or condition1 condition2)}}at least one true{{/if}}
107
+ */
108
+ or: (...args: unknown[]) => boolean;
109
+ /**
110
+ * Logical NOT - returns true if value is falsy.
111
+ *
112
+ * @example {{#if (not condition)}}condition is false{{/if}}
113
+ */
114
+ not: (value: unknown) => boolean;
115
+ /**
116
+ * Greater than comparison.
117
+ *
118
+ * @example {{#if (gt count 0)}}has items{{/if}}
119
+ */
120
+ gt: (a: unknown, b: unknown) => boolean;
121
+ /**
122
+ * Greater than or equal comparison.
123
+ *
124
+ * @example {{#if (gte count 1)}}at least one{{/if}}
125
+ */
126
+ gte: (a: unknown, b: unknown) => boolean;
127
+ /**
128
+ * Less than comparison.
129
+ *
130
+ * @example {{#if (lt count 10)}}less than ten{{/if}}
131
+ */
132
+ lt: (a: unknown, b: unknown) => boolean;
133
+ /**
134
+ * Less than or equal comparison.
135
+ *
136
+ * @example {{#if (lte count 10)}}ten or less{{/if}}
137
+ */
138
+ lte: (a: unknown, b: unknown) => boolean;
139
+ /**
140
+ * Trim leading/trailing whitespace from a string value.
141
+ *
142
+ * @example {{trim title}}
143
+ */
144
+ trim: (value: unknown) => string;
145
+ /**
146
+ * Translation helper - looks up translation from context.translationService.
147
+ * The translation service must be provided in the template context.
148
+ *
149
+ * @example {{t "label.title"}}
150
+ */
151
+ t: (this: {
152
+ translationService?: {
153
+ t: (key: string) => string;
154
+ };
155
+ }, key: string) => string;
156
+ /**
157
+ * Join array elements with a separator.
158
+ *
159
+ * @example {{join items ", "}}
160
+ */
161
+ join: (arr: unknown[], separator?: string) => string;
162
+ /**
163
+ * Return part of a string using slice semantics.
164
+ *
165
+ * @example {{substring notation 0 6}}
166
+ */
167
+ substring: (value: unknown, start: number, end?: number) => string;
168
+ /**
169
+ * Split a string into parts, or return one part if index is provided.
170
+ * Supports negative index values, where -1 is the last part.
171
+ *
172
+ * @example {{split notation "/" -1}}
173
+ */
174
+ split: (value: unknown, separator: string, index?: number) => unknown;
175
+ /**
176
+ * Concatenate strings.
177
+ * Note: The last argument is the Handlebars options hash, which is removed.
178
+ *
179
+ * @example {{concat prefix value suffix}}
180
+ */
181
+ concat: (...args: unknown[]) => string;
182
+ /**
183
+ * Default value if the primary value is empty/falsy.
184
+ *
185
+ * @example {{default title "Untitled"}}
186
+ */
187
+ default: (value: unknown, defaultValue: unknown) => unknown;
188
+ /**
189
+ * Convert markdown to HTML when output format is markdown, otherwise pass HTML through.
190
+ * Note: This helper does not sanitize HTML output, we are currently only using it on the client side with Angular's DomSanitizer to ensure safe usage.
191
+ * Do not use this helper with untrusted content in a server-side context without proper sanitization (see DOMSanitizerService as a way to sanitize the HTML on the server side).
192
+ *
193
+ * @example {{{markdownToHtml content outputFormat}}}
194
+ */
195
+ markdownToHtml: (value: unknown, outputFormat?: string) => string;
196
+ /**
197
+ * JSON stringify a value (useful for debugging).
198
+ *
199
+ * @example {{json data}}
200
+ */
201
+ json: (value: unknown) => string;
202
+ /**
203
+ * Render metadata values into nested HTML suitable for generated view-only display.
204
+ *
205
+ * @example {{{renderMetadataValue metadata.someField}}}
206
+ */
207
+ renderMetadataValue: (value: unknown) => string;
208
+ };
209
+ /**
210
+ * Type definition for the Handlebars helper functions.
211
+ */
212
+ export type HandlebarsHelperDefinitions = typeof handlebarsHelperDefinitions;
213
+ /**
214
+ * Register all shared helpers with a Handlebars instance.
215
+ *
216
+ * @param Handlebars The Handlebars instance to register helpers on
217
+ */
218
+ export declare function registerSharedHandlebarsHelpers(Handlebars: {
219
+ registerHelper: (name: string, fn: (...args: any[]) => any) => void;
220
+ }): void;
221
+ /**
222
+ * Get the names of all shared helpers.
223
+ */
224
+ export declare function getSharedHandlebarsHelperNames(): string[];