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