@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.
@@ -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?: T | BindingInfoHolder<T>
721
- ): PathInModelExpression<T> | ConstantExpression<T>;
722
- export function bindState<T extends readonly unknown[]>(stateObjectProp?: T | BindingInfoHolder<T>): PathInModelExpression<T>;
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 T);
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;