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