@sapui5/sap.fe.base 1.130.6 → 1.132.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/package.json +1 -1
- package/src/sap/fe/base/.library +1 -1
- package/src/sap/fe/base/BindingToolkit.js +45 -48
- package/src/sap/fe/base/BindingToolkit.ts +19 -14
- package/src/sap/fe/base/BuildingBlockBase.js +184 -0
- package/src/sap/fe/base/BuildingBlockBase.ts +166 -0
- package/src/sap/fe/base/ClassSupport.js +145 -85
- package/src/sap/fe/base/ClassSupport.ts +157 -62
- package/src/sap/fe/base/EventDelegateHook.js +6 -7
- package/src/sap/fe/base/HookSupport.js +4 -5
- package/src/sap/fe/base/jsx-runtime/ViewLoader.js +9 -13
- package/src/sap/fe/base/jsx-runtime/jsx-control.js +9 -10
- package/src/sap/fe/base/jsx-runtime/jsx-control.ts +3 -0
- package/src/sap/fe/base/jsx-runtime/jsx-xml.js +16 -21
- package/src/sap/fe/base/jsx-runtime/jsx-xml.ts +7 -9
- package/src/sap/fe/base/library.js +3 -2
- package/src/sap/fe/base/library.ts +1 -0
|
@@ -28,7 +28,8 @@ import type {
|
|
|
28
28
|
PathAnnotationExpression,
|
|
29
29
|
PathConditionExpression,
|
|
30
30
|
Property,
|
|
31
|
-
PropertyAnnotationValue
|
|
31
|
+
PropertyAnnotationValue,
|
|
32
|
+
ConstantExpression as VocabConstantExpression
|
|
32
33
|
} from "@sap-ux/vocabularies-types";
|
|
33
34
|
import { CommonAnnotationTerms } from "@sap-ux/vocabularies-types/vocabularies/Common";
|
|
34
35
|
import { resolveEnumValue } from "sap/fe/base/AnnotationEnum";
|
|
@@ -714,22 +715,17 @@ export function ref(reference: string | null): ReferenceExpression {
|
|
|
714
715
|
* Wrap a state object into a path in model expression.
|
|
715
716
|
* @template T
|
|
716
717
|
* @param stateObjectProp The object to evaluate, if it's a constant it will be wrapped in a constant expression, if it's a state property it will be bound
|
|
718
|
+
* @param key The key of the state object to bind
|
|
717
719
|
* @returns The correct binding toolkit expression
|
|
718
720
|
*/
|
|
719
|
-
export function bindState<T extends PrimitiveType>(
|
|
720
|
-
stateObjectProp
|
|
721
|
-
|
|
722
|
-
|
|
723
|
-
export function bindState<T extends PrimitiveType | readonly PrimitiveType[]>(
|
|
724
|
-
stateObjectProp?: T | BindingInfoHolder<T>
|
|
725
|
-
): PathInModelExpression<T> | ConstantExpression<T> {
|
|
721
|
+
export function bindState<T extends object, K extends PrimitiveType>(
|
|
722
|
+
stateObjectProp: T,
|
|
723
|
+
key: keyof T
|
|
724
|
+
): PathInModelExpression<K> | ConstantExpression<K> {
|
|
726
725
|
if (typeof stateObjectProp === "object" && (stateObjectProp as BindingInfoHolder<T>).__bindingInfo) {
|
|
727
|
-
return pathInModel(
|
|
728
|
-
(stateObjectProp as BindingInfoHolder<T>).__bindingInfo.path,
|
|
729
|
-
(stateObjectProp as BindingInfoHolder<T>).__bindingInfo.model
|
|
730
|
-
);
|
|
726
|
+
return pathInModel("/" + key.toString(), (stateObjectProp as BindingInfoHolder<T>).__bindingInfo.model);
|
|
731
727
|
} else {
|
|
732
|
-
return constant(stateObjectProp as
|
|
728
|
+
return constant(stateObjectProp) as unknown as ConstantExpression<K>;
|
|
733
729
|
}
|
|
734
730
|
}
|
|
735
731
|
/**
|
|
@@ -852,7 +848,8 @@ type ComplexAnnotationExpression<P> =
|
|
|
852
848
|
| GtAnnotationExpression<P>
|
|
853
849
|
| GeAnnotationExpression<P>
|
|
854
850
|
| LeAnnotationExpression<P>
|
|
855
|
-
| LtAnnotationExpression<P
|
|
851
|
+
| LtAnnotationExpression<P>
|
|
852
|
+
| VocabConstantExpression<P>;
|
|
856
853
|
|
|
857
854
|
function isPrimitiveObject(objectType: object): boolean {
|
|
858
855
|
switch (objectType.constructor.name) {
|
|
@@ -956,6 +953,9 @@ export function getExpressionFromAnnotation<T extends PrimitiveType>(
|
|
|
956
953
|
visitedNavigationPaths,
|
|
957
954
|
pathVisitor
|
|
958
955
|
) as BindingToolkitExpression<PrimitiveTypeCast<T>>;
|
|
956
|
+
case "Constant":
|
|
957
|
+
// Not a real case but the type system needs it
|
|
958
|
+
return constant(annotationValue.value as PrimitiveTypeCast<T>);
|
|
959
959
|
}
|
|
960
960
|
return unresolvableExpression;
|
|
961
961
|
}
|
|
@@ -1772,11 +1772,15 @@ export function addTypeInformation<T, U extends Fn<T>>(
|
|
|
1772
1772
|
const uomPath = pathInModel("/##@@requestUnitsOfMeasure");
|
|
1773
1773
|
uomPath.targetType = "any";
|
|
1774
1774
|
uomPath.mode = "OneTime";
|
|
1775
|
+
oFormatOptions ??= {};
|
|
1776
|
+
oFormatOptions.preserveDecimals = false; // default value since we don't have a CLDR
|
|
1775
1777
|
parameterExpressions.push(uomPath);
|
|
1776
1778
|
} else if (type === "sap.ui.model.odata.type.Currency") {
|
|
1777
1779
|
const currencyPath = pathInModel("/##@@requestCurrencyCodes");
|
|
1778
1780
|
currencyPath.targetType = "any";
|
|
1779
1781
|
currencyPath.mode = "OneTime";
|
|
1782
|
+
oFormatOptions ??= {};
|
|
1783
|
+
oFormatOptions.preserveDecimals = false; // default value since we don't have a CLDR
|
|
1780
1784
|
parameterExpressions.push(currencyPath);
|
|
1781
1785
|
}
|
|
1782
1786
|
|
|
@@ -1799,6 +1803,7 @@ type ComplexTypeFormatOptions = {
|
|
|
1799
1803
|
showTime?: boolean;
|
|
1800
1804
|
showDate?: boolean;
|
|
1801
1805
|
showTimezone?: boolean;
|
|
1806
|
+
preserveDecimals?: boolean;
|
|
1802
1807
|
};
|
|
1803
1808
|
|
|
1804
1809
|
export type ComplexTypeConstraintOptions = {
|
|
@@ -0,0 +1,184 @@
|
|
|
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/base/BindingToolkit", "sap/fe/base/ClassSupport", "sap/ui/core/Control", "sap/ui/core/InvisibleRenderer"], function (BindingToolkit, ClassSupport, Control, InvisibleRenderer) {
|
|
6
|
+
"use strict";
|
|
7
|
+
|
|
8
|
+
var _dec, _dec2, _dec3, _dec4, _class, _class2, _descriptor, _descriptor2, _descriptor3;
|
|
9
|
+
var defineUI5Class = ClassSupport.defineUI5Class;
|
|
10
|
+
var defineState = ClassSupport.defineState;
|
|
11
|
+
var association = ClassSupport.association;
|
|
12
|
+
var aggregation = ClassSupport.aggregation;
|
|
13
|
+
function _initializerDefineProperty(e, i, r, l) { r && Object.defineProperty(e, i, { enumerable: r.enumerable, configurable: r.configurable, writable: r.writable, value: r.initializer ? r.initializer.call(l) : void 0 }); }
|
|
14
|
+
function _inheritsLoose(t, o) { t.prototype = Object.create(o.prototype), t.prototype.constructor = t, _setPrototypeOf(t, o); }
|
|
15
|
+
function _setPrototypeOf(t, e) { return _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function (t, e) { return t.__proto__ = e, t; }, _setPrototypeOf(t, e); }
|
|
16
|
+
function _applyDecoratedDescriptor(i, e, r, n, l) { var a = {}; return Object.keys(n).forEach(function (i) { a[i] = n[i]; }), a.enumerable = !!a.enumerable, a.configurable = !!a.configurable, ("value" in a || a.initializer) && (a.writable = !0), a = r.slice().reverse().reduce(function (r, n) { return n(i, e, r) || r; }, a), l && void 0 !== a.initializer && (a.value = a.initializer ? a.initializer.call(l) : void 0, a.initializer = void 0), void 0 === a.initializer ? (Object.defineProperty(i, e, a), null) : a; }
|
|
17
|
+
function _initializerWarningHelper(r, e) { throw Error("Decorating class property failed. Please ensure that transform-class-properties is enabled and runs after the decorators transform."); }
|
|
18
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
19
|
+
/**
|
|
20
|
+
* Base class for building blocks.
|
|
21
|
+
* This contains the low level functionality of having a content aggregation and handling the rendering of the content without an actual DOM element.
|
|
22
|
+
* The building block also defines a state object that can be used to store the state of the building block.
|
|
23
|
+
* Accessibility and classes information are forwarded to the content control.
|
|
24
|
+
* @experimental
|
|
25
|
+
* @public
|
|
26
|
+
*/
|
|
27
|
+
let BuildingBlockBase = (_dec = defineUI5Class("sap.fe.base.BuildingBlockBase"), _dec2 = aggregation({
|
|
28
|
+
type: "sap.ui.core.Element",
|
|
29
|
+
multiple: false,
|
|
30
|
+
isDefault: true
|
|
31
|
+
}), _dec3 = association({
|
|
32
|
+
type: "sap.ui.core.Control",
|
|
33
|
+
multiple: true,
|
|
34
|
+
singularName: "ariaLabelledBy"
|
|
35
|
+
}), _dec4 = defineState(), _dec(_class = (_class2 = /*#__PURE__*/function (_Control) {
|
|
36
|
+
function BuildingBlockBase(settings, others) {
|
|
37
|
+
var _this;
|
|
38
|
+
if (typeof settings === "string") {
|
|
39
|
+
others ??= {};
|
|
40
|
+
others.id = settings;
|
|
41
|
+
}
|
|
42
|
+
_this = _Control.call(this, settings, others) || this;
|
|
43
|
+
_initializerDefineProperty(_this, "content", _descriptor, _this);
|
|
44
|
+
/**
|
|
45
|
+
* Association to controls / IDs that label this control (see WAI-ARIA attribute aria-labelledby).
|
|
46
|
+
*/
|
|
47
|
+
_initializerDefineProperty(_this, "ariaLabelledBy", _descriptor2, _this);
|
|
48
|
+
_initializerDefineProperty(_this, "state", _descriptor3, _this);
|
|
49
|
+
_this._oldDomRef = null;
|
|
50
|
+
return _this;
|
|
51
|
+
}
|
|
52
|
+
_inheritsLoose(BuildingBlockBase, _Control);
|
|
53
|
+
BuildingBlockBase.render = function render(oRm, oControl) {
|
|
54
|
+
if (!oControl.content || oControl.getVisible() === false) {
|
|
55
|
+
InvisibleRenderer.render(oRm, oControl);
|
|
56
|
+
} else {
|
|
57
|
+
oRm.renderControl(oControl.content);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* Override the bindProperty to deal with the case where the property is a binding info.
|
|
63
|
+
* @param name The name of te property
|
|
64
|
+
* @param bindingInfo The binding info
|
|
65
|
+
* @returns The instance of the building block for chaining
|
|
66
|
+
*/;
|
|
67
|
+
var _proto = BuildingBlockBase.prototype;
|
|
68
|
+
_proto.bindProperty = function bindProperty(name, bindingInfo) {
|
|
69
|
+
const propertyMetadata = this.getMetadata().getProperty(name);
|
|
70
|
+
if (propertyMetadata?.bindable === false && propertyMetadata.group === "Data") {
|
|
71
|
+
this[name] = bindingInfo;
|
|
72
|
+
} else {
|
|
73
|
+
_Control.prototype.bindProperty.call(this, name, bindingInfo);
|
|
74
|
+
}
|
|
75
|
+
return this;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
//set the old dom ref
|
|
79
|
+
;
|
|
80
|
+
_proto.onAfterRendering = function onAfterRendering(event) {
|
|
81
|
+
const domRef = this.getDomRef();
|
|
82
|
+
if (domRef) {
|
|
83
|
+
this._oldDomRef = new WeakRef(domRef);
|
|
84
|
+
} else {
|
|
85
|
+
this._oldDomRef = null;
|
|
86
|
+
}
|
|
87
|
+
_Control.prototype.onAfterRendering.call(this, event);
|
|
88
|
+
};
|
|
89
|
+
_proto.getDomRef = function getDomRef() {
|
|
90
|
+
const oContent = this.content;
|
|
91
|
+
let domRef = oContent?.getDomRef() ?? _Control.prototype.getDomRef.call(this);
|
|
92
|
+
if (!domRef) {
|
|
93
|
+
domRef = this._oldDomRef?.deref() ?? null;
|
|
94
|
+
if (domRef) {
|
|
95
|
+
return document.getElementById(domRef.id);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
return domRef;
|
|
99
|
+
};
|
|
100
|
+
_proto.getFocusDomRef = function getFocusDomRef() {
|
|
101
|
+
const oContent = this.content;
|
|
102
|
+
return oContent ? oContent.getFocusDomRef() : _Control.prototype.getFocusDomRef.call(this);
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
/**
|
|
106
|
+
* This function asks up the control tree to enhance the accessibility state of the control.
|
|
107
|
+
* @param _oElement The element to enhance
|
|
108
|
+
* @param mAriaProps The current aria properties
|
|
109
|
+
* @returns The enhanced aria properties
|
|
110
|
+
*/;
|
|
111
|
+
_proto.enhanceAccessibilityState = function enhanceAccessibilityState(_oElement, mAriaProps) {
|
|
112
|
+
const oParent = this.getParent();
|
|
113
|
+
if (oParent && oParent.enhanceAccessibilityState) {
|
|
114
|
+
// forward enhanceAccessibilityState call to the parent
|
|
115
|
+
oParent.enhanceAccessibilityState(_oElement, mAriaProps);
|
|
116
|
+
}
|
|
117
|
+
return mAriaProps;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
/**
|
|
121
|
+
* This function (if available on the concrete control) provides the current accessibility state of the control.
|
|
122
|
+
* @returns The accessibility information for the control.
|
|
123
|
+
*/;
|
|
124
|
+
_proto.getAccessibilityInfo = function getAccessibilityInfo() {
|
|
125
|
+
let accessibilityInfo = {};
|
|
126
|
+
if (this.content?.isA("sap.ui.core.Control")) {
|
|
127
|
+
accessibilityInfo = this.content.getAccessibilityInfo();
|
|
128
|
+
}
|
|
129
|
+
return accessibilityInfo;
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
/**
|
|
133
|
+
* Returns the DOMNode ID to be used for the "labelFor" attribute.
|
|
134
|
+
*
|
|
135
|
+
* We forward the call of this method to the content control.
|
|
136
|
+
* @returns ID to be used for the <code>labelFor</code>
|
|
137
|
+
*/;
|
|
138
|
+
_proto.getIdForLabel = function getIdForLabel() {
|
|
139
|
+
if (this.content?.isA("sap.ui.core.Control")) {
|
|
140
|
+
return this.content.getIdForLabel();
|
|
141
|
+
}
|
|
142
|
+
return "";
|
|
143
|
+
};
|
|
144
|
+
_proto.addStyleClass = function addStyleClass(styleClass) {
|
|
145
|
+
this.content?.addStyleClass(styleClass);
|
|
146
|
+
_Control.prototype.addStyleClass.call(this, styleClass);
|
|
147
|
+
return this;
|
|
148
|
+
};
|
|
149
|
+
_proto.removeStyleClass = function removeStyleClass(styleClass) {
|
|
150
|
+
this.content?.removeStyleClass(styleClass);
|
|
151
|
+
_Control.prototype.removeStyleClass.call(this, styleClass);
|
|
152
|
+
return this;
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
/**
|
|
156
|
+
* Shorthand for the BindingToolkit.bindState function with the current state object.
|
|
157
|
+
* @param path A property in the state object
|
|
158
|
+
* @returns The binding toolkit expression for the state
|
|
159
|
+
*/;
|
|
160
|
+
_proto.bindState = function bindState(path) {
|
|
161
|
+
return BindingToolkit.bindState(this.state, path);
|
|
162
|
+
};
|
|
163
|
+
return BuildingBlockBase;
|
|
164
|
+
}(Control), _descriptor = _applyDecoratedDescriptor(_class2.prototype, "content", [_dec2], {
|
|
165
|
+
configurable: true,
|
|
166
|
+
enumerable: true,
|
|
167
|
+
writable: true,
|
|
168
|
+
initializer: null
|
|
169
|
+
}), _descriptor2 = _applyDecoratedDescriptor(_class2.prototype, "ariaLabelledBy", [_dec3], {
|
|
170
|
+
configurable: true,
|
|
171
|
+
enumerable: true,
|
|
172
|
+
writable: true,
|
|
173
|
+
initializer: null
|
|
174
|
+
}), _descriptor3 = _applyDecoratedDescriptor(_class2.prototype, "state", [_dec4], {
|
|
175
|
+
configurable: true,
|
|
176
|
+
enumerable: true,
|
|
177
|
+
writable: true,
|
|
178
|
+
initializer: function () {
|
|
179
|
+
return {};
|
|
180
|
+
}
|
|
181
|
+
}), _class2)) || _class);
|
|
182
|
+
return BuildingBlockBase;
|
|
183
|
+
}, false);
|
|
184
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJCdWlsZGluZ0Jsb2NrQmFzZSIsIl9kZWMiLCJkZWZpbmVVSTVDbGFzcyIsIl9kZWMyIiwiYWdncmVnYXRpb24iLCJ0eXBlIiwibXVsdGlwbGUiLCJpc0RlZmF1bHQiLCJfZGVjMyIsImFzc29jaWF0aW9uIiwic2luZ3VsYXJOYW1lIiwiX2RlYzQiLCJkZWZpbmVTdGF0ZSIsIl9jbGFzcyIsIl9jbGFzczIiLCJfQ29udHJvbCIsInNldHRpbmdzIiwib3RoZXJzIiwiX3RoaXMiLCJpZCIsImNhbGwiLCJfaW5pdGlhbGl6ZXJEZWZpbmVQcm9wZXJ0eSIsIl9kZXNjcmlwdG9yIiwiX2Rlc2NyaXB0b3IyIiwiX2Rlc2NyaXB0b3IzIiwiX29sZERvbVJlZiIsIl9pbmhlcml0c0xvb3NlIiwicmVuZGVyIiwib1JtIiwib0NvbnRyb2wiLCJjb250ZW50IiwiZ2V0VmlzaWJsZSIsIkludmlzaWJsZVJlbmRlcmVyIiwicmVuZGVyQ29udHJvbCIsIl9wcm90byIsInByb3RvdHlwZSIsImJpbmRQcm9wZXJ0eSIsIm5hbWUiLCJiaW5kaW5nSW5mbyIsInByb3BlcnR5TWV0YWRhdGEiLCJnZXRNZXRhZGF0YSIsImdldFByb3BlcnR5IiwiYmluZGFibGUiLCJncm91cCIsIm9uQWZ0ZXJSZW5kZXJpbmciLCJldmVudCIsImRvbVJlZiIsImdldERvbVJlZiIsIldlYWtSZWYiLCJvQ29udGVudCIsImRlcmVmIiwiZG9jdW1lbnQiLCJnZXRFbGVtZW50QnlJZCIsImdldEZvY3VzRG9tUmVmIiwiZW5oYW5jZUFjY2Vzc2liaWxpdHlTdGF0ZSIsIl9vRWxlbWVudCIsIm1BcmlhUHJvcHMiLCJvUGFyZW50IiwiZ2V0UGFyZW50IiwiZ2V0QWNjZXNzaWJpbGl0eUluZm8iLCJhY2Nlc3NpYmlsaXR5SW5mbyIsImlzQSIsImdldElkRm9yTGFiZWwiLCJhZGRTdHlsZUNsYXNzIiwic3R5bGVDbGFzcyIsInJlbW92ZVN0eWxlQ2xhc3MiLCJiaW5kU3RhdGUiLCJwYXRoIiwiQmluZGluZ1Rvb2xraXQiLCJzdGF0ZSIsIkNvbnRyb2wiLCJfYXBwbHlEZWNvcmF0ZWREZXNjcmlwdG9yIiwiY29uZmlndXJhYmxlIiwiZW51bWVyYWJsZSIsIndyaXRhYmxlIiwiaW5pdGlhbGl6ZXIiXSwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzIjpbIkJ1aWxkaW5nQmxvY2tCYXNlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgQ29uc3RhbnRFeHByZXNzaW9uLCBQYXRoSW5Nb2RlbEV4cHJlc3Npb24sIFByaW1pdGl2ZVR5cGUgfSBmcm9tIFwic2FwL2ZlL2Jhc2UvQmluZGluZ1Rvb2xraXRcIjtcbmltcG9ydCAqIGFzIEJpbmRpbmdUb29sa2l0IGZyb20gXCJzYXAvZmUvYmFzZS9CaW5kaW5nVG9vbGtpdFwiO1xuaW1wb3J0IHR5cGUgeyBQcm9wZXJ0aWVzT2YsIFN0YXRlT2YgfSBmcm9tIFwic2FwL2ZlL2Jhc2UvQ2xhc3NTdXBwb3J0XCI7XG5pbXBvcnQgeyBhZ2dyZWdhdGlvbiwgYXNzb2NpYXRpb24sIGRlZmluZVN0YXRlLCBkZWZpbmVVSTVDbGFzcyB9IGZyb20gXCJzYXAvZmUvYmFzZS9DbGFzc1N1cHBvcnRcIjtcbmltcG9ydCB0eXBlIE1hbmFnZWRPYmplY3QgZnJvbSBcInNhcC91aS9iYXNlL01hbmFnZWRPYmplY3RcIjtcbmltcG9ydCB0eXBlIHsgUHJvcGVydHlCaW5kaW5nSW5mbyB9IGZyb20gXCJzYXAvdWkvYmFzZS9NYW5hZ2VkT2JqZWN0XCI7XG5pbXBvcnQgQ29udHJvbCBmcm9tIFwic2FwL3VpL2NvcmUvQ29udHJvbFwiO1xuaW1wb3J0IHR5cGUgVUk1RWxlbWVudCBmcm9tIFwic2FwL3VpL2NvcmUvRWxlbWVudFwiO1xuaW1wb3J0IEludmlzaWJsZVJlbmRlcmVyIGZyb20gXCJzYXAvdWkvY29yZS9JbnZpc2libGVSZW5kZXJlclwiO1xuaW1wb3J0IHR5cGUgUmVuZGVyTWFuYWdlciBmcm9tIFwic2FwL3VpL2NvcmUvUmVuZGVyTWFuYWdlclwiO1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG5pbnRlcmZhY2UgQnVpbGRpbmdCbG9ja0Jhc2U8VCBleHRlbmRzIFVJNUVsZW1lbnQgPSBDb250cm9sLCBLIGV4dGVuZHMgb2JqZWN0ID0ge30+IHtcblx0Ly8gRm9yY2UgYSBzdGF0ZSB1cGRhdGVcblx0X3VwZGF0ZVN0YXRlKCk6IFByb21pc2U8dm9pZD47XG59XG5cbi8qKlxuICogQmFzZSBjbGFzcyBmb3IgYnVpbGRpbmcgYmxvY2tzLlxuICogVGhpcyBjb250YWlucyB0aGUgbG93IGxldmVsIGZ1bmN0aW9uYWxpdHkgb2YgaGF2aW5nIGEgY29udGVudCBhZ2dyZWdhdGlvbiBhbmQgaGFuZGxpbmcgdGhlIHJlbmRlcmluZyBvZiB0aGUgY29udGVudCB3aXRob3V0IGFuIGFjdHVhbCBET00gZWxlbWVudC5cbiAqIFRoZSBidWlsZGluZyBibG9jayBhbHNvIGRlZmluZXMgYSBzdGF0ZSBvYmplY3QgdGhhdCBjYW4gYmUgdXNlZCB0byBzdG9yZSB0aGUgc3RhdGUgb2YgdGhlIGJ1aWxkaW5nIGJsb2NrLlxuICogQWNjZXNzaWJpbGl0eSBhbmQgY2xhc3NlcyBpbmZvcm1hdGlvbiBhcmUgZm9yd2FyZGVkIHRvIHRoZSBjb250ZW50IGNvbnRyb2wuXG4gKiBAZXhwZXJpbWVudGFsXG4gKiBAcHVibGljXG4gKi9cbkBkZWZpbmVVSTVDbGFzcyhcInNhcC5mZS5iYXNlLkJ1aWxkaW5nQmxvY2tCYXNlXCIpXG5jbGFzcyBCdWlsZGluZ0Jsb2NrQmFzZTxUIGV4dGVuZHMgVUk1RWxlbWVudCA9IENvbnRyb2wsIEsgZXh0ZW5kcyBvYmplY3QgPSB7fT4gZXh0ZW5kcyBDb250cm9sIHtcblx0QGFnZ3JlZ2F0aW9uKHsgdHlwZTogXCJzYXAudWkuY29yZS5FbGVtZW50XCIsIG11bHRpcGxlOiBmYWxzZSwgaXNEZWZhdWx0OiB0cnVlIH0pXG5cdGNvbnRlbnQ/OiBUO1xuXG5cdC8qKlxuXHQgKiBBc3NvY2lhdGlvbiB0byBjb250cm9scyAvIElEcyB0aGF0IGxhYmVsIHRoaXMgY29udHJvbCAoc2VlIFdBSS1BUklBIGF0dHJpYnV0ZSBhcmlhLWxhYmVsbGVkYnkpLlxuXHQgKi9cblx0QGFzc29jaWF0aW9uKHsgdHlwZTogXCJzYXAudWkuY29yZS5Db250cm9sXCIsIG11bHRpcGxlOiB0cnVlLCBzaW5ndWxhck5hbWU6IFwiYXJpYUxhYmVsbGVkQnlcIiB9KVxuXHRhcmlhTGFiZWxsZWRCeSE6IHN0cmluZ1tdO1xuXG5cdEBkZWZpbmVTdGF0ZSgpXG5cdHByb3RlY3RlZCBzdGF0ZTogU3RhdGVPZjxLPiA9IHt9IGFzIFN0YXRlT2Y8Sz47XG5cblx0Y29uc3RydWN0b3Ioc2V0dGluZ3M/OiBzdHJpbmcgfCBQcm9wZXJ0aWVzT2Y8QnVpbGRpbmdCbG9ja0Jhc2U8VD4+LCBvdGhlcnM/OiBQcm9wZXJ0aWVzT2Y8QnVpbGRpbmdCbG9ja0Jhc2U8VD4+KSB7XG5cdFx0aWYgKHR5cGVvZiBzZXR0aW5ncyA9PT0gXCJzdHJpbmdcIikge1xuXHRcdFx0b3RoZXJzID8/PSB7fTtcblx0XHRcdG90aGVycy5pZCA9IHNldHRpbmdzO1xuXHRcdH1cblx0XHRzdXBlcihzZXR0aW5ncyBhcyB1bmtub3duIGFzIHN0cmluZywgb3RoZXJzKTtcblx0fVxuXG5cdHByaXZhdGUgX29sZERvbVJlZjogV2Vha1JlZjxFbGVtZW50PiB8IG51bGwgPSBudWxsO1xuXG5cdHN0YXRpYyByZW5kZXI8VCBleHRlbmRzIENvbnRyb2w+KG9SbTogUmVuZGVyTWFuYWdlciwgb0NvbnRyb2w6IEJ1aWxkaW5nQmxvY2tCYXNlPFQ+KTogdm9pZCB7XG5cdFx0aWYgKCFvQ29udHJvbC5jb250ZW50IHx8IG9Db250cm9sLmdldFZpc2libGUoKSA9PT0gZmFsc2UpIHtcblx0XHRcdEludmlzaWJsZVJlbmRlcmVyLnJlbmRlcihvUm0sIG9Db250cm9sKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0b1JtLnJlbmRlckNvbnRyb2wob0NvbnRyb2wuY29udGVudCk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIE92ZXJyaWRlIHRoZSBiaW5kUHJvcGVydHkgdG8gZGVhbCB3aXRoIHRoZSBjYXNlIHdoZXJlIHRoZSBwcm9wZXJ0eSBpcyBhIGJpbmRpbmcgaW5mby5cblx0ICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgb2YgdGUgcHJvcGVydHlcblx0ICogQHBhcmFtIGJpbmRpbmdJbmZvIFRoZSBiaW5kaW5nIGluZm9cblx0ICogQHJldHVybnMgVGhlIGluc3RhbmNlIG9mIHRoZSBidWlsZGluZyBibG9jayBmb3IgY2hhaW5pbmdcblx0ICovXG5cdG92ZXJyaWRlIGJpbmRQcm9wZXJ0eShuYW1lOiBzdHJpbmcsIGJpbmRpbmdJbmZvOiBQcm9wZXJ0eUJpbmRpbmdJbmZvKTogdGhpcyB7XG5cdFx0Y29uc3QgcHJvcGVydHlNZXRhZGF0YSA9IHRoaXMuZ2V0TWV0YWRhdGEoKS5nZXRQcm9wZXJ0eShuYW1lKTtcblx0XHRpZiAocHJvcGVydHlNZXRhZGF0YT8uYmluZGFibGUgPT09IGZhbHNlICYmIHByb3BlcnR5TWV0YWRhdGEuZ3JvdXAgPT09IFwiRGF0YVwiKSB7XG5cdFx0XHQodGhpcyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilbbmFtZV0gPSBiaW5kaW5nSW5mbztcblx0XHR9IGVsc2Uge1xuXHRcdFx0c3VwZXIuYmluZFByb3BlcnR5KG5hbWUsIGJpbmRpbmdJbmZvKTtcblx0XHR9XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cblxuXHQvL3NldCB0aGUgb2xkIGRvbSByZWZcblx0b3ZlcnJpZGUgb25BZnRlclJlbmRlcmluZyhldmVudDogSlF1ZXJ5LkV2ZW50KTogdm9pZCB7XG5cdFx0Y29uc3QgZG9tUmVmID0gdGhpcy5nZXREb21SZWYoKTtcblx0XHRpZiAoZG9tUmVmKSB7XG5cdFx0XHR0aGlzLl9vbGREb21SZWYgPSBuZXcgV2Vha1JlZihkb21SZWYpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aGlzLl9vbGREb21SZWYgPSBudWxsO1xuXHRcdH1cblx0XHRzdXBlci5vbkFmdGVyUmVuZGVyaW5nKGV2ZW50KTtcblx0fVxuXG5cdG92ZXJyaWRlIGdldERvbVJlZigpOiBFbGVtZW50IHwgbnVsbCB7XG5cdFx0Y29uc3Qgb0NvbnRlbnQgPSB0aGlzLmNvbnRlbnQ7XG5cdFx0bGV0IGRvbVJlZjogRWxlbWVudCB8IG51bGwgPSBvQ29udGVudD8uZ2V0RG9tUmVmKCkgPz8gc3VwZXIuZ2V0RG9tUmVmKCk7XG5cdFx0aWYgKCFkb21SZWYpIHtcblx0XHRcdGRvbVJlZiA9IHRoaXMuX29sZERvbVJlZj8uZGVyZWYoKSA/PyBudWxsO1xuXHRcdFx0aWYgKGRvbVJlZikge1xuXHRcdFx0XHRyZXR1cm4gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZG9tUmVmLmlkKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIGRvbVJlZjtcblx0fVxuXG5cdG92ZXJyaWRlIGdldEZvY3VzRG9tUmVmKCk6IEVsZW1lbnQgfCBudWxsIHtcblx0XHRjb25zdCBvQ29udGVudCA9IHRoaXMuY29udGVudDtcblx0XHRyZXR1cm4gb0NvbnRlbnQgPyBvQ29udGVudC5nZXRGb2N1c0RvbVJlZigpIDogc3VwZXIuZ2V0Rm9jdXNEb21SZWYoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIGFza3MgdXAgdGhlIGNvbnRyb2wgdHJlZSB0byBlbmhhbmNlIHRoZSBhY2Nlc3NpYmlsaXR5IHN0YXRlIG9mIHRoZSBjb250cm9sLlxuXHQgKiBAcGFyYW0gX29FbGVtZW50IFRoZSBlbGVtZW50IHRvIGVuaGFuY2Vcblx0ICogQHBhcmFtIG1BcmlhUHJvcHMgVGhlIGN1cnJlbnQgYXJpYSBwcm9wZXJ0aWVzXG5cdCAqIEByZXR1cm5zIFRoZSBlbmhhbmNlZCBhcmlhIHByb3BlcnRpZXNcblx0ICovXG5cdG92ZXJyaWRlIGVuaGFuY2VBY2Nlc3NpYmlsaXR5U3RhdGUoX29FbGVtZW50OiBvYmplY3QsIG1BcmlhUHJvcHM6IG9iamVjdCk6IG9iamVjdCB7XG5cdFx0Y29uc3Qgb1BhcmVudCA9IHRoaXMuZ2V0UGFyZW50KCk7XG5cblx0XHRpZiAob1BhcmVudCAmJiAob1BhcmVudCBhcyBNYW5hZ2VkT2JqZWN0ICYgeyBlbmhhbmNlQWNjZXNzaWJpbGl0eVN0YXRlPzogRnVuY3Rpb24gfSkuZW5oYW5jZUFjY2Vzc2liaWxpdHlTdGF0ZSkge1xuXHRcdFx0Ly8gZm9yd2FyZCAgZW5oYW5jZUFjY2Vzc2liaWxpdHlTdGF0ZSBjYWxsIHRvIHRoZSBwYXJlbnRcblx0XHRcdChvUGFyZW50IGFzIE1hbmFnZWRPYmplY3QgJiB7IGVuaGFuY2VBY2Nlc3NpYmlsaXR5U3RhdGU6IEZ1bmN0aW9uIH0pLmVuaGFuY2VBY2Nlc3NpYmlsaXR5U3RhdGUoX29FbGVtZW50LCBtQXJpYVByb3BzKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gbUFyaWFQcm9wcztcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIChpZiBhdmFpbGFibGUgb24gdGhlIGNvbmNyZXRlIGNvbnRyb2wpIHByb3ZpZGVzIHRoZSBjdXJyZW50IGFjY2Vzc2liaWxpdHkgc3RhdGUgb2YgdGhlIGNvbnRyb2wuXG5cdCAqIEByZXR1cm5zIFRoZSBhY2Nlc3NpYmlsaXR5IGluZm9ybWF0aW9uIGZvciB0aGUgY29udHJvbC5cblx0ICovXG5cdG92ZXJyaWRlIGdldEFjY2Vzc2liaWxpdHlJbmZvKCk6IE9iamVjdCB7XG5cdFx0bGV0IGFjY2Vzc2liaWxpdHlJbmZvID0ge307XG5cdFx0aWYgKHRoaXMuY29udGVudD8uaXNBPENvbnRyb2w+KFwic2FwLnVpLmNvcmUuQ29udHJvbFwiKSkge1xuXHRcdFx0YWNjZXNzaWJpbGl0eUluZm8gPSB0aGlzLmNvbnRlbnQuZ2V0QWNjZXNzaWJpbGl0eUluZm8oKTtcblx0XHR9XG5cdFx0cmV0dXJuIGFjY2Vzc2liaWxpdHlJbmZvO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHVybnMgdGhlIERPTU5vZGUgSUQgdG8gYmUgdXNlZCBmb3IgdGhlIFwibGFiZWxGb3JcIiBhdHRyaWJ1dGUuXG5cdCAqXG5cdCAqIFdlIGZvcndhcmQgdGhlIGNhbGwgb2YgdGhpcyBtZXRob2QgdG8gdGhlIGNvbnRlbnQgY29udHJvbC5cblx0ICogQHJldHVybnMgSUQgdG8gYmUgdXNlZCBmb3IgdGhlIDxjb2RlPmxhYmVsRm9yPC9jb2RlPlxuXHQgKi9cblx0b3ZlcnJpZGUgZ2V0SWRGb3JMYWJlbCgpOiBzdHJpbmcge1xuXHRcdGlmICh0aGlzLmNvbnRlbnQ/LmlzQTxDb250cm9sPihcInNhcC51aS5jb3JlLkNvbnRyb2xcIikpIHtcblx0XHRcdHJldHVybiB0aGlzLmNvbnRlbnQuZ2V0SWRGb3JMYWJlbCgpO1xuXHRcdH1cblx0XHRyZXR1cm4gXCJcIjtcblx0fVxuXG5cdG92ZXJyaWRlIGFkZFN0eWxlQ2xhc3Moc3R5bGVDbGFzczogc3RyaW5nKTogdGhpcyB7XG5cdFx0KHRoaXMuY29udGVudCBhcyB1bmtub3duIGFzIENvbnRyb2wpPy5hZGRTdHlsZUNsYXNzKHN0eWxlQ2xhc3MpO1xuXHRcdHN1cGVyLmFkZFN0eWxlQ2xhc3Moc3R5bGVDbGFzcyk7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cblxuXHRvdmVycmlkZSByZW1vdmVTdHlsZUNsYXNzKHN0eWxlQ2xhc3M6IHN0cmluZyk6IHRoaXMge1xuXHRcdCh0aGlzLmNvbnRlbnQgYXMgdW5rbm93biBhcyBDb250cm9sKT8ucmVtb3ZlU3R5bGVDbGFzcyhzdHlsZUNsYXNzKTtcblx0XHRzdXBlci5yZW1vdmVTdHlsZUNsYXNzKHN0eWxlQ2xhc3MpO1xuXHRcdHJldHVybiB0aGlzO1xuXHR9XG5cblx0LyoqXG5cdCAqIFNob3J0aGFuZCBmb3IgdGhlIEJpbmRpbmdUb29sa2l0LmJpbmRTdGF0ZSBmdW5jdGlvbiB3aXRoIHRoZSBjdXJyZW50IHN0YXRlIG9iamVjdC5cblx0ICogQHBhcmFtIHBhdGggQSBwcm9wZXJ0eSBpbiB0aGUgc3RhdGUgb2JqZWN0XG5cdCAqIEByZXR1cm5zIFRoZSBiaW5kaW5nIHRvb2xraXQgZXhwcmVzc2lvbiBmb3IgdGhlIHN0YXRlXG5cdCAqL1xuXHRwcm90ZWN0ZWQgYmluZFN0YXRlKHBhdGg6IGtleW9mIEspOiBQYXRoSW5Nb2RlbEV4cHJlc3Npb248UHJpbWl0aXZlVHlwZT4gfCBDb25zdGFudEV4cHJlc3Npb248UHJpbWl0aXZlVHlwZT4ge1xuXHRcdHJldHVybiBCaW5kaW5nVG9vbGtpdC5iaW5kU3RhdGUodGhpcy5zdGF0ZSBhcyBLLCBwYXRoKTtcblx0fVxufVxuXG5leHBvcnQgZGVmYXVsdCBCdWlsZGluZ0Jsb2NrQmFzZTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7RUFXQTtFQU1BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFQQSxJQVNNQSxpQkFBaUIsSUFBQUMsSUFBQSxHQUR0QkMsY0FBYyxDQUFDLCtCQUErQixDQUFDLEVBQUFDLEtBQUEsR0FFOUNDLFdBQVcsQ0FBQztJQUFFQyxJQUFJLEVBQUUscUJBQXFCO0lBQUVDLFFBQVEsRUFBRSxLQUFLO0lBQUVDLFNBQVMsRUFBRTtFQUFLLENBQUMsQ0FBQyxFQUFBQyxLQUFBLEdBTTlFQyxXQUFXLENBQUM7SUFBRUosSUFBSSxFQUFFLHFCQUFxQjtJQUFFQyxRQUFRLEVBQUUsSUFBSTtJQUFFSSxZQUFZLEVBQUU7RUFBaUIsQ0FBQyxDQUFDLEVBQUFDLEtBQUEsR0FHNUZDLFdBQVcsQ0FBQyxDQUFDLEVBQUFYLElBQUEsQ0FBQVksTUFBQSxJQUFBQyxPQUFBLDBCQUFBQyxRQUFBO0lBR2QsU0FBQWYsa0JBQVlnQixRQUFzRCxFQUFFQyxNQUEyQyxFQUFFO01BQUEsSUFBQUMsS0FBQTtNQUNoSCxJQUFJLE9BQU9GLFFBQVEsS0FBSyxRQUFRLEVBQUU7UUFDakNDLE1BQU0sS0FBSyxDQUFDLENBQUM7UUFDYkEsTUFBTSxDQUFDRSxFQUFFLEdBQUdILFFBQVE7TUFDckI7TUFDQUUsS0FBQSxHQUFBSCxRQUFBLENBQUFLLElBQUEsT0FBTUosUUFBUSxFQUF1QkMsTUFBTSxDQUFDO01BQUNJLDBCQUFBLENBQUFILEtBQUEsYUFBQUksV0FBQSxFQUFBSixLQUFBO01BZDlDO0FBQ0Q7QUFDQTtNQUZDRywwQkFBQSxDQUFBSCxLQUFBLG9CQUFBSyxZQUFBLEVBQUFMLEtBQUE7TUFBQUcsMEJBQUEsQ0FBQUgsS0FBQSxXQUFBTSxZQUFBLEVBQUFOLEtBQUE7TUFBQUEsS0FBQSxDQWlCUU8sVUFBVSxHQUE0QixJQUFJO01BQUEsT0FBQVAsS0FBQTtJQUZsRDtJQUFDUSxjQUFBLENBQUExQixpQkFBQSxFQUFBZSxRQUFBO0lBQUFmLGlCQUFBLENBSU0yQixNQUFNLEdBQWIsU0FBT0EsTUFBTUEsQ0FBb0JDLEdBQWtCLEVBQUVDLFFBQThCLEVBQVE7TUFDMUYsSUFBSSxDQUFDQSxRQUFRLENBQUNDLE9BQU8sSUFBSUQsUUFBUSxDQUFDRSxVQUFVLENBQUMsQ0FBQyxLQUFLLEtBQUssRUFBRTtRQUN6REMsaUJBQWlCLENBQUNMLE1BQU0sQ0FBQ0MsR0FBRyxFQUFFQyxRQUFRLENBQUM7TUFDeEMsQ0FBQyxNQUFNO1FBQ05ELEdBQUcsQ0FBQ0ssYUFBYSxDQUFDSixRQUFRLENBQUNDLE9BQU8sQ0FBQztNQUNwQztJQUNEOztJQUVBO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUxDO0lBQUEsSUFBQUksTUFBQSxHQUFBbEMsaUJBQUEsQ0FBQW1DLFNBQUE7SUFBQUQsTUFBQSxDQU1TRSxZQUFZLEdBQXJCLFNBQVNBLFlBQVlBLENBQUNDLElBQVksRUFBRUMsV0FBZ0MsRUFBUTtNQUMzRSxNQUFNQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUNDLFdBQVcsQ0FBQyxDQUFDLENBQUNDLFdBQVcsQ0FBQ0osSUFBSSxDQUFDO01BQzdELElBQUlFLGdCQUFnQixFQUFFRyxRQUFRLEtBQUssS0FBSyxJQUFJSCxnQkFBZ0IsQ0FBQ0ksS0FBSyxLQUFLLE1BQU0sRUFBRTtRQUM3RSxJQUFJLENBQTZCTixJQUFJLENBQUMsR0FBR0MsV0FBVztNQUN0RCxDQUFDLE1BQU07UUFDTnZCLFFBQUEsQ0FBQW9CLFNBQUEsQ0FBTUMsWUFBWSxDQUFBaEIsSUFBQSxPQUFDaUIsSUFBSSxFQUFFQyxXQUFXO01BQ3JDO01BQ0EsT0FBTyxJQUFJO0lBQ1o7O0lBRUE7SUFBQTtJQUFBSixNQUFBLENBQ1NVLGdCQUFnQixHQUF6QixTQUFTQSxnQkFBZ0JBLENBQUNDLEtBQW1CLEVBQVE7TUFDcEQsTUFBTUMsTUFBTSxHQUFHLElBQUksQ0FBQ0MsU0FBUyxDQUFDLENBQUM7TUFDL0IsSUFBSUQsTUFBTSxFQUFFO1FBQ1gsSUFBSSxDQUFDckIsVUFBVSxHQUFHLElBQUl1QixPQUFPLENBQUNGLE1BQU0sQ0FBQztNQUN0QyxDQUFDLE1BQU07UUFDTixJQUFJLENBQUNyQixVQUFVLEdBQUcsSUFBSTtNQUN2QjtNQUNBVixRQUFBLENBQUFvQixTQUFBLENBQU1TLGdCQUFnQixDQUFBeEIsSUFBQSxPQUFDeUIsS0FBSztJQUM3QixDQUFDO0lBQUFYLE1BQUEsQ0FFUWEsU0FBUyxHQUFsQixTQUFTQSxTQUFTQSxDQUFBLEVBQW1CO01BQ3BDLE1BQU1FLFFBQVEsR0FBRyxJQUFJLENBQUNuQixPQUFPO01BQzdCLElBQUlnQixNQUFzQixHQUFHRyxRQUFRLEVBQUVGLFNBQVMsQ0FBQyxDQUFDLElBQUFoQyxRQUFBLENBQUFvQixTQUFBLENBQVVZLFNBQVMsQ0FBQTNCLElBQUEsTUFBRTtNQUN2RSxJQUFJLENBQUMwQixNQUFNLEVBQUU7UUFDWkEsTUFBTSxHQUFHLElBQUksQ0FBQ3JCLFVBQVUsRUFBRXlCLEtBQUssQ0FBQyxDQUFDLElBQUksSUFBSTtRQUN6QyxJQUFJSixNQUFNLEVBQUU7VUFDWCxPQUFPSyxRQUFRLENBQUNDLGNBQWMsQ0FBQ04sTUFBTSxDQUFDM0IsRUFBRSxDQUFDO1FBQzFDO01BQ0Q7TUFDQSxPQUFPMkIsTUFBTTtJQUNkLENBQUM7SUFBQVosTUFBQSxDQUVRbUIsY0FBYyxHQUF2QixTQUFTQSxjQUFjQSxDQUFBLEVBQW1CO01BQ3pDLE1BQU1KLFFBQVEsR0FBRyxJQUFJLENBQUNuQixPQUFPO01BQzdCLE9BQU9tQixRQUFRLEdBQUdBLFFBQVEsQ0FBQ0ksY0FBYyxDQUFDLENBQUMsR0FBQXRDLFFBQUEsQ0FBQW9CLFNBQUEsQ0FBU2tCLGNBQWMsQ0FBQWpDLElBQUEsTUFBRTtJQUNyRTs7SUFFQTtBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FMQztJQUFBYyxNQUFBLENBTVNvQix5QkFBeUIsR0FBbEMsU0FBU0EseUJBQXlCQSxDQUFDQyxTQUFpQixFQUFFQyxVQUFrQixFQUFVO01BQ2pGLE1BQU1DLE9BQU8sR0FBRyxJQUFJLENBQUNDLFNBQVMsQ0FBQyxDQUFDO01BRWhDLElBQUlELE9BQU8sSUFBS0EsT0FBTyxDQUE4REgseUJBQXlCLEVBQUU7UUFDL0c7UUFDQ0csT0FBTyxDQUE2REgseUJBQXlCLENBQUNDLFNBQVMsRUFBRUMsVUFBVSxDQUFDO01BQ3RIO01BRUEsT0FBT0EsVUFBVTtJQUNsQjs7SUFFQTtBQUNEO0FBQ0E7QUFDQSxPQUhDO0lBQUF0QixNQUFBLENBSVN5QixvQkFBb0IsR0FBN0IsU0FBU0Esb0JBQW9CQSxDQUFBLEVBQVc7TUFDdkMsSUFBSUMsaUJBQWlCLEdBQUcsQ0FBQyxDQUFDO01BQzFCLElBQUksSUFBSSxDQUFDOUIsT0FBTyxFQUFFK0IsR0FBRyxDQUFVLHFCQUFxQixDQUFDLEVBQUU7UUFDdERELGlCQUFpQixHQUFHLElBQUksQ0FBQzlCLE9BQU8sQ0FBQzZCLG9CQUFvQixDQUFDLENBQUM7TUFDeEQ7TUFDQSxPQUFPQyxpQkFBaUI7SUFDekI7O0lBRUE7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BTEM7SUFBQTFCLE1BQUEsQ0FNUzRCLGFBQWEsR0FBdEIsU0FBU0EsYUFBYUEsQ0FBQSxFQUFXO01BQ2hDLElBQUksSUFBSSxDQUFDaEMsT0FBTyxFQUFFK0IsR0FBRyxDQUFVLHFCQUFxQixDQUFDLEVBQUU7UUFDdEQsT0FBTyxJQUFJLENBQUMvQixPQUFPLENBQUNnQyxhQUFhLENBQUMsQ0FBQztNQUNwQztNQUNBLE9BQU8sRUFBRTtJQUNWLENBQUM7SUFBQTVCLE1BQUEsQ0FFUTZCLGFBQWEsR0FBdEIsU0FBU0EsYUFBYUEsQ0FBQ0MsVUFBa0IsRUFBUTtNQUMvQyxJQUFJLENBQUNsQyxPQUFPLEVBQXlCaUMsYUFBYSxDQUFDQyxVQUFVLENBQUM7TUFDL0RqRCxRQUFBLENBQUFvQixTQUFBLENBQU00QixhQUFhLENBQUEzQyxJQUFBLE9BQUM0QyxVQUFVO01BQzlCLE9BQU8sSUFBSTtJQUNaLENBQUM7SUFBQTlCLE1BQUEsQ0FFUStCLGdCQUFnQixHQUF6QixTQUFTQSxnQkFBZ0JBLENBQUNELFVBQWtCLEVBQVE7TUFDbEQsSUFBSSxDQUFDbEMsT0FBTyxFQUF5Qm1DLGdCQUFnQixDQUFDRCxVQUFVLENBQUM7TUFDbEVqRCxRQUFBLENBQUFvQixTQUFBLENBQU04QixnQkFBZ0IsQ0FBQTdDLElBQUEsT0FBQzRDLFVBQVU7TUFDakMsT0FBTyxJQUFJO0lBQ1o7O0lBRUE7QUFDRDtBQUNBO0FBQ0E7QUFDQSxPQUpDO0lBQUE5QixNQUFBLENBS1VnQyxTQUFTLEdBQW5CLFNBQVVBLFNBQVNBLENBQUNDLElBQWEsRUFBNEU7TUFDNUcsT0FBT0MsY0FBYyxDQUFDRixTQUFTLENBQUMsSUFBSSxDQUFDRyxLQUFLLEVBQU9GLElBQUksQ0FBQztJQUN2RCxDQUFDO0lBQUEsT0FBQW5FLGlCQUFBO0VBQUEsRUF4SXFGc0UsT0FBTyxHQUFBaEQsV0FBQSxHQUFBaUQseUJBQUEsQ0FBQXpELE9BQUEsQ0FBQXFCLFNBQUEsY0FBQWhDLEtBQUE7SUFBQXFFLFlBQUE7SUFBQUMsVUFBQTtJQUFBQyxRQUFBO0lBQUFDLFdBQUE7RUFBQSxJQUFBcEQsWUFBQSxHQUFBZ0QseUJBQUEsQ0FBQXpELE9BQUEsQ0FBQXFCLFNBQUEscUJBQUEzQixLQUFBO0lBQUFnRSxZQUFBO0lBQUFDLFVBQUE7SUFBQUMsUUFBQTtJQUFBQyxXQUFBO0VBQUEsSUFBQW5ELFlBQUEsR0FBQStDLHlCQUFBLENBQUF6RCxPQUFBLENBQUFxQixTQUFBLFlBQUF4QixLQUFBO0lBQUE2RCxZQUFBO0lBQUFDLFVBQUE7SUFBQUMsUUFBQTtJQUFBQyxXQUFBLFdBQUFBLENBQUE7TUFBQSxPQVcvRCxDQUFDLENBQUM7SUFBQTtFQUFBLElBQUE3RCxPQUFBLE1BQUFELE1BQUE7RUFBQSxPQWdJbEJiLGlCQUFpQjtBQUFBIiwiaWdub3JlTGlzdCI6W119
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
import type { ConstantExpression, PathInModelExpression, PrimitiveType } from "sap/fe/base/BindingToolkit";
|
|
2
|
+
import * as BindingToolkit from "sap/fe/base/BindingToolkit";
|
|
3
|
+
import type { PropertiesOf, StateOf } from "sap/fe/base/ClassSupport";
|
|
4
|
+
import { aggregation, association, defineState, defineUI5Class } from "sap/fe/base/ClassSupport";
|
|
5
|
+
import type ManagedObject from "sap/ui/base/ManagedObject";
|
|
6
|
+
import type { PropertyBindingInfo } from "sap/ui/base/ManagedObject";
|
|
7
|
+
import Control from "sap/ui/core/Control";
|
|
8
|
+
import type UI5Element from "sap/ui/core/Element";
|
|
9
|
+
import InvisibleRenderer from "sap/ui/core/InvisibleRenderer";
|
|
10
|
+
import type RenderManager from "sap/ui/core/RenderManager";
|
|
11
|
+
|
|
12
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
13
|
+
interface BuildingBlockBase<T extends UI5Element = Control, K extends object = {}> {
|
|
14
|
+
// Force a state update
|
|
15
|
+
_updateState(): Promise<void>;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Base class for building blocks.
|
|
20
|
+
* This contains the low level functionality of having a content aggregation and handling the rendering of the content without an actual DOM element.
|
|
21
|
+
* The building block also defines a state object that can be used to store the state of the building block.
|
|
22
|
+
* Accessibility and classes information are forwarded to the content control.
|
|
23
|
+
* @experimental
|
|
24
|
+
* @public
|
|
25
|
+
*/
|
|
26
|
+
@defineUI5Class("sap.fe.base.BuildingBlockBase")
|
|
27
|
+
class BuildingBlockBase<T extends UI5Element = Control, K extends object = {}> extends Control {
|
|
28
|
+
@aggregation({ type: "sap.ui.core.Element", multiple: false, isDefault: true })
|
|
29
|
+
content?: T;
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Association to controls / IDs that label this control (see WAI-ARIA attribute aria-labelledby).
|
|
33
|
+
*/
|
|
34
|
+
@association({ type: "sap.ui.core.Control", multiple: true, singularName: "ariaLabelledBy" })
|
|
35
|
+
ariaLabelledBy!: string[];
|
|
36
|
+
|
|
37
|
+
@defineState()
|
|
38
|
+
protected state: StateOf<K> = {} as StateOf<K>;
|
|
39
|
+
|
|
40
|
+
constructor(settings?: string | PropertiesOf<BuildingBlockBase<T>>, others?: PropertiesOf<BuildingBlockBase<T>>) {
|
|
41
|
+
if (typeof settings === "string") {
|
|
42
|
+
others ??= {};
|
|
43
|
+
others.id = settings;
|
|
44
|
+
}
|
|
45
|
+
super(settings as unknown as string, others);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
private _oldDomRef: WeakRef<Element> | null = null;
|
|
49
|
+
|
|
50
|
+
static render<T extends Control>(oRm: RenderManager, oControl: BuildingBlockBase<T>): void {
|
|
51
|
+
if (!oControl.content || oControl.getVisible() === false) {
|
|
52
|
+
InvisibleRenderer.render(oRm, oControl);
|
|
53
|
+
} else {
|
|
54
|
+
oRm.renderControl(oControl.content);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* Override the bindProperty to deal with the case where the property is a binding info.
|
|
60
|
+
* @param name The name of te property
|
|
61
|
+
* @param bindingInfo The binding info
|
|
62
|
+
* @returns The instance of the building block for chaining
|
|
63
|
+
*/
|
|
64
|
+
override bindProperty(name: string, bindingInfo: PropertyBindingInfo): this {
|
|
65
|
+
const propertyMetadata = this.getMetadata().getProperty(name);
|
|
66
|
+
if (propertyMetadata?.bindable === false && propertyMetadata.group === "Data") {
|
|
67
|
+
(this as Record<string, unknown>)[name] = bindingInfo;
|
|
68
|
+
} else {
|
|
69
|
+
super.bindProperty(name, bindingInfo);
|
|
70
|
+
}
|
|
71
|
+
return this;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
//set the old dom ref
|
|
75
|
+
override onAfterRendering(event: JQuery.Event): void {
|
|
76
|
+
const domRef = this.getDomRef();
|
|
77
|
+
if (domRef) {
|
|
78
|
+
this._oldDomRef = new WeakRef(domRef);
|
|
79
|
+
} else {
|
|
80
|
+
this._oldDomRef = null;
|
|
81
|
+
}
|
|
82
|
+
super.onAfterRendering(event);
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
override getDomRef(): Element | null {
|
|
86
|
+
const oContent = this.content;
|
|
87
|
+
let domRef: Element | null = oContent?.getDomRef() ?? super.getDomRef();
|
|
88
|
+
if (!domRef) {
|
|
89
|
+
domRef = this._oldDomRef?.deref() ?? null;
|
|
90
|
+
if (domRef) {
|
|
91
|
+
return document.getElementById(domRef.id);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
return domRef;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
override getFocusDomRef(): Element | null {
|
|
98
|
+
const oContent = this.content;
|
|
99
|
+
return oContent ? oContent.getFocusDomRef() : super.getFocusDomRef();
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
/**
|
|
103
|
+
* This function asks up the control tree to enhance the accessibility state of the control.
|
|
104
|
+
* @param _oElement The element to enhance
|
|
105
|
+
* @param mAriaProps The current aria properties
|
|
106
|
+
* @returns The enhanced aria properties
|
|
107
|
+
*/
|
|
108
|
+
override enhanceAccessibilityState(_oElement: object, mAriaProps: object): object {
|
|
109
|
+
const oParent = this.getParent();
|
|
110
|
+
|
|
111
|
+
if (oParent && (oParent as ManagedObject & { enhanceAccessibilityState?: Function }).enhanceAccessibilityState) {
|
|
112
|
+
// forward enhanceAccessibilityState call to the parent
|
|
113
|
+
(oParent as ManagedObject & { enhanceAccessibilityState: Function }).enhanceAccessibilityState(_oElement, mAriaProps);
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
return mAriaProps;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
/**
|
|
120
|
+
* This function (if available on the concrete control) provides the current accessibility state of the control.
|
|
121
|
+
* @returns The accessibility information for the control.
|
|
122
|
+
*/
|
|
123
|
+
override getAccessibilityInfo(): Object {
|
|
124
|
+
let accessibilityInfo = {};
|
|
125
|
+
if (this.content?.isA<Control>("sap.ui.core.Control")) {
|
|
126
|
+
accessibilityInfo = this.content.getAccessibilityInfo();
|
|
127
|
+
}
|
|
128
|
+
return accessibilityInfo;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
/**
|
|
132
|
+
* Returns the DOMNode ID to be used for the "labelFor" attribute.
|
|
133
|
+
*
|
|
134
|
+
* We forward the call of this method to the content control.
|
|
135
|
+
* @returns ID to be used for the <code>labelFor</code>
|
|
136
|
+
*/
|
|
137
|
+
override getIdForLabel(): string {
|
|
138
|
+
if (this.content?.isA<Control>("sap.ui.core.Control")) {
|
|
139
|
+
return this.content.getIdForLabel();
|
|
140
|
+
}
|
|
141
|
+
return "";
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
override addStyleClass(styleClass: string): this {
|
|
145
|
+
(this.content as unknown as Control)?.addStyleClass(styleClass);
|
|
146
|
+
super.addStyleClass(styleClass);
|
|
147
|
+
return this;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
override removeStyleClass(styleClass: string): this {
|
|
151
|
+
(this.content as unknown as Control)?.removeStyleClass(styleClass);
|
|
152
|
+
super.removeStyleClass(styleClass);
|
|
153
|
+
return this;
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
/**
|
|
157
|
+
* Shorthand for the BindingToolkit.bindState function with the current state object.
|
|
158
|
+
* @param path A property in the state object
|
|
159
|
+
* @returns The binding toolkit expression for the state
|
|
160
|
+
*/
|
|
161
|
+
protected bindState(path: keyof K): PathInModelExpression<PrimitiveType> | ConstantExpression<PrimitiveType> {
|
|
162
|
+
return BindingToolkit.bindState(this.state as K, path);
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
export default BuildingBlockBase;
|