@sapui5/sap.fe.base 1.130.1 → 1.131.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.
@@ -714,22 +714,17 @@ export function ref(reference: string | null): ReferenceExpression {
714
714
  * Wrap a state object into a path in model expression.
715
715
  * @template T
716
716
  * @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
717
+ * @param key The key of the state object to bind
717
718
  * @returns The correct binding toolkit expression
718
719
  */
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> {
720
+ export function bindState<T extends object, K extends PrimitiveType>(
721
+ stateObjectProp: T,
722
+ key: keyof T
723
+ ): PathInModelExpression<K> | ConstantExpression<K> {
726
724
  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
- );
725
+ return pathInModel("/" + key.toString(), (stateObjectProp as BindingInfoHolder<T>).__bindingInfo.model);
731
726
  } else {
732
- return constant(stateObjectProp as T);
727
+ return constant(stateObjectProp) as unknown as ConstantExpression<K>;
733
728
  }
734
729
  }
735
730
  /**
@@ -0,0 +1,191 @@
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 _assertThisInitialized(e) { if (void 0 === e) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return e; }
15
+ function _inheritsLoose(t, o) { t.prototype = Object.create(o.prototype), t.prototype.constructor = t, _setPrototypeOf(t, o); }
16
+ function _setPrototypeOf(t, e) { return _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function (t, e) { return t.__proto__ = e, t; }, _setPrototypeOf(t, e); }
17
+ 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; }
18
+ function _initializerWarningHelper(r, e) { throw Error("Decorating class property failed. Please ensure that transform-class-properties is enabled and runs after the decorators transform."); }
19
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
20
+ /**
21
+ * Base class for building blocks.
22
+ * This contains the low level functionality of having a content aggregation and handling the rendering of the content without an actual DOM element.
23
+ * The building block also defines a state object that can be used to store the state of the building block.
24
+ * Accessibility and classes information are forwarded to the content control.
25
+ * @experimental
26
+ * @public
27
+ */
28
+ let BuildingBlockBase = (_dec = defineUI5Class("sap.fe.base.BuildingBlockBase"), _dec2 = aggregation({
29
+ type: "sap.ui.core.Element",
30
+ multiple: false,
31
+ isDefault: true
32
+ }), _dec3 = association({
33
+ type: "sap.ui.core.Control",
34
+ multiple: true,
35
+ singularName: "ariaLabelledBy"
36
+ }), _dec4 = defineState(), _dec(_class = (_class2 = /*#__PURE__*/function (_Control) {
37
+ _inheritsLoose(BuildingBlockBase, _Control);
38
+ /**
39
+ * Association to controls / IDs that label this control (see WAI-ARIA attribute aria-labelledby).
40
+ */
41
+
42
+ function BuildingBlockBase(settings, others) {
43
+ var _this;
44
+ if (typeof settings === "string") {
45
+ others ??= {};
46
+ others.id = settings;
47
+ }
48
+ _this = _Control.call(this, settings, others) || this;
49
+ _initializerDefineProperty(_this, "content", _descriptor, _assertThisInitialized(_this));
50
+ _initializerDefineProperty(_this, "ariaLabelledBy", _descriptor2, _assertThisInitialized(_this));
51
+ _initializerDefineProperty(_this, "state", _descriptor3, _assertThisInitialized(_this));
52
+ _this._oldDomRef = null;
53
+ return _this;
54
+ }
55
+ BuildingBlockBase.render = function render(oRm, oControl) {
56
+ if (!oControl.content || oControl.getVisible() === false) {
57
+ InvisibleRenderer.render(oRm, oControl);
58
+ } else {
59
+ oRm.renderControl(oControl.content);
60
+ }
61
+ }
62
+
63
+ /**
64
+ * Override the bindProperty to deal with the case where the property is a binding info.
65
+ * @param name The name of te property
66
+ * @param bindingInfo The binding info
67
+ * @returns The instance of the building block for chaining
68
+ */;
69
+ var _proto = BuildingBlockBase.prototype;
70
+ _proto.bindProperty = function bindProperty(name, bindingInfo) {
71
+ const propertyMetadata = this.getMetadata().getProperty(name);
72
+ if ((propertyMetadata === null || propertyMetadata === void 0 ? void 0 : propertyMetadata.bindable) === false && propertyMetadata.group === "Data") {
73
+ this[name] = bindingInfo;
74
+ } else {
75
+ _Control.prototype.bindProperty.call(this, name, bindingInfo);
76
+ }
77
+ return this;
78
+ }
79
+
80
+ //set the old dom ref
81
+ ;
82
+ _proto.onAfterRendering = function onAfterRendering(event) {
83
+ const domRef = this.getDomRef();
84
+ if (domRef) {
85
+ this._oldDomRef = new WeakRef(domRef);
86
+ } else {
87
+ this._oldDomRef = null;
88
+ }
89
+ _Control.prototype.onAfterRendering.call(this, event);
90
+ };
91
+ _proto.getDomRef = function getDomRef() {
92
+ const oContent = this.content;
93
+ let domRef = (oContent === null || oContent === void 0 ? void 0 : oContent.getDomRef()) ?? _Control.prototype.getDomRef.call(this);
94
+ if (!domRef) {
95
+ var _this$_oldDomRef;
96
+ domRef = ((_this$_oldDomRef = this._oldDomRef) === null || _this$_oldDomRef === void 0 ? void 0 : _this$_oldDomRef.deref()) ?? null;
97
+ if (domRef) {
98
+ return document.getElementById(domRef.id);
99
+ }
100
+ }
101
+ return domRef;
102
+ };
103
+ _proto.getFocusDomRef = function getFocusDomRef() {
104
+ const oContent = this.content;
105
+ return oContent ? oContent.getFocusDomRef() : _Control.prototype.getFocusDomRef.call(this);
106
+ }
107
+
108
+ /**
109
+ * This function asks up the control tree to enhance the accessibility state of the control.
110
+ * @param _oElement The element to enhance
111
+ * @param mAriaProps The current aria properties
112
+ * @returns The enhanced aria properties
113
+ */;
114
+ _proto.enhanceAccessibilityState = function enhanceAccessibilityState(_oElement, mAriaProps) {
115
+ const oParent = this.getParent();
116
+ if (oParent && oParent.enhanceAccessibilityState) {
117
+ // forward enhanceAccessibilityState call to the parent
118
+ oParent.enhanceAccessibilityState(_oElement, mAriaProps);
119
+ }
120
+ return mAriaProps;
121
+ }
122
+
123
+ /**
124
+ * This function (if available on the concrete control) provides the current accessibility state of the control.
125
+ * @returns The accessibility information for the control.
126
+ */;
127
+ _proto.getAccessibilityInfo = function getAccessibilityInfo() {
128
+ var _this$content;
129
+ let accessibilityInfo = {};
130
+ if ((_this$content = this.content) !== null && _this$content !== void 0 && _this$content.isA("sap.ui.core.Control")) {
131
+ accessibilityInfo = this.content.getAccessibilityInfo();
132
+ }
133
+ return accessibilityInfo;
134
+ }
135
+
136
+ /**
137
+ * Returns the DOMNode ID to be used for the "labelFor" attribute.
138
+ *
139
+ * We forward the call of this method to the content control.
140
+ * @returns ID to be used for the <code>labelFor</code>
141
+ */;
142
+ _proto.getIdForLabel = function getIdForLabel() {
143
+ var _this$content2;
144
+ if ((_this$content2 = this.content) !== null && _this$content2 !== void 0 && _this$content2.isA("sap.ui.core.Control")) {
145
+ return this.content.getIdForLabel();
146
+ }
147
+ return "";
148
+ };
149
+ _proto.addStyleClass = function addStyleClass(styleClass) {
150
+ var _this$content3;
151
+ (_this$content3 = this.content) === null || _this$content3 === void 0 ? void 0 : _this$content3.addStyleClass(styleClass);
152
+ _Control.prototype.addStyleClass.call(this, styleClass);
153
+ return this;
154
+ };
155
+ _proto.removeStyleClass = function removeStyleClass(styleClass) {
156
+ var _this$content4;
157
+ (_this$content4 = this.content) === null || _this$content4 === void 0 ? void 0 : _this$content4.removeStyleClass(styleClass);
158
+ _Control.prototype.removeStyleClass.call(this, styleClass);
159
+ return this;
160
+ }
161
+
162
+ /**
163
+ * Shorthand for the BindingToolkit.bindState function with the current state object.
164
+ * @param path A property in the state object
165
+ * @returns The binding toolkit expression for the state
166
+ */;
167
+ _proto.bindState = function bindState(path) {
168
+ return BindingToolkit.bindState(this.state, path);
169
+ };
170
+ return BuildingBlockBase;
171
+ }(Control), (_descriptor = _applyDecoratedDescriptor(_class2.prototype, "content", [_dec2], {
172
+ configurable: true,
173
+ enumerable: true,
174
+ writable: true,
175
+ initializer: null
176
+ }), _descriptor2 = _applyDecoratedDescriptor(_class2.prototype, "ariaLabelledBy", [_dec3], {
177
+ configurable: true,
178
+ enumerable: true,
179
+ writable: true,
180
+ initializer: null
181
+ }), _descriptor3 = _applyDecoratedDescriptor(_class2.prototype, "state", [_dec4], {
182
+ configurable: true,
183
+ enumerable: true,
184
+ writable: true,
185
+ initializer: function () {
186
+ return {};
187
+ }
188
+ })), _class2)) || _class);
189
+ return BuildingBlockBase;
190
+ }, false);
191
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJCdWlsZGluZ0Jsb2NrQmFzZSIsIl9kZWMiLCJkZWZpbmVVSTVDbGFzcyIsIl9kZWMyIiwiYWdncmVnYXRpb24iLCJ0eXBlIiwibXVsdGlwbGUiLCJpc0RlZmF1bHQiLCJfZGVjMyIsImFzc29jaWF0aW9uIiwic2luZ3VsYXJOYW1lIiwiX2RlYzQiLCJkZWZpbmVTdGF0ZSIsIl9jbGFzcyIsIl9jbGFzczIiLCJfQ29udHJvbCIsIl9pbmhlcml0c0xvb3NlIiwic2V0dGluZ3MiLCJvdGhlcnMiLCJfdGhpcyIsImlkIiwiY2FsbCIsIl9pbml0aWFsaXplckRlZmluZVByb3BlcnR5IiwiX2Rlc2NyaXB0b3IiLCJfYXNzZXJ0VGhpc0luaXRpYWxpemVkIiwiX2Rlc2NyaXB0b3IyIiwiX2Rlc2NyaXB0b3IzIiwiX29sZERvbVJlZiIsInJlbmRlciIsIm9SbSIsIm9Db250cm9sIiwiY29udGVudCIsImdldFZpc2libGUiLCJJbnZpc2libGVSZW5kZXJlciIsInJlbmRlckNvbnRyb2wiLCJfcHJvdG8iLCJwcm90b3R5cGUiLCJiaW5kUHJvcGVydHkiLCJuYW1lIiwiYmluZGluZ0luZm8iLCJwcm9wZXJ0eU1ldGFkYXRhIiwiZ2V0TWV0YWRhdGEiLCJnZXRQcm9wZXJ0eSIsImJpbmRhYmxlIiwiZ3JvdXAiLCJvbkFmdGVyUmVuZGVyaW5nIiwiZXZlbnQiLCJkb21SZWYiLCJnZXREb21SZWYiLCJXZWFrUmVmIiwib0NvbnRlbnQiLCJfdGhpcyRfb2xkRG9tUmVmIiwiZGVyZWYiLCJkb2N1bWVudCIsImdldEVsZW1lbnRCeUlkIiwiZ2V0Rm9jdXNEb21SZWYiLCJlbmhhbmNlQWNjZXNzaWJpbGl0eVN0YXRlIiwiX29FbGVtZW50IiwibUFyaWFQcm9wcyIsIm9QYXJlbnQiLCJnZXRQYXJlbnQiLCJnZXRBY2Nlc3NpYmlsaXR5SW5mbyIsIl90aGlzJGNvbnRlbnQiLCJhY2Nlc3NpYmlsaXR5SW5mbyIsImlzQSIsImdldElkRm9yTGFiZWwiLCJfdGhpcyRjb250ZW50MiIsImFkZFN0eWxlQ2xhc3MiLCJzdHlsZUNsYXNzIiwiX3RoaXMkY29udGVudDMiLCJyZW1vdmVTdHlsZUNsYXNzIiwiX3RoaXMkY29udGVudDQiLCJiaW5kU3RhdGUiLCJwYXRoIiwiQmluZGluZ1Rvb2xraXQiLCJzdGF0ZSIsIkNvbnRyb2wiLCJfYXBwbHlEZWNvcmF0ZWREZXNjcmlwdG9yIiwiY29uZmlndXJhYmxlIiwiZW51bWVyYWJsZSIsIndyaXRhYmxlIiwiaW5pdGlhbGl6ZXIiXSwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzIjpbIkJ1aWxkaW5nQmxvY2tCYXNlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgQ29uc3RhbnRFeHByZXNzaW9uLCBQYXRoSW5Nb2RlbEV4cHJlc3Npb24sIFByaW1pdGl2ZVR5cGUgfSBmcm9tIFwic2FwL2ZlL2Jhc2UvQmluZGluZ1Rvb2xraXRcIjtcbmltcG9ydCAqIGFzIEJpbmRpbmdUb29sa2l0IGZyb20gXCJzYXAvZmUvYmFzZS9CaW5kaW5nVG9vbGtpdFwiO1xuaW1wb3J0IHR5cGUgeyBQcm9wZXJ0aWVzT2YsIFN0YXRlT2YgfSBmcm9tIFwic2FwL2ZlL2Jhc2UvQ2xhc3NTdXBwb3J0XCI7XG5pbXBvcnQgeyBhZ2dyZWdhdGlvbiwgYXNzb2NpYXRpb24sIGRlZmluZVN0YXRlLCBkZWZpbmVVSTVDbGFzcyB9IGZyb20gXCJzYXAvZmUvYmFzZS9DbGFzc1N1cHBvcnRcIjtcbmltcG9ydCB0eXBlIE1hbmFnZWRPYmplY3QgZnJvbSBcInNhcC91aS9iYXNlL01hbmFnZWRPYmplY3RcIjtcbmltcG9ydCB0eXBlIHsgUHJvcGVydHlCaW5kaW5nSW5mbyB9IGZyb20gXCJzYXAvdWkvYmFzZS9NYW5hZ2VkT2JqZWN0XCI7XG5pbXBvcnQgQ29udHJvbCBmcm9tIFwic2FwL3VpL2NvcmUvQ29udHJvbFwiO1xuaW1wb3J0IHR5cGUgVUk1RWxlbWVudCBmcm9tIFwic2FwL3VpL2NvcmUvRWxlbWVudFwiO1xuaW1wb3J0IEludmlzaWJsZVJlbmRlcmVyIGZyb20gXCJzYXAvdWkvY29yZS9JbnZpc2libGVSZW5kZXJlclwiO1xuaW1wb3J0IHR5cGUgUmVuZGVyTWFuYWdlciBmcm9tIFwic2FwL3VpL2NvcmUvUmVuZGVyTWFuYWdlclwiO1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG5pbnRlcmZhY2UgQnVpbGRpbmdCbG9ja0Jhc2U8VCBleHRlbmRzIFVJNUVsZW1lbnQgPSBDb250cm9sLCBLIGV4dGVuZHMgb2JqZWN0ID0ge30+IHtcblx0Ly8gRm9yY2UgYSBzdGF0ZSB1cGRhdGVcblx0X3VwZGF0ZVN0YXRlKCk6IFByb21pc2U8dm9pZD47XG59XG5cbi8qKlxuICogQmFzZSBjbGFzcyBmb3IgYnVpbGRpbmcgYmxvY2tzLlxuICogVGhpcyBjb250YWlucyB0aGUgbG93IGxldmVsIGZ1bmN0aW9uYWxpdHkgb2YgaGF2aW5nIGEgY29udGVudCBhZ2dyZWdhdGlvbiBhbmQgaGFuZGxpbmcgdGhlIHJlbmRlcmluZyBvZiB0aGUgY29udGVudCB3aXRob3V0IGFuIGFjdHVhbCBET00gZWxlbWVudC5cbiAqIFRoZSBidWlsZGluZyBibG9jayBhbHNvIGRlZmluZXMgYSBzdGF0ZSBvYmplY3QgdGhhdCBjYW4gYmUgdXNlZCB0byBzdG9yZSB0aGUgc3RhdGUgb2YgdGhlIGJ1aWxkaW5nIGJsb2NrLlxuICogQWNjZXNzaWJpbGl0eSBhbmQgY2xhc3NlcyBpbmZvcm1hdGlvbiBhcmUgZm9yd2FyZGVkIHRvIHRoZSBjb250ZW50IGNvbnRyb2wuXG4gKiBAZXhwZXJpbWVudGFsXG4gKiBAcHVibGljXG4gKi9cbkBkZWZpbmVVSTVDbGFzcyhcInNhcC5mZS5iYXNlLkJ1aWxkaW5nQmxvY2tCYXNlXCIpXG5jbGFzcyBCdWlsZGluZ0Jsb2NrQmFzZTxUIGV4dGVuZHMgVUk1RWxlbWVudCA9IENvbnRyb2wsIEsgZXh0ZW5kcyBvYmplY3QgPSB7fT4gZXh0ZW5kcyBDb250cm9sIHtcblx0QGFnZ3JlZ2F0aW9uKHsgdHlwZTogXCJzYXAudWkuY29yZS5FbGVtZW50XCIsIG11bHRpcGxlOiBmYWxzZSwgaXNEZWZhdWx0OiB0cnVlIH0pXG5cdGNvbnRlbnQ/OiBUO1xuXG5cdC8qKlxuXHQgKiBBc3NvY2lhdGlvbiB0byBjb250cm9scyAvIElEcyB0aGF0IGxhYmVsIHRoaXMgY29udHJvbCAoc2VlIFdBSS1BUklBIGF0dHJpYnV0ZSBhcmlhLWxhYmVsbGVkYnkpLlxuXHQgKi9cblx0QGFzc29jaWF0aW9uKHsgdHlwZTogXCJzYXAudWkuY29yZS5Db250cm9sXCIsIG11bHRpcGxlOiB0cnVlLCBzaW5ndWxhck5hbWU6IFwiYXJpYUxhYmVsbGVkQnlcIiB9KVxuXHRhcmlhTGFiZWxsZWRCeSE6IHN0cmluZ1tdO1xuXG5cdEBkZWZpbmVTdGF0ZSgpXG5cdHByb3RlY3RlZCBzdGF0ZTogU3RhdGVPZjxLPiA9IHt9IGFzIFN0YXRlT2Y8Sz47XG5cblx0Y29uc3RydWN0b3Ioc2V0dGluZ3M/OiBzdHJpbmcgfCBQcm9wZXJ0aWVzT2Y8QnVpbGRpbmdCbG9ja0Jhc2U8VD4+LCBvdGhlcnM/OiBQcm9wZXJ0aWVzT2Y8QnVpbGRpbmdCbG9ja0Jhc2U8VD4+KSB7XG5cdFx0aWYgKHR5cGVvZiBzZXR0aW5ncyA9PT0gXCJzdHJpbmdcIikge1xuXHRcdFx0b3RoZXJzID8/PSB7fTtcblx0XHRcdG90aGVycy5pZCA9IHNldHRpbmdzO1xuXHRcdH1cblx0XHRzdXBlcihzZXR0aW5ncyBhcyB1bmtub3duIGFzIHN0cmluZywgb3RoZXJzKTtcblx0fVxuXG5cdHByaXZhdGUgX29sZERvbVJlZjogV2Vha1JlZjxFbGVtZW50PiB8IG51bGwgPSBudWxsO1xuXG5cdHN0YXRpYyByZW5kZXI8VCBleHRlbmRzIENvbnRyb2w+KG9SbTogUmVuZGVyTWFuYWdlciwgb0NvbnRyb2w6IEJ1aWxkaW5nQmxvY2tCYXNlPFQ+KTogdm9pZCB7XG5cdFx0aWYgKCFvQ29udHJvbC5jb250ZW50IHx8IG9Db250cm9sLmdldFZpc2libGUoKSA9PT0gZmFsc2UpIHtcblx0XHRcdEludmlzaWJsZVJlbmRlcmVyLnJlbmRlcihvUm0sIG9Db250cm9sKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0b1JtLnJlbmRlckNvbnRyb2wob0NvbnRyb2wuY29udGVudCk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIE92ZXJyaWRlIHRoZSBiaW5kUHJvcGVydHkgdG8gZGVhbCB3aXRoIHRoZSBjYXNlIHdoZXJlIHRoZSBwcm9wZXJ0eSBpcyBhIGJpbmRpbmcgaW5mby5cblx0ICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgb2YgdGUgcHJvcGVydHlcblx0ICogQHBhcmFtIGJpbmRpbmdJbmZvIFRoZSBiaW5kaW5nIGluZm9cblx0ICogQHJldHVybnMgVGhlIGluc3RhbmNlIG9mIHRoZSBidWlsZGluZyBibG9jayBmb3IgY2hhaW5pbmdcblx0ICovXG5cdG92ZXJyaWRlIGJpbmRQcm9wZXJ0eShuYW1lOiBzdHJpbmcsIGJpbmRpbmdJbmZvOiBQcm9wZXJ0eUJpbmRpbmdJbmZvKTogdGhpcyB7XG5cdFx0Y29uc3QgcHJvcGVydHlNZXRhZGF0YSA9IHRoaXMuZ2V0TWV0YWRhdGEoKS5nZXRQcm9wZXJ0eShuYW1lKTtcblx0XHRpZiAocHJvcGVydHlNZXRhZGF0YT8uYmluZGFibGUgPT09IGZhbHNlICYmIHByb3BlcnR5TWV0YWRhdGEuZ3JvdXAgPT09IFwiRGF0YVwiKSB7XG5cdFx0XHQodGhpcyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilbbmFtZV0gPSBiaW5kaW5nSW5mbztcblx0XHR9IGVsc2Uge1xuXHRcdFx0c3VwZXIuYmluZFByb3BlcnR5KG5hbWUsIGJpbmRpbmdJbmZvKTtcblx0XHR9XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cblxuXHQvL3NldCB0aGUgb2xkIGRvbSByZWZcblx0b3ZlcnJpZGUgb25BZnRlclJlbmRlcmluZyhldmVudDogSlF1ZXJ5LkV2ZW50KTogdm9pZCB7XG5cdFx0Y29uc3QgZG9tUmVmID0gdGhpcy5nZXREb21SZWYoKTtcblx0XHRpZiAoZG9tUmVmKSB7XG5cdFx0XHR0aGlzLl9vbGREb21SZWYgPSBuZXcgV2Vha1JlZihkb21SZWYpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aGlzLl9vbGREb21SZWYgPSBudWxsO1xuXHRcdH1cblx0XHRzdXBlci5vbkFmdGVyUmVuZGVyaW5nKGV2ZW50KTtcblx0fVxuXG5cdG92ZXJyaWRlIGdldERvbVJlZigpOiBFbGVtZW50IHwgbnVsbCB7XG5cdFx0Y29uc3Qgb0NvbnRlbnQgPSB0aGlzLmNvbnRlbnQ7XG5cdFx0bGV0IGRvbVJlZjogRWxlbWVudCB8IG51bGwgPSBvQ29udGVudD8uZ2V0RG9tUmVmKCkgPz8gc3VwZXIuZ2V0RG9tUmVmKCk7XG5cdFx0aWYgKCFkb21SZWYpIHtcblx0XHRcdGRvbVJlZiA9IHRoaXMuX29sZERvbVJlZj8uZGVyZWYoKSA/PyBudWxsO1xuXHRcdFx0aWYgKGRvbVJlZikge1xuXHRcdFx0XHRyZXR1cm4gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZG9tUmVmLmlkKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIGRvbVJlZjtcblx0fVxuXG5cdG92ZXJyaWRlIGdldEZvY3VzRG9tUmVmKCk6IEVsZW1lbnQgfCBudWxsIHtcblx0XHRjb25zdCBvQ29udGVudCA9IHRoaXMuY29udGVudDtcblx0XHRyZXR1cm4gb0NvbnRlbnQgPyBvQ29udGVudC5nZXRGb2N1c0RvbVJlZigpIDogc3VwZXIuZ2V0Rm9jdXNEb21SZWYoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIGFza3MgdXAgdGhlIGNvbnRyb2wgdHJlZSB0byBlbmhhbmNlIHRoZSBhY2Nlc3NpYmlsaXR5IHN0YXRlIG9mIHRoZSBjb250cm9sLlxuXHQgKiBAcGFyYW0gX29FbGVtZW50IFRoZSBlbGVtZW50IHRvIGVuaGFuY2Vcblx0ICogQHBhcmFtIG1BcmlhUHJvcHMgVGhlIGN1cnJlbnQgYXJpYSBwcm9wZXJ0aWVzXG5cdCAqIEByZXR1cm5zIFRoZSBlbmhhbmNlZCBhcmlhIHByb3BlcnRpZXNcblx0ICovXG5cdG92ZXJyaWRlIGVuaGFuY2VBY2Nlc3NpYmlsaXR5U3RhdGUoX29FbGVtZW50OiBvYmplY3QsIG1BcmlhUHJvcHM6IG9iamVjdCk6IG9iamVjdCB7XG5cdFx0Y29uc3Qgb1BhcmVudCA9IHRoaXMuZ2V0UGFyZW50KCk7XG5cblx0XHRpZiAob1BhcmVudCAmJiAob1BhcmVudCBhcyBNYW5hZ2VkT2JqZWN0ICYgeyBlbmhhbmNlQWNjZXNzaWJpbGl0eVN0YXRlPzogRnVuY3Rpb24gfSkuZW5oYW5jZUFjY2Vzc2liaWxpdHlTdGF0ZSkge1xuXHRcdFx0Ly8gZm9yd2FyZCAgZW5oYW5jZUFjY2Vzc2liaWxpdHlTdGF0ZSBjYWxsIHRvIHRoZSBwYXJlbnRcblx0XHRcdChvUGFyZW50IGFzIE1hbmFnZWRPYmplY3QgJiB7IGVuaGFuY2VBY2Nlc3NpYmlsaXR5U3RhdGU6IEZ1bmN0aW9uIH0pLmVuaGFuY2VBY2Nlc3NpYmlsaXR5U3RhdGUoX29FbGVtZW50LCBtQXJpYVByb3BzKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gbUFyaWFQcm9wcztcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIChpZiBhdmFpbGFibGUgb24gdGhlIGNvbmNyZXRlIGNvbnRyb2wpIHByb3ZpZGVzIHRoZSBjdXJyZW50IGFjY2Vzc2liaWxpdHkgc3RhdGUgb2YgdGhlIGNvbnRyb2wuXG5cdCAqIEByZXR1cm5zIFRoZSBhY2Nlc3NpYmlsaXR5IGluZm9ybWF0aW9uIGZvciB0aGUgY29udHJvbC5cblx0ICovXG5cdG92ZXJyaWRlIGdldEFjY2Vzc2liaWxpdHlJbmZvKCk6IE9iamVjdCB7XG5cdFx0bGV0IGFjY2Vzc2liaWxpdHlJbmZvID0ge307XG5cdFx0aWYgKHRoaXMuY29udGVudD8uaXNBPENvbnRyb2w+KFwic2FwLnVpLmNvcmUuQ29udHJvbFwiKSkge1xuXHRcdFx0YWNjZXNzaWJpbGl0eUluZm8gPSB0aGlzLmNvbnRlbnQuZ2V0QWNjZXNzaWJpbGl0eUluZm8oKTtcblx0XHR9XG5cdFx0cmV0dXJuIGFjY2Vzc2liaWxpdHlJbmZvO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHVybnMgdGhlIERPTU5vZGUgSUQgdG8gYmUgdXNlZCBmb3IgdGhlIFwibGFiZWxGb3JcIiBhdHRyaWJ1dGUuXG5cdCAqXG5cdCAqIFdlIGZvcndhcmQgdGhlIGNhbGwgb2YgdGhpcyBtZXRob2QgdG8gdGhlIGNvbnRlbnQgY29udHJvbC5cblx0ICogQHJldHVybnMgSUQgdG8gYmUgdXNlZCBmb3IgdGhlIDxjb2RlPmxhYmVsRm9yPC9jb2RlPlxuXHQgKi9cblx0b3ZlcnJpZGUgZ2V0SWRGb3JMYWJlbCgpOiBzdHJpbmcge1xuXHRcdGlmICh0aGlzLmNvbnRlbnQ/LmlzQTxDb250cm9sPihcInNhcC51aS5jb3JlLkNvbnRyb2xcIikpIHtcblx0XHRcdHJldHVybiB0aGlzLmNvbnRlbnQuZ2V0SWRGb3JMYWJlbCgpO1xuXHRcdH1cblx0XHRyZXR1cm4gXCJcIjtcblx0fVxuXG5cdG92ZXJyaWRlIGFkZFN0eWxlQ2xhc3Moc3R5bGVDbGFzczogc3RyaW5nKTogdGhpcyB7XG5cdFx0KHRoaXMuY29udGVudCBhcyB1bmtub3duIGFzIENvbnRyb2wpPy5hZGRTdHlsZUNsYXNzKHN0eWxlQ2xhc3MpO1xuXHRcdHN1cGVyLmFkZFN0eWxlQ2xhc3Moc3R5bGVDbGFzcyk7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cblxuXHRvdmVycmlkZSByZW1vdmVTdHlsZUNsYXNzKHN0eWxlQ2xhc3M6IHN0cmluZyk6IHRoaXMge1xuXHRcdCh0aGlzLmNvbnRlbnQgYXMgdW5rbm93biBhcyBDb250cm9sKT8ucmVtb3ZlU3R5bGVDbGFzcyhzdHlsZUNsYXNzKTtcblx0XHRzdXBlci5yZW1vdmVTdHlsZUNsYXNzKHN0eWxlQ2xhc3MpO1xuXHRcdHJldHVybiB0aGlzO1xuXHR9XG5cblx0LyoqXG5cdCAqIFNob3J0aGFuZCBmb3IgdGhlIEJpbmRpbmdUb29sa2l0LmJpbmRTdGF0ZSBmdW5jdGlvbiB3aXRoIHRoZSBjdXJyZW50IHN0YXRlIG9iamVjdC5cblx0ICogQHBhcmFtIHBhdGggQSBwcm9wZXJ0eSBpbiB0aGUgc3RhdGUgb2JqZWN0XG5cdCAqIEByZXR1cm5zIFRoZSBiaW5kaW5nIHRvb2xraXQgZXhwcmVzc2lvbiBmb3IgdGhlIHN0YXRlXG5cdCAqL1xuXHRwcm90ZWN0ZWQgYmluZFN0YXRlKHBhdGg6IGtleW9mIEspOiBQYXRoSW5Nb2RlbEV4cHJlc3Npb248UHJpbWl0aXZlVHlwZT4gfCBDb25zdGFudEV4cHJlc3Npb248UHJpbWl0aXZlVHlwZT4ge1xuXHRcdHJldHVybiBCaW5kaW5nVG9vbGtpdC5iaW5kU3RhdGUodGhpcy5zdGF0ZSBhcyBLLCBwYXRoKTtcblx0fVxufVxuXG5leHBvcnQgZGVmYXVsdCBCdWlsZGluZ0Jsb2NrQmFzZTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7O0VBV0E7RUFNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBUEEsSUFTTUEsaUJBQWlCLElBQUFDLElBQUEsR0FEdEJDLGNBQWMsQ0FBQywrQkFBK0IsQ0FBQyxFQUFBQyxLQUFBLEdBRTlDQyxXQUFXLENBQUM7SUFBRUMsSUFBSSxFQUFFLHFCQUFxQjtJQUFFQyxRQUFRLEVBQUUsS0FBSztJQUFFQyxTQUFTLEVBQUU7RUFBSyxDQUFDLENBQUMsRUFBQUMsS0FBQSxHQU05RUMsV0FBVyxDQUFDO0lBQUVKLElBQUksRUFBRSxxQkFBcUI7SUFBRUMsUUFBUSxFQUFFLElBQUk7SUFBRUksWUFBWSxFQUFFO0VBQWlCLENBQUMsQ0FBQyxFQUFBQyxLQUFBLEdBRzVGQyxXQUFXLENBQUMsQ0FBQyxFQUFBWCxJQUFBLENBQUFZLE1BQUEsSUFBQUMsT0FBQSwwQkFBQUMsUUFBQTtJQUFBQyxjQUFBLENBQUFoQixpQkFBQSxFQUFBZSxRQUFBO0lBTmQ7QUFDRDtBQUNBOztJQU9DLFNBQUFmLGtCQUFZaUIsUUFBc0QsRUFBRUMsTUFBMkMsRUFBRTtNQUFBLElBQUFDLEtBQUE7TUFDaEgsSUFBSSxPQUFPRixRQUFRLEtBQUssUUFBUSxF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
@@ -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;