@sapui5/sap.fe.base 1.125.0
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/LICENSE.txt +38 -0
- package/README.md +15 -0
- package/package.json +12 -0
- package/src/sap/fe/base/.library +38 -0
- package/src/sap/fe/base/ClassSupport.js +590 -0
- package/src/sap/fe/base/ClassSupport.ts +714 -0
- package/src/sap/fe/base/jsx-runtime/Fragment.js +14 -0
- package/src/sap/fe/base/jsx-runtime/Fragment.ts +3 -0
- package/src/sap/fe/base/jsx-runtime/ViewLoader.js +93 -0
- package/src/sap/fe/base/jsx-runtime/ViewLoader.tsx +86 -0
- package/src/sap/fe/base/jsx-runtime/jsx-control.js +177 -0
- package/src/sap/fe/base/jsx-runtime/jsx-control.ts +197 -0
- package/src/sap/fe/base/jsx-runtime/jsx-renderManager.js +44 -0
- package/src/sap/fe/base/jsx-runtime/jsx-renderManager.ts +43 -0
- package/src/sap/fe/base/jsx-runtime/jsx-xml.js +237 -0
- package/src/sap/fe/base/jsx-runtime/jsx-xml.ts +246 -0
- package/src/sap/fe/base/jsx-runtime/jsx.js +56 -0
- package/src/sap/fe/base/jsx-runtime/jsx.ts +91 -0
- package/src/sap/fe/base/jsx-runtime/jsxs.js +10 -0
- package/src/sap/fe/base/jsx-runtime/jsxs.ts +3 -0
- package/src/sap/fe/base/jsx-runtime.js +17 -0
- package/src/sap/fe/base/jsx-runtime.ts +8 -0
- package/src/sap/fe/base/library.js +31 -0
- package/src/sap/fe/base/library.ts +23 -0
- package/ui5.yaml +8 -0
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* SAP UI development toolkit for HTML5 (SAPUI5)
|
|
3
|
+
* (c) Copyright 2009-2024 SAP SE. All rights reserved
|
|
4
|
+
*/
|
|
5
|
+
sap.ui.define([], function () {
|
|
6
|
+
"use strict";
|
|
7
|
+
|
|
8
|
+
const jsxRenderManager = function (type, mSettings, key, renderManager) {
|
|
9
|
+
return () => {
|
|
10
|
+
if (typeof type === "string") {
|
|
11
|
+
if (mSettings.ref) {
|
|
12
|
+
renderManager.openStart(type, mSettings.ref);
|
|
13
|
+
} else {
|
|
14
|
+
renderManager.openStart(type);
|
|
15
|
+
}
|
|
16
|
+
for (const mSetting in mSettings) {
|
|
17
|
+
if (mSetting !== "children" && mSetting !== "ref") {
|
|
18
|
+
renderManager.attr(mSetting, mSettings[mSetting]);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
renderManager.openEnd();
|
|
22
|
+
}
|
|
23
|
+
const children = mSettings.children;
|
|
24
|
+
if (Array.isArray(children)) {
|
|
25
|
+
children.forEach(child => {
|
|
26
|
+
if (typeof child === "string") {
|
|
27
|
+
renderManager.text(child);
|
|
28
|
+
} else if (typeof child === "function") {
|
|
29
|
+
child();
|
|
30
|
+
} else if (child !== undefined) {
|
|
31
|
+
renderManager.renderControl(child);
|
|
32
|
+
}
|
|
33
|
+
});
|
|
34
|
+
} else {
|
|
35
|
+
renderManager.text(mSettings["children"]);
|
|
36
|
+
}
|
|
37
|
+
if (typeof type === "string") {
|
|
38
|
+
renderManager.close(type);
|
|
39
|
+
}
|
|
40
|
+
};
|
|
41
|
+
};
|
|
42
|
+
return jsxRenderManager;
|
|
43
|
+
}, false);
|
|
44
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJqc3hSZW5kZXJNYW5hZ2VyIiwidHlwZSIsIm1TZXR0aW5ncyIsImtleSIsInJlbmRlck1hbmFnZXIiLCJyZWYiLCJvcGVuU3RhcnQiLCJtU2V0dGluZyIsImF0dHIiLCJvcGVuRW5kIiwiY2hpbGRyZW4iLCJBcnJheSIsImlzQXJyYXkiLCJmb3JFYWNoIiwiY2hpbGQiLCJ0ZXh0IiwidW5kZWZpbmVkIiwicmVuZGVyQ29udHJvbCIsImNsb3NlIl0sInNvdXJjZVJvb3QiOiIuIiwic291cmNlcyI6WyJqc3gtcmVuZGVyTWFuYWdlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSBSZW5kZXJNYW5hZ2VyIGZyb20gXCJzYXAvdWkvY29yZS9SZW5kZXJNYW5hZ2VyXCI7XG5cbmNvbnN0IGpzeFJlbmRlck1hbmFnZXIgPSBmdW5jdGlvbiAoXG5cdHR5cGU6IHN0cmluZyB8IEZ1bmN0aW9uLFxuXHRtU2V0dGluZ3M6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4sXG5cdGtleTogc3RyaW5nLFxuXHRyZW5kZXJNYW5hZ2VyOiBSZW5kZXJNYW5hZ2VyXG4pOiBGdW5jdGlvbiB7XG5cdHJldHVybiAoKSA9PiB7XG5cdFx0aWYgKHR5cGVvZiB0eXBlID09PSBcInN0cmluZ1wiKSB7XG5cdFx0XHRpZiAobVNldHRpbmdzLnJlZikge1xuXHRcdFx0XHRyZW5kZXJNYW5hZ2VyLm9wZW5TdGFydCh0eXBlLCBtU2V0dGluZ3MucmVmKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHJlbmRlck1hbmFnZXIub3BlblN0YXJ0KHR5cGUpO1xuXHRcdFx0fVxuXHRcdFx0Zm9yIChjb25zdCBtU2V0dGluZyBpbiBtU2V0dGluZ3MpIHtcblx0XHRcdFx0aWYgKG1TZXR0aW5nICE9PSBcImNoaWxkcmVuXCIgJiYgbVNldHRpbmcgIT09IFwicmVmXCIpIHtcblx0XHRcdFx0XHRyZW5kZXJNYW5hZ2VyLmF0dHIobVNldHRpbmcsIG1TZXR0aW5nc1ttU2V0dGluZ10pO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRyZW5kZXJNYW5hZ2VyLm9wZW5FbmQoKTtcblx0XHR9XG5cdFx0Y29uc3QgY2hpbGRyZW46IHN0cmluZyB8IEZ1bmN0aW9uW10gPSBtU2V0dGluZ3MuY2hpbGRyZW47XG5cdFx0aWYgKEFycmF5LmlzQXJyYXkoY2hpbGRyZW4pKSB7XG5cdFx0XHRjaGlsZHJlbi5mb3JFYWNoKChjaGlsZCkgPT4ge1xuXHRcdFx0XHRpZiAodHlwZW9mIGNoaWxkID09PSBcInN0cmluZ1wiKSB7XG5cdFx0XHRcdFx0cmVuZGVyTWFuYWdlci50ZXh0KGNoaWxkKTtcblx0XHRcdFx0fSBlbHNlIGlmICh0eXBlb2YgY2hpbGQgPT09IFwiZnVuY3Rpb25cIikge1xuXHRcdFx0XHRcdGNoaWxkKCk7XG5cdFx0XHRcdH0gZWxzZSBpZiAoY2hpbGQgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdHJlbmRlck1hbmFnZXIucmVuZGVyQ29udHJvbChjaGlsZCk7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZW5kZXJNYW5hZ2VyLnRleHQobVNldHRpbmdzW1wiY2hpbGRyZW5cIl0pO1xuXHRcdH1cblxuXHRcdGlmICh0eXBlb2YgdHlwZSA9PT0gXCJzdHJpbmdcIikge1xuXHRcdFx0cmVuZGVyTWFuYWdlci5jbG9zZSh0eXBlKTtcblx0XHR9XG5cdH07XG59O1xuZXhwb3J0IGRlZmF1bHQganN4UmVuZGVyTWFuYWdlcjtcbiJdLCJtYXBwaW5ncyI6IjtBQUFBO0FBQUE7QUFBQTs7OztFQUVBLE1BQU1BLGdCQUFnQixHQUFHLFVBQ3hCQyxJQUF1QixFQUN2QkMsU0FBaUMsRUFDakNDLEdBQVcsRUFDWEMsYUFBNEIsRUFDakI7SUFDWCxPQUFPLE1BQU07TUFDWixJQUFJLE9BQU9ILElBQUksS0FBSyxRQUFRLEVBQUU7UUFDN0IsSUFBSUMsU0FBUyxDQUFDRyxHQUFHLEVBQUU7VUFDbEJELGFBQWEsQ0FBQ0UsU0FBUyxDQUFDTCxJQUFJLEVBQUVDLFNBQVMsQ0FBQ0csR0FBRyxDQUFDO1FBQzdDLENBQUMsTUFBTTtVQUNORCxhQUFhLENBQUNFLFNBQVMsQ0FBQ0wsSUFBSSxDQUFDO1FBQzlCO1FBQ0EsS0FBSyxNQUFNTSxRQUFRLElBQUlMLFNBQVMsRUFBRTtVQUNqQyxJQUFJSyxRQUFRLEtBQUssVUFBVSxJQUFJQSxRQUFRLEtBQUssS0FBSyxFQUFFO1lBQ2xESCxhQUFhLENBQUNJLElBQUksQ0FBQ0QsUUFBUSxFQUFFTCxTQUFTLENBQUNLLFFBQVEsQ0FBQyxDQUFDO1VBQ2xEO1FBQ0Q7UUFDQUgsYUFBYSxDQUFDSyxPQUFPLEVBQUU7TUFDeEI7TUFDQSxNQUFNQyxRQUE2QixHQUFHUixTQUFTLENBQUNRLFFBQVE7TUFDeEQsSUFBSUMsS0FBSyxDQUFDQyxPQUFPLENBQUNGLFFBQVEsQ0FBQyxFQUFFO1FBQzVCQSxRQUFRLENBQUNHLE9BQU8sQ0FBRUMsS0FBSyxJQUFLO1VBQzNCLElBQUksT0FBT0EsS0FBSyxLQUFLLFFBQVEsRUFBRTtZQUM5QlYsYUFBYSxDQUFDVyxJQUFJLENBQUNELEtBQUssQ0FBQztVQUMxQixDQUFDLE1BQU0sSUFBSSxPQUFPQSxLQUFLLEtBQUssVUFBVSxFQUFFO1lBQ3ZDQSxLQUFLLEVBQUU7VUFDUixDQUFDLE1BQU0sSUFBSUEsS0FBSyxLQUFLRSxTQUFTLEVBQUU7WUFDL0JaLGFBQWEsQ0FBQ2EsYUFBYSxDQUFDSCxLQUFLLENBQUM7VUFDbkM7UUFDRCxDQUFDLENBQUM7TUFDSCxDQUFDLE1BQU07UUFDTlYsYUFBYSxDQUFDVyxJQUFJLENBQUNiLFNBQVMsQ0FBQyxVQUFVLENBQUMsQ0FBQztNQUMxQztNQUVBLElBQUksT0FBT0QsSUFBSSxLQUFLLFFBQVEsRUFBRTtRQUM3QkcsYUFBYSxDQUFDYyxLQUFLLENBQUNqQixJQUFJLENBQUM7TUFDMUI7SUFDRCxDQUFDO0VBQ0YsQ0FBQztFQUFDLE9BQ2FELGdCQUFnQjtBQUFBIn0=
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import type RenderManager from "sap/ui/core/RenderManager";
|
|
2
|
+
|
|
3
|
+
const jsxRenderManager = function (
|
|
4
|
+
type: string | Function,
|
|
5
|
+
mSettings: Record<string, string>,
|
|
6
|
+
key: string,
|
|
7
|
+
renderManager: RenderManager
|
|
8
|
+
): Function {
|
|
9
|
+
return () => {
|
|
10
|
+
if (typeof type === "string") {
|
|
11
|
+
if (mSettings.ref) {
|
|
12
|
+
renderManager.openStart(type, mSettings.ref);
|
|
13
|
+
} else {
|
|
14
|
+
renderManager.openStart(type);
|
|
15
|
+
}
|
|
16
|
+
for (const mSetting in mSettings) {
|
|
17
|
+
if (mSetting !== "children" && mSetting !== "ref") {
|
|
18
|
+
renderManager.attr(mSetting, mSettings[mSetting]);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
renderManager.openEnd();
|
|
22
|
+
}
|
|
23
|
+
const children: string | Function[] = mSettings.children;
|
|
24
|
+
if (Array.isArray(children)) {
|
|
25
|
+
children.forEach((child) => {
|
|
26
|
+
if (typeof child === "string") {
|
|
27
|
+
renderManager.text(child);
|
|
28
|
+
} else if (typeof child === "function") {
|
|
29
|
+
child();
|
|
30
|
+
} else if (child !== undefined) {
|
|
31
|
+
renderManager.renderControl(child);
|
|
32
|
+
}
|
|
33
|
+
});
|
|
34
|
+
} else {
|
|
35
|
+
renderManager.text(mSettings["children"]);
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
if (typeof type === "string") {
|
|
39
|
+
renderManager.close(type);
|
|
40
|
+
}
|
|
41
|
+
};
|
|
42
|
+
};
|
|
43
|
+
export default jsxRenderManager;
|
|
@@ -0,0 +1,237 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* SAP UI development toolkit for HTML5 (SAPUI5)
|
|
3
|
+
* (c) Copyright 2009-2024 SAP SE. All rights reserved
|
|
4
|
+
*/
|
|
5
|
+
sap.ui.define(["sap/fe/core/helpers/BindingToolkit"], function (BindingToolkit) {
|
|
6
|
+
"use strict";
|
|
7
|
+
|
|
8
|
+
var isBindingToolkitExpression = BindingToolkit.isBindingToolkitExpression;
|
|
9
|
+
const writeChildren = function (val) {
|
|
10
|
+
if (Array.isArray(val)) {
|
|
11
|
+
return val.join("");
|
|
12
|
+
} else {
|
|
13
|
+
return val;
|
|
14
|
+
}
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Some characters needs to be escaped when used as XML attribute value, otherwise this result in incorrect XML.
|
|
19
|
+
*
|
|
20
|
+
* @param value
|
|
21
|
+
* @returns The escaped xml attribute
|
|
22
|
+
*/
|
|
23
|
+
function escapeXMLAttributeValue(value) {
|
|
24
|
+
return value === null || value === void 0 ? void 0 : value.replace(/&/g, "&").replace(/</g, "<").replace(/"/g, """).replace(/'/g, "'");
|
|
25
|
+
}
|
|
26
|
+
const addChildAggregation = function (aggregationChildren, aggregationName, child) {
|
|
27
|
+
if (child === undefined) {
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
if (!aggregationChildren[aggregationName]) {
|
|
31
|
+
aggregationChildren[aggregationName] = [];
|
|
32
|
+
}
|
|
33
|
+
if (typeof child === "string") {
|
|
34
|
+
if (child.trim().length > 0) {
|
|
35
|
+
aggregationChildren[aggregationName].push(child);
|
|
36
|
+
}
|
|
37
|
+
} else if (Array.isArray(child)) {
|
|
38
|
+
child.forEach(subChild => {
|
|
39
|
+
addChildAggregation(aggregationChildren, aggregationName, subChild);
|
|
40
|
+
});
|
|
41
|
+
} else {
|
|
42
|
+
for (const childKey of Object.keys(child)) {
|
|
43
|
+
addChildAggregation(aggregationChildren, childKey, child[childKey]);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
};
|
|
47
|
+
const isAControl = function (children) {
|
|
48
|
+
return !!(children !== null && children !== void 0 && children.getMetadata);
|
|
49
|
+
};
|
|
50
|
+
const FL_DELEGATE = "fl:delegate";
|
|
51
|
+
const CORE_REQUIRE = "core:require";
|
|
52
|
+
const LOG_SOURCEPATH = "log:sourcePath";
|
|
53
|
+
const CUSTOM_LOADVALUE = "customData:loadValue";
|
|
54
|
+
const CUSTOM_URL = "customData:url";
|
|
55
|
+
function processObjectPropertyValue(childrenObject, namespaceAlias, propertyName) {
|
|
56
|
+
// This is called when the child is
|
|
57
|
+
const aggregationProperties = [];
|
|
58
|
+
const aggregationChildren = [];
|
|
59
|
+
Object.keys(childrenObject).forEach(subPropName => {
|
|
60
|
+
const childValue = childrenObject[subPropName];
|
|
61
|
+
if (childValue !== undefined) {
|
|
62
|
+
if (typeof childValue === "object") {
|
|
63
|
+
// if the property is a value it needs to be serialized as a children
|
|
64
|
+
// <myObjectProp prop1='xxx', prop2='xxt'/>
|
|
65
|
+
aggregationChildren.push(processObjectPropertyValue(childValue, namespaceAlias, subPropName));
|
|
66
|
+
} else {
|
|
67
|
+
// Otherwise it's part of the main object just as another property
|
|
68
|
+
aggregationProperties.push(`${subPropName}='${escapeXMLAttributeValue(childValue.toString())}'`);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
});
|
|
72
|
+
return `<${namespaceAlias}:${propertyName} ${aggregationProperties.join(" ")}>${aggregationChildren.join("\n")}</${namespaceAlias}:${propertyName}>`;
|
|
73
|
+
}
|
|
74
|
+
function processProperties(mSettings, metadataProperties, namespaceAlias, propertiesString, aggregationString) {
|
|
75
|
+
Object.keys(metadataProperties).forEach(propertyName => {
|
|
76
|
+
var _mSettings$children, _mSettings$children2;
|
|
77
|
+
if (mSettings.hasOwnProperty(propertyName) && mSettings[propertyName] !== undefined) {
|
|
78
|
+
const propertyValue = mSettings[propertyName];
|
|
79
|
+
if (propertyName === CORE_REQUIRE) {
|
|
80
|
+
propertiesString.push(`xmlns:core="sap.ui.core"`);
|
|
81
|
+
}
|
|
82
|
+
if (propertyName === LOG_SOURCEPATH) {
|
|
83
|
+
propertiesString.push(`xmlns:log="http://schemas.sap.com/sapui5/extension/sap.ui.core.CustomData/1"`);
|
|
84
|
+
}
|
|
85
|
+
if (propertyName === CUSTOM_URL || propertyName === CUSTOM_LOADVALUE) {
|
|
86
|
+
propertiesString.push(`xmlns:customData="http://schemas.sap.com/sapui5/extension/sap.ui.core.CustomData/1"`);
|
|
87
|
+
}
|
|
88
|
+
if (propertyValue && typeof propertyValue === "object") {
|
|
89
|
+
if (metadataProperties[propertyName].type === "sap.ui.model.Context") {
|
|
90
|
+
propertiesString.push(`${propertyName}='${propertyValue.getPath()}'`);
|
|
91
|
+
} else if (isBindingToolkitExpression(propertyValue) || propertyName === "delegate") {
|
|
92
|
+
propertiesString.push(`${propertyName}='${JSON.stringify(mSettings[propertyName])}'`);
|
|
93
|
+
} else if (Array.isArray(propertyValue)) {
|
|
94
|
+
if (propertyValue.length === 1) {
|
|
95
|
+
propertiesString.push(`${propertyName}='${JSON.stringify(propertyValue[0])}'`);
|
|
96
|
+
} else {
|
|
97
|
+
propertiesString.push(`${propertyName}='${JSON.stringify(mSettings[propertyName])}'`);
|
|
98
|
+
}
|
|
99
|
+
} else {
|
|
100
|
+
const complexProperty = [];
|
|
101
|
+
const propertyValueObj = propertyValue;
|
|
102
|
+
Object.keys(propertyValueObj).forEach(subPropName => {
|
|
103
|
+
if (propertyValueObj[subPropName] !== undefined) {
|
|
104
|
+
complexProperty.push(`${subPropName}='${escapeXMLAttributeValue(propertyValueObj[subPropName].toString())}'`);
|
|
105
|
+
}
|
|
106
|
+
});
|
|
107
|
+
aggregationString.push(`<${propertyName} ${complexProperty.join(" ")}/>`);
|
|
108
|
+
}
|
|
109
|
+
} else {
|
|
110
|
+
const prop = mSettings[propertyName];
|
|
111
|
+
propertiesString.push(`${propertyName}='${escapeXMLAttributeValue(prop.toString())}'`);
|
|
112
|
+
}
|
|
113
|
+
} else if ((_mSettings$children = mSettings.children) !== null && _mSettings$children !== void 0 && _mSettings$children.hasOwnProperty(propertyName) && Object.keys(((_mSettings$children2 = mSettings.children) === null || _mSettings$children2 === void 0 ? void 0 : _mSettings$children2[propertyName]) ?? {}).length > 0) {
|
|
114
|
+
var _mSettings$children3;
|
|
115
|
+
// Object / Array properties are part of the `children` aggregation and as such still need to be processed as properties
|
|
116
|
+
const childrenObject = (_mSettings$children3 = mSettings.children) === null || _mSettings$children3 === void 0 ? void 0 : _mSettings$children3[propertyName];
|
|
117
|
+
aggregationString.push(processObjectPropertyValue(childrenObject, namespaceAlias, propertyName));
|
|
118
|
+
}
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
function processAggregations(mSettings, metadataAggregations, namespaceAlias, defaultAggregationName, propertiesString, aggregationString) {
|
|
122
|
+
const aggregationChildren = {};
|
|
123
|
+
addChildAggregation(aggregationChildren, defaultAggregationName ?? "customData", mSettings.children);
|
|
124
|
+
const aggregationChildKeys = Object.keys(aggregationChildren);
|
|
125
|
+
let writeOnlyDefaultAggregation = false;
|
|
126
|
+
if (aggregationChildKeys.length === 1 && aggregationChildKeys[0] === defaultAggregationName) {
|
|
127
|
+
writeOnlyDefaultAggregation = true;
|
|
128
|
+
}
|
|
129
|
+
Object.keys(metadataAggregations).forEach(aggregationName => {
|
|
130
|
+
if (aggregationChildren.hasOwnProperty(aggregationName) && aggregationChildren[aggregationName].length > 0) {
|
|
131
|
+
if (aggregationName === defaultAggregationName && writeOnlyDefaultAggregation) {
|
|
132
|
+
aggregationString.push(`${writeChildren(aggregationChildren[aggregationName])}`);
|
|
133
|
+
} else {
|
|
134
|
+
aggregationString.push(`<${namespaceAlias}:${aggregationName}>
|
|
135
|
+
${writeChildren(aggregationChildren[aggregationName])}
|
|
136
|
+
</${namespaceAlias}:${aggregationName}>`);
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
if (mSettings.hasOwnProperty(aggregationName) && mSettings[aggregationName] !== undefined) {
|
|
140
|
+
if (typeof mSettings[aggregationName] === "object") {
|
|
141
|
+
propertiesString.push(`${aggregationName}='${JSON.stringify(mSettings[aggregationName])}'`);
|
|
142
|
+
} else {
|
|
143
|
+
// In some case the aggregation expect a string value (like for the tooltip), in this case we set it directly as a property
|
|
144
|
+
propertiesString.push(`${aggregationName}='${mSettings[aggregationName]}'`);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
});
|
|
148
|
+
return aggregationChildren;
|
|
149
|
+
}
|
|
150
|
+
const jsxXml = function (type, mSettings, key, xmlNamespaceMap, overrideNodeName) {
|
|
151
|
+
let metadata;
|
|
152
|
+
let metadataProperties;
|
|
153
|
+
let controlName;
|
|
154
|
+
let metadataAggregations;
|
|
155
|
+
let defaultAggregationName;
|
|
156
|
+
if (isAControl(type)) {
|
|
157
|
+
metadata = type.getMetadata();
|
|
158
|
+
metadataProperties = metadata.getAllProperties();
|
|
159
|
+
metadataProperties = {
|
|
160
|
+
...metadataProperties,
|
|
161
|
+
...metadata.getAllEvents(),
|
|
162
|
+
...metadata.getAllAssociations()
|
|
163
|
+
};
|
|
164
|
+
controlName = metadata.getName();
|
|
165
|
+
metadataAggregations = metadata.getAllAggregations();
|
|
166
|
+
defaultAggregationName = metadata.getDefaultAggregationName();
|
|
167
|
+
} else {
|
|
168
|
+
metadata = type.metadata;
|
|
169
|
+
metadataProperties = metadata.properties;
|
|
170
|
+
metadataAggregations = {
|
|
171
|
+
...{
|
|
172
|
+
dependents: {},
|
|
173
|
+
customData: {}
|
|
174
|
+
},
|
|
175
|
+
...metadata.aggregations
|
|
176
|
+
};
|
|
177
|
+
defaultAggregationName = metadata.defaultAggregation;
|
|
178
|
+
controlName = metadata.namespace + "." + metadata.name;
|
|
179
|
+
}
|
|
180
|
+
const namesSplit = controlName.split(".");
|
|
181
|
+
if (key !== undefined) {
|
|
182
|
+
mSettings["key"] = key;
|
|
183
|
+
}
|
|
184
|
+
metadataProperties["class"] = {
|
|
185
|
+
name: "class"
|
|
186
|
+
};
|
|
187
|
+
metadataProperties["id"] = {
|
|
188
|
+
name: "id"
|
|
189
|
+
};
|
|
190
|
+
metadataProperties[FL_DELEGATE] = {
|
|
191
|
+
name: FL_DELEGATE
|
|
192
|
+
};
|
|
193
|
+
metadataProperties[CORE_REQUIRE] = {
|
|
194
|
+
name: CORE_REQUIRE
|
|
195
|
+
};
|
|
196
|
+
metadataProperties[LOG_SOURCEPATH] = {
|
|
197
|
+
name: LOG_SOURCEPATH
|
|
198
|
+
};
|
|
199
|
+
metadataProperties[CUSTOM_LOADVALUE] = {
|
|
200
|
+
name: CUSTOM_LOADVALUE
|
|
201
|
+
};
|
|
202
|
+
metadataProperties[CUSTOM_URL] = {
|
|
203
|
+
name: CUSTOM_URL
|
|
204
|
+
};
|
|
205
|
+
metadataProperties["xmlns:fl"] = {
|
|
206
|
+
name: FL_DELEGATE
|
|
207
|
+
};
|
|
208
|
+
metadataProperties["xmlns:core"] = {
|
|
209
|
+
name: CORE_REQUIRE
|
|
210
|
+
};
|
|
211
|
+
metadataProperties["xmlns:log"] = {
|
|
212
|
+
name: LOG_SOURCEPATH
|
|
213
|
+
};
|
|
214
|
+
if (controlName === "sap.ui.core.Fragment") {
|
|
215
|
+
metadataProperties["fragmentName"] = {
|
|
216
|
+
name: "fragmentName"
|
|
217
|
+
};
|
|
218
|
+
}
|
|
219
|
+
const namespace = namesSplit.slice(0, -1);
|
|
220
|
+
const name = namesSplit[namesSplit.length - 1];
|
|
221
|
+
let namespaceAlias = namespace[namespace.length - 1];
|
|
222
|
+
if (xmlNamespaceMap[namespace.join(".")]) {
|
|
223
|
+
namespaceAlias = xmlNamespaceMap[namespace.join(".")];
|
|
224
|
+
}
|
|
225
|
+
let tagName = `${namespaceAlias}:${name}`;
|
|
226
|
+
const propertiesString = [];
|
|
227
|
+
const aggregationString = [];
|
|
228
|
+
processProperties(mSettings, metadataProperties, namespaceAlias, propertiesString, aggregationString);
|
|
229
|
+
processAggregations(mSettings, metadataAggregations, namespaceAlias, defaultAggregationName, propertiesString, aggregationString);
|
|
230
|
+
if (overrideNodeName) {
|
|
231
|
+
tagName = overrideNodeName;
|
|
232
|
+
}
|
|
233
|
+
return `<${tagName} xmlns:${namespaceAlias}="${namespace.join(".")}" ${propertiesString.join(" ")}>${aggregationString.join("")}</${tagName}>`;
|
|
234
|
+
};
|
|
235
|
+
return jsxXml;
|
|
236
|
+
}, false);
|
|
237
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJ3cml0ZUNoaWxkcmVuIiwidmFsIiwiQXJyYXkiLCJpc0FycmF5Iiwiam9pbiIsImVzY2FwZVhNTEF0dHJpYnV0ZVZhbHVlIiwidmFsdWUiLCJyZXBsYWNlIiwiYWRkQ2hpbGRBZ2dyZWdhdGlvbiIsImFnZ3JlZ2F0aW9uQ2hpbGRyZW4iLCJhZ2dyZWdhdGlvbk5hbWUiLCJjaGlsZCIsInVuZGVmaW5lZCIsInRyaW0iLCJsZW5ndGgiLCJwdXNoIiwiZm9yRWFjaCIsInN1YkNoaWxkIiwiY2hpbGRLZXkiLCJPYmplY3QiLCJrZXlzIiwiaXNBQ29udHJvbCIsImNoaWxkcmVuIiwiZ2V0TWV0YWRhdGEiLCJGTF9ERUxFR0FURSIsIkNPUkVfUkVRVUlSRSIsIkxPR19TT1VSQ0VQQVRIIiwiQ1VTVE9NX0xPQURWQUxVRSIsIkNVU1RPTV9VUkwiLCJwcm9jZXNzT2JqZWN0UHJvcGVydHlWYWx1ZSIsImNoaWxkcmVuT2JqZWN0IiwibmFtZXNwYWNlQWxpYXMiLCJwcm9wZXJ0eU5hbWUiLCJhZ2dyZWdhdGlvblByb3BlcnRpZXMiLCJzdWJQcm9wTmFtZSIsImNoaWxkVmFsdWUiLCJ0b1N0cmluZyIsInByb2Nlc3NQcm9wZXJ0aWVzIiwibVNldHRpbmdzIiwibWV0YWRhdGFQcm9wZXJ0aWVzIiwicHJvcGVydGllc1N0cmluZyIsImFnZ3JlZ2F0aW9uU3RyaW5nIiwiaGFzT3duUHJvcGVydHkiLCJwcm9wZXJ0eVZhbHVlIiwidHlwZSIsImdldFBhdGgiLCJpc0JpbmRpbmdUb29sa2l0RXhwcmVzc2lvbiIsIkpTT04iLCJzdHJpbmdpZnkiLCJjb21wbGV4UHJvcGVydHkiLCJwcm9wZXJ0eVZhbHVlT2JqIiwicHJvcCIsInByb2Nlc3NBZ2dyZWdhdGlvbnMiLCJtZXRhZGF0YUFnZ3JlZ2F0aW9ucyIsImRlZmF1bHRBZ2dyZWdhdGlvbk5hbWUiLCJhZ2dyZWdhdGlvbkNoaWxkS2V5cyIsIndyaXRlT25seURlZmF1bHRBZ2dyZWdhdGlvbiIsImpzeFhtbCIsImtleSIsInhtbE5hbWVzcGFjZU1hcCIsIm92ZXJyaWRlTm9kZU5hbWUiLCJtZXRhZGF0YSIsImNvbnRyb2xOYW1lIiwiZ2V0QWxsUHJvcGVydGllcyIsImdldEFsbEV2ZW50cyIsImdldEFsbEFzc29jaWF0aW9ucyIsImdldE5hbWUiLCJnZXRBbGxBZ2dyZWdhdGlvbnMiLCJnZXREZWZhdWx0QWdncmVnYXRpb25OYW1lIiwicHJvcGVydGllcyIsImRlcGVuZGVudHMiLCJjdXN0b21EYXRhIiwiYWdncmVnYXRpb25zIiwiZGVmYXVsdEFnZ3JlZ2F0aW9uIiwibmFtZXNwYWNlIiwibmFtZSIsIm5hbWVzU3BsaXQiLCJzcGxpdCIsInNsaWNlIiwidGFnTmFtZSJdLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXMiOlsianN4LXhtbC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IENvbnRyb2xQcm9wZXJ0aWVzLCBOb25Db250cm9sUHJvcGVydGllcyB9IGZyb20gXCJzYXAvZmUvYmFzZS9qc3gtcnVudGltZS9qc3hcIjtcbmltcG9ydCB0eXBlIEJ1aWxkaW5nQmxvY2tUZW1wbGF0aW5nQmFzZSBmcm9tIFwic2FwL2ZlL2NvcmUvYnVpbGRpbmdCbG9ja3MvdGVtcGxhdGluZy9CdWlsZGluZ0Jsb2NrVGVtcGxhdGluZ0Jhc2VcIjtcbmltcG9ydCB7IGlzQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uIH0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvQmluZGluZ1Rvb2xraXRcIjtcbmltcG9ydCB0eXBlIENvbnRyb2wgZnJvbSBcInNhcC91aS9jb3JlL0NvbnRyb2xcIjtcbmltcG9ydCB0eXBlIFVJNUVsZW1lbnQgZnJvbSBcInNhcC91aS9jb3JlL0VsZW1lbnRcIjtcbmltcG9ydCB0eXBlIENvbnRleHQgZnJvbSBcInNhcC91aS9tb2RlbC9Db250ZXh0XCI7XG5cbmNvbnN0IHdyaXRlQ2hpbGRyZW4gPSBmdW5jdGlvbiAodmFsOiBzdHJpbmcgfCBzdHJpbmdbXSk6IHN0cmluZyB7XG5cdGlmIChBcnJheS5pc0FycmF5KHZhbCkpIHtcblx0XHRyZXR1cm4gdmFsLmpvaW4oXCJcIik7XG5cdH0gZWxzZSB7XG5cdFx0cmV0dXJuIHZhbDtcblx0fVxufTtcblxuLyoqXG4gKiBTb21lIGNoYXJhY3RlcnMgbmVlZHMgdG8gYmUgZXNjYXBlZCB3aGVuIHVzZWQgYXMgWE1MIGF0dHJpYnV0ZSB2YWx1ZSwgb3RoZXJ3aXNlIHRoaXMgcmVzdWx0IGluIGluY29ycmVjdCBYTUwuXG4gKlxuICogQHBhcmFtIHZhbHVlXG4gKiBAcmV0dXJucyBUaGUgZXNjYXBlZCB4bWwgYXR0cmlidXRlXG4gKi9cbmZ1bmN0aW9uIGVzY2FwZVhNTEF0dHJpYnV0ZVZhbHVlKHZhbHVlPzogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcblx0cmV0dXJuIHZhbHVlPy5yZXBsYWNlKC8mL2csIFwiJmFtcDtcIikucmVwbGFjZSgvPC9nLCBcIiZsdDtcIikucmVwbGFjZSgvXCIvZywgXCImcXVvdDtcIikucmVwbGFjZSgvJy9nLCBcIiZhcG9zO1wiKTtcbn1cblxuY29uc3QgYWRkQ2hpbGRBZ2dyZWdhdGlvbiA9IGZ1bmN0aW9uIChcblx0YWdncmVnYXRpb25DaGlsZHJlbjogUmVjb3JkPHN0cmluZywgKENvbnRyb2wgfCBzdHJpbmcpW10+LFxuXHRhZ2dyZWdhdGlvbk5hbWU6IHN0cmluZyxcblx0Y2hpbGQ6IHN0cmluZyB8IFJlY29yZDxzdHJpbmcsIHN0cmluZz5cbik6IHZvaWQge1xuXHRpZiAoY2hpbGQgPT09IHVuZGVmaW5lZCkge1xuXHRcdHJldHVybjtcblx0fVxuXHRpZiAoIWFnZ3JlZ2F0aW9uQ2hpbGRyZW5bYWdncmVnYXRpb25OYW1lXSkge1xuXHRcdGFnZ3JlZ2F0aW9uQ2hpbGRyZW5bYWdncmVnYXRpb25OYW1lXSA9IFtdO1xuXHR9XG5cdGlmICh0eXBlb2YgY2hpbGQgPT09IFwic3RyaW5nXCIpIHtcblx0XHRpZiAoY2hpbGQudHJpbSgpLmxlbmd0aCA+IDApIHtcblx0XHRcdGFnZ3JlZ2F0aW9uQ2hpbGRyZW5bYWdncmVnYXRpb25OYW1lXS5wdXNoKGNoaWxkKTtcblx0XHR9XG5cdH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShjaGlsZCkpIHtcblx0XHRjaGlsZC5mb3JFYWNoKChzdWJDaGlsZCkgPT4ge1xuXHRcdFx0YWRkQ2hpbGRBZ2dyZWdhdGlvbihhZ2dyZWdhdGlvbkNoaWxkcmVuLCBhZ2dyZWdhdGlvbk5hbWUsIHN1YkNoaWxkKTtcblx0XHR9KTtcblx0fSBlbHNlIHtcblx0XHRmb3IgKGNvbnN0IGNoaWxkS2V5IG9mIE9iamVjdC5rZXlzKGNoaWxkKSkge1xuXHRcdFx0YWRkQ2hpbGRBZ2dyZWdhdGlvbihhZ2dyZWdhdGlvbkNoaWxkcmVuLCBjaGlsZEtleSwgY2hpbGRbY2hpbGRLZXldKTtcblx0XHR9XG5cdH1cbn07XG5cbmNvbnN0IGlzQUNvbnRyb2wgPSBmdW5jdGlvbiAoY2hpbGRyZW4/OiB0eXBlb2YgQ29udHJvbCB8IEZ1bmN0aW9uKTogY2hpbGRyZW4gaXMgdHlwZW9mIENvbnRyb2wge1xuXHRyZXR1cm4gISEoY2hpbGRyZW4gYXMgdHlwZW9mIENvbnRyb2wpPy5nZXRNZXRhZGF0YTtcbn07XG5cbmNvbnN0IEZMX0RFTEVHQVRFID0gXCJmbDpkZWxlZ2F0ZVwiO1xuY29uc3QgQ09SRV9SRVFVSVJFID0gXCJjb3JlOnJlcXVpcmVcIjtcbmNvbnN0IExPR19TT1VSQ0VQQVRIID0gXCJsb2c6c291cmNlUGF0aFwiO1xuY29uc3QgQ1VTVE9NX0xPQURWQUxVRSA9IFwiY3VzdG9tRGF0YTpsb2FkVmFsdWVcIjtcbmNvbnN0IENVU1RPTV9VUkwgPSBcImN1c3RvbURhdGE6dXJsXCI7XG5cbmZ1bmN0aW9uIHByb2Nlc3NPYmplY3RQcm9wZXJ0eVZhbHVlKGNoaWxkcmVuT2JqZWN0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiwgbmFtZXNwYWNlQWxpYXM6IHN0cmluZywgcHJvcGVydHlOYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuXHQvLyBUaGlzIGlzIGNhbGxlZCB3aGVuIHRoZSBjaGlsZCBpc1xuXHRjb25zdCBhZ2dyZWdhdGlvblByb3BlcnRpZXM6IHN0cmluZ1tdID0gW107XG5cdGNvbnN0IGFnZ3JlZ2F0aW9uQ2hpbGRyZW46IHN0cmluZ1tdID0gW107XG5cdE9iamVjdC5rZXlzKGNoaWxkcmVuT2JqZWN0KS5mb3JFYWNoKChzdWJQcm9wTmFtZSkgPT4ge1xuXHRcdGNvbnN0IGNoaWxkVmFsdWUgPSBjaGlsZHJlbk9iamVjdFtzdWJQcm9wTmFtZV07XG5cdFx0aWYgKGNoaWxkVmFsdWUgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0aWYgKHR5cGVvZiBjaGlsZFZhbHVlID09PSBcIm9iamVjdFwiKSB7XG5cdFx0XHRcdC8vIGlmIHRoZSBwcm9wZXJ0eSBpcyBhIHZhbHVlIGl0IG5lZWRzIHRvIGJlIHNlcmlhbGl6ZWQgYXMgYSBjaGlsZHJlblxuXHRcdFx0XHQvLyA8bXlPYmplY3RQcm9wIHByb3AxPSd4eHgnLCBwcm9wMj0neHh0Jy8+XG5cdFx0XHRcdGFnZ3JlZ2F0aW9uQ2hpbGRyZW4ucHVzaChwcm9jZXNzT2JqZWN0UHJvcGVydHlWYWx1ZShjaGlsZFZhbHVlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+LCBuYW1lc3BhY2VBbGlhcywgc3ViUHJvcE5hbWUpKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdC8vIE90aGVyd2lzZSBpdCdzIHBhcnQgb2YgdGhlIG1haW4gb2JqZWN0IGp1c3QgYXMgYW5vdGhlciBwcm9wZXJ0eVxuXHRcdFx0XHRhZ2dyZWdhdGlvblByb3BlcnRpZXMucHVzaChgJHtzdWJQcm9wTmFtZX09JyR7ZXNjYXBlWE1MQXR0cmlidXRlVmFsdWUoY2hpbGRWYWx1ZS50b1N0cmluZygpKX0nYCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9KTtcblx0cmV0dXJuIGA8JHtuYW1lc3BhY2VBbGlhc306JHtwcm9wZXJ0eU5hbWV9ICR7YWdncmVnYXRpb25Qcm9wZXJ0aWVzLmpvaW4oXCIgXCIpfT4ke2FnZ3JlZ2F0aW9uQ2hpbGRyZW4uam9pbihcblx0XHRcIlxcblwiXG5cdCl9PC8ke25hbWVzcGFjZUFsaWFzfToke3Byb3BlcnR5TmFtZX0+YDtcbn1cblxuZnVuY3Rpb24gcHJvY2Vzc1Byb3BlcnRpZXM8VD4oXG5cdG1TZXR0aW5nczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG5cdG1ldGFkYXRhUHJvcGVydGllczogUmVjb3JkPFxuXHRcdHN0cmluZyxcblx0XHR7XG5cdFx0XHRuYW1lPzogc3RyaW5nO1xuXHRcdFx0dHlwZT86IHN0cmluZztcblx0XHR9XG5cdD4sXG5cdG5hbWVzcGFjZUFsaWFzOiBzdHJpbmcsXG5cdHByb3BlcnRpZXNTdHJpbmc6IHN0cmluZ1tdLFxuXHRhZ2dyZWdhdGlvblN0cmluZzogc3RyaW5nW11cbik6IHZvaWQge1xuXHRPYmplY3Qua2V5cyhtZXRhZGF0YVByb3BlcnRpZXMpLmZvckVhY2goKHByb3BlcnR5TmFtZSkgPT4ge1xuXHRcdGlmIChtU2V0dGluZ3MuaGFzT3duUHJvcGVydHkocHJvcGVydHlOYW1lKSAmJiBtU2V0dGluZ3NbcHJvcGVydHlOYW1lXSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRjb25zdCBwcm9wZXJ0eVZhbHVlID0gbVNldHRpbmdzW3Byb3BlcnR5TmFtZV07XG5cdFx0XHRpZiAocHJvcGVydHlOYW1lID09PSBDT1JFX1JFUVVJUkUpIHtcblx0XHRcdFx0cHJvcGVydGllc1N0cmluZy5wdXNoKGB4bWxuczpjb3JlPVwic2FwLnVpLmNvcmVcImApO1xuXHRcdFx0fVxuXHRcdFx0aWYgKHByb3BlcnR5TmFtZSA9PT0gTE9HX1NPVVJDRVBBVEgpIHtcblx0XHRcdFx0cHJvcGVydGllc1N0cmluZy5wdXNoKGB4bWxuczpsb2c9XCJodHRwOi8vc2NoZW1hcy5zYXAuY29tL3NhcHVpNS9leHRlbnNpb24vc2FwLnVpLmNvcmUuQ3VzdG9tRGF0YS8xXCJgKTtcblx0XHRcdH1cblx0XHRcdGlmIChwcm9wZXJ0eU5hbWUgPT09IENVU1RPTV9VUkwgfHwgcHJvcGVydHlOYW1lID09PSBDVVNUT01fTE9BRFZBTFVFKSB7XG5cdFx0XHRcdHByb3BlcnRpZXNTdHJpbmcucHVzaChgeG1sbnM6Y3VzdG9tRGF0YT1cImh0dHA6Ly9zY2hlbWFzLnNhcC5jb20vc2FwdWk1L2V4dGVuc2lvbi9zYXAudWkuY29yZS5DdXN0b21EYXRhLzFcImApO1xuXHRcdFx0fVxuXHRcdFx0aWYgKHByb3BlcnR5VmFsdWUgJiYgdHlwZW9mIHByb3BlcnR5VmFsdWUgPT09IFwib2JqZWN0XCIpIHtcblx0XHRcdFx0aWYgKG1ldGFkYXRhUHJvcGVydGllc1twcm9wZXJ0eU5hbWVdLnR5cGUgPT09IFwic2FwLnVpLm1vZGVsLkNvbnRleHRcIikge1xuXHRcdFx0XHRcdHByb3BlcnRpZXNTdHJpbmcucHVzaChgJHtwcm9wZXJ0eU5hbWV9PSckeyhwcm9wZXJ0eVZhbHVlIGFzIENvbnRleHQpLmdldFBhdGgoKX0nYCk7XG5cdFx0XHRcdH0gZWxzZSBpZiAoaXNCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb24ocHJvcGVydHlWYWx1ZSkgfHwgcHJvcGVydHlOYW1lID09PSBcImRlbGVnYXRlXCIpIHtcblx0XHRcdFx0XHRwcm9wZXJ0aWVzU3RyaW5nLnB1c2goYCR7cHJvcGVydHlOYW1lfT0nJHtKU09OLnN0cmluZ2lmeShtU2V0dGluZ3NbcHJvcGVydHlOYW1lXSl9J2ApO1xuXHRcdFx0XHR9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkocHJvcGVydHlWYWx1ZSkpIHtcblx0XHRcdFx0XHRpZiAocHJvcGVydHlWYWx1ZS5sZW5ndGggPT09IDEpIHtcblx0XHRcdFx0XHRcdHByb3BlcnRpZXNTdHJpbmcucHVzaChgJHtwcm9wZXJ0eU5hbWV9PScke0pTT04uc3RyaW5naWZ5KHByb3BlcnR5VmFsdWVbMF0pfSdgKTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0cHJvcGVydGllc1N0cmluZy5wdXNoKGAke3Byb3BlcnR5TmFtZX09JyR7SlNPTi5zdHJpbmdpZnkobVNldHRpbmdzW3Byb3BlcnR5TmFtZV0pfSdgKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Y29uc3QgY29tcGxleFByb3BlcnR5OiBzdHJpbmdbXSA9IFtdO1xuXHRcdFx0XHRcdGNvbnN0IHByb3BlcnR5VmFsdWVPYmogPSBwcm9wZXJ0eVZhbHVlIGFzIFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG5cdFx0XHRcdFx0T2JqZWN0LmtleXMocHJvcGVydHlWYWx1ZU9iaikuZm9yRWFjaCgoc3ViUHJvcE5hbWUpID0+IHtcblx0XHRcdFx0XHRcdGlmIChwcm9wZXJ0eVZhbHVlT2JqW3N1YlByb3BOYW1lXSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0XHRcdGNvbXBsZXhQcm9wZXJ0eS5wdXNoKGAke3N1YlByb3BOYW1lfT0nJHtlc2NhcGVYTUxBdHRyaWJ1dGVWYWx1ZShwcm9wZXJ0eVZhbHVlT2JqW3N1YlByb3BOYW1lXS50b1N0cmluZygpKX0nYCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0YWdncmVnYXRpb25TdHJpbmcucHVzaChgPCR7cHJvcGVydHlOYW1lfSAke2NvbXBsZXhQcm9wZXJ0eS5qb2luKFwiIFwiKX0vPmApO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRjb25zdCBwcm9wID0gbVNldHRpbmdzW3Byb3BlcnR5TmFtZV0gYXMgc3RyaW5nIHwgYm9vbGVhbiB8IG51bWJlcjtcblx0XHRcdFx0cHJvcGVydGllc1N0cmluZy5wdXNoKGAke3Byb3BlcnR5TmFtZX09JyR7ZXNjYXBlWE1MQXR0cmlidXRlVmFsdWUocHJvcC50b1N0cmluZygpKX0nYCk7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIGlmIChcblx0XHRcdG1TZXR0aW5ncy5jaGlsZHJlbj8uaGFzT3duUHJvcGVydHkocHJvcGVydHlOYW1lKSAmJlxuXHRcdFx0T2JqZWN0LmtleXMoKG1TZXR0aW5ncy5jaGlsZHJlbiBhcyBDb250cm9sUHJvcGVydGllczxUPik/Lltwcm9wZXJ0eU5hbWVdID8/IHt9KS5sZW5ndGggPiAwXG5cdFx0KSB7XG5cdFx0XHQvLyBPYmplY3QgLyBBcnJheSBwcm9wZXJ0aWVzIGFyZSBwYXJ0IG9mIHRoZSBgY2hpbGRyZW5gIGFnZ3JlZ2F0aW9uIGFuZCBhcyBzdWNoIHN0aWxsIG5lZWQgdG8gYmUgcHJvY2Vzc2VkIGFzIHByb3BlcnRpZXNcblx0XHRcdGNvbnN0IGNoaWxkcmVuT2JqZWN0ID0gKG1TZXR0aW5ncy5jaGlsZHJlbiBhcyBDb250cm9sUHJvcGVydGllczxUPik/Lltwcm9wZXJ0eU5hbWVdIGFzIHVua25vd24gYXMgUmVjb3JkPHN0cmluZywgb2JqZWN0Pjtcblx0XHRcdGFnZ3JlZ2F0aW9uU3RyaW5nLnB1c2gocHJvY2Vzc09iamVjdFByb3BlcnR5VmFsdWUoY2hpbGRyZW5PYmplY3QsIG5hbWVzcGFjZUFsaWFzLCBwcm9wZXJ0eU5hbWUpKTtcblx0XHR9XG5cdH0pO1xufVxuXG5mdW5jdGlvbiBwcm9jZXNzQWdncmVnYXRpb25zKFxuXHRtU2V0dGluZ3M6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuXHRtZXRhZGF0YUFnZ3JlZ2F0aW9uczogUmVjb3JkPHN0cmluZywgb2JqZWN0Pixcblx0bmFtZXNwYWNlQWxpYXM6IHN0cmluZyxcblx0ZGVmYXVsdEFnZ3JlZ2F0aW9uTmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkLFxuXHRwcm9wZXJ0aWVzU3RyaW5nOiBzdHJpbmdbXSxcblx0YWdncmVnYXRpb25TdHJpbmc6IHN0cmluZ1tdXG4pOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT4ge1xuXHRjb25zdCBhZ2dyZWdhdGlvbkNoaWxkcmVuOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT4gPSB7fTtcblx0YWRkQ2hpbGRBZ2dyZWdhdGlvbihhZ2dyZWdhdGlvbkNoaWxkcmVuLCBkZWZhdWx0QWdncmVnYXRpb25OYW1lID8/IFwiY3VzdG9tRGF0YVwiLCBtU2V0dGluZ3MuY2hpbGRyZW4gYXMgUmVjb3JkPHN0cmluZywgc3RyaW5nPik7XG5cdGNvbnN0IGFnZ3JlZ2F0aW9uQ2hpbGRLZXlzID0gT2JqZWN0LmtleXMoYWdncmVnYXRpb25DaGlsZHJlbik7XG5cdGxldCB3cml0ZU9ubHlEZWZhdWx0QWdncmVnYXRpb24gPSBmYWxzZTtcblx0aWYgKGFnZ3JlZ2F0aW9uQ2hpbGRLZXlzLmxlbmd0aCA9PT0gMSAmJiBhZ2dyZWdhdGlvbkNoaWxkS2V5c1swXSA9PT0gZGVmYXVsdEFnZ3JlZ2F0aW9uTmFtZSkge1xuXHRcdHdyaXRlT25seURlZmF1bHRBZ2dyZWdhdGlvbiA9IHRydWU7XG5cdH1cblx0T2JqZWN0LmtleXMobWV0YWRhdGFBZ2dyZWdhdGlvbnMpLmZvckVhY2goKGFnZ3JlZ2F0aW9uTmFtZSkgPT4ge1xuXHRcdGlmIChhZ2dyZWdhdGlvbkNoaWxkcmVuLmhhc093blByb3BlcnR5KGFnZ3JlZ2F0aW9uTmFtZSkgJiYgYWdncmVnYXRpb25DaGlsZHJlblthZ2dyZWdhdGlvbk5hbWVdLmxlbmd0aCA+IDApIHtcblx0XHRcdGlmIChhZ2dyZWdhdGlvbk5hbWUgPT09IGRlZmF1bHRBZ2dyZWdhdGlvbk5hbWUgJiYgd3JpdGVPbmx5RGVmYXVsdEFnZ3JlZ2F0aW9uKSB7XG5cdFx0XHRcdGFnZ3JlZ2F0aW9uU3RyaW5nLnB1c2goYCR7d3JpdGVDaGlsZHJlbihhZ2dyZWdhdGlvbkNoaWxkcmVuW2FnZ3JlZ2F0aW9uTmFtZV0pfWApO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0YWdncmVnYXRpb25TdHJpbmcucHVzaChcblx0XHRcdFx0XHRgPCR7bmFtZXNwYWNlQWxpYXN9OiR7YWdncmVnYXRpb25OYW1lfT5cblx0XHRcdFx0XHRcdCR7d3JpdGVDaGlsZHJlbihhZ2dyZWdhdGlvbkNoaWxkcmVuW2FnZ3JlZ2F0aW9uTmFtZV0pfVxuXHRcdFx0XHRcdDwvJHtuYW1lc3BhY2VBbGlhc306JHthZ2dyZWdhdGlvbk5hbWV9PmBcblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHR9XG5cdFx0aWYgKG1TZXR0aW5ncy5oYXNPd25Qcm9wZXJ0eShhZ2dyZWdhdGlvbk5hbWUpICYmIG1TZXR0aW5nc1thZ2dyZWdhdGlvbk5hbWVdICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdGlmICh0eXBlb2YgbVNldHRpbmdzW2FnZ3JlZ2F0aW9uTmFtZV0gPT09IFwib2JqZWN0XCIpIHtcblx0XHRcdFx0cHJvcGVydGllc1N0cmluZy5wdXNoKGAke2FnZ3JlZ2F0aW9uTmFtZX09JyR7SlNPTi5zdHJpbmdpZnkobVNldHRpbmdzW2FnZ3JlZ2F0aW9uTmFtZV0pfSdgKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdC8vIEluIHNvbWUgY2FzZSB0aGUgYWdncmVnYXRpb24gZXhwZWN0IGEgc3RyaW5nIHZhbHVlIChsaWtlIGZvciB0aGUgdG9vbHRpcCksIGluIHRoaXMgY2FzZSB3ZSBzZXQgaXQgZGlyZWN0bHkgYXMgYSBwcm9wZXJ0eVxuXHRcdFx0XHRwcm9wZXJ0aWVzU3RyaW5nLnB1c2goYCR7YWdncmVnYXRpb25OYW1lfT0nJHttU2V0dGluZ3NbYWdncmVnYXRpb25OYW1lXX0nYCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9KTtcblx0cmV0dXJuIGFnZ3JlZ2F0aW9uQ2hpbGRyZW47XG59XG5cbmNvbnN0IGpzeFhtbCA9IGZ1bmN0aW9uIDxUPihcblx0dHlwZTogdHlwZW9mIENvbnRyb2wgfCB0eXBlb2YgQnVpbGRpbmdCbG9ja1RlbXBsYXRpbmdCYXNlLFxuXHRtU2V0dGluZ3M6IE5vbkNvbnRyb2xQcm9wZXJ0aWVzPFQ+ICYgeyBrZXk/OiBzdHJpbmc7IGNoaWxkcmVuPzogVUk1RWxlbWVudCB8IENvbnRyb2xQcm9wZXJ0aWVzPFQ+IH0sXG5cdGtleTogc3RyaW5nIHwgdW5kZWZpbmVkLFxuXHR4bWxOYW1lc3BhY2VNYXA6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4sXG5cdG92ZXJyaWRlTm9kZU5hbWU/OiBzdHJpbmdcbik6IHN0cmluZyB7XG5cdGxldCBtZXRhZGF0YTtcblx0bGV0IG1ldGFkYXRhUHJvcGVydGllczogUmVjb3JkPHN0cmluZywgeyBuYW1lPzogc3RyaW5nOyB0eXBlPzogc3RyaW5nIH0+O1xuXHRsZXQgY29udHJvbE5hbWU7XG5cdGxldCBtZXRhZGF0YUFnZ3JlZ2F0aW9ucztcblx0bGV0IGRlZmF1bHRBZ2dyZWdhdGlvbk5hbWU6IHN0cmluZyB8IHVuZGVmaW5lZDtcblx0aWYgKGlzQUNvbnRyb2wodHlwZSkpIHtcblx0XHRtZXRhZGF0YSA9IHR5cGUuZ2V0TWV0YWRhdGEoKTtcblx0XHRtZXRhZGF0YVByb3BlcnRpZXMgPSBtZXRhZGF0YS5nZXRBbGxQcm9wZXJ0aWVzKCk7XG5cdFx0bWV0YWRhdGFQcm9wZXJ0aWVzID0geyAuLi5tZXRhZGF0YVByb3BlcnRpZXMsIC4uLm1ldGFkYXRhLmdldEFsbEV2ZW50cygpLCAuLi5tZXRhZGF0YS5nZXRBbGxBc3NvY2lhdGlvbnMoKSB9O1xuXHRcdGNvbnRyb2xOYW1lID0gbWV0YWRhdGEuZ2V0TmFtZSgpO1xuXHRcdG1ldGFkYXRhQWdncmVnYXRpb25zID0gbWV0YWRhdGEuZ2V0QWxsQWdncmVnYXRpb25zKCk7XG5cdFx0ZGVmYXVsdEFnZ3JlZ2F0aW9uTmFtZSA9IG1ldGFkYXRhLmdldERlZmF1bHRBZ2dyZWdhdGlvbk5hbWUoKTtcblx0fSBlbHNlIHtcblx0XHRtZXRhZGF0YSA9IHR5cGUubWV0YWRhdGE7XG5cdFx0bWV0YWRhdGFQcm9wZXJ0aWVzID0gbWV0YWRhdGEucHJvcGVydGllcztcblx0XHRtZXRhZGF0YUFnZ3JlZ2F0aW9ucyA9IHsgLi4ueyBkZXBlbmRlbnRzOiB7fSwgY3VzdG9tRGF0YToge30gfSwgLi4ubWV0YWRhdGEuYWdncmVnYXRpb25zIH07XG5cdFx0ZGVmYXVsdEFnZ3JlZ2F0aW9uTmFtZSA9IG1ldGFkYXRhLmRlZmF1bHRBZ2dyZWdhdGlvbjtcblx0XHRjb250cm9sTmFtZSA9IG1ldGFkYXRhLm5hbWVzcGFjZSArIFwiLlwiICsgbWV0YWRhdGEubmFtZTtcblx0fVxuXHRjb25zdCBuYW1lc1NwbGl0ID0gY29udHJvbE5hbWUuc3BsaXQoXCIuXCIpO1xuXHRpZiAoa2V5ICE9PSB1bmRlZmluZWQpIHtcblx0XHRtU2V0dGluZ3NbXCJrZXlcIl0gPSBrZXk7XG5cdH1cblxuXHRtZXRhZGF0YVByb3BlcnRpZXNbXCJjbGFzc1wiXSA9IHsgbmFtZTogXCJjbGFzc1wiIH07XG5cdG1ldGFkYXRhUHJvcGVydGllc1tcImlkXCJdID0geyBuYW1lOiBcImlkXCIgfTtcblx0bWV0YWRhdGFQcm9wZXJ0aWVzW0ZMX0RFTEVHQVRFXSA9IHsgbmFtZTogRkxfREVMRUdBVEUgfTtcblx0bWV0YWRhdGFQcm9wZXJ0aWVzW0NPUkVfUkVRVUlSRV0gPSB7IG5hbWU6IENPUkVfUkVRVUlSRSB9O1xuXHRtZXRhZGF0YVByb3BlcnRpZXNbTE9HX1NPVVJDRVBBVEhdID0geyBuYW1lOiBMT0dfU09VUkNFUEFUSCB9O1xuXHRtZXRhZGF0YVByb3BlcnRpZXNbQ1VTVE9NX0xPQURWQUxVRV0gPSB7IG5hbWU6IENVU1RPTV9MT0FEVkFMVUUgfTtcblx0bWV0YWRhdGFQcm9wZXJ0aWVzW0NVU1RPTV9VUkxdID0geyBuYW1lOiBDVVNUT01fVVJMIH07XG5cdG1ldGFkYXRhUHJvcGVydGllc1tcInhtbG5zOmZsXCJdID0geyBuYW1lOiBGTF9ERUxFR0FURSB9O1xuXHRtZXRhZGF0YVByb3BlcnRpZXNbXCJ4bWxuczpjb3JlXCJdID0geyBuYW1lOiBDT1JFX1JFUVVJUkUgfTtcblx0bWV0YWRhdGFQcm9wZXJ0aWVzW1wieG1sbnM6bG9nXCJdID0geyBuYW1lOiBMT0dfU09VUkNFUEFUSCB9O1xuXHRpZiAoY29udHJvbE5hbWUgPT09IFwic2FwLnVpLmNvcmUuRnJhZ21lbnRcIikge1xuXHRcdG1ldGFkYXRhUHJvcGVydGllc1tcImZyYWdtZW50TmFtZVwiXSA9IHsgbmFtZTogXCJmcmFnbWVudE5hbWVcIiB9O1xuXHR9XG5cdGNvbnN0IG5hbWVzcGFjZSA9IG5hbWVzU3BsaXQuc2xpY2UoMCwgLTEpO1xuXHRjb25zdCBuYW1lID0gbmFtZXNTcGxpdFtuYW1lc1NwbGl0Lmxlbmd0aCAtIDFdO1xuXHRsZXQgbmFtZXNwYWNlQWxpYXMgPSBuYW1lc3BhY2VbbmFtZXNwYWNlLmxlbmd0aCAtIDFdO1xuXHRpZiAoeG1sTmFtZXNwYWNlTWFwW25hbWVzcGFjZS5qb2luKFwiLlwiKV0pIHtcblx0XHRuYW1lc3BhY2VBbGlhcyA9IHhtbE5hbWVzcGFjZU1hcFtuYW1lc3BhY2Uuam9pbihcIi5cIildO1xuXHR9XG5cdGxldCB0YWdOYW1lID0gYCR7bmFtZXNwYWNlQWxpYXN9OiR7bmFtZX1gO1xuXHRjb25zdCBwcm9wZXJ0aWVzU3RyaW5nOiBzdHJpbmdbXSA9IFtdO1xuXHRjb25zdCBhZ2dyZWdhdGlvblN0cmluZzogc3RyaW5nW10gPSBbXTtcblx0cHJvY2Vzc1Byb3BlcnRpZXMobVNldHRpbmdzLCBtZXRhZGF0YVByb3BlcnRpZXMsIG5hbWVzcGFjZUFsaWFzLCBwcm9wZXJ0aWVzU3RyaW5nLCBhZ2dyZWdhdGlvblN0cmluZyk7XG5cdHByb2Nlc3NBZ2dyZWdhdGlvbnMobVNldHRpbmdzLCBtZXRhZGF0YUFnZ3JlZ2F0aW9ucywgbmFtZXNwYWNlQWxpYXMsIGRlZmF1bHRBZ2dyZWdhdGlvbk5hbWUsIHByb3BlcnRpZXNTdHJpbmcsIGFnZ3JlZ2F0aW9uU3RyaW5nKTtcblx0aWYgKG92ZXJyaWRlTm9kZU5hbWUpIHtcblx0XHR0YWdOYW1lID0gb3ZlcnJpZGVOb2RlTmFtZTtcblx0fVxuXHRyZXR1cm4gYDwke3RhZ05hbWV9IHhtbG5zOiR7bmFtZXNwYWNlQWxpYXN9PVwiJHtuYW1lc3BhY2Uuam9pbihcIi5cIil9XCIgJHtwcm9wZXJ0aWVzU3RyaW5nLmpvaW4oXCIgXCIpfT4ke2FnZ3JlZ2F0aW9uU3RyaW5nLmpvaW4oXG5cdFx0XCJcIlxuXHQpfTwvJHt0YWdOYW1lfT5gO1xufTtcbmV4cG9ydCBkZWZhdWx0IGpzeFhtbDtcbiJdLCJtYXBwaW5ncyI6IjtBQUFBO0FBQUE7QUFBQTs7Ozs7RUFPQSxNQUFNQSxhQUFhLEdBQUcsVUFBVUMsR0FBc0IsRUFBVTtJQUMvRCxJQUFJQyxLQUFLLENBQUNDLE9BQU8sQ0FBQ0YsR0FBRyxDQUFDLEVBQUU7TUFDdkIsT0FBT0EsR0FBRyxDQUFDRyxJQUFJ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
|
|
@@ -0,0 +1,246 @@
|
|
|
1
|
+
import type { ControlProperties, NonControlProperties } from "sap/fe/base/jsx-runtime/jsx";
|
|
2
|
+
import type BuildingBlockTemplatingBase from "sap/fe/core/buildingBlocks/templating/BuildingBlockTemplatingBase";
|
|
3
|
+
import { isBindingToolkitExpression } from "sap/fe/core/helpers/BindingToolkit";
|
|
4
|
+
import type Control from "sap/ui/core/Control";
|
|
5
|
+
import type UI5Element from "sap/ui/core/Element";
|
|
6
|
+
import type Context from "sap/ui/model/Context";
|
|
7
|
+
|
|
8
|
+
const writeChildren = function (val: string | string[]): string {
|
|
9
|
+
if (Array.isArray(val)) {
|
|
10
|
+
return val.join("");
|
|
11
|
+
} else {
|
|
12
|
+
return val;
|
|
13
|
+
}
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Some characters needs to be escaped when used as XML attribute value, otherwise this result in incorrect XML.
|
|
18
|
+
*
|
|
19
|
+
* @param value
|
|
20
|
+
* @returns The escaped xml attribute
|
|
21
|
+
*/
|
|
22
|
+
function escapeXMLAttributeValue(value?: string): string | undefined {
|
|
23
|
+
return value?.replace(/&/g, "&").replace(/</g, "<").replace(/"/g, """).replace(/'/g, "'");
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
const addChildAggregation = function (
|
|
27
|
+
aggregationChildren: Record<string, (Control | string)[]>,
|
|
28
|
+
aggregationName: string,
|
|
29
|
+
child: string | Record<string, string>
|
|
30
|
+
): void {
|
|
31
|
+
if (child === undefined) {
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
if (!aggregationChildren[aggregationName]) {
|
|
35
|
+
aggregationChildren[aggregationName] = [];
|
|
36
|
+
}
|
|
37
|
+
if (typeof child === "string") {
|
|
38
|
+
if (child.trim().length > 0) {
|
|
39
|
+
aggregationChildren[aggregationName].push(child);
|
|
40
|
+
}
|
|
41
|
+
} else if (Array.isArray(child)) {
|
|
42
|
+
child.forEach((subChild) => {
|
|
43
|
+
addChildAggregation(aggregationChildren, aggregationName, subChild);
|
|
44
|
+
});
|
|
45
|
+
} else {
|
|
46
|
+
for (const childKey of Object.keys(child)) {
|
|
47
|
+
addChildAggregation(aggregationChildren, childKey, child[childKey]);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
};
|
|
51
|
+
|
|
52
|
+
const isAControl = function (children?: typeof Control | Function): children is typeof Control {
|
|
53
|
+
return !!(children as typeof Control)?.getMetadata;
|
|
54
|
+
};
|
|
55
|
+
|
|
56
|
+
const FL_DELEGATE = "fl:delegate";
|
|
57
|
+
const CORE_REQUIRE = "core:require";
|
|
58
|
+
const LOG_SOURCEPATH = "log:sourcePath";
|
|
59
|
+
const CUSTOM_LOADVALUE = "customData:loadValue";
|
|
60
|
+
const CUSTOM_URL = "customData:url";
|
|
61
|
+
|
|
62
|
+
function processObjectPropertyValue(childrenObject: Record<string, unknown>, namespaceAlias: string, propertyName: string): string {
|
|
63
|
+
// This is called when the child is
|
|
64
|
+
const aggregationProperties: string[] = [];
|
|
65
|
+
const aggregationChildren: string[] = [];
|
|
66
|
+
Object.keys(childrenObject).forEach((subPropName) => {
|
|
67
|
+
const childValue = childrenObject[subPropName];
|
|
68
|
+
if (childValue !== undefined) {
|
|
69
|
+
if (typeof childValue === "object") {
|
|
70
|
+
// if the property is a value it needs to be serialized as a children
|
|
71
|
+
// <myObjectProp prop1='xxx', prop2='xxt'/>
|
|
72
|
+
aggregationChildren.push(processObjectPropertyValue(childValue as Record<string, unknown>, namespaceAlias, subPropName));
|
|
73
|
+
} else {
|
|
74
|
+
// Otherwise it's part of the main object just as another property
|
|
75
|
+
aggregationProperties.push(`${subPropName}='${escapeXMLAttributeValue(childValue.toString())}'`);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
});
|
|
79
|
+
return `<${namespaceAlias}:${propertyName} ${aggregationProperties.join(" ")}>${aggregationChildren.join(
|
|
80
|
+
"\n"
|
|
81
|
+
)}</${namespaceAlias}:${propertyName}>`;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
function processProperties<T>(
|
|
85
|
+
mSettings: Record<string, unknown>,
|
|
86
|
+
metadataProperties: Record<
|
|
87
|
+
string,
|
|
88
|
+
{
|
|
89
|
+
name?: string;
|
|
90
|
+
type?: string;
|
|
91
|
+
}
|
|
92
|
+
>,
|
|
93
|
+
namespaceAlias: string,
|
|
94
|
+
propertiesString: string[],
|
|
95
|
+
aggregationString: string[]
|
|
96
|
+
): void {
|
|
97
|
+
Object.keys(metadataProperties).forEach((propertyName) => {
|
|
98
|
+
if (mSettings.hasOwnProperty(propertyName) && mSettings[propertyName] !== undefined) {
|
|
99
|
+
const propertyValue = mSettings[propertyName];
|
|
100
|
+
if (propertyName === CORE_REQUIRE) {
|
|
101
|
+
propertiesString.push(`xmlns:core="sap.ui.core"`);
|
|
102
|
+
}
|
|
103
|
+
if (propertyName === LOG_SOURCEPATH) {
|
|
104
|
+
propertiesString.push(`xmlns:log="http://schemas.sap.com/sapui5/extension/sap.ui.core.CustomData/1"`);
|
|
105
|
+
}
|
|
106
|
+
if (propertyName === CUSTOM_URL || propertyName === CUSTOM_LOADVALUE) {
|
|
107
|
+
propertiesString.push(`xmlns:customData="http://schemas.sap.com/sapui5/extension/sap.ui.core.CustomData/1"`);
|
|
108
|
+
}
|
|
109
|
+
if (propertyValue && typeof propertyValue === "object") {
|
|
110
|
+
if (metadataProperties[propertyName].type === "sap.ui.model.Context") {
|
|
111
|
+
propertiesString.push(`${propertyName}='${(propertyValue as Context).getPath()}'`);
|
|
112
|
+
} else if (isBindingToolkitExpression(propertyValue) || propertyName === "delegate") {
|
|
113
|
+
propertiesString.push(`${propertyName}='${JSON.stringify(mSettings[propertyName])}'`);
|
|
114
|
+
} else if (Array.isArray(propertyValue)) {
|
|
115
|
+
if (propertyValue.length === 1) {
|
|
116
|
+
propertiesString.push(`${propertyName}='${JSON.stringify(propertyValue[0])}'`);
|
|
117
|
+
} else {
|
|
118
|
+
propertiesString.push(`${propertyName}='${JSON.stringify(mSettings[propertyName])}'`);
|
|
119
|
+
}
|
|
120
|
+
} else {
|
|
121
|
+
const complexProperty: string[] = [];
|
|
122
|
+
const propertyValueObj = propertyValue as Record<string, string>;
|
|
123
|
+
Object.keys(propertyValueObj).forEach((subPropName) => {
|
|
124
|
+
if (propertyValueObj[subPropName] !== undefined) {
|
|
125
|
+
complexProperty.push(`${subPropName}='${escapeXMLAttributeValue(propertyValueObj[subPropName].toString())}'`);
|
|
126
|
+
}
|
|
127
|
+
});
|
|
128
|
+
aggregationString.push(`<${propertyName} ${complexProperty.join(" ")}/>`);
|
|
129
|
+
}
|
|
130
|
+
} else {
|
|
131
|
+
const prop = mSettings[propertyName] as string | boolean | number;
|
|
132
|
+
propertiesString.push(`${propertyName}='${escapeXMLAttributeValue(prop.toString())}'`);
|
|
133
|
+
}
|
|
134
|
+
} else if (
|
|
135
|
+
mSettings.children?.hasOwnProperty(propertyName) &&
|
|
136
|
+
Object.keys((mSettings.children as ControlProperties<T>)?.[propertyName] ?? {}).length > 0
|
|
137
|
+
) {
|
|
138
|
+
// Object / Array properties are part of the `children` aggregation and as such still need to be processed as properties
|
|
139
|
+
const childrenObject = (mSettings.children as ControlProperties<T>)?.[propertyName] as unknown as Record<string, object>;
|
|
140
|
+
aggregationString.push(processObjectPropertyValue(childrenObject, namespaceAlias, propertyName));
|
|
141
|
+
}
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
function processAggregations(
|
|
146
|
+
mSettings: Record<string, unknown>,
|
|
147
|
+
metadataAggregations: Record<string, object>,
|
|
148
|
+
namespaceAlias: string,
|
|
149
|
+
defaultAggregationName: string | undefined,
|
|
150
|
+
propertiesString: string[],
|
|
151
|
+
aggregationString: string[]
|
|
152
|
+
): Record<string, string[]> {
|
|
153
|
+
const aggregationChildren: Record<string, string[]> = {};
|
|
154
|
+
addChildAggregation(aggregationChildren, defaultAggregationName ?? "customData", mSettings.children as Record<string, string>);
|
|
155
|
+
const aggregationChildKeys = Object.keys(aggregationChildren);
|
|
156
|
+
let writeOnlyDefaultAggregation = false;
|
|
157
|
+
if (aggregationChildKeys.length === 1 && aggregationChildKeys[0] === defaultAggregationName) {
|
|
158
|
+
writeOnlyDefaultAggregation = true;
|
|
159
|
+
}
|
|
160
|
+
Object.keys(metadataAggregations).forEach((aggregationName) => {
|
|
161
|
+
if (aggregationChildren.hasOwnProperty(aggregationName) && aggregationChildren[aggregationName].length > 0) {
|
|
162
|
+
if (aggregationName === defaultAggregationName && writeOnlyDefaultAggregation) {
|
|
163
|
+
aggregationString.push(`${writeChildren(aggregationChildren[aggregationName])}`);
|
|
164
|
+
} else {
|
|
165
|
+
aggregationString.push(
|
|
166
|
+
`<${namespaceAlias}:${aggregationName}>
|
|
167
|
+
${writeChildren(aggregationChildren[aggregationName])}
|
|
168
|
+
</${namespaceAlias}:${aggregationName}>`
|
|
169
|
+
);
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
if (mSettings.hasOwnProperty(aggregationName) && mSettings[aggregationName] !== undefined) {
|
|
173
|
+
if (typeof mSettings[aggregationName] === "object") {
|
|
174
|
+
propertiesString.push(`${aggregationName}='${JSON.stringify(mSettings[aggregationName])}'`);
|
|
175
|
+
} else {
|
|
176
|
+
// In some case the aggregation expect a string value (like for the tooltip), in this case we set it directly as a property
|
|
177
|
+
propertiesString.push(`${aggregationName}='${mSettings[aggregationName]}'`);
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
});
|
|
181
|
+
return aggregationChildren;
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
const jsxXml = function <T>(
|
|
185
|
+
type: typeof Control | typeof BuildingBlockTemplatingBase,
|
|
186
|
+
mSettings: NonControlProperties<T> & { key?: string; children?: UI5Element | ControlProperties<T> },
|
|
187
|
+
key: string | undefined,
|
|
188
|
+
xmlNamespaceMap: Record<string, string>,
|
|
189
|
+
overrideNodeName?: string
|
|
190
|
+
): string {
|
|
191
|
+
let metadata;
|
|
192
|
+
let metadataProperties: Record<string, { name?: string; type?: string }>;
|
|
193
|
+
let controlName;
|
|
194
|
+
let metadataAggregations;
|
|
195
|
+
let defaultAggregationName: string | undefined;
|
|
196
|
+
if (isAControl(type)) {
|
|
197
|
+
metadata = type.getMetadata();
|
|
198
|
+
metadataProperties = metadata.getAllProperties();
|
|
199
|
+
metadataProperties = { ...metadataProperties, ...metadata.getAllEvents(), ...metadata.getAllAssociations() };
|
|
200
|
+
controlName = metadata.getName();
|
|
201
|
+
metadataAggregations = metadata.getAllAggregations();
|
|
202
|
+
defaultAggregationName = metadata.getDefaultAggregationName();
|
|
203
|
+
} else {
|
|
204
|
+
metadata = type.metadata;
|
|
205
|
+
metadataProperties = metadata.properties;
|
|
206
|
+
metadataAggregations = { ...{ dependents: {}, customData: {} }, ...metadata.aggregations };
|
|
207
|
+
defaultAggregationName = metadata.defaultAggregation;
|
|
208
|
+
controlName = metadata.namespace + "." + metadata.name;
|
|
209
|
+
}
|
|
210
|
+
const namesSplit = controlName.split(".");
|
|
211
|
+
if (key !== undefined) {
|
|
212
|
+
mSettings["key"] = key;
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
metadataProperties["class"] = { name: "class" };
|
|
216
|
+
metadataProperties["id"] = { name: "id" };
|
|
217
|
+
metadataProperties[FL_DELEGATE] = { name: FL_DELEGATE };
|
|
218
|
+
metadataProperties[CORE_REQUIRE] = { name: CORE_REQUIRE };
|
|
219
|
+
metadataProperties[LOG_SOURCEPATH] = { name: LOG_SOURCEPATH };
|
|
220
|
+
metadataProperties[CUSTOM_LOADVALUE] = { name: CUSTOM_LOADVALUE };
|
|
221
|
+
metadataProperties[CUSTOM_URL] = { name: CUSTOM_URL };
|
|
222
|
+
metadataProperties["xmlns:fl"] = { name: FL_DELEGATE };
|
|
223
|
+
metadataProperties["xmlns:core"] = { name: CORE_REQUIRE };
|
|
224
|
+
metadataProperties["xmlns:log"] = { name: LOG_SOURCEPATH };
|
|
225
|
+
if (controlName === "sap.ui.core.Fragment") {
|
|
226
|
+
metadataProperties["fragmentName"] = { name: "fragmentName" };
|
|
227
|
+
}
|
|
228
|
+
const namespace = namesSplit.slice(0, -1);
|
|
229
|
+
const name = namesSplit[namesSplit.length - 1];
|
|
230
|
+
let namespaceAlias = namespace[namespace.length - 1];
|
|
231
|
+
if (xmlNamespaceMap[namespace.join(".")]) {
|
|
232
|
+
namespaceAlias = xmlNamespaceMap[namespace.join(".")];
|
|
233
|
+
}
|
|
234
|
+
let tagName = `${namespaceAlias}:${name}`;
|
|
235
|
+
const propertiesString: string[] = [];
|
|
236
|
+
const aggregationString: string[] = [];
|
|
237
|
+
processProperties(mSettings, metadataProperties, namespaceAlias, propertiesString, aggregationString);
|
|
238
|
+
processAggregations(mSettings, metadataAggregations, namespaceAlias, defaultAggregationName, propertiesString, aggregationString);
|
|
239
|
+
if (overrideNodeName) {
|
|
240
|
+
tagName = overrideNodeName;
|
|
241
|
+
}
|
|
242
|
+
return `<${tagName} xmlns:${namespaceAlias}="${namespace.join(".")}" ${propertiesString.join(" ")}>${aggregationString.join(
|
|
243
|
+
""
|
|
244
|
+
)}</${tagName}>`;
|
|
245
|
+
};
|
|
246
|
+
export default jsxXml;
|