@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.
- package/package.json +1 -1
- package/src/sap/fe/base/.library +1 -1
- package/src/sap/fe/base/BindingToolkit.js +4 -3
- package/src/sap/fe/base/BindingToolkit.ts +7 -12
- package/src/sap/fe/base/BuildingBlockBase.js +191 -0
- package/src/sap/fe/base/BuildingBlockBase.ts +166 -0
- package/src/sap/fe/base/ClassSupport.js +76 -26
- package/src/sap/fe/base/ClassSupport.ts +94 -19
- package/src/sap/fe/base/jsx-runtime/jsx-control.js +3 -1
- package/src/sap/fe/base/jsx-runtime/jsx-control.ts +3 -0
- package/src/sap/fe/base/jsx-runtime/jsx-xml.js +12 -14
- 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
|
@@ -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
|
|
721
|
-
|
|
722
|
-
|
|
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
|
|
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;
|