@sapui5/sap.fe.core 1.101.1 → 1.102.2
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/core/.library +1 -1
- package/src/sap/fe/core/AppComponent.js +5 -5
- package/src/sap/fe/core/AppComponent.ts +19 -18
- package/src/sap/fe/core/AppStateHandler.js +4 -4
- package/src/sap/fe/core/AppStateHandler.ts +9 -9
- package/src/sap/fe/core/CommonUtils.js +59 -93
- package/src/sap/fe/core/CommonUtils.ts +80 -99
- package/src/sap/fe/core/ExtensionAPI.js +2 -4
- package/src/sap/fe/core/ExtensionAPI.ts +1 -3
- package/src/sap/fe/core/PageController.js +14 -9
- package/src/sap/fe/core/PageController.ts +8 -2
- package/src/sap/fe/core/TemplateComponent.js +6 -6
- package/src/sap/fe/core/TemplateComponent.ts +5 -5
- package/src/sap/fe/core/TemplateModel.js +2 -2
- package/src/sap/fe/core/TemplateModel.ts +2 -2
- package/src/sap/fe/core/buildingBlocks/BuildingBlockRuntime.js +303 -75
- package/src/sap/fe/core/buildingBlocks/BuildingBlockRuntime.ts +273 -64
- package/src/sap/fe/core/{BusyLocker.js → controllerextensions/BusyLocker.js} +1 -1
- package/src/sap/fe/core/{BusyLocker.ts → controllerextensions/BusyLocker.ts} +7 -7
- package/src/sap/fe/core/controllerextensions/EditFlow.js +234 -123
- package/src/sap/fe/core/controllerextensions/EditFlow.ts +176 -114
- package/src/sap/fe/core/controllerextensions/InternalEditFlow.js +34 -10
- package/src/sap/fe/core/controllerextensions/InternalEditFlow.ts +44 -12
- package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.js +30 -28
- package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.ts +38 -31
- package/src/sap/fe/core/controllerextensions/InternalRouting.js +157 -102
- package/src/sap/fe/core/controllerextensions/InternalRouting.ts +155 -103
- package/src/sap/fe/core/controllerextensions/MassEdit.js +4 -3
- package/src/sap/fe/core/controllerextensions/MassEdit.ts +15 -14
- package/src/sap/fe/core/controllerextensions/MessageHandler.js +3 -3
- package/src/sap/fe/core/controllerextensions/MessageHandler.ts +10 -2
- package/src/sap/fe/core/controllerextensions/Paginator.js +12 -3
- package/src/sap/fe/core/controllerextensions/Paginator.ts +11 -2
- package/src/sap/fe/core/controllerextensions/Share.js +19 -1
- package/src/sap/fe/core/controllerextensions/Share.ts +18 -0
- package/src/sap/fe/core/controllerextensions/SideEffects.js +2 -2
- package/src/sap/fe/core/controllerextensions/SideEffects.ts +2 -2
- package/src/sap/fe/core/controllerextensions/ViewState.js +11 -1
- package/src/sap/fe/core/controllerextensions/ViewState.ts +10 -0
- package/src/sap/fe/core/controllerextensions/collaboration/ActivityBase.js +105 -0
- package/src/sap/fe/core/controllerextensions/collaboration/ActivityBase.ts +98 -0
- package/src/sap/fe/core/controllerextensions/collaboration/ActivitySync.js +360 -0
- package/src/sap/fe/core/{actions → controllerextensions}/collaboration/ActivitySync.ts +57 -106
- package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon.js +146 -0
- package/src/sap/fe/core/{actions → controllerextensions}/collaboration/CollaborationCommon.ts +6 -6
- package/src/sap/fe/core/{actions → controllerextensions}/collaboration/Manage.js +4 -4
- package/src/sap/fe/core/{actions → controllerextensions}/collaboration/Manage.ts +3 -3
- package/src/sap/fe/core/{actions → controllerextensions}/collaboration/ManageDialog.fragment.xml +0 -0
- package/src/sap/fe/core/{actions → controllerextensions}/collaboration/UserDetails.fragment.xml +5 -7
- package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.js +1587 -0
- package/src/sap/fe/core/{TransactionHelper.ts → controllerextensions/editFlow/TransactionHelper.ts} +26 -13
- package/src/sap/fe/core/controllerextensions/editFlow/draft.js +785 -0
- package/src/sap/fe/core/{actions → controllerextensions/editFlow}/draft.ts +179 -22
- package/src/sap/fe/core/controllerextensions/editFlow/operations.js +1175 -0
- package/src/sap/fe/core/{actions → controllerextensions/editFlow}/operations.ts +203 -98
- package/src/sap/fe/core/controllerextensions/editFlow/sticky.js +190 -0
- package/src/sap/fe/core/{actions → controllerextensions/editFlow}/sticky.ts +76 -12
- package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.js +597 -0
- package/src/sap/fe/core/{actions → controllerextensions/messageHandler}/messageHandling.ts +46 -27
- package/src/sap/fe/core/controllerextensions/routing/RouterProxy.js +940 -0
- package/src/sap/fe/core/{RouterProxy.ts → controllerextensions/routing/RouterProxy.ts} +20 -18
- package/src/sap/fe/core/controls/ActionParameterDialog.fragment.xml +21 -18
- package/src/sap/fe/core/controls/CommandExecution.js +14 -3
- package/src/sap/fe/core/controls/CommandExecution.ts +11 -2
- package/src/sap/fe/core/controls/CustomFilterFieldContentWrapper.js +34 -29
- package/src/sap/fe/core/controls/CustomFilterFieldContentWrapper.ts +33 -29
- package/src/sap/fe/core/controls/CustomQuickViewPage.js +2 -1
- package/src/sap/fe/core/controls/CustomQuickViewPage.ts +1 -0
- package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossDraft.fragment.xml +11 -3
- package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.js +17 -7
- package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.ts +9 -3
- package/src/sap/fe/core/controls/FileWrapper.js +49 -2
- package/src/sap/fe/core/controls/FileWrapper.ts +34 -1
- package/src/sap/fe/core/controls/FormElementWrapper.js +12 -2
- package/src/sap/fe/core/controls/FormElementWrapper.ts +12 -1
- package/src/sap/fe/core/controls/MassEditSelect.js +33 -0
- package/src/sap/fe/core/controls/MassEditSelect.ts +45 -0
- package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.js +2 -2
- package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.ts +23 -28
- package/src/sap/fe/core/controls/massEdit/MassEditDialog.fragment.xml +28 -63
- package/src/sap/fe/core/controls/massEdit/MassEditField.fragment.xml +107 -0
- package/src/sap/fe/core/controls/massEdit/MassEditHandlers.js +550 -36
- package/src/sap/fe/core/controls/massEdit/MassEditHandlers.ts +604 -36
- package/src/sap/fe/core/converters/ManifestSettings.js +2 -1
- package/src/sap/fe/core/converters/ManifestSettings.ts +4 -1
- package/src/sap/fe/core/converters/MetaModelConverter.js +11 -40
- package/src/sap/fe/core/converters/MetaModelConverter.ts +56 -84
- package/src/sap/fe/core/converters/annotations/DataField.js +20 -4
- package/src/sap/fe/core/converters/annotations/DataField.ts +24 -2
- package/src/sap/fe/core/converters/controls/Common/Action.js +5 -12
- package/src/sap/fe/core/converters/controls/Common/Action.ts +3 -9
- package/src/sap/fe/core/converters/controls/Common/Chart.js +10 -3
- package/src/sap/fe/core/converters/controls/Common/Chart.ts +8 -3
- package/src/sap/fe/core/converters/controls/Common/Form.js +12 -14
- package/src/sap/fe/core/converters/controls/Common/Form.ts +17 -19
- package/src/sap/fe/core/converters/controls/Common/Table.js +149 -66
- package/src/sap/fe/core/converters/controls/Common/Table.ts +136 -52
- package/src/sap/fe/core/converters/controls/Common/table/StandardActions.js +22 -12
- package/src/sap/fe/core/converters/controls/Common/table/StandardActions.ts +23 -12
- package/src/sap/fe/core/converters/controls/ListReport/FilterBar.js +7 -5
- package/src/sap/fe/core/converters/controls/ListReport/FilterBar.ts +15 -10
- package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.js +26 -24
- package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.ts +35 -33
- package/src/sap/fe/core/converters/helpers/Aggregation.js +10 -2
- package/src/sap/fe/core/converters/helpers/Aggregation.ts +18 -13
- package/src/sap/fe/core/converters/helpers/BindingHelper.js +3 -2
- package/src/sap/fe/core/converters/helpers/BindingHelper.ts +6 -5
- package/src/sap/fe/core/converters/templates/ObjectPageConverter.js +25 -25
- package/src/sap/fe/core/converters/templates/ObjectPageConverter.ts +35 -38
- package/src/sap/fe/core/designtime/AppComponent.designtime.js +3 -3
- package/src/sap/fe/core/designtime/AppComponent.designtime.ts +8 -6
- package/src/sap/fe/core/formatters/TableFormatter.js +73 -12
- package/src/sap/fe/core/formatters/TableFormatter.ts +70 -15
- package/src/sap/fe/core/fpm/Component.js +2 -2
- package/src/sap/fe/core/fpm/Component.ts +1 -1
- package/src/sap/fe/core/helpers/BindingExpression.js +10 -7
- package/src/sap/fe/core/helpers/BindingExpression.ts +37 -35
- package/src/sap/fe/core/helpers/ClassSupport.js +1 -1
- package/src/sap/fe/core/helpers/ClassSupport.ts +1 -0
- package/src/sap/fe/core/helpers/FPMHelper.js +3 -2
- package/src/sap/fe/core/helpers/FPMHelper.ts +9 -8
- package/src/sap/fe/core/helpers/MassEditHelper.js +399 -152
- package/src/sap/fe/core/helpers/MassEditHelper.ts +385 -163
- package/src/sap/fe/core/helpers/ModelHelper.js +1 -1
- package/src/sap/fe/core/helpers/ModelHelper.ts +20 -30
- package/src/sap/fe/core/helpers/StableIdHelper.js +5 -1
- package/src/sap/fe/core/helpers/StableIdHelper.ts +8 -4
- package/src/sap/fe/core/{Synchronization.js → helpers/Synchronization.js} +1 -1
- package/src/sap/fe/core/{Synchronization.ts → helpers/Synchronization.ts} +1 -1
- package/src/sap/fe/core/library.js +12 -3
- package/src/sap/fe/core/library.ts +9 -0
- package/src/sap/fe/core/messagebundle.properties +125 -180
- package/src/sap/fe/core/messagebundle_ar.properties +30 -63
- package/src/sap/fe/core/messagebundle_bg.properties +30 -63
- package/src/sap/fe/core/messagebundle_ca.properties +30 -63
- package/src/sap/fe/core/messagebundle_cs.properties +30 -63
- package/src/sap/fe/core/messagebundle_cy.properties +30 -63
- package/src/sap/fe/core/messagebundle_da.properties +31 -64
- package/src/sap/fe/core/messagebundle_de.properties +30 -63
- package/src/sap/fe/core/messagebundle_el.properties +31 -64
- package/src/sap/fe/core/messagebundle_en.properties +31 -64
- package/src/sap/fe/core/messagebundle_en_GB.properties +31 -64
- package/src/sap/fe/core/messagebundle_en_US_sappsd.properties +40 -73
- package/src/sap/fe/core/messagebundle_en_US_saprigi.properties +31 -64
- package/src/sap/fe/core/messagebundle_en_US_saptrc.properties +49 -82
- package/src/sap/fe/core/messagebundle_es.properties +30 -63
- package/src/sap/fe/core/messagebundle_es_MX.properties +30 -63
- package/src/sap/fe/core/messagebundle_et.properties +30 -63
- package/src/sap/fe/core/messagebundle_fi.properties +30 -63
- package/src/sap/fe/core/messagebundle_fr.properties +33 -66
- package/src/sap/fe/core/messagebundle_fr_CA.properties +30 -63
- package/src/sap/fe/core/messagebundle_hi.properties +30 -63
- package/src/sap/fe/core/messagebundle_hr.properties +30 -63
- package/src/sap/fe/core/messagebundle_hu.properties +29 -62
- package/src/sap/fe/core/messagebundle_id.properties +31 -64
- package/src/sap/fe/core/messagebundle_it.properties +30 -63
- package/src/sap/fe/core/messagebundle_iw.properties +30 -63
- package/src/sap/fe/core/messagebundle_ja.properties +30 -63
- package/src/sap/fe/core/messagebundle_kk.properties +30 -63
- package/src/sap/fe/core/messagebundle_ko.properties +30 -63
- package/src/sap/fe/core/messagebundle_lt.properties +30 -63
- package/src/sap/fe/core/messagebundle_lv.properties +30 -63
- package/src/sap/fe/core/messagebundle_ms.properties +31 -64
- package/src/sap/fe/core/messagebundle_nl.properties +31 -64
- package/src/sap/fe/core/messagebundle_no.properties +30 -63
- package/src/sap/fe/core/messagebundle_pl.properties +31 -64
- package/src/sap/fe/core/messagebundle_pt.properties +31 -64
- package/src/sap/fe/core/messagebundle_pt_PT.properties +30 -63
- package/src/sap/fe/core/messagebundle_ro.properties +30 -63
- package/src/sap/fe/core/messagebundle_ru.properties +30 -63
- package/src/sap/fe/core/messagebundle_sh.properties +30 -63
- package/src/sap/fe/core/messagebundle_sk.properties +30 -63
- package/src/sap/fe/core/messagebundle_sl.properties +32 -65
- package/src/sap/fe/core/messagebundle_sv.properties +30 -63
- package/src/sap/fe/core/messagebundle_th.properties +30 -63
- package/src/sap/fe/core/messagebundle_tr.properties +30 -63
- package/src/sap/fe/core/messagebundle_uk.properties +31 -64
- package/src/sap/fe/core/messagebundle_vi.properties +31 -64
- package/src/sap/fe/core/messagebundle_zh_CN.properties +30 -63
- package/src/sap/fe/core/messagebundle_zh_TW.properties +31 -64
- package/src/sap/fe/core/services/EnvironmentServiceFactory.js +6 -3
- package/src/sap/fe/core/services/EnvironmentServiceFactory.ts +10 -9
- package/src/sap/fe/core/services/NavigationServiceFactory.js +2 -2
- package/src/sap/fe/core/services/NavigationServiceFactory.ts +8 -4
- package/src/sap/fe/core/services/RoutingServiceFactory.js +9 -6
- package/src/sap/fe/core/services/RoutingServiceFactory.ts +10 -9
- package/src/sap/fe/core/services/ShellServicesFactory.js +36 -1
- package/src/sap/fe/core/services/ShellServicesFactory.ts +38 -1
- package/src/sap/fe/core/services/TemplatedViewServiceFactory.js +5 -4
- package/src/sap/fe/core/services/TemplatedViewServiceFactory.ts +34 -36
- package/src/sap/fe/core/templating/DisplayModeFormatter.js +1 -1
- package/src/sap/fe/core/templating/DisplayModeFormatter.ts +1 -1
- package/src/sap/fe/core/templating/EntitySetHelper.js +1 -9
- package/src/sap/fe/core/templating/EntitySetHelper.ts +11 -13
- package/src/sap/fe/core/templating/FilterHelper.js +4 -4
- package/src/sap/fe/core/templating/FilterHelper.ts +6 -5
- package/src/sap/fe/core/templating/PropertyHelper.js +58 -35
- package/src/sap/fe/core/templating/PropertyHelper.ts +19 -4
- package/src/sap/fe/core/templating/UIFormatters.js +16 -5
- package/src/sap/fe/core/templating/UIFormatters.ts +14 -5
- package/src/sap/fe/core/type/DateTimeWithTimezone.js +47 -0
- package/src/sap/fe/core/type/DateTimeWithTimezone.ts +23 -0
- package/src/sap/fe/core/AnnotationHelper.js +0 -331
- package/src/sap/fe/core/AnnotationHelper.ts +0 -321
- package/src/sap/fe/core/RouterProxy.js +0 -938
- package/src/sap/fe/core/TransactionHelper.js +0 -1577
- package/src/sap/fe/core/actions/collaboration/ActivitySync.js +0 -406
- package/src/sap/fe/core/actions/collaboration/CollaborationCommon.js +0 -146
- package/src/sap/fe/core/actions/draft.js +0 -665
- package/src/sap/fe/core/actions/messageHandling.js +0 -579
- package/src/sap/fe/core/actions/nonDraft.js +0 -20
- package/src/sap/fe/core/actions/nonDraft.ts +0 -12
- package/src/sap/fe/core/actions/operations.js +0 -1096
- package/src/sap/fe/core/actions/sticky.js +0 -130
- package/src/sap/fe/core/formatters/CriticalityFormatter.js +0 -77
- package/src/sap/fe/core/formatters/CriticalityFormatter.ts +0 -58
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import Log from "sap/base/Log";
|
|
2
|
+
import uid from "sap/base/util/uid";
|
|
2
3
|
import AttributeModel from "sap/fe/core/buildingBlocks/AttributeModel";
|
|
3
4
|
import {
|
|
4
5
|
BuildingBlockAggregationDefinition,
|
|
@@ -9,19 +10,23 @@ import {
|
|
|
9
10
|
BuildingBlockMetadataContextDefinition,
|
|
10
11
|
BuildingBlockPropertyDefinition
|
|
11
12
|
} from "sap/fe/core/buildingBlocks/BuildingBlock";
|
|
13
|
+
import { compileBinding } from "sap/fe/core/helpers/BindingExpression";
|
|
12
14
|
import ResourceModel from "sap/fe/macros/ResourceModel";
|
|
13
15
|
import BindingParser from "sap/ui/base/BindingParser";
|
|
14
16
|
import XMLPreprocessor from "sap/ui/core/util/XMLPreprocessor";
|
|
17
|
+
import Context from "sap/ui/model/Context";
|
|
15
18
|
import JSONModel from "sap/ui/model/json/JSONModel";
|
|
16
19
|
import TraceInfo from "./TraceInfo";
|
|
17
20
|
|
|
18
21
|
const LOGGER_SCOPE = "sap.fe.core.buildingBlocks.BuildingBlockRuntime";
|
|
19
22
|
const DOMParserInstance = new DOMParser();
|
|
23
|
+
let isTraceMode = false;
|
|
20
24
|
|
|
21
25
|
type ResolvedBuildingBlockMetadata = {
|
|
22
26
|
properties: Record<string, BuildingBlockPropertyDefinition>;
|
|
23
27
|
aggregations: Record<string, BuildingBlockAggregationDefinition>;
|
|
24
28
|
metadataContexts: Record<string, BuildingBlockMetadataContextDefinition>;
|
|
29
|
+
isOpen: boolean;
|
|
25
30
|
};
|
|
26
31
|
|
|
27
32
|
type ICallback = {
|
|
@@ -77,6 +82,7 @@ type ICallback = {
|
|
|
77
82
|
* model which is not available) (since 1.57.0)
|
|
78
83
|
*/
|
|
79
84
|
getResult(sValue: string, element?: Element): Promise<any> | null;
|
|
85
|
+
getContext(sPath: string): Context;
|
|
80
86
|
/**
|
|
81
87
|
* Returns a callback interface instance for the given map of variables which
|
|
82
88
|
* override currently known variables of the same name in <code>this</code>
|
|
@@ -185,9 +191,10 @@ export function validateMacroSignature(sName: any, oMetadata: any, mContexts: an
|
|
|
185
191
|
* Ensures that the metadata for the building block are properly defined.
|
|
186
192
|
*
|
|
187
193
|
* @param buildingBlockMetadata The metadata received from the input
|
|
194
|
+
* @param isOpen Whether the building block is open or not
|
|
188
195
|
* @returns A set of completed metadata for further processing
|
|
189
196
|
*/
|
|
190
|
-
function prepareMetadata(buildingBlockMetadata?: BuildingBlockMetadata): ResolvedBuildingBlockMetadata {
|
|
197
|
+
function prepareMetadata(buildingBlockMetadata?: BuildingBlockMetadata, isOpen = false): ResolvedBuildingBlockMetadata {
|
|
191
198
|
if (buildingBlockMetadata) {
|
|
192
199
|
const oProperties: any = {};
|
|
193
200
|
const oAggregations: any = {
|
|
@@ -221,7 +228,8 @@ function prepareMetadata(buildingBlockMetadata?: BuildingBlockMetadata): Resolve
|
|
|
221
228
|
return {
|
|
222
229
|
properties: oProperties,
|
|
223
230
|
aggregations: oAggregations,
|
|
224
|
-
metadataContexts: oMetadataContexts
|
|
231
|
+
metadataContexts: oMetadataContexts,
|
|
232
|
+
isOpen: isOpen
|
|
225
233
|
};
|
|
226
234
|
} else {
|
|
227
235
|
return {
|
|
@@ -234,12 +242,20 @@ function prepareMetadata(buildingBlockMetadata?: BuildingBlockMetadata): Resolve
|
|
|
234
242
|
type: "sap.ui.core.Element"
|
|
235
243
|
}
|
|
236
244
|
},
|
|
237
|
-
properties: {}
|
|
245
|
+
properties: {},
|
|
246
|
+
isOpen: isOpen
|
|
238
247
|
};
|
|
239
248
|
}
|
|
240
249
|
}
|
|
241
250
|
|
|
242
|
-
function _getMetadataContext(
|
|
251
|
+
function _getMetadataContext(
|
|
252
|
+
oSettings: any,
|
|
253
|
+
oNode: Element,
|
|
254
|
+
sAttributeName: string,
|
|
255
|
+
oVisitor: ICallback,
|
|
256
|
+
bDoNotResolve: boolean,
|
|
257
|
+
isOpen: boolean
|
|
258
|
+
) {
|
|
243
259
|
let oMetadataContext;
|
|
244
260
|
if (!bDoNotResolve && oNode.hasAttribute(sAttributeName)) {
|
|
245
261
|
const sAttributeValue = oNode.getAttribute(sAttributeName) as string;
|
|
@@ -247,7 +263,15 @@ function _getMetadataContext(oSettings: any, oNode: Element, sAttributeName: str
|
|
|
247
263
|
// oVisitor.getResult(sAttributeValue, oNode);
|
|
248
264
|
oMetadataContext = BindingParser.complexParser(sAttributeValue);
|
|
249
265
|
if (!oMetadataContext) {
|
|
250
|
-
if ((
|
|
266
|
+
if (sAttributeValue.startsWith("uid--")) {
|
|
267
|
+
const oData = myStore[sAttributeValue];
|
|
268
|
+
const sContextPath = "/" + sAttributeValue;
|
|
269
|
+
oSettings.models.converterContext.setProperty(sContextPath, oData);
|
|
270
|
+
oMetadataContext = {
|
|
271
|
+
model: "converterContext",
|
|
272
|
+
path: sContextPath
|
|
273
|
+
};
|
|
274
|
+
} else if ((sAttributeName === "metaPath" && oSettings.currentContextPath) || sAttributeName === "contextPath") {
|
|
251
275
|
if (sAttributeValue && sAttributeValue.startsWith("/")) {
|
|
252
276
|
// absolute path - we just use this one
|
|
253
277
|
sMetaPath = sAttributeValue;
|
|
@@ -276,6 +300,17 @@ function _getMetadataContext(oSettings: any, oNode: Element, sAttributeName: str
|
|
|
276
300
|
model: sAttributeName,
|
|
277
301
|
path: ""
|
|
278
302
|
};
|
|
303
|
+
} else if (isOpen) {
|
|
304
|
+
try {
|
|
305
|
+
if (oVisitor.getContext(`${sAttributeName}>`)) {
|
|
306
|
+
oMetadataContext = {
|
|
307
|
+
model: sAttributeName,
|
|
308
|
+
path: ""
|
|
309
|
+
};
|
|
310
|
+
}
|
|
311
|
+
} catch (e) {
|
|
312
|
+
oMetadataContext = undefined;
|
|
313
|
+
}
|
|
279
314
|
}
|
|
280
315
|
return oMetadataContext;
|
|
281
316
|
}
|
|
@@ -319,10 +354,9 @@ async function processProperties(
|
|
|
319
354
|
aDefinitionContextsKeys = aDefinitionContextsKeys.sort(function (a: string, b: string) {
|
|
320
355
|
return a > b ? 1 : -1;
|
|
321
356
|
});
|
|
322
|
-
for (
|
|
323
|
-
const sAttributeName = aDefinitionContextsKeys[j];
|
|
357
|
+
for (const sAttributeName of aDefinitionContextsKeys) {
|
|
324
358
|
const bDoNotResolve = isPublic && !oDefinitionContexts[sAttributeName].isPublic && oNode.hasAttribute(sAttributeName);
|
|
325
|
-
const oMetadataContext = _getMetadataContext(oSettings, oNode, sAttributeName, oVisitor, bDoNotResolve);
|
|
359
|
+
const oMetadataContext = _getMetadataContext(oSettings, oNode, sAttributeName, oVisitor, bDoNotResolve, oMetadata.isOpen);
|
|
326
360
|
if (oMetadataContext) {
|
|
327
361
|
oMetadataContext.name = sAttributeName;
|
|
328
362
|
addSingleContext(mContexts, oVisitor, oMetadataContext, oMetadataContexts);
|
|
@@ -340,7 +374,7 @@ async function processProperties(
|
|
|
340
374
|
mMissingContext[sAttributeName] = true;
|
|
341
375
|
}
|
|
342
376
|
}
|
|
343
|
-
return { mMissingContext, propertyValues };
|
|
377
|
+
return { mMissingContext, propertyValues: propertyValues };
|
|
344
378
|
}
|
|
345
379
|
|
|
346
380
|
async function processChildren(
|
|
@@ -383,43 +417,43 @@ async function processBuildingBlock(
|
|
|
383
417
|
oVisitor: ICallback,
|
|
384
418
|
isPublic = false
|
|
385
419
|
) {
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
.
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
.
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
const oMetadata = prepareMetadata(buildingBLockDefinition.metadata);
|
|
406
|
-
|
|
407
|
-
//Inject storage for macros
|
|
408
|
-
if (!oSettings[sFragmentName]) {
|
|
409
|
-
oSettings[sFragmentName] = {};
|
|
410
|
-
}
|
|
420
|
+
const sFragmentName = buildingBLockDefinition.fragment || `${buildingBLockDefinition.namespace}.${buildingBLockDefinition.name}`;
|
|
421
|
+
|
|
422
|
+
const sName = "this";
|
|
423
|
+
|
|
424
|
+
const mContexts: any = {};
|
|
425
|
+
const oMetadataContexts: any = {};
|
|
426
|
+
const oSettings = oVisitor.getSettings();
|
|
427
|
+
// TODO 0001 Move this elsewhere this is weird :)
|
|
428
|
+
if (oSettings.models["sap.fe.i18n"]) {
|
|
429
|
+
oSettings.models["sap.fe.i18n"]
|
|
430
|
+
.getResourceBundle()
|
|
431
|
+
.then(function (oResourceBundle: any) {
|
|
432
|
+
ResourceModel.setApplicationI18nBundle(oResourceBundle);
|
|
433
|
+
})
|
|
434
|
+
.catch(function (error: any) {
|
|
435
|
+
Log.error(error);
|
|
436
|
+
});
|
|
437
|
+
}
|
|
438
|
+
const oMetadata = prepareMetadata(buildingBLockDefinition.metadata, buildingBLockDefinition.isOpen);
|
|
411
439
|
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
oNode,
|
|
417
|
-
isPublic,
|
|
418
|
-
oVisitor,
|
|
419
|
-
mContexts,
|
|
420
|
-
oMetadataContexts
|
|
421
|
-
);
|
|
440
|
+
//Inject storage for macros
|
|
441
|
+
if (!oSettings[sFragmentName]) {
|
|
442
|
+
oSettings[sFragmentName] = {};
|
|
443
|
+
}
|
|
422
444
|
|
|
445
|
+
// First of all we need to visit the attributes
|
|
446
|
+
const { mMissingContext, propertyValues } = await processProperties(
|
|
447
|
+
oMetadata,
|
|
448
|
+
oSettings,
|
|
449
|
+
oNode,
|
|
450
|
+
isPublic,
|
|
451
|
+
oVisitor,
|
|
452
|
+
mContexts,
|
|
453
|
+
oMetadataContexts
|
|
454
|
+
);
|
|
455
|
+
const initialKeys = Object.keys(propertyValues);
|
|
456
|
+
try {
|
|
423
457
|
// Aggregation and complex type support
|
|
424
458
|
const oAggregations = await processChildren(oNode, oVisitor, oMetadata, isPublic, propertyValues);
|
|
425
459
|
let oInstance: any;
|
|
@@ -429,9 +463,9 @@ async function processBuildingBlock(
|
|
|
429
463
|
// Only used in the Field macro and even then maybe not really useful
|
|
430
464
|
oControlConfig = oSettings.models.viewData.getProperty("/controlConfiguration");
|
|
431
465
|
}
|
|
432
|
-
|
|
466
|
+
let processedPropertyValues = propertyValues;
|
|
433
467
|
if (isV1MacroDef(buildingBLockDefinition) && buildingBLockDefinition.create) {
|
|
434
|
-
|
|
468
|
+
processedPropertyValues = buildingBLockDefinition.create.call(
|
|
435
469
|
buildingBLockDefinition,
|
|
436
470
|
propertyValues,
|
|
437
471
|
oControlConfig,
|
|
@@ -441,12 +475,12 @@ async function processBuildingBlock(
|
|
|
441
475
|
);
|
|
442
476
|
Object.keys(oMetadata.metadataContexts).forEach(function (sMetadataName: string) {
|
|
443
477
|
if (oMetadata.metadataContexts[sMetadataName].computed) {
|
|
444
|
-
mContexts[sMetadataName] =
|
|
478
|
+
mContexts[sMetadataName] = processedPropertyValues[sMetadataName];
|
|
445
479
|
}
|
|
446
480
|
});
|
|
447
481
|
Object.keys(mMissingContext).forEach(function (sContextName: string) {
|
|
448
|
-
if (
|
|
449
|
-
mContexts[sContextName] =
|
|
482
|
+
if (processedPropertyValues.hasOwnProperty(sContextName)) {
|
|
483
|
+
mContexts[sContextName] = processedPropertyValues[sContextName];
|
|
450
484
|
}
|
|
451
485
|
});
|
|
452
486
|
} else if (buildingBLockDefinition.apiVersion === 2) {
|
|
@@ -464,7 +498,7 @@ async function processBuildingBlock(
|
|
|
464
498
|
const BuildingBlockClass = buildingBLockDefinition as typeof BuildingBlockBase;
|
|
465
499
|
oInstance = new BuildingBlockClass(propertyValues /*, oControlConfig, oSettings, oAggregations, isPublic*/);
|
|
466
500
|
}
|
|
467
|
-
const oAttributesModel: JSONModel = new AttributeModel(oNode,
|
|
501
|
+
const oAttributesModel: JSONModel = new AttributeModel(oNode, processedPropertyValues, buildingBLockDefinition);
|
|
468
502
|
mContexts[sName] = oAttributesModel.createBindingContext("/");
|
|
469
503
|
|
|
470
504
|
let oPreviousMacroInfo: any;
|
|
@@ -495,17 +529,55 @@ async function processBuildingBlock(
|
|
|
495
529
|
buildingBLockDefinition.apiVersion === 2
|
|
496
530
|
) {
|
|
497
531
|
let oTemplate;
|
|
532
|
+
let addDefaultNamespace = false;
|
|
498
533
|
if (buildingBLockDefinition.apiVersion === 2) {
|
|
499
534
|
oTemplate = oInstance.getTemplate();
|
|
535
|
+
addDefaultNamespace = true;
|
|
500
536
|
} else if (buildingBLockDefinition.getTemplate) {
|
|
501
|
-
oTemplate = buildingBLockDefinition.getTemplate(
|
|
537
|
+
oTemplate = buildingBLockDefinition.getTemplate(processedPropertyValues);
|
|
502
538
|
}
|
|
503
539
|
|
|
540
|
+
let hasError = "";
|
|
504
541
|
if (oTemplate) {
|
|
505
542
|
if (!oTemplate.firstElementChild) {
|
|
506
|
-
oTemplate =
|
|
543
|
+
oTemplate = parseXMLString(oTemplate, addDefaultNamespace);
|
|
544
|
+
// For safety purpose we try to detect trailing text in between XML Tags
|
|
545
|
+
const iter = document.createNodeIterator(oTemplate, NodeFilter.SHOW_TEXT);
|
|
546
|
+
let textnode = iter.nextNode();
|
|
547
|
+
while (textnode) {
|
|
548
|
+
if (textnode.textContent && textnode.textContent.trim().length > 0) {
|
|
549
|
+
hasError = textnode.textContent;
|
|
550
|
+
}
|
|
551
|
+
textnode = iter.nextNode();
|
|
552
|
+
}
|
|
507
553
|
}
|
|
508
|
-
|
|
554
|
+
|
|
555
|
+
if (oTemplate.localName === "parsererror") {
|
|
556
|
+
// If there is a parseerror while processing the XML it means the XML itself is malformed, as such we rerun the template process
|
|
557
|
+
// Setting isTraceMode true will make it so that each xml` expression is checked for validity from XML perspective and if an error is found it's returned instead of the normal fragment
|
|
558
|
+
Log.error(`Error while processing building block ${buildingBLockDefinition.name}`);
|
|
559
|
+
try {
|
|
560
|
+
isTraceMode = true;
|
|
561
|
+
oTemplate = oInstance?.getTemplate
|
|
562
|
+
? oInstance.getTemplate()
|
|
563
|
+
: (buildingBLockDefinition as any).getTemplate(processedPropertyValues);
|
|
564
|
+
oTemplate = parseXMLString(oTemplate, true);
|
|
565
|
+
} finally {
|
|
566
|
+
isTraceMode = false;
|
|
567
|
+
}
|
|
568
|
+
} else if (hasError.length > 0) {
|
|
569
|
+
// If there is trailing text we create a standard error and display it.
|
|
570
|
+
Log.error(`Error while processing building block ${buildingBLockDefinition.name}`);
|
|
571
|
+
const oErrorText = createErrorXML(
|
|
572
|
+
[
|
|
573
|
+
`Error while processing building block ${buildingBLockDefinition.name}`,
|
|
574
|
+
`Trailing text was found in the XML: ${hasError}`
|
|
575
|
+
],
|
|
576
|
+
oTemplate.outerHTML
|
|
577
|
+
);
|
|
578
|
+
oTemplate = parseXMLString(oErrorText, true);
|
|
579
|
+
}
|
|
580
|
+
oNode.replaceWith(oTemplate);
|
|
509
581
|
oNode = oParent.children[iChildIndex];
|
|
510
582
|
oPromise = oContextVisitor.visitNode(oNode);
|
|
511
583
|
} else {
|
|
@@ -550,15 +622,53 @@ async function processBuildingBlock(
|
|
|
550
622
|
oSlotElement.remove();
|
|
551
623
|
});
|
|
552
624
|
}
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
625
|
+
}
|
|
626
|
+
if (oPreviousMacroInfo) {
|
|
627
|
+
//restore macro info if available
|
|
628
|
+
oSettings["_macroInfo"] = oPreviousMacroInfo;
|
|
629
|
+
} else {
|
|
630
|
+
delete oSettings["_macroInfo"];
|
|
631
|
+
}
|
|
632
|
+
} catch (e) {
|
|
633
|
+
// In case there is a generic error (usually code error), we retrieve the current context information and create a dedicated error message
|
|
634
|
+
const traceDetails = {
|
|
635
|
+
initialProperties: {} as any,
|
|
636
|
+
resolvedProperties: {} as any,
|
|
637
|
+
missingContexts: mMissingContext
|
|
638
|
+
};
|
|
639
|
+
for (const propertyName of initialKeys) {
|
|
640
|
+
const propertyValue = propertyValues[propertyName];
|
|
641
|
+
if (propertyValue && propertyValue.isA && propertyValue.isA("sap.ui.model.Context")) {
|
|
642
|
+
traceDetails.initialProperties[propertyName] = {
|
|
643
|
+
path: propertyValue.getPath(),
|
|
644
|
+
value: propertyValue.getObject()
|
|
645
|
+
};
|
|
556
646
|
} else {
|
|
557
|
-
|
|
647
|
+
traceDetails.initialProperties[propertyName] = propertyValue;
|
|
558
648
|
}
|
|
559
649
|
}
|
|
560
|
-
|
|
561
|
-
|
|
650
|
+
for (const propertyName in propertyValues) {
|
|
651
|
+
const propertyValue = propertyValues[propertyName];
|
|
652
|
+
if (!initialKeys.includes(propertyName)) {
|
|
653
|
+
if (propertyValue && propertyValue.isA && propertyValue.isA("sap.ui.model.Context")) {
|
|
654
|
+
traceDetails.resolvedProperties[propertyName] = {
|
|
655
|
+
path: propertyValue.getPath(),
|
|
656
|
+
value: propertyValue.getObject()
|
|
657
|
+
};
|
|
658
|
+
} else {
|
|
659
|
+
traceDetails.resolvedProperties[propertyName] = propertyValue;
|
|
660
|
+
}
|
|
661
|
+
}
|
|
662
|
+
}
|
|
663
|
+
const errorAny = e as any;
|
|
664
|
+
Log.error(errorAny, errorAny);
|
|
665
|
+
const oError = createErrorXML(
|
|
666
|
+
[`Error while processing building block ${buildingBLockDefinition.name}`, errorAny.stack],
|
|
667
|
+
oNode.outerHTML,
|
|
668
|
+
traceDetails
|
|
669
|
+
);
|
|
670
|
+
const oTemplate = parseXMLString(oError, true);
|
|
671
|
+
oNode.replaceWith(oTemplate as any);
|
|
562
672
|
}
|
|
563
673
|
}
|
|
564
674
|
function addSingleContext(mContexts: any, oVisitor: any, oCtx: any, oMetadataContexts: any) {
|
|
@@ -584,7 +694,7 @@ function addSingleContext(mContexts: any, oVisitor: any, oCtx: any, oMetadataCon
|
|
|
584
694
|
//console.error(ex);
|
|
585
695
|
// ignore the context as this can only be the case if the model is not ready, i.e. not a preprocessing model but maybe a model for
|
|
586
696
|
// providing afterwards
|
|
587
|
-
// TODO not yet implemented
|
|
697
|
+
// TODO 0002 not yet implemented
|
|
588
698
|
//mContexts["_$error"].oModel.setProperty("/" + sKey, ex);
|
|
589
699
|
}
|
|
590
700
|
}
|
|
@@ -609,20 +719,119 @@ export function registerBuildingBlock(buildingBlockDefinition: BuildingBlockDefi
|
|
|
609
719
|
}
|
|
610
720
|
}
|
|
611
721
|
|
|
722
|
+
function createErrorXML(errorMessages: string[], xmlFragment: string, additionalData?: object): string {
|
|
723
|
+
const errorLabels = errorMessages.map((errorMessage) => xml`<m:Label text="${escapeXML(errorMessage)}"/>`);
|
|
724
|
+
let additionalText = "";
|
|
725
|
+
if (additionalData) {
|
|
726
|
+
additionalText = xml`<m:VBox>
|
|
727
|
+
<m:Label text="Trace Info"/>
|
|
728
|
+
<code:CodeEditor type="json" value="${escapeXML(JSON.stringify(additionalData, null, 4))}" height="300px" width="100vh"/>
|
|
729
|
+
</m:VBox>`;
|
|
730
|
+
}
|
|
731
|
+
return xml`<m:VBox xmlns:m="sap.m" xmlns:code="sap.ui.codeeditor">
|
|
732
|
+
${errorLabels}
|
|
733
|
+
<m:HBox>
|
|
734
|
+
<m:VBox>
|
|
735
|
+
<m:Label text="How the building block was called"/>
|
|
736
|
+
<code:CodeEditor type="xml" value="${escapeXML(xmlFragment)}" height="300px" width="100vh"/>
|
|
737
|
+
</m:VBox>
|
|
738
|
+
${additionalText}
|
|
739
|
+
</m:HBox>
|
|
740
|
+
</m:VBox>`;
|
|
741
|
+
}
|
|
742
|
+
|
|
743
|
+
const myStore: Record<string, any> = {};
|
|
744
|
+
function storeValue(values: any) {
|
|
745
|
+
const propertyUID = `uid--${uid()}`;
|
|
746
|
+
myStore[propertyUID] = values;
|
|
747
|
+
return propertyUID;
|
|
748
|
+
}
|
|
749
|
+
|
|
612
750
|
/**
|
|
613
|
-
*
|
|
751
|
+
* Parse an XML string and return the associated document.
|
|
752
|
+
*
|
|
753
|
+
* @param xmlString The xml string
|
|
754
|
+
* @param addDefaultNamespaces Whether or not we should add default namespace
|
|
755
|
+
* @returns The XML document.
|
|
756
|
+
*/
|
|
757
|
+
function parseXMLString(xmlString: string, addDefaultNamespaces = false): Element {
|
|
758
|
+
if (addDefaultNamespaces) {
|
|
759
|
+
xmlString = `<template
|
|
760
|
+
xmlns:template="http://schemas.sap.com/sapui5/extension/sap.ui.core.template/1"
|
|
761
|
+
xmlns:m="sap.m"
|
|
762
|
+
xmlns:core="sap.ui.core"
|
|
763
|
+
xmlns:customData="http://schemas.sap.com/sapui5/extension/sap.ui.core.CustomData/1">${xmlString}</template>`;
|
|
764
|
+
}
|
|
765
|
+
const xmlDocument = DOMParserInstance.parseFromString(xmlString, "text/xml");
|
|
766
|
+
let output = xmlDocument.firstElementChild;
|
|
767
|
+
while (output?.localName === "template") {
|
|
768
|
+
output = output.firstElementChild;
|
|
769
|
+
}
|
|
770
|
+
return output as Element;
|
|
771
|
+
}
|
|
772
|
+
|
|
773
|
+
/**
|
|
774
|
+
* Escape an XML string to include it in an XML fragment.
|
|
775
|
+
*
|
|
776
|
+
* @param str The string to escape
|
|
777
|
+
* @returns The escaped string.
|
|
778
|
+
*/
|
|
779
|
+
function escapeXML(str: string): string {
|
|
780
|
+
return str
|
|
781
|
+
.replace(/&/g, "&")
|
|
782
|
+
.replace(/</g, "<")
|
|
783
|
+
.replace(/\n/g, " ")
|
|
784
|
+
.replace(/\{/g, "\\{")
|
|
785
|
+
.replace(/>/g, ">")
|
|
786
|
+
.replace(/"/g, """)
|
|
787
|
+
.replace(/'/g, "'");
|
|
788
|
+
}
|
|
789
|
+
|
|
790
|
+
/**
|
|
791
|
+
* Escape an XML attribute value.
|
|
792
|
+
*
|
|
793
|
+
* @param val The attribute value to escape.
|
|
794
|
+
* @returns The escaped string.
|
|
795
|
+
*/
|
|
796
|
+
function escapeXMLAttributeValue(val: string): string {
|
|
797
|
+
return val.replace(/&/g, "&").replace(/</g, "<");
|
|
798
|
+
}
|
|
799
|
+
|
|
800
|
+
/**
|
|
801
|
+
* Create a string representation of the template literal while handling special object case.
|
|
614
802
|
*
|
|
615
803
|
* @param strings The string parts of the template literal
|
|
616
804
|
* @param values The values part of the template literal
|
|
617
|
-
* @returns The XML document representing the string that was used.
|
|
805
|
+
* @returns The XML string document representing the string that was used.
|
|
618
806
|
*/
|
|
619
807
|
export const xml = (strings: TemplateStringsArray, ...values: any[]) => {
|
|
620
808
|
let outStr = "";
|
|
621
809
|
let i;
|
|
622
810
|
for (i = 0; i < values.length; i++) {
|
|
623
811
|
outStr += strings[i];
|
|
624
|
-
|
|
812
|
+
// Handle the different case of object, if it's an array we join them, if it's a binding expression (determined by _type) then we compile it.
|
|
813
|
+
if (Array.isArray(values[i])) {
|
|
814
|
+
outStr += values[i].flat(5).join("").trim();
|
|
815
|
+
} else if (values[i]?._type) {
|
|
816
|
+
const compiledExpression = compileBinding(values[i]);
|
|
817
|
+
outStr += compiledExpression !== undefined ? escapeXMLAttributeValue(compiledExpression) : undefined;
|
|
818
|
+
} else if (values[i]?.getTemplate) {
|
|
819
|
+
outStr += values[i].getTemplate();
|
|
820
|
+
} else if (typeof values[i] === "object") {
|
|
821
|
+
const propertyUId = storeValue(values[i]);
|
|
822
|
+
outStr += `${propertyUId}`;
|
|
823
|
+
} else {
|
|
824
|
+
outStr += values[i];
|
|
825
|
+
}
|
|
625
826
|
}
|
|
626
827
|
outStr += strings[i];
|
|
627
|
-
|
|
828
|
+
outStr = outStr.trim();
|
|
829
|
+
if (isTraceMode) {
|
|
830
|
+
const xmlResult = parseXMLString(outStr, true);
|
|
831
|
+
if (xmlResult && xmlResult?.localName === "parsererror") {
|
|
832
|
+
const errorMessage = (xmlResult as any).innerText || (xmlResult as any).innerHTML;
|
|
833
|
+
return createErrorXML([errorMessage.split("\n")[0]], outStr);
|
|
834
|
+
}
|
|
835
|
+
}
|
|
836
|
+
return outStr;
|
|
628
837
|
};
|
|
@@ -104,4 +104,4 @@ sap.ui.define(["sap/base/Log"], function (Log) {
|
|
|
104
104
|
};
|
|
105
105
|
return BusyLocker;
|
|
106
106
|
}, false);
|
|
107
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,
|
|
107
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIkJ1c3lMb2NrZXIudHMiXSwibmFtZXMiOlsiX2lUaW1lb3V0SW5TZWNvbmRzIiwiX21Mb2NrQ291bnRlcnMiLCJfb1JlZmVyZW5jZUR1bW15IiwiZ2V0SWQiLCJzZXRCdXN5IiwiYkJ1c3kiLCJMb2ciLCJpbmZvIiwiZ2V0TG9ja0NvdW50SWQiLCJvUmVmZXJlbmNlIiwic1BhdGgiLCJpc0xvY2tlZCIsImdldExvY2tDb3VudEVudHJ5Iiwid2FybmluZyIsInNJZCIsImlkIiwicGF0aCIsInJlZmVyZW5jZSIsImNvdW50IiwiZGVsZXRlTG9ja0NvdW50RW50cnkiLCJtTG9ja0NvdW50RW50cnkiLCJhcHBseUxvY2tTdGF0ZSIsImJJc01vZGVsIiwiaXNBIiwic2V0UHJvcGVydHkiLCJ1bmRlZmluZWQiLCJjbGVhclRpbWVvdXQiLCJ0aW1lb3V0Iiwic2V0VGltZW91dCIsImVycm9yIiwiY2hhbmdlTG9ja0NvdW50IiwiaURlbHRhIiwiQnVzeUxvY2tlciIsImxvY2siLCJvTW9kZWxPckNvbnRyb2wiLCJfdXBkYXRlTG9jayIsInVubG9jayJdLCJtYXBwaW5ncyI6IjtBQUFBO0FBQ0E7QUFDQTs7OztBQURBLE1BQU1BLGtCQUFrQixHQUFHLEVBQTNCO0FBQUEsTUFDQ0MsY0FBbUIsR0FBRyxFQUR2QjtBQUFBLE1BRUNDLGdCQUFnQixHQUFHO0FBQ2xCQyxJQUFBQSxLQUFLLEVBQUUsWUFBWTtBQUNsQixhQUFPLDJCQUFQO0FBQ0EsS0FIaUI7QUFJbEJDLElBQUFBLE9BQU8sRUFBRSxVQUFVQyxLQUFWLEVBQXNCO0FBQzlCQyxNQUFBQSxHQUFHLENBQUNDLElBQUosbUJBQW9CRixLQUFwQjtBQUNBO0FBTmlCLEdBRnBCOztBQVVBLFdBQVNHLGNBQVQsQ0FBd0JDLFVBQXhCLEVBQXlDQyxLQUF6QyxFQUFxRDtBQUNwRCxXQUFPRCxVQUFVLENBQUNOLEtBQVgsTUFBc0JPLEtBQUssSUFBSSxPQUEvQixDQUFQO0FBQ0E7O0FBQ0QsV0FBU0MsUUFBVCxDQUFrQkYs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ZSxDQUFDRixLQUF2RTtBQUNBO0FBQ0Q7O0FBRUQsTUFBTWMsVUFBVSxHQUFHO0FBQ2xCQyxJQUFBQSxJQUFJLEVBQUUsVUFBVUMsZUFBVixFQUFnQ3hCLEtBQWhDLEVBQWdEO0FBQ3JELGFBQU8sS0FBS3lCLFdBQUwsQ0FBaUJELGVBQWpCLEVBQWtDeEIsS0FBbEMsRUFBeUMsQ0FBekMsQ0FBUDtBQUNBLEtBSGlCO0FBS2xCMEIsSUFBQUEsTUFBTSxFQUFFLFVBQVVGLGVBQVYsRUFBZ0N4QixLQUFoQyxFQUFnRDtBQUN2RCxhQUFPLEtBQUt5QixXQUFMLENBQWlCRCxlQUFqQixFQUFrQ3hCLEtBQWxDLEVBQXlDLENBQUMsQ0FBMUMsQ0FBUDtBQUNBLEtBUGlCO0FBU2xCQyxJQUFBQSxRQUFRLEVBQUUsVUFBVXVCLGVBQVYsRUFBZ0N4QixLQUFoQyxFQUFnRDtBQUN6RCxhQUFPQyxRQUFRLENBQUN1QixlQUFELEVBQWtCeEIsS0FBbEIsQ0FBZjtBQUNBLEtBWGlCO0FBYWxCeUIsSUFBQUEsV0FBVyxFQUFFLFVBQVUxQixVQUFWLEVBQTJCQyxLQUEzQixFQUF1Q3FCLE1BQXZDLEVBQW9EO0FBQ2hFLFVBQU1YLGVBQWUsR0FBR1IsaUJBQWlCLENBQUNILFVBQUQsRUFBYUMsS0FBYixDQUF6QztBQUNBb0IsTUFBQUEsZUFBZSxDQUFDVixlQUFELEVBQWtCVyxNQUFsQixDQUFmO0FBQ0EsYUFBT1YsY0FBYyxDQUFDRCxlQUFELENBQXJCO0FBQ0E7QUFqQmlCLEdBQW5CO1NBb0JlWSxVIiwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgTG9nIGZyb20gXCJzYXAvYmFzZS9Mb2dcIjtcbmNvbnN0IF9pVGltZW91dEluU2Vjb25kcyA9IDMwLFxuXHRfbUxvY2tDb3VudGVyczogYW55ID0ge30sXG5cdF9vUmVmZXJlbmNlRHVtbXkgPSB7XG5cdFx0Z2V0SWQ6IGZ1bmN0aW9uICgpIHtcblx0XHRcdHJldHVybiBcIkJ1c3lMb2NrZXIuUmVmZXJlbmNlRHVtbXlcIjtcblx0XHR9LFxuXHRcdHNldEJ1c3k6IGZ1bmN0aW9uIChiQnVzeTogYW55KSB7XG5cdFx0XHRMb2cuaW5mbyhgc2V0QnVzeSgke2JCdXN5fSkgdHJpZ2dlcmVkIG9uIGR1bW15IHJlZmVyZW5jZWApO1xuXHRcdH1cblx0fTtcbmZ1bmN0aW9uIGdldExvY2tDb3VudElkKG9SZWZlcmVuY2U6IGFueSwgc1BhdGg6IGFueSkge1xuXHRyZXR1cm4gb1JlZmVyZW5jZS5nZXRJZCgpICsgKHNQYXRoIHx8IFwiL2J1c3lcIik7XG59XG5mdW5jdGlvbiBpc0xvY2tlZChvUmVmZXJlbmNlOiBhbnksIHNQYXRoOiBhbnkpIHtcblx0cmV0dXJuIGdldExvY2tDb3VudElkKG9SZWZlcmVuY2UsIHNQYXRoKSBpbiBfbUxvY2tDb3VudGVycztcbn1cbmZ1bmN0aW9uIGdldExvY2tDb3VudEVudHJ5KG9SZWZlcmVuY2U6IGFueSwgc1BhdGg6IGFueSkge1xuXHRpZiAoIW9SZWZlcmVuY2UgfHwgIW9SZWZlcmVuY2UuZ2V0SWQpIHtcblx0XHRMb2cud2FybmluZyhcIk5vIHJlZmVyZW5jZSBmb3IgQnVzeUxvY2tlciwgdXNpbmcgZHVtbXkgcmVmZXJlbmNlXCIpO1xuXHRcdG9SZWZlcmVuY2UgPSBfb1JlZmVyZW5jZUR1bW15O1xuXHR9XG5cblx0c1BhdGggPSBzUGF0aCB8fCBcIi9idXN5XCI7XG5cdGNvbnN0IHNJZCA9IGdldExvY2tDb3VudElkKG9SZWZlcmVuY2UsIHNQYXRoKTtcblxuXHRpZiAoIShzSWQgaW4gX21Mb2NrQ291bnRlcnMpKSB7XG5cdFx0X21Mb2NrQ291bnRlcnNbc0lkXSA9IHtcblx0XHRcdGlkOiBzSWQsXG5cdFx0XHRwYXRoOiBzUGF0aCxcblx0XHRcdHJlZmVyZW5jZTogb1JlZmVyZW5jZSxcblx0XHRcdGNvdW50OiAwXG5cdFx0fTtcblx0fVxuXHRyZXR1cm4gX21Mb2NrQ291bnRlcnNbc0lkXTtcbn1cbi8qKlxuICogQHBhcmFtIG1Mb2NrQ291bnRFbnRyeVxuICovXG5mdW5jdGlvbiBkZWxldGVMb2NrQ291bnRFbnRyeShtTG9ja0NvdW50RW50cnk6IGFueSkge1xuXHRkZWxldGUgX21Mb2NrQ291bnRlcnNbbUxvY2tDb3VudEVudHJ5LmlkXTtcbn1cblxuZnVuY3Rpb24gYXBwbHlMb2NrU3RhdGUobUxvY2tDb3VudEVudHJ5OiBhbnkpIHtcblx0Y29uc3QgYklzTW9kZWwgPSBtTG9ja0NvdW50RW50cnkucmVmZXJlbmNlLmlzQSAmJiBtTG9ja0NvdW50RW50cnkucmVmZXJlbmNlLmlzQShcInNhcC51aS5tb2RlbC5Nb2RlbFwiKSxcblx0XHRiQnVzeSA9IG1Mb2NrQ291bnRFbnRyeS5jb3VudCAhPT0gMDtcblxuXHRpZiAoYklzTW9kZWwpIHtcblx0XHRtTG9ja0NvdW50RW50cnkucmVmZXJlbmNlLnNldFByb3BlcnR5KG1Mb2NrQ291bnRFbnRyeS5wYXRoLCBiQnVzeSwgdW5kZWZpbmVkLCB0cnVlKTtcblx0fSBlbHNlIGlmIChtTG9ja0NvdW50RW50cnkucmVmZXJlbmNlLnNldEJ1c3kpIHtcblx0XHRtTG9ja0NvdW50RW50cnkucmVmZXJlbmNlLnNldEJ1c3koYkJ1c3kpO1xuXHR9XG5cblx0Y2xlYXJUaW1lb3V0KG1Mb2NrQ291bnRFbnRyeS50aW1lb3V0KTtcblx0aWYgKGJCdXN5KSB7XG5cdFx0bUxvY2tDb3VudEVudHJ5LnRpbWVvdXQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcblx0XHRcdExvZy5lcnJvcihcblx0XHRcdFx0YGJ1c3kgbG9jayBmb3IgJHttTG9ja0NvdW50RW50cnkuaWR9IHdpdGggdmFsdWUgJHttTG9ja0NvdW50RW50cnkuY291bnR9IHRpbWVkIG91dCBhZnRlciAke19pVGltZW91dEluU2Vjb25kc30gc2Vjb25kcyFgXG5cdFx0XHQpO1xuXHRcdH0sIF9pVGltZW91dEluU2Vjb25kcyAqIDEwMDApO1xuXHR9IGVsc2Uge1xuXHRcdGRlbGV0ZUxvY2tDb3VudEVudHJ5KG1Mb2NrQ291bnRFbnRyeSk7XG5cdH1cblxuXHRyZXR1cm4gYkJ1c3k7XG59XG5cbmZ1bmN0aW9uIGNoYW5nZUxvY2tDb3VudChtTG9ja0NvdW50RW50cnk6IGFueSwgaURlbHRhOiBhbnkpIHtcblx0aWYgKGlEZWx0YSA9PT0gMCkge1xuXHRcdG1Mb2NrQ291bnRFbnRyeS5jb3VudCA9IDA7XG5cdFx0TG9nLmluZm8oYGJ1c3kgbG9jayBjb3VudCAnJHttTG9ja0NvdW50RW50cnkuaWR9JyB3YXMgcmVzZXQgdG8gMGApO1xuXHR9IGVsc2Uge1xuXHRcdG1Mb2NrQ291bnRFbnRyeS5jb3VudCArPSBpRGVsdGE7XG5cdFx0TG9nLmluZm8oYGJ1c3kgbG9jayBjb3VudCAnJHttTG9ja0NvdW50RW50cnkuaWR9JyBpcyAke21Mb2NrQ291bnRFbnRyeS5jb3VudH1gKTtcblx0fVxufVxuXG5jb25zdCBCdXN5TG9ja2VyID0ge1xuXHRsb2NrOiBmdW5jdGlvbiAob01vZGVsT3JDb250cm9sOiBhbnksIHNQYXRoPzogc3RyaW5nKSB7XG5cdFx0cmV0dXJuIHRoaXMuX3VwZGF0ZUxvY2sob01vZGVsT3JDb250cm9sLCBzUGF0aCwgMSk7XG5cdH0sXG5cblx0dW5sb2NrOiBmdW5jdGlvbiAob01vZGVsT3JDb250cm9sOiBhbnksIHNQYXRoPzogc3RyaW5nKSB7XG5cdFx0cmV0dXJuIHRoaXMuX3VwZGF0ZUxvY2sob01vZGVsT3JDb250cm9sLCBzUGF0aCwgLTEpO1xuXHR9LFxuXG5cdGlzTG9ja2VkOiBmdW5jdGlvbiAob01vZGVsT3JDb250cm9sOiBhbnksIHNQYXRoPzogc3RyaW5nKSB7XG5cdFx0cmV0dXJuIGlzTG9ja2VkKG9Nb2RlbE9yQ29udHJvbCwgc1BhdGgpO1xuXHR9LFxuXG5cdF91cGRhdGVMb2NrOiBmdW5jdGlvbiAob1JlZmVyZW5jZTogYW55LCBzUGF0aDogYW55LCBpRGVsdGE6IGFueSkge1xuXHRcdGNvbnN0IG1Mb2NrQ291bnRFbnRyeSA9IGdldExvY2tDb3VudEVudHJ5KG9SZWZlcmVuY2UsIHNQYXRoKTtcblx0XHRjaGFuZ2VMb2NrQ291bnQobUxvY2tDb3VudEVudHJ5LCBpRGVsdGEpO1xuXHRcdHJldHVybiBhcHBseUxvY2tTdGF0ZShtTG9ja0NvdW50RW50cnkpO1xuXHR9XG59O1xuXG5leHBvcnQgZGVmYXVsdCBCdXN5TG9ja2VyO1xuIl19
|
|
@@ -2,10 +2,10 @@ import Log from "sap/base/Log";
|
|
|
2
2
|
const _iTimeoutInSeconds = 30,
|
|
3
3
|
_mLockCounters: any = {},
|
|
4
4
|
_oReferenceDummy = {
|
|
5
|
-
getId: function() {
|
|
5
|
+
getId: function () {
|
|
6
6
|
return "BusyLocker.ReferenceDummy";
|
|
7
7
|
},
|
|
8
|
-
setBusy: function(bBusy: any) {
|
|
8
|
+
setBusy: function (bBusy: any) {
|
|
9
9
|
Log.info(`setBusy(${bBusy}) triggered on dummy reference`);
|
|
10
10
|
}
|
|
11
11
|
};
|
|
@@ -53,7 +53,7 @@ function applyLockState(mLockCountEntry: any) {
|
|
|
53
53
|
|
|
54
54
|
clearTimeout(mLockCountEntry.timeout);
|
|
55
55
|
if (bBusy) {
|
|
56
|
-
mLockCountEntry.timeout = setTimeout(function() {
|
|
56
|
+
mLockCountEntry.timeout = setTimeout(function () {
|
|
57
57
|
Log.error(
|
|
58
58
|
`busy lock for ${mLockCountEntry.id} with value ${mLockCountEntry.count} timed out after ${_iTimeoutInSeconds} seconds!`
|
|
59
59
|
);
|
|
@@ -76,19 +76,19 @@ function changeLockCount(mLockCountEntry: any, iDelta: any) {
|
|
|
76
76
|
}
|
|
77
77
|
|
|
78
78
|
const BusyLocker = {
|
|
79
|
-
lock: function(oModelOrControl: any, sPath?: string) {
|
|
79
|
+
lock: function (oModelOrControl: any, sPath?: string) {
|
|
80
80
|
return this._updateLock(oModelOrControl, sPath, 1);
|
|
81
81
|
},
|
|
82
82
|
|
|
83
|
-
unlock: function(oModelOrControl: any, sPath?: string) {
|
|
83
|
+
unlock: function (oModelOrControl: any, sPath?: string) {
|
|
84
84
|
return this._updateLock(oModelOrControl, sPath, -1);
|
|
85
85
|
},
|
|
86
86
|
|
|
87
|
-
isLocked: function(oModelOrControl: any, sPath?: string) {
|
|
87
|
+
isLocked: function (oModelOrControl: any, sPath?: string) {
|
|
88
88
|
return isLocked(oModelOrControl, sPath);
|
|
89
89
|
},
|
|
90
90
|
|
|
91
|
-
_updateLock: function(oReference: any, sPath: any, iDelta: any) {
|
|
91
|
+
_updateLock: function (oReference: any, sPath: any, iDelta: any) {
|
|
92
92
|
const mLockCountEntry = getLockCountEntry(oReference, sPath);
|
|
93
93
|
changeLockCount(mLockCountEntry, iDelta);
|
|
94
94
|
return applyLockState(mLockCountEntry);
|