@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,558 @@
1
+ "use strict";
2
+ // Copyright (c) 2025 Queensland Cyber Infrastructure Foundation (http://www.qcif.edu.au/)
3
+ //
4
+ // GNU GENERAL PUBLIC LICENSE
5
+ // Version 2, June 1991
6
+ //
7
+ // This program is free software; you can redistribute it and/or modify
8
+ // it under the terms of the GNU General Public License as published by
9
+ // the Free Software Foundation; either version 2 of the License, or
10
+ // (at your option) any later version.
11
+ //
12
+ // This program is distributed in the hope that it will be useful,
13
+ // but WITHOUT ANY WARRANTY; without even the implied warranty of
14
+ // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
+ // GNU General Public License for more details.
16
+ //
17
+ // You should have received a copy of the GNU General Public License along
18
+ // with this program; if not, write to the Free Software Foundation, Inc.,
19
+ // 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
20
+ Object.defineProperty(exports, "__esModule", { value: true });
21
+ exports.handlebarsHelperDefinitions = exports.dateLocalePresetMap = void 0;
22
+ exports.registerSharedHandlebarsHelpers = registerSharedHandlebarsHelpers;
23
+ exports.getSharedHandlebarsHelperNames = getSharedHandlebarsHelperNames;
24
+ const luxon_1 = require("luxon");
25
+ const lodash_1 = require("lodash");
26
+ function isHandlebarsOptionsArg(value) {
27
+ return (typeof value === 'object' &&
28
+ value !== null &&
29
+ (Object.prototype.hasOwnProperty.call(value, 'hash') ||
30
+ Object.prototype.hasOwnProperty.call(value, 'data') ||
31
+ Object.prototype.hasOwnProperty.call(value, 'fn') ||
32
+ Object.prototype.hasOwnProperty.call(value, 'inverse')));
33
+ }
34
+ // TODO: this is because the DateInputComponent needs Luxon style formatters. We have a moment shim on the server side but not on the client.
35
+ function mapMomentToLuxonFormat(fmt) {
36
+ if (!fmt) {
37
+ return fmt;
38
+ }
39
+ return fmt
40
+ .replace(/YYYY/g, 'yyyy')
41
+ .replace(/YY/g, 'yy')
42
+ .replace(/MMMM/g, 'LLLL')
43
+ .replace(/MMM/g, 'LLL')
44
+ .replace(/\bMM\b/g, 'LL')
45
+ .replace(/\bM\b/g, 'L')
46
+ .replace(/\bDD\b/g, 'dd')
47
+ .replace(/\bD\b/g, 'd')
48
+ .replace(/dddd/g, 'cccc')
49
+ .replace(/ddd/g, 'ccc')
50
+ .replace(/\bHH\b/g, 'HH')
51
+ .replace(/\bH\b/g, 'H')
52
+ .replace(/\bhh\b/g, 'hh')
53
+ .replace(/\bh\b/g, 'h')
54
+ .replace(/\bmm\b/g, 'mm')
55
+ .replace(/\bm\b/g, 'm')
56
+ .replace(/\bss\b/g, 'ss')
57
+ .replace(/\bs\b/g, 's')
58
+ .replace(/A/g, 'a');
59
+ }
60
+ function resolveDateFormatArg(formatOrOptions) {
61
+ if (typeof formatOrOptions === 'string') {
62
+ return mapMomentToLuxonFormat(formatOrOptions);
63
+ }
64
+ if (isHandlebarsOptionsArg(formatOrOptions)) {
65
+ return undefined;
66
+ }
67
+ return undefined;
68
+ }
69
+ /**
70
+ * Marked is an ESM module so cannot be imported synchronously in a CommonJS context.
71
+ * We use dynamic import to load it when needed, and cache the parser function for future use. If the module cannot be loaded, the markdownToHtml helper will simply return the input string unmodified.
72
+ */
73
+ let cachedMarkedParser;
74
+ void import('marked')
75
+ .then(markedModule => {
76
+ const parseFn = markedModule?.marked?.parse ?? markedModule?.parse;
77
+ if (typeof parseFn === 'function') {
78
+ cachedMarkedParser = (value) => {
79
+ const result = parseFn(value);
80
+ return typeof result === 'string' ? result : value;
81
+ };
82
+ return;
83
+ }
84
+ cachedMarkedParser = null;
85
+ })
86
+ .catch(() => {
87
+ cachedMarkedParser = null;
88
+ });
89
+ function resolveMarkedParser() {
90
+ return cachedMarkedParser ?? null;
91
+ }
92
+ function escapeHtml(value) {
93
+ return String(value ?? '')
94
+ .replace(/&/g, '&')
95
+ .replace(/</g, '&lt;')
96
+ .replace(/>/g, '&gt;')
97
+ .replace(/"/g, '&quot;')
98
+ .replace(/'/g, '&#39;');
99
+ }
100
+ function isPrimitiveMetadataValue(value) {
101
+ return (value === null ||
102
+ value === undefined ||
103
+ typeof value === 'string' ||
104
+ typeof value === 'number' ||
105
+ typeof value === 'boolean');
106
+ }
107
+ function isFlatObject(value) {
108
+ if (!(0, lodash_1.isPlainObject)(value)) {
109
+ return false;
110
+ }
111
+ return Object.values(value).every(entry => isPrimitiveMetadataValue(entry));
112
+ }
113
+ function renderMetadataPrimitive(value) {
114
+ if ((0, lodash_1.isUndefined)(value) || (0, lodash_1.isNull)(value) || value === '') {
115
+ return '<em class="text-muted">—</em>';
116
+ }
117
+ return escapeHtml(value);
118
+ }
119
+ function renderMetadataObjectEntries(value) {
120
+ const entries = Object.entries(value);
121
+ if (entries.length === 0) {
122
+ return '<em class="text-muted">—</em>';
123
+ }
124
+ const rows = entries
125
+ .map(([key, entryValue]) => {
126
+ return `<div class="rb-view-metadata__nested-row"><div class="rb-view-metadata__nested-key">${escapeHtml(key)}</div><div class="rb-view-metadata__nested-value">${renderMetadataValue(entryValue)}</div></div>`;
127
+ })
128
+ .join('');
129
+ return `<div class="rb-view-metadata__nested">${rows}</div>`;
130
+ }
131
+ function renderMetadataTable(value) {
132
+ if (value.length === 0) {
133
+ return '<em class="text-muted">—</em>';
134
+ }
135
+ const columnsSet = new Set();
136
+ for (const row of value) {
137
+ for (const key of Object.keys(row)) {
138
+ columnsSet.add(key);
139
+ }
140
+ }
141
+ const columns = Array.from(columnsSet);
142
+ if (columns.length === 0) {
143
+ return '<em class="text-muted">—</em>';
144
+ }
145
+ const headerHtml = columns.map(key => `<th>${escapeHtml(key)}</th>`).join('');
146
+ const rowHtml = value
147
+ .map(row => {
148
+ const cells = columns.map(key => `<td>${renderMetadataPrimitive(row[key])}</td>`).join('');
149
+ return `<tr>${cells}</tr>`;
150
+ })
151
+ .join('');
152
+ return `<div class="rb-view-metadata__table-wrapper"><table class="table table-striped table-sm rb-view-metadata__table"><thead><tr>${headerHtml}</tr></thead><tbody>${rowHtml}</tbody></table></div>`;
153
+ }
154
+ function renderMetadataArray(value) {
155
+ if (value.length === 0) {
156
+ return '<em class="text-muted">—</em>';
157
+ }
158
+ if (value.every(entry => typeof entry === 'string')) {
159
+ const items = value.map(entry => `<li>${escapeHtml(entry)}</li>`).join('');
160
+ return `<ul class="rb-view-metadata__list">${items}</ul>`;
161
+ }
162
+ if (value.every(entry => isFlatObject(entry))) {
163
+ return renderMetadataTable(value);
164
+ }
165
+ const items = value.map(entry => `<li>${renderMetadataValue(entry)}</li>`).join('');
166
+ return `<ul class="rb-view-metadata__list">${items}</ul>`;
167
+ }
168
+ function renderMetadataValue(value) {
169
+ if ((0, lodash_1.isArray)(value)) {
170
+ return renderMetadataArray(value);
171
+ }
172
+ if ((0, lodash_1.isPlainObject)(value)) {
173
+ return renderMetadataObjectEntries(value);
174
+ }
175
+ return renderMetadataPrimitive(value);
176
+ }
177
+ /**
178
+ * Shared Handlebars helper definitions for use in both server and client contexts.
179
+ * These helpers provide CSP-safe alternatives to lodash template expressions.
180
+ *
181
+ * Usage:
182
+ * - Server: Import and register with Handlebars.registerHelper()
183
+ * - Client: Import and register with Handlebars runtime
184
+ */
185
+ /**
186
+ * Preset mapping for locale-aware date formatting.
187
+ * Maps preset names to Luxon's built-in format options.
188
+ */
189
+ exports.dateLocalePresetMap = {
190
+ DATE_SHORT: luxon_1.DateTime.DATE_SHORT,
191
+ DATE_MED: luxon_1.DateTime.DATE_MED,
192
+ DATE_MED_WITH_WEEKDAY: luxon_1.DateTime.DATE_MED_WITH_WEEKDAY,
193
+ DATE_FULL: luxon_1.DateTime.DATE_FULL,
194
+ DATE_HUGE: luxon_1.DateTime.DATE_HUGE,
195
+ TIME_SIMPLE: luxon_1.DateTime.TIME_SIMPLE,
196
+ TIME_WITH_SECONDS: luxon_1.DateTime.TIME_WITH_SECONDS,
197
+ TIME_WITH_SHORT_OFFSET: luxon_1.DateTime.TIME_WITH_SHORT_OFFSET,
198
+ TIME_WITH_LONG_OFFSET: luxon_1.DateTime.TIME_WITH_LONG_OFFSET,
199
+ TIME_24_SIMPLE: luxon_1.DateTime.TIME_24_SIMPLE,
200
+ TIME_24_WITH_SECONDS: luxon_1.DateTime.TIME_24_WITH_SECONDS,
201
+ TIME_24_WITH_SHORT_OFFSET: luxon_1.DateTime.TIME_24_WITH_SHORT_OFFSET,
202
+ TIME_24_WITH_LONG_OFFSET: luxon_1.DateTime.TIME_24_WITH_LONG_OFFSET,
203
+ DATETIME_SHORT: luxon_1.DateTime.DATETIME_SHORT,
204
+ DATETIME_MED: luxon_1.DateTime.DATETIME_MED,
205
+ DATETIME_FULL: luxon_1.DateTime.DATETIME_FULL,
206
+ DATETIME_HUGE: luxon_1.DateTime.DATETIME_HUGE,
207
+ DATETIME_SHORT_WITH_SECONDS: luxon_1.DateTime.DATETIME_SHORT_WITH_SECONDS,
208
+ DATETIME_MED_WITH_SECONDS: luxon_1.DateTime.DATETIME_MED_WITH_SECONDS,
209
+ DATETIME_FULL_WITH_SECONDS: luxon_1.DateTime.DATETIME_FULL_WITH_SECONDS,
210
+ DATETIME_HUGE_WITH_SECONDS: luxon_1.DateTime.DATETIME_HUGE_WITH_SECONDS,
211
+ };
212
+ /**
213
+ * Helper function definitions that can be registered with Handlebars.
214
+ * Each function is a pure, deterministic helper that does not execute arbitrary code.
215
+ */
216
+ exports.handlebarsHelperDefinitions = {
217
+ /**
218
+ * Format a date value using a custom format string.
219
+ * Supports ISO date strings and JavaScript Date instances.
220
+ * Replaces lodash template usage like: ${ DateTime.fromISO(data.date).toFormat('dd/MM/yyyy hh:mm a') }
221
+ *
222
+ * @example {{formatDate lastSaveDate "dd/MM/yyyy hh:mm a"}}
223
+ */
224
+ formatDate: function (dateValue, formatOrOptions) {
225
+ if (!dateValue) {
226
+ return '';
227
+ }
228
+ try {
229
+ const dt = dateValue instanceof Date ? luxon_1.DateTime.fromJSDate(dateValue) : luxon_1.DateTime.fromISO(dateValue);
230
+ if (!dt.isValid) {
231
+ return String(dateValue);
232
+ }
233
+ const format = resolveDateFormatArg(formatOrOptions);
234
+ return dt.toFormat(format || 'dd/MM/yyyy hh:mm a');
235
+ }
236
+ catch {
237
+ return String(dateValue);
238
+ }
239
+ },
240
+ /**
241
+ * Format a date value using locale-aware presets.
242
+ * Supports ISO date strings and JavaScript Date instances.
243
+ *
244
+ * @example {{formatDateLocale lastSaveDate "DATETIME_MED"}}
245
+ */
246
+ formatDateLocale: function (dateValue, presetNameOrOptions, localeOrOptions) {
247
+ if (!dateValue) {
248
+ return '';
249
+ }
250
+ try {
251
+ let dt = dateValue instanceof Date ? luxon_1.DateTime.fromJSDate(dateValue) : luxon_1.DateTime.fromISO(dateValue);
252
+ if (!dt.isValid) {
253
+ return String(dateValue);
254
+ }
255
+ const presetName = typeof presetNameOrOptions === 'string' ? presetNameOrOptions : undefined;
256
+ const locale = typeof localeOrOptions === 'string' ? localeOrOptions : undefined;
257
+ // Set locale - use provided locale or browser's language
258
+ if (locale) {
259
+ dt = dt.setLocale(locale);
260
+ }
261
+ else if (typeof navigator !== 'undefined' && navigator.language) {
262
+ dt = dt.setLocale(navigator.language);
263
+ }
264
+ const preset = exports.dateLocalePresetMap[presetName || 'DATETIME_MED'];
265
+ return dt.toLocaleString(preset);
266
+ }
267
+ catch {
268
+ return String(dateValue);
269
+ }
270
+ },
271
+ /**
272
+ * Parse a date string (pass-through for chaining).
273
+ *
274
+ * @example {{parseDateString dateString}}
275
+ */
276
+ parseDateString: function (dateString) {
277
+ return dateString || '';
278
+ },
279
+ /**
280
+ * Get a nested property from an object using dot notation.
281
+ * Replaces lodash template usage like: ${ _.get(data, 'metadata.contributor_ci', '') }
282
+ *
283
+ * @example {{get this "metadata.contributor_ci.text_full_name"}}
284
+ */
285
+ get: function (obj, path, defaultValue) {
286
+ return (0, lodash_1.get)(obj, path, defaultValue ?? '');
287
+ },
288
+ /**
289
+ * Check if a value is empty (null, undefined, empty string, empty array, empty object).
290
+ *
291
+ * @example {{#if (isEmpty value)}}empty{{/if}}
292
+ */
293
+ isEmpty: function (value) {
294
+ return (0, lodash_1.isEmpty)(value);
295
+ },
296
+ /**
297
+ * Check if a value is undefined.
298
+ *
299
+ * @example {{#if (isUndefined value)}}undefined{{/if}}
300
+ */
301
+ isUndefined: function (value) {
302
+ return (0, lodash_1.isUndefined)(value);
303
+ },
304
+ /**
305
+ * Check if a value is null.
306
+ *
307
+ * @example {{#if (isNull value)}}null{{/if}}
308
+ */
309
+ isNull: function (value) {
310
+ return (0, lodash_1.isNull)(value);
311
+ },
312
+ /**
313
+ * Check if a value is defined (not undefined and not null).
314
+ *
315
+ * @example {{#if (isDefined value)}}defined{{/if}}
316
+ */
317
+ isDefined: function (value) {
318
+ return !(0, lodash_1.isUndefined)(value) && !(0, lodash_1.isNull)(value);
319
+ },
320
+ /**
321
+ * Check if a value is an array.
322
+ *
323
+ * @example {{#if (isArray value)}}is array{{/if}}
324
+ */
325
+ isArray: function (value) {
326
+ return (0, lodash_1.isArray)(value);
327
+ },
328
+ /**
329
+ * Check if a value is a plain object.
330
+ *
331
+ * @example {{#if (isObject value)}}is object{{/if}}
332
+ */
333
+ isObject: function (value) {
334
+ return (0, lodash_1.isPlainObject)(value);
335
+ },
336
+ /**
337
+ * Strict equality comparison.
338
+ *
339
+ * @example {{#if (eq status "active")}}active{{/if}}
340
+ */
341
+ eq: function (a, b) {
342
+ return a === b;
343
+ },
344
+ /**
345
+ * Not equal comparison.
346
+ *
347
+ * @example {{#if (ne status "inactive")}}not inactive{{/if}}
348
+ */
349
+ ne: function (a, b) {
350
+ return a !== b;
351
+ },
352
+ /**
353
+ * Logical AND - returns true if all arguments are truthy.
354
+ * Note: The last argument is the Handlebars options hash, which is removed.
355
+ *
356
+ * @example {{#if (and condition1 condition2)}}both true{{/if}}
357
+ */
358
+ and: function (...args) {
359
+ // Remove the Handlebars options hash (last argument)
360
+ args.pop();
361
+ return args.every(Boolean);
362
+ },
363
+ /**
364
+ * Logical OR - returns true if any argument is truthy.
365
+ * Note: The last argument is the Handlebars options hash, which is removed.
366
+ *
367
+ * @example {{#if (or condition1 condition2)}}at least one true{{/if}}
368
+ */
369
+ or: function (...args) {
370
+ // Remove the Handlebars options hash (last argument)
371
+ args.pop();
372
+ return args.some(Boolean);
373
+ },
374
+ /**
375
+ * Logical NOT - returns true if value is falsy.
376
+ *
377
+ * @example {{#if (not condition)}}condition is false{{/if}}
378
+ */
379
+ not: function (value) {
380
+ return !value;
381
+ },
382
+ /**
383
+ * Greater than comparison.
384
+ *
385
+ * @example {{#if (gt count 0)}}has items{{/if}}
386
+ */
387
+ gt: function (a, b) {
388
+ return Number(a) > Number(b);
389
+ },
390
+ /**
391
+ * Greater than or equal comparison.
392
+ *
393
+ * @example {{#if (gte count 1)}}at least one{{/if}}
394
+ */
395
+ gte: function (a, b) {
396
+ return Number(a) >= Number(b);
397
+ },
398
+ /**
399
+ * Less than comparison.
400
+ *
401
+ * @example {{#if (lt count 10)}}less than ten{{/if}}
402
+ */
403
+ lt: function (a, b) {
404
+ return Number(a) < Number(b);
405
+ },
406
+ /**
407
+ * Less than or equal comparison.
408
+ *
409
+ * @example {{#if (lte count 10)}}ten or less{{/if}}
410
+ */
411
+ lte: function (a, b) {
412
+ return Number(a) <= Number(b);
413
+ },
414
+ /**
415
+ * Trim leading/trailing whitespace from a string value.
416
+ *
417
+ * @example {{trim title}}
418
+ */
419
+ trim: function (value) {
420
+ return String(value ?? '').trim();
421
+ },
422
+ /**
423
+ * Translation helper - looks up translation from context.translationService.
424
+ * The translation service must be provided in the template context.
425
+ *
426
+ * @example {{t "label.title"}}
427
+ */
428
+ t: function (key) {
429
+ const translationService = this?.translationService;
430
+ if (translationService && typeof translationService.t === 'function') {
431
+ return translationService.t(key);
432
+ }
433
+ return key;
434
+ },
435
+ /**
436
+ * Join array elements with a separator.
437
+ *
438
+ * @example {{join items ", "}}
439
+ */
440
+ join: function (arr, separator) {
441
+ if (!(0, lodash_1.isArray)(arr)) {
442
+ return '';
443
+ }
444
+ return arr.join(separator ?? ', ');
445
+ },
446
+ /**
447
+ * Return part of a string using slice semantics.
448
+ *
449
+ * @example {{substring notation 0 6}}
450
+ */
451
+ substring: function (value, start, end) {
452
+ const text = String(value ?? '');
453
+ const from = Number(start);
454
+ const to = end === undefined || end === null ? undefined : Number(end);
455
+ // Use slice semantics so negative offsets work (e.g. -1 for last char, -6 for trailing code).
456
+ // String.prototype.substring() clamps negatives to 0 and cannot express this.
457
+ return text.slice(Number.isNaN(from) ? 0 : from, Number.isNaN(to) ? undefined : to);
458
+ },
459
+ /**
460
+ * Split a string into parts, or return one part if index is provided.
461
+ * Supports negative index values, where -1 is the last part.
462
+ *
463
+ * @example {{split notation "/" -1}}
464
+ */
465
+ split: function (value, separator, index) {
466
+ const text = String(value ?? '');
467
+ const parts = text.split(String(separator ?? ''));
468
+ if (index === undefined || index === null) {
469
+ return parts;
470
+ }
471
+ const parsedIndex = Number(index);
472
+ if (Number.isNaN(parsedIndex)) {
473
+ return '';
474
+ }
475
+ const normalizedIndex = parsedIndex < 0 ? parts.length + parsedIndex : parsedIndex;
476
+ if (normalizedIndex < 0 || normalizedIndex >= parts.length) {
477
+ return '';
478
+ }
479
+ return parts[normalizedIndex];
480
+ },
481
+ /**
482
+ * Concatenate strings.
483
+ * Note: The last argument is the Handlebars options hash, which is removed.
484
+ *
485
+ * @example {{concat prefix value suffix}}
486
+ */
487
+ concat: function (...args) {
488
+ // Remove the Handlebars options hash (last argument)
489
+ args.pop();
490
+ return args.map(String).join('');
491
+ },
492
+ /**
493
+ * Default value if the primary value is empty/falsy.
494
+ *
495
+ * @example {{default title "Untitled"}}
496
+ */
497
+ default: function (value, defaultValue) {
498
+ return value || defaultValue;
499
+ },
500
+ /**
501
+ * Convert markdown to HTML when output format is markdown, otherwise pass HTML through.
502
+ * 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.
503
+ * 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).
504
+ *
505
+ * @example {{{markdownToHtml content outputFormat}}}
506
+ */
507
+ markdownToHtml: function (value, outputFormat) {
508
+ const input = String(value ?? '');
509
+ if (!input) {
510
+ return '';
511
+ }
512
+ if (outputFormat === 'markdown') {
513
+ const parser = resolveMarkedParser();
514
+ if (parser) {
515
+ return parser(input);
516
+ }
517
+ }
518
+ return input;
519
+ },
520
+ /**
521
+ * JSON stringify a value (useful for debugging).
522
+ *
523
+ * @example {{json data}}
524
+ */
525
+ json: function (value) {
526
+ try {
527
+ return JSON.stringify(value);
528
+ }
529
+ catch {
530
+ return String(value);
531
+ }
532
+ },
533
+ /**
534
+ * Render metadata values into nested HTML suitable for generated view-only display.
535
+ *
536
+ * @example {{{renderMetadataValue metadata.someField}}}
537
+ */
538
+ renderMetadataValue: function (value) {
539
+ return renderMetadataValue(value);
540
+ },
541
+ };
542
+ /**
543
+ * Register all shared helpers with a Handlebars instance.
544
+ *
545
+ * @param Handlebars The Handlebars instance to register helpers on
546
+ */
547
+ function registerSharedHandlebarsHelpers(Handlebars) {
548
+ for (const [name, fn] of Object.entries(exports.handlebarsHelperDefinitions)) {
549
+ Handlebars.registerHelper(name, fn);
550
+ }
551
+ }
552
+ /**
553
+ * Get the names of all shared helpers.
554
+ */
555
+ function getSharedHandlebarsHelperNames() {
556
+ return Object.keys(exports.handlebarsHelperDefinitions);
557
+ }
558
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGFuZGxlYmFycy1oZWxwZXJzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2hhbmRsZWJhcnMtaGVscGVycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsMEZBQTBGO0FBQzFGLEVBQUU7QUFDRiw2QkFBNkI7QUFDN0IsMEJBQTBCO0FBQzFCLEVBQUU7QUFDRix1RUFBdUU7QUFDdkUsdUVBQXVFO0FBQ3ZFLG9FQUFvRTtBQUNwRSxzQ0FBc0M7QUFDdEMsRUFBRTtBQUNGLGtFQUFrRTtBQUNsRSxpRUFBaUU7QUFDakUsZ0VBQWdFO0FBQ2hFLCtDQUErQztBQUMvQyxFQUFFO0FBQ0YsMEVBQTBFO0FBQzFFLDBFQUEwRTtBQUMxRSw4REFBOEQ7OztBQTZsQjlELDBFQU1DO0FBS0Qsd0VBRUM7QUF4bUJELGlDQUFpQztBQUNqQyxtQ0FPZ0I7QUFFaEIsU0FBUyxzQkFBc0IsQ0FBQyxLQUFjO0lBQzVDLE9BQU8sQ0FDTCxPQUFPLEtBQUssS0FBSyxRQUFRO1FBQ3pCLEtBQUssS0FBSyxJQUFJO1FBQ2QsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQztZQUNsRCxNQUFNLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQztZQUNuRCxNQUFNLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQztZQUNqRCxNQUFNLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQzFELENBQUM7QUFDSixDQUFDO0FBRUQsNklBQTZJO0FBQzdJLFNBQVMsc0JBQXNCLENBQUMsR0FBVztJQUN6QyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDVCxPQUFPLEdBQUcsQ0FBQztJQUNiLENBQUM7SUFFRCxPQUFPLEdBQUc7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