@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.
Files changed (217) hide show
  1. package/package.json +1 -1
  2. package/src/sap/fe/core/.library +1 -1
  3. package/src/sap/fe/core/AppComponent.js +5 -5
  4. package/src/sap/fe/core/AppComponent.ts +19 -18
  5. package/src/sap/fe/core/AppStateHandler.js +4 -4
  6. package/src/sap/fe/core/AppStateHandler.ts +9 -9
  7. package/src/sap/fe/core/CommonUtils.js +59 -93
  8. package/src/sap/fe/core/CommonUtils.ts +80 -99
  9. package/src/sap/fe/core/ExtensionAPI.js +2 -4
  10. package/src/sap/fe/core/ExtensionAPI.ts +1 -3
  11. package/src/sap/fe/core/PageController.js +14 -9
  12. package/src/sap/fe/core/PageController.ts +8 -2
  13. package/src/sap/fe/core/TemplateComponent.js +6 -6
  14. package/src/sap/fe/core/TemplateComponent.ts +5 -5
  15. package/src/sap/fe/core/TemplateModel.js +2 -2
  16. package/src/sap/fe/core/TemplateModel.ts +2 -2
  17. package/src/sap/fe/core/buildingBlocks/BuildingBlockRuntime.js +303 -75
  18. package/src/sap/fe/core/buildingBlocks/BuildingBlockRuntime.ts +273 -64
  19. package/src/sap/fe/core/{BusyLocker.js → controllerextensions/BusyLocker.js} +1 -1
  20. package/src/sap/fe/core/{BusyLocker.ts → controllerextensions/BusyLocker.ts} +7 -7
  21. package/src/sap/fe/core/controllerextensions/EditFlow.js +234 -123
  22. package/src/sap/fe/core/controllerextensions/EditFlow.ts +176 -114
  23. package/src/sap/fe/core/controllerextensions/InternalEditFlow.js +34 -10
  24. package/src/sap/fe/core/controllerextensions/InternalEditFlow.ts +44 -12
  25. package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.js +30 -28
  26. package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.ts +38 -31
  27. package/src/sap/fe/core/controllerextensions/InternalRouting.js +157 -102
  28. package/src/sap/fe/core/controllerextensions/InternalRouting.ts +155 -103
  29. package/src/sap/fe/core/controllerextensions/MassEdit.js +4 -3
  30. package/src/sap/fe/core/controllerextensions/MassEdit.ts +15 -14
  31. package/src/sap/fe/core/controllerextensions/MessageHandler.js +3 -3
  32. package/src/sap/fe/core/controllerextensions/MessageHandler.ts +10 -2
  33. package/src/sap/fe/core/controllerextensions/Paginator.js +12 -3
  34. package/src/sap/fe/core/controllerextensions/Paginator.ts +11 -2
  35. package/src/sap/fe/core/controllerextensions/Share.js +19 -1
  36. package/src/sap/fe/core/controllerextensions/Share.ts +18 -0
  37. package/src/sap/fe/core/controllerextensions/SideEffects.js +2 -2
  38. package/src/sap/fe/core/controllerextensions/SideEffects.ts +2 -2
  39. package/src/sap/fe/core/controllerextensions/ViewState.js +11 -1
  40. package/src/sap/fe/core/controllerextensions/ViewState.ts +10 -0
  41. package/src/sap/fe/core/controllerextensions/collaboration/ActivityBase.js +105 -0
  42. package/src/sap/fe/core/controllerextensions/collaboration/ActivityBase.ts +98 -0
  43. package/src/sap/fe/core/controllerextensions/collaboration/ActivitySync.js +360 -0
  44. package/src/sap/fe/core/{actions → controllerextensions}/collaboration/ActivitySync.ts +57 -106
  45. package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon.js +146 -0
  46. package/src/sap/fe/core/{actions → controllerextensions}/collaboration/CollaborationCommon.ts +6 -6
  47. package/src/sap/fe/core/{actions → controllerextensions}/collaboration/Manage.js +4 -4
  48. package/src/sap/fe/core/{actions → controllerextensions}/collaboration/Manage.ts +3 -3
  49. package/src/sap/fe/core/{actions → controllerextensions}/collaboration/ManageDialog.fragment.xml +0 -0
  50. package/src/sap/fe/core/{actions → controllerextensions}/collaboration/UserDetails.fragment.xml +5 -7
  51. package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.js +1587 -0
  52. package/src/sap/fe/core/{TransactionHelper.ts → controllerextensions/editFlow/TransactionHelper.ts} +26 -13
  53. package/src/sap/fe/core/controllerextensions/editFlow/draft.js +785 -0
  54. package/src/sap/fe/core/{actions → controllerextensions/editFlow}/draft.ts +179 -22
  55. package/src/sap/fe/core/controllerextensions/editFlow/operations.js +1175 -0
  56. package/src/sap/fe/core/{actions → controllerextensions/editFlow}/operations.ts +203 -98
  57. package/src/sap/fe/core/controllerextensions/editFlow/sticky.js +190 -0
  58. package/src/sap/fe/core/{actions → controllerextensions/editFlow}/sticky.ts +76 -12
  59. package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.js +597 -0
  60. package/src/sap/fe/core/{actions → controllerextensions/messageHandler}/messageHandling.ts +46 -27
  61. package/src/sap/fe/core/controllerextensions/routing/RouterProxy.js +940 -0
  62. package/src/sap/fe/core/{RouterProxy.ts → controllerextensions/routing/RouterProxy.ts} +20 -18
  63. package/src/sap/fe/core/controls/ActionParameterDialog.fragment.xml +21 -18
  64. package/src/sap/fe/core/controls/CommandExecution.js +14 -3
  65. package/src/sap/fe/core/controls/CommandExecution.ts +11 -2
  66. package/src/sap/fe/core/controls/CustomFilterFieldContentWrapper.js +34 -29
  67. package/src/sap/fe/core/controls/CustomFilterFieldContentWrapper.ts +33 -29
  68. package/src/sap/fe/core/controls/CustomQuickViewPage.js +2 -1
  69. package/src/sap/fe/core/controls/CustomQuickViewPage.ts +1 -0
  70. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossDraft.fragment.xml +11 -3
  71. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.js +17 -7
  72. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.ts +9 -3
  73. package/src/sap/fe/core/controls/FileWrapper.js +49 -2
  74. package/src/sap/fe/core/controls/FileWrapper.ts +34 -1
  75. package/src/sap/fe/core/controls/FormElementWrapper.js +12 -2
  76. package/src/sap/fe/core/controls/FormElementWrapper.ts +12 -1
  77. package/src/sap/fe/core/controls/MassEditSelect.js +33 -0
  78. package/src/sap/fe/core/controls/MassEditSelect.ts +45 -0
  79. package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.js +2 -2
  80. package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.ts +23 -28
  81. package/src/sap/fe/core/controls/massEdit/MassEditDialog.fragment.xml +28 -63
  82. package/src/sap/fe/core/controls/massEdit/MassEditField.fragment.xml +107 -0
  83. package/src/sap/fe/core/controls/massEdit/MassEditHandlers.js +550 -36
  84. package/src/sap/fe/core/controls/massEdit/MassEditHandlers.ts +604 -36
  85. package/src/sap/fe/core/converters/ManifestSettings.js +2 -1
  86. package/src/sap/fe/core/converters/ManifestSettings.ts +4 -1
  87. package/src/sap/fe/core/converters/MetaModelConverter.js +11 -40
  88. package/src/sap/fe/core/converters/MetaModelConverter.ts +56 -84
  89. package/src/sap/fe/core/converters/annotations/DataField.js +20 -4
  90. package/src/sap/fe/core/converters/annotations/DataField.ts +24 -2
  91. package/src/sap/fe/core/converters/controls/Common/Action.js +5 -12
  92. package/src/sap/fe/core/converters/controls/Common/Action.ts +3 -9
  93. package/src/sap/fe/core/converters/controls/Common/Chart.js +10 -3
  94. package/src/sap/fe/core/converters/controls/Common/Chart.ts +8 -3
  95. package/src/sap/fe/core/converters/controls/Common/Form.js +12 -14
  96. package/src/sap/fe/core/converters/controls/Common/Form.ts +17 -19
  97. package/src/sap/fe/core/converters/controls/Common/Table.js +149 -66
  98. package/src/sap/fe/core/converters/controls/Common/Table.ts +136 -52
  99. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.js +22 -12
  100. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.ts +23 -12
  101. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.js +7 -5
  102. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.ts +15 -10
  103. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.js +26 -24
  104. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.ts +35 -33
  105. package/src/sap/fe/core/converters/helpers/Aggregation.js +10 -2
  106. package/src/sap/fe/core/converters/helpers/Aggregation.ts +18 -13
  107. package/src/sap/fe/core/converters/helpers/BindingHelper.js +3 -2
  108. package/src/sap/fe/core/converters/helpers/BindingHelper.ts +6 -5
  109. package/src/sap/fe/core/converters/templates/ObjectPageConverter.js +25 -25
  110. package/src/sap/fe/core/converters/templates/ObjectPageConverter.ts +35 -38
  111. package/src/sap/fe/core/designtime/AppComponent.designtime.js +3 -3
  112. package/src/sap/fe/core/designtime/AppComponent.designtime.ts +8 -6
  113. package/src/sap/fe/core/formatters/TableFormatter.js +73 -12
  114. package/src/sap/fe/core/formatters/TableFormatter.ts +70 -15
  115. package/src/sap/fe/core/fpm/Component.js +2 -2
  116. package/src/sap/fe/core/fpm/Component.ts +1 -1
  117. package/src/sap/fe/core/helpers/BindingExpression.js +10 -7
  118. package/src/sap/fe/core/helpers/BindingExpression.ts +37 -35
  119. package/src/sap/fe/core/helpers/ClassSupport.js +1 -1
  120. package/src/sap/fe/core/helpers/ClassSupport.ts +1 -0
  121. package/src/sap/fe/core/helpers/FPMHelper.js +3 -2
  122. package/src/sap/fe/core/helpers/FPMHelper.ts +9 -8
  123. package/src/sap/fe/core/helpers/MassEditHelper.js +399 -152
  124. package/src/sap/fe/core/helpers/MassEditHelper.ts +385 -163
  125. package/src/sap/fe/core/helpers/ModelHelper.js +1 -1
  126. package/src/sap/fe/core/helpers/ModelHelper.ts +20 -30
  127. package/src/sap/fe/core/helpers/StableIdHelper.js +5 -1
  128. package/src/sap/fe/core/helpers/StableIdHelper.ts +8 -4
  129. package/src/sap/fe/core/{Synchronization.js → helpers/Synchronization.js} +1 -1
  130. package/src/sap/fe/core/{Synchronization.ts → helpers/Synchronization.ts} +1 -1
  131. package/src/sap/fe/core/library.js +12 -3
  132. package/src/sap/fe/core/library.ts +9 -0
  133. package/src/sap/fe/core/messagebundle.properties +125 -180
  134. package/src/sap/fe/core/messagebundle_ar.properties +30 -63
  135. package/src/sap/fe/core/messagebundle_bg.properties +30 -63
  136. package/src/sap/fe/core/messagebundle_ca.properties +30 -63
  137. package/src/sap/fe/core/messagebundle_cs.properties +30 -63
  138. package/src/sap/fe/core/messagebundle_cy.properties +30 -63
  139. package/src/sap/fe/core/messagebundle_da.properties +31 -64
  140. package/src/sap/fe/core/messagebundle_de.properties +30 -63
  141. package/src/sap/fe/core/messagebundle_el.properties +31 -64
  142. package/src/sap/fe/core/messagebundle_en.properties +31 -64
  143. package/src/sap/fe/core/messagebundle_en_GB.properties +31 -64
  144. package/src/sap/fe/core/messagebundle_en_US_sappsd.properties +40 -73
  145. package/src/sap/fe/core/messagebundle_en_US_saprigi.properties +31 -64
  146. package/src/sap/fe/core/messagebundle_en_US_saptrc.properties +49 -82
  147. package/src/sap/fe/core/messagebundle_es.properties +30 -63
  148. package/src/sap/fe/core/messagebundle_es_MX.properties +30 -63
  149. package/src/sap/fe/core/messagebundle_et.properties +30 -63
  150. package/src/sap/fe/core/messagebundle_fi.properties +30 -63
  151. package/src/sap/fe/core/messagebundle_fr.properties +33 -66
  152. package/src/sap/fe/core/messagebundle_fr_CA.properties +30 -63
  153. package/src/sap/fe/core/messagebundle_hi.properties +30 -63
  154. package/src/sap/fe/core/messagebundle_hr.properties +30 -63
  155. package/src/sap/fe/core/messagebundle_hu.properties +29 -62
  156. package/src/sap/fe/core/messagebundle_id.properties +31 -64
  157. package/src/sap/fe/core/messagebundle_it.properties +30 -63
  158. package/src/sap/fe/core/messagebundle_iw.properties +30 -63
  159. package/src/sap/fe/core/messagebundle_ja.properties +30 -63
  160. package/src/sap/fe/core/messagebundle_kk.properties +30 -63
  161. package/src/sap/fe/core/messagebundle_ko.properties +30 -63
  162. package/src/sap/fe/core/messagebundle_lt.properties +30 -63
  163. package/src/sap/fe/core/messagebundle_lv.properties +30 -63
  164. package/src/sap/fe/core/messagebundle_ms.properties +31 -64
  165. package/src/sap/fe/core/messagebundle_nl.properties +31 -64
  166. package/src/sap/fe/core/messagebundle_no.properties +30 -63
  167. package/src/sap/fe/core/messagebundle_pl.properties +31 -64
  168. package/src/sap/fe/core/messagebundle_pt.properties +31 -64
  169. package/src/sap/fe/core/messagebundle_pt_PT.properties +30 -63
  170. package/src/sap/fe/core/messagebundle_ro.properties +30 -63
  171. package/src/sap/fe/core/messagebundle_ru.properties +30 -63
  172. package/src/sap/fe/core/messagebundle_sh.properties +30 -63
  173. package/src/sap/fe/core/messagebundle_sk.properties +30 -63
  174. package/src/sap/fe/core/messagebundle_sl.properties +32 -65
  175. package/src/sap/fe/core/messagebundle_sv.properties +30 -63
  176. package/src/sap/fe/core/messagebundle_th.properties +30 -63
  177. package/src/sap/fe/core/messagebundle_tr.properties +30 -63
  178. package/src/sap/fe/core/messagebundle_uk.properties +31 -64
  179. package/src/sap/fe/core/messagebundle_vi.properties +31 -64
  180. package/src/sap/fe/core/messagebundle_zh_CN.properties +30 -63
  181. package/src/sap/fe/core/messagebundle_zh_TW.properties +31 -64
  182. package/src/sap/fe/core/services/EnvironmentServiceFactory.js +6 -3
  183. package/src/sap/fe/core/services/EnvironmentServiceFactory.ts +10 -9
  184. package/src/sap/fe/core/services/NavigationServiceFactory.js +2 -2
  185. package/src/sap/fe/core/services/NavigationServiceFactory.ts +8 -4
  186. package/src/sap/fe/core/services/RoutingServiceFactory.js +9 -6
  187. package/src/sap/fe/core/services/RoutingServiceFactory.ts +10 -9
  188. package/src/sap/fe/core/services/ShellServicesFactory.js +36 -1
  189. package/src/sap/fe/core/services/ShellServicesFactory.ts +38 -1
  190. package/src/sap/fe/core/services/TemplatedViewServiceFactory.js +5 -4
  191. package/src/sap/fe/core/services/TemplatedViewServiceFactory.ts +34 -36
  192. package/src/sap/fe/core/templating/DisplayModeFormatter.js +1 -1
  193. package/src/sap/fe/core/templating/DisplayModeFormatter.ts +1 -1
  194. package/src/sap/fe/core/templating/EntitySetHelper.js +1 -9
  195. package/src/sap/fe/core/templating/EntitySetHelper.ts +11 -13
  196. package/src/sap/fe/core/templating/FilterHelper.js +4 -4
  197. package/src/sap/fe/core/templating/FilterHelper.ts +6 -5
  198. package/src/sap/fe/core/templating/PropertyHelper.js +58 -35
  199. package/src/sap/fe/core/templating/PropertyHelper.ts +19 -4
  200. package/src/sap/fe/core/templating/UIFormatters.js +16 -5
  201. package/src/sap/fe/core/templating/UIFormatters.ts +14 -5
  202. package/src/sap/fe/core/type/DateTimeWithTimezone.js +47 -0
  203. package/src/sap/fe/core/type/DateTimeWithTimezone.ts +23 -0
  204. package/src/sap/fe/core/AnnotationHelper.js +0 -331
  205. package/src/sap/fe/core/AnnotationHelper.ts +0 -321
  206. package/src/sap/fe/core/RouterProxy.js +0 -938
  207. package/src/sap/fe/core/TransactionHelper.js +0 -1577
  208. package/src/sap/fe/core/actions/collaboration/ActivitySync.js +0 -406
  209. package/src/sap/fe/core/actions/collaboration/CollaborationCommon.js +0 -146
  210. package/src/sap/fe/core/actions/draft.js +0 -665
  211. package/src/sap/fe/core/actions/messageHandling.js +0 -579
  212. package/src/sap/fe/core/actions/nonDraft.js +0 -20
  213. package/src/sap/fe/core/actions/nonDraft.ts +0 -12
  214. package/src/sap/fe/core/actions/operations.js +0 -1096
  215. package/src/sap/fe/core/actions/sticky.js +0 -130
  216. package/src/sap/fe/core/formatters/CriticalityFormatter.js +0 -77
  217. 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(oSettings: any, oNode: Element, sAttributeName: string, oVisitor: ICallback, bDoNotResolve: boolean) {
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 ((sAttributeName === "metaPath" && oSettings.currentContextPath) || sAttributeName === "contextPath") {
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 (let j = 0; j < aDefinitionContextsKeys.length; j++) {
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
- try {
387
- const sFragmentName = buildingBLockDefinition.fragment || `${buildingBLockDefinition.namespace}.${buildingBLockDefinition.name}`;
388
-
389
- const sName = "this";
390
-
391
- const mContexts: any = {};
392
- const oMetadataContexts: any = {};
393
- const oSettings = oVisitor.getSettings();
394
- // TODO Move this elsewhere this is weird :)
395
- if (oSettings.models["sap.fe.i18n"]) {
396
- oSettings.models["sap.fe.i18n"]
397
- .getResourceBundle()
398
- .then(function (oResourceBundle: any) {
399
- ResourceModel.setApplicationI18nBundle(oResourceBundle);
400
- })
401
- .catch(function (error: any) {
402
- Log.error(error);
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
- // First of all we need to visit the attributes
413
- let { mMissingContext, propertyValues } = await processProperties(
414
- oMetadata,
415
- oSettings,
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
- propertyValues = buildingBLockDefinition.create.call(
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] = propertyValues[sMetadataName];
478
+ mContexts[sMetadataName] = processedPropertyValues[sMetadataName];
445
479
  }
446
480
  });
447
481
  Object.keys(mMissingContext).forEach(function (sContextName: string) {
448
- if (propertyValues.hasOwnProperty(sContextName)) {
449
- mContexts[sContextName] = propertyValues[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, propertyValues, buildingBLockDefinition);
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(propertyValues);
537
+ oTemplate = buildingBLockDefinition.getTemplate(processedPropertyValues);
502
538
  }
503
539
 
540
+ let hasError = "";
504
541
  if (oTemplate) {
505
542
  if (!oTemplate.firstElementChild) {
506
- oTemplate = DOMParserInstance.parseFromString(oTemplate, "text/xml");
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
- oNode.replaceWith(oTemplate.firstElementChild);
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
- if (oPreviousMacroInfo) {
554
- //restore macro info if available
555
- oSettings["_macroInfo"] = oPreviousMacroInfo;
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
- delete oSettings["_macroInfo"];
647
+ traceDetails.initialProperties[propertyName] = propertyValue;
558
648
  }
559
649
  }
560
- } catch (e) {
561
- Log.error(e as any);
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
- * Create an XML representation of the string used in the template literal.
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, "&amp;")
782
+ .replace(/</g, "&lt;")
783
+ .replace(/\n/g, "&#10;")
784
+ .replace(/\{/g, "\\{")
785
+ .replace(/>/g, "&gt;")
786
+ .replace(/"/g, "&quot;")
787
+ .replace(/'/g, "&apos;");
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, "&amp;").replace(/</g, "&lt;");
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
- outStr += values[i];
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
- return DOMParserInstance.parseFromString(outStr, "text/xml");
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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIkJ1c3lMb2NrZXIudHMiXSwibmFtZXMiOlsiX2lUaW1lb3V0SW5TZWNvbmRzIiwiX21Mb2NrQ291bnRlcnMiLCJfb1JlZmVyZW5jZUR1bW15IiwiZ2V0SWQiLCJzZXRCdXN5IiwiYkJ1c3kiLCJMb2ciLCJpbmZvIiwiZ2V0TG9ja0NvdW50SWQiLCJvUmVmZXJlbmNlIiwic1BhdGgiLCJpc0xvY2tlZCIsImdldExvY2tDb3VudEVudHJ5Iiwid2FybmluZyIsInNJZCIsImlkIiwicGF0aCIsInJlZmVyZW5jZSIsImNvdW50IiwiZGVsZXRlTG9ja0NvdW50RW50cnkiLCJtTG9ja0NvdW50RW50cnkiLCJhcHBseUxvY2tTdGF0ZSIsImJJc01vZGVsIiwiaXNBIiwic2V0UHJvcGVydHkiLCJ1bmRlZmluZWQiLCJjbGVhclRpbWVvdXQiLCJ0aW1lb3V0Iiwic2V0VGltZW91dCIsImVycm9yIiwiY2hhbmdlTG9ja0NvdW50IiwiaURlbHRhIiwiQnVzeUxvY2tlciIsImxvY2siLCJvTW9kZWxPckNvbnRyb2wiLCJfdXBkYXRlTG9jayIsInVubG9jayJdLCJtYXBwaW5ncyI6IjtBQUFBO0FBQ0E7QUFDQTs7OztBQURBLE1BQU1BLGtCQUFrQixHQUFHLEVBQTNCO0FBQUEsTUFDQ0MsY0FBbUIsR0FBRyxFQUR2QjtBQUFBLE1BRUNDLGdCQUFnQixHQUFHO0FBQ2xCQyxJQUFBQSxLQUFLLEVBQUUsWUFBVztBQUNqQixhQUFPLDJCQUFQO0FBQ0EsS0FIaUI7QUFJbEJDLElBQUFBLE9BQU8sRUFBRSxVQUFTQyxLQUFULEVBQXFCO0FBQzdCQyxNQUFBQSxHQUFHLENBQUNDLElBQUosbUJBQW9CRixLQUFwQjtBQUNBO0FBTmlCLEdBRnBCOztBQVVBLFdBQVNHLGNBQVQsQ0FBd0JDLFVBQXhCLEVBQXlDQyxLQUF6QyxFQUFxRDtBQUNwRCxXQUFPRCxVQUFVLENBQUNOLEtBQVgsTUFBc0JPLEtBQUssSUFBSSxPQUEvQixDQUFQO0FBQ0E7O0FBQ0QsV0FBU0MsUUFBVCxDQUFrQkYs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ZSxDQUFDRixLQUF2RTtBQUNBO0FBQ0Q7O0FBRUQsTUFBTWMsVUFBVSxHQUFHO0FBQ2xCQyxJQUFBQSxJQUFJLEVBQUUsVUFBU0MsZUFBVCxFQUErQnhCLEtBQS9CLEVBQStDO0FBQ3BELGFBQU8sS0FBS3lCLFdBQUwsQ0FBaUJELGVBQWpCLEVBQWtDeEIsS0FBbEMsRUFBeUMsQ0FBekMsQ0FBUDtBQUNBLEtBSGlCO0FBS2xCMEIsSUFBQUEsTUFBTSxFQUFFLFVBQVNGLGVBQVQsRUFBK0J4QixLQUEvQixFQUErQztBQUN0RCxhQUFPLEtBQUt5QixXQUFMLENBQWlCRCxlQUFqQixFQUFrQ3hCLEtBQWxDLEVBQXlDLENBQUMsQ0FBMUMsQ0FBUDtBQUNBLEtBUGlCO0FBU2xCQyxJQUFBQSxRQUFRLEVBQUUsVUFBU3VCLGVBQVQsRUFBK0J4QixLQUEvQixFQUErQztBQUN4RCxhQUFPQyxRQUFRLENBQUN1QixlQUFELEVBQWtCeEIsS0FBbEIsQ0FBZjtBQUNBLEtBWGlCO0FBYWxCeUIsSUFBQUEsV0FBVyxFQUFFLFVBQVMxQixVQUFULEVBQTBCQyxLQUExQixFQUFzQ3FCLE1BQXRDLEVBQW1EO0FBQy9ELFVBQU1YLGVBQWUsR0FBR1IsaUJBQWlCLENBQUNILFVBQUQsRUFBYUMsS0FBYixDQUF6QztBQUNBb0IsTUFBQUEsZUFBZSxDQUFDVixlQUFELEVBQWtCVyxNQUFsQixDQUFmO0FBQ0EsYUFBT1YsY0FBYyxDQUFDRCxlQUFELENBQXJCO0FBQ0E7QUFqQmlCLEdBQW5CO1NBb0JlWSxVIiwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgTG9nIGZyb20gXCJzYXAvYmFzZS9Mb2dcIjtcbmNvbnN0IF9pVGltZW91dEluU2Vjb25kcyA9IDMwLFxuXHRfbUxvY2tDb3VudGVyczogYW55ID0ge30sXG5cdF9vUmVmZXJlbmNlRHVtbXkgPSB7XG5cdFx0Z2V0SWQ6IGZ1bmN0aW9uKCkge1xuXHRcdFx0cmV0dXJuIFwiQnVzeUxvY2tlci5SZWZlcmVuY2VEdW1teVwiO1xuXHRcdH0sXG5cdFx0c2V0QnVzeTogZnVuY3Rpb24oYkJ1c3k6IGFueSkge1xuXHRcdFx0TG9nLmluZm8oYHNldEJ1c3koJHtiQnVzeX0pIHRyaWdnZXJlZCBvbiBkdW1teSByZWZlcmVuY2VgKTtcblx0XHR9XG5cdH07XG5mdW5jdGlvbiBnZXRMb2NrQ291bnRJZChvUmVmZXJlbmNlOiBhbnksIHNQYXRoOiBhbnkpIHtcblx0cmV0dXJuIG9SZWZlcmVuY2UuZ2V0SWQoKSArIChzUGF0aCB8fCBcIi9idXN5XCIpO1xufVxuZnVuY3Rpb24gaXNMb2NrZWQob1JlZmVyZW5jZTogYW55LCBzUGF0aDogYW55KSB7XG5cdHJldHVybiBnZXRMb2NrQ291bnRJZChvUmVmZXJlbmNlLCBzUGF0aCkgaW4gX21Mb2NrQ291bnRlcnM7XG59XG5mdW5jdGlvbiBnZXRMb2NrQ291bnRFbnRyeShvUmVmZXJlbmNlOiBhbnksIHNQYXRoOiBhbnkpIHtcblx0aWYgKCFvUmVmZXJlbmNlIHx8ICFvUmVmZXJlbmNlLmdldElkKSB7XG5cdFx0TG9nLndhcm5pbmcoXCJObyByZWZlcmVuY2UgZm9yIEJ1c3lMb2NrZXIsIHVzaW5nIGR1bW15IHJlZmVyZW5jZVwiKTtcblx0XHRvUmVmZXJlbmNlID0gX29SZWZlcmVuY2VEdW1teTtcblx0fVxuXG5cdHNQYXRoID0gc1BhdGggfHwgXCIvYnVzeVwiO1xuXHRjb25zdCBzSWQgPSBnZXRMb2NrQ291bnRJZChvUmVmZXJlbmNlLCBzUGF0aCk7XG5cblx0aWYgKCEoc0lkIGluIF9tTG9ja0NvdW50ZXJzKSkge1xuXHRcdF9tTG9ja0NvdW50ZXJzW3NJZF0gPSB7XG5cdFx0XHRpZDogc0lkLFxuXHRcdFx0cGF0aDogc1BhdGgsXG5cdFx0XHRyZWZlcmVuY2U6IG9SZWZlcmVuY2UsXG5cdFx0XHRjb3VudDogMFxuXHRcdH07XG5cdH1cblx0cmV0dXJuIF9tTG9ja0NvdW50ZXJzW3NJZF07XG59XG4vKipcbiAqIEBwYXJhbSBtTG9ja0NvdW50RW50cnlcbiAqL1xuZnVuY3Rpb24gZGVsZXRlTG9ja0NvdW50RW50cnkobUxvY2tDb3VudEVudHJ5OiBhbnkpIHtcblx0ZGVsZXRlIF9tTG9ja0NvdW50ZXJzW21Mb2NrQ291bnRFbnRyeS5pZF07XG59XG5cbmZ1bmN0aW9uIGFwcGx5TG9ja1N0YXRlKG1Mb2NrQ291bnRFbnRyeTogYW55KSB7XG5cdGNvbnN0IGJJc01vZGVsID0gbUxvY2tDb3VudEVudHJ5LnJlZmVyZW5jZS5pc0EgJiYgbUxvY2tDb3VudEVudHJ5LnJlZmVyZW5jZS5pc0EoXCJzYXAudWkubW9kZWwuTW9kZWxcIiksXG5cdFx0YkJ1c3kgPSBtTG9ja0NvdW50RW50cnkuY291bnQgIT09IDA7XG5cblx0aWYgKGJJc01vZGVsKSB7XG5cdFx0bUxvY2tDb3VudEVudHJ5LnJlZmVyZW5jZS5zZXRQcm9wZXJ0eShtTG9ja0NvdW50RW50cnkucGF0aCwgYkJ1c3ksIHVuZGVmaW5lZCwgdHJ1ZSk7XG5cdH0gZWxzZSBpZiAobUxvY2tDb3VudEVudHJ5LnJlZmVyZW5jZS5zZXRCdXN5KSB7XG5cdFx0bUxvY2tDb3VudEVudHJ5LnJlZmVyZW5jZS5zZXRCdXN5KGJCdXN5KTtcblx0fVxuXG5cdGNsZWFyVGltZW91dChtTG9ja0NvdW50RW50cnkudGltZW91dCk7XG5cdGlmIChiQnVzeSkge1xuXHRcdG1Mb2NrQ291bnRFbnRyeS50aW1lb3V0ID0gc2V0VGltZW91dChmdW5jdGlvbigpIHtcblx0XHRcdExvZy5lcnJvcihcblx0XHRcdFx0YGJ1c3kgbG9jayBmb3IgJHttTG9ja0NvdW50RW50cnkuaWR9IHdpdGggdmFsdWUgJHttTG9ja0NvdW50RW50cnkuY291bnR9IHRpbWVkIG91dCBhZnRlciAke19pVGltZW91dEluU2Vjb25kc30gc2Vjb25kcyFgXG5cdFx0XHQpO1xuXHRcdH0sIF9pVGltZW91dEluU2Vjb25kcyAqIDEwMDApO1xuXHR9IGVsc2Uge1xuXHRcdGRlbGV0ZUxvY2tDb3VudEVudHJ5KG1Mb2NrQ291bnRFbnRyeSk7XG5cdH1cblxuXHRyZXR1cm4gYkJ1c3k7XG59XG5cbmZ1bmN0aW9uIGNoYW5nZUxvY2tDb3VudChtTG9ja0NvdW50RW50cnk6IGFueSwgaURlbHRhOiBhbnkpIHtcblx0aWYgKGlEZWx0YSA9PT0gMCkge1xuXHRcdG1Mb2NrQ291bnRFbnRyeS5jb3VudCA9IDA7XG5cdFx0TG9nLmluZm8oYGJ1c3kgbG9jayBjb3VudCAnJHttTG9ja0NvdW50RW50cnkuaWR9JyB3YXMgcmVzZXQgdG8gMGApO1xuXHR9IGVsc2Uge1xuXHRcdG1Mb2NrQ291bnRFbnRyeS5jb3VudCArPSBpRGVsdGE7XG5cdFx0TG9nLmluZm8oYGJ1c3kgbG9jayBjb3VudCAnJHttTG9ja0NvdW50RW50cnkuaWR9JyBpcyAke21Mb2NrQ291bnRFbnRyeS5jb3VudH1gKTtcblx0fVxufVxuXG5jb25zdCBCdXN5TG9ja2VyID0ge1xuXHRsb2NrOiBmdW5jdGlvbihvTW9kZWxPckNvbnRyb2w6IGFueSwgc1BhdGg/OiBzdHJpbmcpIHtcblx0XHRyZXR1cm4gdGhpcy5fdXBkYXRlTG9jayhvTW9kZWxPckNvbnRyb2wsIHNQYXRoLCAxKTtcblx0fSxcblxuXHR1bmxvY2s6IGZ1bmN0aW9uKG9Nb2RlbE9yQ29udHJvbDogYW55LCBzUGF0aD86IHN0cmluZykge1xuXHRcdHJldHVybiB0aGlzLl91cGRhdGVMb2NrKG9Nb2RlbE9yQ29udHJvbCwgc1BhdGgsIC0xKTtcblx0fSxcblxuXHRpc0xvY2tlZDogZnVuY3Rpb24ob01vZGVsT3JDb250cm9sOiBhbnksIHNQYXRoPzogc3RyaW5nKSB7XG5cdFx0cmV0dXJuIGlzTG9ja2VkKG9Nb2RlbE9yQ29udHJvbCwgc1BhdGgpO1xuXHR9LFxuXG5cdF91cGRhdGVMb2NrOiBmdW5jdGlvbihvUmVmZXJlbmNlOiBhbnksIHNQYXRoOiBhbnksIGlEZWx0YTogYW55KSB7XG5cdFx0Y29uc3QgbUxvY2tDb3VudEVudHJ5ID0gZ2V0TG9ja0NvdW50RW50cnkob1JlZmVyZW5jZSwgc1BhdGgpO1xuXHRcdGNoYW5nZUxvY2tDb3VudChtTG9ja0NvdW50RW50cnksIGlEZWx0YSk7XG5cdFx0cmV0dXJuIGFwcGx5TG9ja1N0YXRlKG1Mb2NrQ291bnRFbnRyeSk7XG5cdH1cbn07XG5cbmV4cG9ydCBkZWZhdWx0IEJ1c3lMb2NrZXI7XG4iXX0=
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);