@sapui5/sap.fe.templates 1.92.0 → 1.93.3

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 (24) hide show
  1. package/package.json +2 -3
  2. package/src/sap/fe/templates/.library +1 -1
  3. package/src/sap/fe/templates/ListReport/Component.js +7 -0
  4. package/src/sap/fe/templates/ListReport/ListReport.view.xml +71 -25
  5. package/src/sap/fe/templates/ListReport/ListReportController.controller.js +50 -23
  6. package/src/sap/fe/templates/ListReport/overrides/IntentBasedNavigation.js +6 -2
  7. package/src/sap/fe/templates/ListReport/overrides/Share.js +47 -37
  8. package/src/sap/fe/templates/ObjectPage/AnnotationHelper.js +74 -160
  9. package/src/sap/fe/templates/ObjectPage/Component.js +0 -4
  10. package/src/sap/fe/templates/ObjectPage/ObjectPage.view.xml +6 -4
  11. package/src/sap/fe/templates/ObjectPage/ObjectPageController.controller.js +34 -49
  12. package/src/sap/fe/templates/ObjectPage/overrides/Share.js +95 -66
  13. package/src/sap/fe/templates/ObjectPage/overrides/ViewState.js +3 -0
  14. package/src/sap/fe/templates/ObjectPage/templating/ObjectPageTemplating.js +21 -6
  15. package/src/sap/fe/templates/ObjectPage/templating/ObjectPageTemplating.ts +21 -17
  16. package/src/sap/fe/templates/ObjectPage/view/fragments/Actions.fragment.xml +4 -4
  17. package/src/sap/fe/templates/ObjectPage/view/fragments/EditableHeaderFacet.fragment.xml +55 -49
  18. package/src/sap/fe/templates/ObjectPage/view/fragments/FooterContent.fragment.xml +1 -1
  19. package/src/sap/fe/templates/ObjectPage/view/fragments/HeaderContent.fragment.xml +2 -2
  20. package/src/sap/fe/templates/ObjectPage/view/fragments/HeaderFacet.fragment.xml +0 -1
  21. package/src/sap/fe/templates/ObjectPage/view/fragments/HeaderFacetCustomContainer.fragment.xml +14 -26
  22. package/src/sap/fe/templates/RootContainer/controller/RootContainerBaseController.js +2 -2
  23. package/src/sap/fe/templates/library.js +1 -1
  24. package/src/sap/fe/templates/messagebundle.properties +3 -3
@@ -13,9 +13,9 @@ sap.ui.define(
13
13
  ],
14
14
  function(HashChanger, ModelHelper, SemanticKeyHelper, Filter, FilterOperator, Log) {
15
15
  "use strict";
16
- var bIsActiveEntity, bHasActiveEntity, bIsStickySupported, oUIModel, sEditMode;
16
+ var bIsStickySupported, oUIModel, sEditMode;
17
17
 
18
- function createFilterToFetchActiveContext(mKeyValues) {
18
+ function createFilterToFetchActiveContext(mKeyValues, bIsActiveEntityDefined) {
19
19
  var aFilters,
20
20
  aKeys = Object.keys(mKeyValues);
21
21
 
@@ -25,12 +25,16 @@ sap.ui.define(
25
25
  return new Filter(sKey, FilterOperator.EQ, sValue);
26
26
  }
27
27
  });
28
- var oActiveFilter = new Filter({
29
- filters: [new Filter("SiblingEntity/IsActiveEntity", FilterOperator.EQ, true)],
30
- and: false
31
- });
32
28
 
33
- aFilters.push(oActiveFilter);
29
+ if (bIsActiveEntityDefined) {
30
+ var oActiveFilter = new Filter({
31
+ filters: [new Filter("SiblingEntity/IsActiveEntity", FilterOperator.EQ, true)],
32
+ and: false
33
+ });
34
+
35
+ aFilters.push(oActiveFilter);
36
+ }
37
+
34
38
  var oCombinedFilter = new Filter(aFilters, true);
35
39
  return oCombinedFilter;
36
40
  }
@@ -68,22 +72,40 @@ sap.ui.define(
68
72
  // which is required to create a filter to fetch the relavant/correct active context
69
73
  // Example: {SalesOrderManage:{technicalID:technicalIDValue}, _Item:{technicalID:technicalIDValue}} etc.,
70
74
  var oPageMap = {};
75
+ var aPageHashArray = [];
71
76
  aCurrentHashArray.forEach(function(sPageHash) {
72
77
  var aKeyValues = sPageHash.substring(sPageHash.indexOf("(") + 1, sPageHash.length - 1).split(",");
73
78
  var mKeyValues = {};
74
- aKeyValues.forEach(function(sKeyAssignment) {
75
- var aParts = sKeyAssignment.split("="),
76
- sKeyValue = aParts[1];
79
+ var sPageHashName = sPageHash.split("(")[0];
80
+ oPageMap[sPageHashName] = {};
81
+ aPageHashArray.push(sPageHashName);
82
+ oPageMap[sPageHashName]["bIsActiveEntityDefined"] = true;
83
+ for (var i = 0; i < aKeyValues.length; i++) {
84
+ var sKeyAssignment = aKeyValues[i];
85
+ var aParts = sKeyAssignment.split("=");
86
+ var sKeyValue = aParts[1];
87
+ var sKey = aParts[0];
88
+ // In case if only one technical key is defined then the url just contains the technicalIDValue but not the technicalID
89
+ // Example: SalesOrderManage(ID=11111129-aaaa-bbbb-cccc-ddddeeeeffff,IsActiveEntity=false)/_Item(11111129-aaaa-bbbb-cccc-ddddeeeeffff)
90
+ // In above example SalesOrderItem has only one technical key defined, hence technicalID info is not present in the url
91
+ // Hence in such cases we get technical key and use them to fetch active context
92
+ if (sKeyAssignment.indexOf("=") === -1) {
93
+ var oMetaModel = oContext.getModel().getMetaModel();
94
+ var aTechnicalKeys = oMetaModel.getObject("/" + aPageHashArray.join("/") + "/$Type/$Key");
95
+ sKeyValue = aParts[0];
96
+ sKey = aTechnicalKeys[0];
97
+ oPageMap[sPageHash.split("(")[0]]["bIsActiveEntityDefined"] = false;
98
+ }
77
99
 
78
- if (aParts[0] !== "IsActiveEntity") {
100
+ if (sKey !== "IsActiveEntity") {
79
101
  if (sKeyValue.indexOf("'") === 0 && sKeyValue.lastIndexOf("'") === sKeyValue.length - 1) {
80
102
  // Remove the quotes from the value and decode special chars
81
103
  sKeyValue = decodeURIComponent(sKeyValue.substring(1, sKeyValue.length - 1));
82
104
  }
83
- mKeyValues[aParts[0]] = sKeyValue;
105
+ mKeyValues[sKey] = sKeyValue;
84
106
  }
85
- });
86
- oPageMap[sPageHash.split("(")[0]] = mKeyValues;
107
+ }
108
+ oPageMap[sPageHashName].mKeyValues = mKeyValues;
87
109
  });
88
110
 
89
111
  var oPageEntitySet = oEntitySet;
@@ -101,12 +123,13 @@ sap.ui.define(
101
123
  } else {
102
124
  oPageInfo.pageEntityName = sNavigationPath;
103
125
  }
104
- oPageInfo.mKeyValues = oPageMap[sNavigationPath];
126
+ oPageInfo.mKeyValues = oPageMap[sNavigationPath].mKeyValues;
127
+ oPageInfo.bIsActiveEntityDefined = oPageMap[sNavigationPath].bIsActiveEntityDefined;
105
128
  aPages.push(oPageInfo);
106
129
  });
107
130
 
108
131
  aPages.forEach(function(oPageInfo) {
109
- var oFilter = createFilterToFetchActiveContext(oPageInfo.mKeyValues);
132
+ var oFilter = createFilterToFetchActiveContext(oPageInfo.mKeyValues, oPageInfo.bIsActiveEntityDefined);
110
133
  aActiveContextpromises.push(getActiveContextPath(oController, oPageInfo.pageEntityName, oFilter));
111
134
  });
112
135
 
@@ -199,8 +222,6 @@ sap.ui.define(
199
222
  // 2. In case of draft enabled Sub Object Pages (where semantic bookmarking is not supported)
200
223
  var oViewData = oController.getView().getViewData();
201
224
  if (oContext && !bIsStickySupported && ((oViewData.viewLevel === 1 && !aSemanticKeys) || oViewData.viewLevel >= 2)) {
202
- bIsActiveEntity = oContext.getObject().IsActiveEntity;
203
- bHasActiveEntity = oContext.getObject().HasActiveEntity;
204
225
  oPromise = getActiveContextPaths(oContext, oController);
205
226
  return oPromise;
206
227
  } else {
@@ -209,76 +230,84 @@ sap.ui.define(
209
230
  }
210
231
 
211
232
  /**
212
- * Get custom URL for creating a new tile.
233
+ * Get share URL.
213
234
  * @param sEditMode
214
- * @param bIsActiveEntity
215
- * @param bHasActiveEntity
216
235
  * @param bIsStickySupported
217
236
  * @param aActiveContextPaths
218
- * @returns {string} The custom URL
237
+ * @returns {string} The share URL
219
238
  * @protected
220
239
  * @static
221
240
  */
222
- function getCustomUrl(sEditMode, bIsActiveEntity, bHasActiveEntity, bIsStickySupported, aActiveContextPaths) {
223
- var sCustomUrl;
241
+ function getShareUrl(sEditMode, bIsStickySupported, aActiveContextPaths) {
242
+ var sShareUrl;
224
243
  var sHash = HashChanger.getInstance().getHash();
225
244
  var sBasePath = HashChanger.getInstance().hrefForAppSpecificHash ? HashChanger.getInstance().hrefForAppSpecificHash("") : "";
226
- if (sEditMode === "Editable" && !bIsStickySupported && !bIsActiveEntity && bHasActiveEntity && aActiveContextPaths) {
227
- sCustomUrl = sBasePath + aActiveContextPaths.join("/");
245
+ if (sEditMode === "Editable" && !bIsStickySupported && aActiveContextPaths) {
246
+ sShareUrl = sBasePath + aActiveContextPaths.join("/");
228
247
  } else {
229
- sCustomUrl = sHash ? sBasePath + sHash : window.location.href;
248
+ sShareUrl = sHash ? sBasePath + sHash : window.location.hash;
230
249
  }
231
- return sCustomUrl;
250
+ return sShareUrl;
232
251
  }
233
252
 
234
- function getShareEmailUrl(sEditMode, bIsStickySupported, bIsActiveEntity, bHasActiveEntity, aActiveContextPaths) {
235
- var sShareEmailUrl = document.URL;
253
+ function getJamUrl(sEditMode, bIsStickySupported, aActiveContextPaths) {
254
+ var sJamUrl;
255
+ var sHash = HashChanger.getInstance().getHash();
236
256
  var sBasePath = HashChanger.getInstance().hrefForAppSpecificHash ? HashChanger.getInstance().hrefForAppSpecificHash("") : "";
237
- if (sEditMode === "Editable" && !bIsStickySupported && !bIsActiveEntity && bHasActiveEntity && aActiveContextPaths) {
238
- sShareEmailUrl = window.location.origin + window.location.pathname + sBasePath + aActiveContextPaths.join("/");
257
+ if (sEditMode === "Editable" && !bIsStickySupported && aActiveContextPaths) {
258
+ sJamUrl = sBasePath + aActiveContextPaths.join("/");
259
+ } else {
260
+ sJamUrl = sHash ? sBasePath + sHash : window.location.hash;
261
+ }
262
+ // in case we are in cFLP scenario, the application is running
263
+ // inside an iframe, and there for we need to get the cFLP URL
264
+ // and not 'document.URL' that represents the iframe URL
265
+ if (sap.ushell && sap.ushell.Container && sap.ushell.Container.runningInIframe && sap.ushell.Container.runningInIframe()) {
266
+ sap.ushell.Container.getFLPUrl(true)
267
+ .then(function(sUrl) {
268
+ return sUrl.substr(0, sUrl.indexOf("#")) + sJamUrl;
269
+ })
270
+ .catch(function(sError) {
271
+ Log.error("Could not retrieve cFLP URL for the sharing dialog (dialog will not be opened)", sError);
272
+ });
273
+ } else {
274
+ return Promise.resolve(window.location.origin + window.location.pathname + sJamUrl);
239
275
  }
240
- return sShareEmailUrl;
241
276
  }
242
277
 
243
278
  return {
244
- adaptShareData: function(oShareData) {
279
+ adaptShareMetadata: function(oShareMetadata) {
245
280
  var that = this;
246
281
  var oContext = this.base.getView().getBindingContext();
247
282
  oUIModel = this.base.getView().getModel("ui");
248
283
  sEditMode = oUIModel.getProperty("/editMode");
249
284
  return fetchActiveContextPaths(oContext, that.base.getView().getController()).then(function(aActiveContextPaths) {
250
- return that.base
251
- .getView()
252
- .getController()
253
- ._getPageTitleInformation()
254
- .then(function(pageTitleInfo) {
255
- var sTitle = pageTitleInfo.title;
256
- var sObjectSubtitle = pageTitleInfo.subtitle;
257
- if (sObjectSubtitle) {
258
- sTitle = sTitle + " - " + sObjectSubtitle;
259
- }
260
- oShareData = {
261
- title: pageTitleInfo.title,
262
- subtitle: pageTitleInfo.subtitle,
263
- emailSubject: sTitle,
264
- jamText: sTitle
265
- };
266
- oShareData.customUrl = getCustomUrl(
267
- sEditMode,
268
- bIsActiveEntity,
269
- bHasActiveEntity,
270
- bIsStickySupported,
271
- aActiveContextPaths
272
- );
273
- oShareData.shareEmailUrl = getShareEmailUrl(
274
- sEditMode,
275
- bIsStickySupported,
276
- bIsActiveEntity,
277
- bHasActiveEntity,
278
- aActiveContextPaths
279
- );
280
- return oShareData;
281
- });
285
+ var aPromises = [];
286
+ aPromises.push(
287
+ that.base
288
+ .getView()
289
+ .getController()
290
+ ._getPageTitleInformation()
291
+ );
292
+ aPromises.push(getJamUrl(sEditMode, bIsStickySupported, aActiveContextPaths));
293
+ return Promise.all(aPromises).then(function(oData) {
294
+ var oPageTitleInfo = oData[0];
295
+ var sJamUrl = oData[1];
296
+ var sTitle = oPageTitleInfo.title;
297
+ var sObjectSubtitle = oPageTitleInfo.subtitle;
298
+ if (sObjectSubtitle) {
299
+ sTitle = sTitle + " - " + sObjectSubtitle;
300
+ }
301
+ oShareMetadata.tile = {
302
+ title: oPageTitleInfo.title,
303
+ subtitle: oPageTitleInfo.subtitle
304
+ };
305
+ oShareMetadata.email.title = sTitle;
306
+ oShareMetadata.title = sTitle;
307
+ oShareMetadata.url = getShareUrl(sEditMode, bIsStickySupported, aActiveContextPaths);
308
+ oShareMetadata.jam.url = sJamUrl;
309
+ return oShareMetadata;
310
+ });
282
311
  });
283
312
  }
284
313
  };
@@ -8,6 +8,9 @@ sap.ui.define(["sap/fe/core/library"], function(CoreLibrary) {
8
8
  var VariantManagement = CoreLibrary.VariantManagement;
9
9
 
10
10
  return {
11
+ applyInitialStateOnly: function() {
12
+ return false;
13
+ },
11
14
  adaptStateControls: function(aStateControls) {
12
15
  var oView = this.getView(),
13
16
  oController = oView.getController(),
@@ -42,12 +42,20 @@ sap.ui.define(["sap/fe/core/helpers/BindingExpression", "sap/fe/core/converters/
42
42
  * @returns The binding expression for the object page title
43
43
  */
44
44
  var getExpressionForTitle = function (oHeaderInfo, oViewData, fullContextPath) {
45
- var _ref;
45
+ var _ref, _ref2, _ref3, _ref3$Value, _ref3$Value$$target, _ref3$Value$$target$a, _ref3$Value$$target$a2, _ref3$Value$$target$a3, _ref3$Value$$target$a4, _ref3$Value$$target$a5;
46
46
 
47
47
  var titleNoHeaderInfo = CommonUtils.getTranslatedText("T_NEW_OBJECT", oViewData.resourceBundle, null, oViewData.entitySet);
48
48
  var titleWithHeaderInfo = CommonUtils.getTranslatedText("T_ANNOTATION_HELPER_DEFAULT_OBJECT_PAGE_HEADER_TITLE", oViewData.resourceBundle, null, oViewData.entitySet);
49
- var titleForActiveHeaderNoHeaderInfo = CommonUtils.getTranslatedText("T_ANNOTATION_HELPER_DEFAULT_OBJECT_PAGE_HEADER_TITLE_NO_HEADER_INFO", oViewData.resourceBundle);
50
- var titleValueExpression = formatValueRecursively(addTextArrangementToBindingExpression(annotationExpression((_ref = oHeaderInfo === null || oHeaderInfo === void 0 ? void 0 : oHeaderInfo.Title) === null || _ref === void 0 ? void 0 : _ref.Value), fullContextPath), fullContextPath); // If there is a TypeName defined, show the default title 'New + TypeName', otherwise show the custom title or the default 'New object'
49
+ var oEmptyHeaderInfoTitle = (oHeaderInfo === null || oHeaderInfo === void 0 ? void 0 : oHeaderInfo.Title) === undefined || (oHeaderInfo === null || oHeaderInfo === void 0 ? void 0 : oHeaderInfo.Title) === "" || ((_ref = oHeaderInfo === null || oHeaderInfo === void 0 ? void 0 : oHeaderInfo.Title) === null || _ref === void 0 ? void 0 : _ref.Value) === "";
50
+ var titleForActiveHeaderNoHeaderInfo = !oEmptyHeaderInfoTitle ? CommonUtils.getTranslatedText("T_ANNOTATION_HELPER_DEFAULT_OBJECT_PAGE_HEADER_TITLE_NO_HEADER_INFO", oViewData.resourceBundle) : "";
51
+ var titleValueExpression = annotationExpression((_ref2 = oHeaderInfo === null || oHeaderInfo === void 0 ? void 0 : oHeaderInfo.Title) === null || _ref2 === void 0 ? void 0 : _ref2.Value);
52
+
53
+ if ((_ref3 = oHeaderInfo === null || oHeaderInfo === void 0 ? void 0 : oHeaderInfo.Title) === null || _ref3 === void 0 ? void 0 : (_ref3$Value = _ref3.Value) === null || _ref3$Value === void 0 ? void 0 : (_ref3$Value$$target = _ref3$Value.$target) === null || _ref3$Value$$target === void 0 ? void 0 : (_ref3$Value$$target$a = _ref3$Value$$target.annotations) === null || _ref3$Value$$target$a === void 0 ? void 0 : (_ref3$Value$$target$a2 = _ref3$Value$$target$a.Common) === null || _ref3$Value$$target$a2 === void 0 ? void 0 : (_ref3$Value$$target$a3 = _ref3$Value$$target$a2.Text) === null || _ref3$Value$$target$a3 === void 0 ? void 0 : (_ref3$Value$$target$a4 = _ref3$Value$$target$a3.annotations) === null || _ref3$Value$$target$a4 === void 0 ? void 0 : (_ref3$Value$$target$a5 = _ref3$Value$$target$a4.UI) === null || _ref3$Value$$target$a5 === void 0 ? void 0 : _ref3$Value$$target$a5.TextArrangement) {
54
+ // In case an explicit text arrangement was set we make use of it in the description as well
55
+ titleValueExpression = addTextArrangementToBindingExpression(titleValueExpression, fullContextPath);
56
+ }
57
+
58
+ titleValueExpression = formatValueRecursively(titleValueExpression, fullContextPath); // If there is a TypeName defined, show the default title 'New + TypeName', otherwise show the custom title or the default 'New object'
51
59
 
52
60
  var createModeTitle = (oHeaderInfo === null || oHeaderInfo === void 0 ? void 0 : oHeaderInfo.TypeName) ? concat(titleWithHeaderInfo, " ", annotationExpression(oHeaderInfo.TypeName.toString())) : titleNoHeaderInfo;
53
61
  return compileBinding(ifElse( // If Create Mode && Empty expression
@@ -66,9 +74,16 @@ sap.ui.define(["sap/fe/core/helpers/BindingExpression", "sap/fe/core/converters/
66
74
  _exports.getExpressionForTitle = getExpressionForTitle;
67
75
 
68
76
  var getExpressionForDescription = function (oHeaderInfo, fullContextPath) {
69
- var _ref2;
77
+ var _ref4, _ref5, _ref5$Value, _ref5$Value$$target, _ref5$Value$$target$a, _ref5$Value$$target$a2, _ref5$Value$$target$a3, _ref5$Value$$target$a4, _ref5$Value$$target$a5;
78
+
79
+ var bindingExpression = annotationExpression((_ref4 = oHeaderInfo === null || oHeaderInfo === void 0 ? void 0 : oHeaderInfo.Description) === null || _ref4 === void 0 ? void 0 : _ref4.Value);
80
+
81
+ if ((_ref5 = oHeaderInfo === null || oHeaderInfo === void 0 ? void 0 : oHeaderInfo.Description) === null || _ref5 === void 0 ? void 0 : (_ref5$Value = _ref5.Value) === null || _ref5$Value === void 0 ? void 0 : (_ref5$Value$$target = _ref5$Value.$target) === null || _ref5$Value$$target === void 0 ? void 0 : (_ref5$Value$$target$a = _ref5$Value$$target.annotations) === null || _ref5$Value$$target$a === void 0 ? void 0 : (_ref5$Value$$target$a2 = _ref5$Value$$target$a.Common) === null || _ref5$Value$$target$a2 === void 0 ? void 0 : (_ref5$Value$$target$a3 = _ref5$Value$$target$a2.Text) === null || _ref5$Value$$target$a3 === void 0 ? void 0 : (_ref5$Value$$target$a4 = _ref5$Value$$target$a3.annotations) === null || _ref5$Value$$target$a4 === void 0 ? void 0 : (_ref5$Value$$target$a5 = _ref5$Value$$target$a4.UI) === null || _ref5$Value$$target$a5 === void 0 ? void 0 : _ref5$Value$$target$a5.TextArrangement) {
82
+ // In case an explicit text arrangement was set we make use of it in the description as well
83
+ bindingExpression = addTextArrangementToBindingExpression(bindingExpression, fullContextPath);
84
+ }
70
85
 
71
- return compileBinding(formatValueRecursively(addTextArrangementToBindingExpression(annotationExpression((_ref2 = oHeaderInfo === null || oHeaderInfo === void 0 ? void 0 : oHeaderInfo.Description) === null || _ref2 === void 0 ? void 0 : _ref2.Value), fullContextPath), fullContextPath));
86
+ return compileBinding(formatValueRecursively(bindingExpression, fullContextPath));
72
87
  };
73
88
  /**
74
89
  * Return the expression for the save button.
@@ -100,4 +115,4 @@ sap.ui.define(["sap/fe/core/helpers/BindingExpression", "sap/fe/core/converters/
100
115
  _exports.getExpressionForSaveButton = getExpressionForSaveButton;
101
116
  return _exports;
102
117
  }, false);
103
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIk9iamVjdFBhZ2VUZW1wbGF0aW5nLnRzIl0sIm5hbWVzIjpbImdldEV4cHJlc3Npb25Gb3JUaXRsZSIsIm9IZWFkZXJJbmZvIiwib1ZpZXdEYXRhIiwiZnVsbENvbnRleHRQYXRoIiwidGl0bGVOb0hlYWRlckluZm8iLCJDb21tb25VdGlscyIsImdldFRyYW5zbGF0ZWRUZXh0IiwicmVzb3VyY2VCdW5kbGUiLCJlbnRpdHlTZXQiLCJ0aXRsZVdpdGhIZWFkZXJJbmZvIiwidGl0bGVGb3JBY3RpdmVIZWFkZXJOb0hlYWRlckluZm8iLCJ0aXRsZVZhbHVlRXhwcmVzc2lvbiIsImZvcm1hdFZhbHVlUmVjdXJzaXZlbHkiLCJhZGRUZXh0QXJyYW5nZW1lbnRUb0JpbmRpbmdFeHByZXNzaW9uIiwiYW5ub3RhdGlvbkV4cHJlc3Npb24iLCJUaXRsZSIsIlZhbHVlIiwiY3JlYXRlTW9kZVRpdGxlIiwiVHlwZU5hbWUiLCJjb25jYXQiLCJ0b1N0cmluZyIsImNvbXBpbGVCaW5kaW5nIiwiaWZFbHNlIiwiYW5kIiwiVUkiLCJJc0NyZWF0ZU1vZGUiLCJpc0VtcHR5IiwiZ2V0RXhwcmVzc2lvbkZvckRlc2NyaXB0aW9uIiwiRGVzY3JpcHRpb24iLCJnZXRFeHByZXNzaW9uRm9yU2F2ZUJ1dHRvbiIsInNhdmVCdXR0b25UZXh0IiwiY3JlYXRlQnV0dG9uVGV4dCIsInNhdmVFeHByZXNzaW9uIiwiaXNTdGlja3lTZXNzaW9uU3VwcG9ydGVkIiwic3RhcnRpbmdFbnRpdHlTZXQiLCJJc0NyZWF0ZU1vZGVTdGlja3kiLCJEcmFmdCIsIklzTmV3T2JqZWN0Il0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQWtCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUNBOzs7Ozs7OztBQVFPLE1BQU1BLHFCQUFxQixHQUFHLFVBQ3BDQyxXQURvQyxFQUVwQ0MsU0FGb0MsRUFHcENDLGVBSG9D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cmNlc0NvbnRlbnQiOlsiLy8gRm9ybWF0dGVycyBmb3IgdGhlIE9iamVjdCBQYWdlXG5pbXBvcnQge1xuXHRhbmQsXG5cdGlmRWxzZSxcblx0aXNFbXB0eSxcblx0Y29uY2F0LFxuXHRhbm5vdGF0aW9uRXhwcmVzc2lvbixcblx0Y29tcGlsZUJpbmRpbmcsXG5cdEJpbmRpbmdFeHByZXNzaW9uXG59IGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL0JpbmRpbmdFeHByZXNzaW9uXCI7XG5pbXBvcnQgeyBVSSwgRHJhZnQgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9oZWxwZXJzL0JpbmRpbmdIZWxwZXJcIjtcbmltcG9ydCB7IENvbW1vblV0aWxzLCBWaWV3RGF0YSB9IGZyb20gXCJzYXAvZmUvY29yZVwiO1xuaW1wb3J0IHsgSGVhZGVySW5mb1R5cGUgfSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXNcIjtcbmltcG9ydCB7IERhdGFNb2RlbE9iamVjdFBhdGggfSBmcm9tIFwic2FwL2ZlL2NvcmUvdGVtcGxhdGluZy9EYXRhTW9kZWxQYXRoSGVscGVyXCI7XG5pbXBvcnQgeyBhZGRUZXh0QXJyYW5nZW1lbnRUb0JpbmRpbmdFeHByZXNzaW9uLCBmb3JtYXRWYWx1ZVJlY3Vyc2l2ZWx5IH0gZnJvbSBcInNhcC9mZS9tYWNyb3MvZmllbGQvRmllbGRUZW1wbGF0aW5nXCI7XG5pbXBvcnQgeyBEYXRhRmllbGRUeXBlcyB9IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlcy9kaXN0L2dlbmVyYXRlZC9VSVwiO1xuaW1wb3J0IHsgaXNTdGlja3lTZXNzaW9uU3VwcG9ydGVkIH0gZnJvbSBcInNhcC9mZS9jb3JlL3RlbXBsYXRpbmcvRW50aXR5U2V0SGVscGVyXCI7XG5cbi8vYGBgbWVybWFpZFxuLy8gZ3JhcGggVERcbi8vIEFbT2JqZWN0IFBhZ2UgVGl0bGVdIC0tPnxHZXQgRGF0YUZpZWxkIFZhbHVlfCBDe0V2YWx1YXRlIENyZWF0ZSBNb2RlfVxuLy8gQyAtLT58SW4gQ3JlYXRlIE1vZGV8IER7SXMgRGF0YUZpZWxkIFZhbHVlIGVtcHR5fVxuLy8gRCAtLT58WWVzfCBGe0lzIHRoZXJlIGEgVHlwZU5hbWV9XG4vLyBGIC0tPnxZZXN8IEdbSXMgdGhlcmUgYW4gY3VzdG9tIHRpdGxlXVxuLy8gRyAtLT58WWVzfCBHMVtTaG93IHRoZSBjdXN0b20gdGl0bGUgKyAnVHlwZU5hbWUnXVxuLy8gRyAtLT58Tm98IEcyW0Rpc3BsYXkgdGhlIGRlZmF1bHQgdGl0bGUgJ05ldyArIFR5cGVOYW1lJ11cbi8vIEYgLS0+fE5vfCBIW0lzIHRoZXJlIGEgY3VzdG9tIHRpdGxlXVxuLy8gSCAtLT58WWVzfCBJW1Nob3cgdGhlIGN1c3RvbSB0aXRsZV1cbi8vIEggLS0+fE5vfCBKW1Nob3cgdGhlIGRlZmF1bHQgJ1VuYW1uZWQgT2JqZWN0J11cbi8vIEQgLS0+fE5vfCBFXG4vLyBDIC0tPnxOb3QgaW4gY3JlYXRlIG1vZGV8IEVbU2hvdyBEYXRhRmllbGQgVmFsdWVdXG4vLyBgYGBcbi8qKlxuICogQ29tcHV0ZSB0aGUgdGl0bGUgZm9yIHRoZSBvYmplY3QgcGFnZS5cbiAqXG4gKiBAcGFyYW0gb0hlYWRlckluZm8gVGhlIEBVSS5IZWFkZXJJbmZvIGFubm90YXRpb24gY29udGVudFxuICogQHBhcmFtIG9WaWV3RGF0YSBUaGUgdmlldyBkYXRhIG9iamVjdCB3ZSdyZSBjdXJyZW50bHkgb25cbiAqIEBwYXJhbSBmdWxsQ29udGV4dFBhdGggVGhlIGZ1bGwgY29udGV4dCBwYXRoIHVzZWQgdG8gcmVhY2ggdGhhdCBvYmplY3QgcGFnZVxuICogQHJldHVybnMgVGhlIGJpbmRpbmcgZXhwcmVzc2lvbiBmb3IgdGhlIG9iamVjdCBwYWdlIHRpdGxlXG4gKi9cbmV4cG9ydCBjb25zdCBnZXRFeHByZXNzaW9uRm9yVGl0bGUgPSBmdW5jdGlvbihcblx0b0hlYWRlckluZm86IEhlYWRlckluZm9UeXBlIHwgdW5kZWZpbmVkLFxuXHRvVmlld0RhdGE6IFZpZXdEYXRhLFxuXHRmdWxsQ29udGV4dFBhdGg6IERhdGFNb2RlbE9iamVjdFBhdGhcbik6IEJpbmRpbmdFeHByZXNzaW9uPHN0cmluZz4ge1xuXHRjb25zdCB0aXRsZU5vSGVhZGVySW5mbyA9IENvbW1vblV0aWxzLmdldFRyYW5zbGF0ZWRUZXh0KFwiVF9ORVdfT0JKRUNUXCIsIG9WaWV3RGF0YS5yZXNvdXJjZUJ1bmRsZSwgbnVsbCwgb1ZpZXdEYXRhLmVudGl0eVNldCk7XG5cblx0Y29uc3QgdGl0bGVXaXRoSGVhZGVySW5mbyA9IENvbW1vblV0aWxzLmdldFRyYW5zbGF0ZWRUZXh0KFxuXHRcdFwiVF9BTk5PVEFUSU9OX0hFTFBFUl9ERUZBVUxUX09CSkVDVF9QQUdFX0hFQURFUl9USVRMRVwiLFxuXHRcdG9WaWV3RGF0YS5yZXNvdXJjZUJ1bmRsZSxcblx0XHRudWxsLFxuXHRcdG9WaWV3RGF0YS5lbnRpdHlTZXRcblx0KTtcblxuXHRjb25zdCB0aXRsZUZvckFjdGl2ZUhlYWRlck5vSGVhZGVySW5mbyA9IENvbW1vblV0aWxzLmdldFRyYW5zbGF0ZWRUZXh0KFxuXHRcdFwiVF9BTk5PVEFUSU9OX0hFTFBFUl9ERUZBVUxUX09CSkVDVF9QQUdFX0hFQURFUl9USVRMRV9OT19IRUFERVJfSU5GT1wiLFxuXHRcdG9WaWV3RGF0YS5yZXNvdXJjZUJ1bmRsZVxuXHQpO1xuXHRjb25zdCB0aXRsZVZhbHVlRXhwcmVzc2lvbiA9IGZvcm1hdFZhbHVlUmVjdXJzaXZlbHkoXG5cdFx0YWRkVGV4dEFycmFuZ2VtZW50VG9CaW5kaW5nRXhwcmVzc2lvbihhbm5vdGF0aW9uRXhwcmVzc2lvbigob0hlYWRlckluZm8/LlRpdGxlIGFzIERhdGFGaWVsZFR5cGVzKT8uVmFsdWUpLCBmdWxsQ29udGV4dFBhdGgpLFxuXHRcdGZ1bGxDb250ZXh0UGF0aFxuXHQpO1xuXG5cdC8vIElmIHRoZXJlIGlzIGEgVHlwZU5hbWUgZGVmaW5lZCwgc2hvdyB0aGUgZGVmYXVsdCB0aXRsZSAnTmV3ICsgVHlwZU5hbWUnLCBvdGhlcndpc2Ugc2hvdyB0aGUgY3VzdG9tIHRpdGxlIG9yIHRoZSBkZWZhdWx0ICdOZXcgb2JqZWN0J1xuXHRjb25zdCBjcmVhdGVNb2RlVGl0bGUgPSBvSGVhZGVySW5mbz8uVHlwZU5hbWVcblx0XHQ/IGNvbmNhdCh0aXRsZVdpdGhIZWFkZXJJbmZvLCBcIiBcIiwgYW5ub3RhdGlvbkV4cHJlc3Npb24ob0hlYWRlckluZm8uVHlwZU5hbWUudG9TdHJpbmcoKSkpXG5cdFx0OiB0aXRsZU5vSGVhZGVySW5mbztcblxuXHRyZXR1cm4gY29tcGlsZUJpbmRpbmcoXG5cdFx0aWZFbHNlKFxuXHRcdFx0Ly8gSWYgQ3JlYXRlIE1vZGUgJiYgRW1wdHkgZXhwcmVzc2lvblxuXHRcdFx0YW5kKFVJLklzQ3JlYXRlTW9kZSwgdGl0bGVWYWx1ZUV4cHJlc3Npb24gJiYgaXNFbXB0eSh0aXRsZVZhbHVlRXhwcmVzc2lvbikpLFxuXG5cdFx0XHRjcmVhdGVNb2RlVGl0bGUsXG5cdFx0XHQvLyBPdGhlcndpc2Ugc2hvdyB0aGUgZGVmYXVsdCBleHByZXNzaW9uXG5cdFx0XHRpZkVsc2UodGl0bGVWYWx1ZUV4cHJlc3Npb24gJiYgaXNFbXB0eSh0aXRsZVZhbHVlRXhwcmVzc2lvbiksIHRpdGxlRm9yQWN0aXZlSGVhZGVyTm9IZWFkZXJJbmZvLCB0aXRsZVZhbHVlRXhwcmVzc2lvbilcblx0XHQpXG5cdCk7XG59O1xuXG4vKipcbiAqIFJldHJpZXZlcyB0aGUgZXhwcmVzc2lvbiBmb3IgdGhlIGRlc2NyaXB0aW9uIG9mIGFuIG9iamVjdCBwYWdlLlxuICpcbiAqIEBwYXJhbSBvSGVhZGVySW5mbyBUaGUgQFVJLkhlYWRlckluZm8gYW5ub3RhdGlvbiBjb250ZW50XG4gKiBAcGFyYW0gZnVsbENvbnRleHRQYXRoIFRoZSBmdWxsIGNvbnRleHQgcGF0aCB1c2VkIHRvIHJlYWNoIHRoYXQgb2JqZWN0IHBhZ2VcbiAqIEByZXR1cm5zIFRoZSBiaW5kaW5nIGV4cHJlc3Npb24gZm9yIHRoZSBvYmplY3QgcGFnZSBkZXNjcmlwdGlvblxuICovXG5leHBvcnQgY29uc3QgZ2V0RXhwcmVzc2lvbkZvckRlc2NyaXB0aW9uID0gZnVuY3Rpb24oXG5cdG9IZWFkZXJJbmZvOiBIZWFkZXJJbmZvVHlwZSB8IHVuZGVmaW5lZCxcblx0ZnVsbENvbnRleHRQYXRoOiBEYXRhTW9kZWxPYmplY3RQYXRoXG4pOiBCaW5kaW5nRXhwcmVzc2lvbjxzdHJpbmc+IHtcblx0cmV0dXJuIGNvbXBpbGVCaW5kaW5nKFxuXHRcdGZvcm1hdFZhbHVlUmVjdXJzaXZlbHkoXG5cdFx0XHRhZGRUZXh0QXJyYW5nZW1lbnRUb0JpbmRpbmdFeHByZXNzaW9uKFxuXHRcdFx0XHRhbm5vdGF0aW9uRXhwcmVzc2lvbigob0hlYWRlckluZm8/LkRlc2NyaXB0aW9uIGFzIERhdGFGaWVsZFR5cGVzKT8uVmFsdWUpLFxuXHRcdFx0XHRmdWxsQ29udGV4dFBhdGhcblx0XHRcdCksXG5cdFx0XHRmdWxsQ29udGV4dFBhdGhcblx0XHQpXG5cdCk7XG59O1xuXG4vKipcbiAqIFJldHVybiB0aGUgZXhwcmVzc2lvbiBmb3IgdGhlIHNhdmUgYnV0dG9uLlxuICpcbiAqIEBwYXJhbSBvVmlld0RhdGEgVGhlIGN1cnJlbnQgdmlldyBkYXRhXG4gKiBAcGFyYW0gZnVsbENvbnRleHRQYXRoIFRoZSBwYXRoIHVzZWQgdXAgdW50aWwgaGVyZVxuICogQHJldHVybnMgVGhlIGJpbmRpbmcgZXhwcmVzc2lvbiB0aGF0IHNob3dzIHRoZSByaWdodCBzYXZlIGJ1dHRvbiB0ZXh0XG4gKi9cbmV4cG9ydCBjb25zdCBnZXRFeHByZXNzaW9uRm9yU2F2ZUJ1dHRvbiA9IGZ1bmN0aW9uKG9WaWV3RGF0YTogVmlld0RhdGEsIGZ1bGxDb250ZXh0UGF0aDogRGF0YU1vZGVsT2JqZWN0UGF0aCk6IEJpbmRpbmdFeHByZXNzaW9uPHN0cmluZz4ge1xuXHRjb25zdCBzYXZlQnV0dG9uVGV4dCA9IENvbW1vblV0aWxzLmdldFRyYW5zbGF0ZWRUZXh0KFwiVF9PUF9PQkpFQ1RfUEFHRV9TQVZFXCIsIG9WaWV3RGF0YS5yZXNvdXJjZUJ1bmRsZSk7XG5cdGNvbnN0IGNyZWF0ZUJ1dHRvblRleHQgPSBDb21tb25VdGlscy5nZXRUcmFuc2xhdGVkVGV4dChcIlRfT1BfT0JKRUNUX1BBR0VfQ1JFQVRFXCIsIG9WaWV3RGF0YS5yZXNvdXJjZUJ1bmRsZSk7XG5cdGxldCBzYXZlRXhwcmVzc2lvbjtcblx0aWYgKGlzU3RpY2t5U2Vzc2lvblN1cHBvcnRlZChmdWxsQ29udGV4dFBhdGguc3RhcnRpbmdFbnRpdHlTZXQpKSB7XG5cdFx0Ly8gSWYgd2UncmUgaW4gc3RpY2t5IG1vZGUgQU5EIHRoZSB1aSBpcyBpbiBjcmVhdGUgbW9kZSwgc2hvdyBDcmVhdGUsIGVsc2Ugc2hvdyBTYXZlXG5cdFx0c2F2ZUV4cHJlc3Npb24gPSBpZkVsc2UoVUkuSXNDcmVhdGVNb2RlU3RpY2t5LCBjcmVhdGVCdXR0b25UZXh0LCBzYXZlQnV0dG9uVGV4dCk7XG5cdH0gZWxzZSB7XG5cdFx0Ly8gSWYgd2UncmUgaW4gZHJhZnQgQU5EIHRoZSBkcmFmdCBpcyBhIG5ldyBvYmplY3QgKCFJc0FjdGl2ZUVudGl0eSAmJiAhSGFzQWN0aXZlRW50aXR5KSwgc2hvdyBjcmVhdGUsIGVsc2Ugc2hvdyBzYXZlXG5cdFx0c2F2ZUV4cHJlc3Npb24gPSBpZkVsc2UoRHJhZnQuSXNOZXdPYmplY3QsIGNyZWF0ZUJ1dHRvblRleHQsIHNhdmVCdXR0b25UZXh0KTtcblx0fVxuXHRyZXR1cm4gY29tcGlsZUJpbmRpbmcoc2F2ZUV4cHJlc3Npb24pO1xufTtcbiJdfQ==
118
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIk9iamVjdFBhZ2VUZW1wbGF0aW5nLnRzIl0sIm5hbWVzIjpbImdldEV4cHJlc3Npb25Gb3JUaXRsZSIsIm9IZWFkZXJJbmZvIiwib1ZpZXdEYXRhIiwiZnVsbENvbnRleHRQYXRoIiwidGl0bGVOb0hlYWRlckluZm8iLCJDb21tb25VdGlscyIsImdldFRyYW5zbGF0ZWRUZXh0IiwicmVzb3VyY2VCdW5kbGUiLCJlbnRpdHlTZXQiLCJ0aXRsZVdpdGhIZWFkZXJJbmZvIiwib0VtcHR5SGVhZGVySW5mb1RpdGxlIiwiVGl0bGUiLCJ1bmRlZmluZWQiLCJWYWx1ZSIsInRpdGxlRm9yQWN0aXZlSGVhZGVyTm9IZWFkZXJJbmZvIiwidGl0bGVWYWx1ZUV4cHJlc3Npb24iLCJhbm5vdGF0aW9uRXhwcmVzc2lvbiIsIiR0YXJnZXQiLCJhbm5vdGF0aW9ucyIsIkNvbW1vbiIsIlRleHQiLCJVSSIsIlRleHRBcnJhbmdlbWVudCIsImFkZFRleHRBcnJhbmdlbWVudFRvQmluZGluZ0V4cHJlc3Npb24iLCJmb3JtYXRWYWx1ZVJlY3Vyc2l2ZWx5IiwiY3JlYXRlTW9kZVRpdGxlIiwiVHlwZU5hbWUiLCJjb25jYXQiLCJ0b1N0cmluZyIsImNvbXBpbGVCaW5kaW5nIiwiaWZFbHNlIiwiYW5kIiwiSXNDcmVhdGVNb2RlIiwiaXNFbXB0eSIsImdldEV4cHJlc3Npb25Gb3JEZXNjcmlwdGlvbiIsImJpbmRpbmdFeHByZXNzaW9uIiwiRGVzY3JpcHRpb24iLCJnZXRFeHByZXNzaW9uRm9yU2F2ZUJ1dHRvbiIsInNhdmVCdXR0b25UZXh0IiwiY3JlYXRlQnV0dG9uVGV4dCIsInNhdmVFeHByZXNzaW9uIiwiaXNTdGlja3lTZXNzaW9uU3VwcG9ydGVkIiwic3RhcnRpbmdFbnRpdHlTZXQiLCJJc0NyZWF0ZU1vZGVTdGlja3kiLCJEcmFmdCIsIklzTmV3T2JqZWN0Il0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQWtCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7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LENBQXZCO0FBQ0E7O0FBQ0QsV0FBT1QsY0FBYyxDQUFDVyxjQUFELENBQXJCO0FBQ0EsR0FaTSIsInNvdXJjZVJvb3QiOiIuIiwic291cmNlc0NvbnRlbnQiOlsiLy8gRm9ybWF0dGVycyBmb3IgdGhlIE9iamVjdCBQYWdlXG5pbXBvcnQge1xuXHRhbmQsXG5cdGlmRWxzZSxcblx0aXNFbXB0eSxcblx0Y29uY2F0LFxuXHRhbm5vdGF0aW9uRXhwcmVzc2lvbixcblx0Y29tcGlsZUJpbmRpbmcsXG5cdEJpbmRpbmdFeHByZXNzaW9uXG59IGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL0JpbmRpbmdFeHByZXNzaW9uXCI7XG5pbXBvcnQgeyBVSSwgRHJhZnQgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9oZWxwZXJzL0JpbmRpbmdIZWxwZXJcIjtcbmltcG9ydCB7IENvbW1vblV0aWxzLCBWaWV3RGF0YSB9IGZyb20gXCJzYXAvZmUvY29yZVwiO1xuaW1wb3J0IHsgSGVhZGVySW5mb1R5cGUgfSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXNcIjtcbmltcG9ydCB7IERhdGFNb2RlbE9iamVjdFBhdGggfSBmcm9tIFwic2FwL2ZlL2NvcmUvdGVtcGxhdGluZy9EYXRhTW9kZWxQYXRoSGVscGVyXCI7XG5pbXBvcnQgeyBhZGRUZXh0QXJyYW5nZW1lbnRUb0JpbmRpbmdFeHByZXNzaW9uLCBmb3JtYXRWYWx1ZVJlY3Vyc2l2ZWx5IH0gZnJvbSBcInNhcC9mZS9tYWNyb3MvZmllbGQvRmllbGRUZW1wbGF0aW5nXCI7XG5pbXBvcnQgeyBEYXRhRmllbGRUeXBlcyB9IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlcy9kaXN0L2dlbmVyYXRlZC9VSVwiO1xuaW1wb3J0IHsgaXNTdGlja3lTZXNzaW9uU3VwcG9ydGVkIH0gZnJvbSBcInNhcC9mZS9jb3JlL3RlbXBsYXRpbmcvRW50aXR5U2V0SGVscGVyXCI7XG5cbi8vYGBgbWVybWFpZFxuLy8gZ3JhcGggVERcbi8vIEFbT2JqZWN0IFBhZ2UgVGl0bGVdIC0tPnxHZXQgRGF0YUZpZWxkIFZhbHVlfCBDe0V2YWx1YXRlIENyZWF0ZSBNb2RlfVxuLy8gQyAtLT58SW4gQ3JlYXRlIE1vZGV8IER7SXMgRGF0YUZpZWxkIFZhbHVlIGVtcHR5fVxuLy8gRCAtLT58WWVzfCBGe0lzIHRoZXJlIGEgVHlwZU5hbWV9XG4vLyBGIC0tPnxZZXN8IEdbSXMgdGhlcmUgYW4gY3VzdG9tIHRpdGxlXVxuLy8gRyAtLT58WWVzfCBHMVtTaG93IHRoZSBjdXN0b20gdGl0bGUgKyAnVHlwZU5hbWUnXVxuLy8gRyAtLT58Tm98IEcyW0Rpc3BsYXkgdGhlIGRlZmF1bHQgdGl0bGUgJ05ldyArIFR5cGVOYW1lJ11cbi8vIEYgLS0+fE5vfCBIW0lzIHRoZXJlIGEgY3VzdG9tIHRpdGxlXVxuLy8gSCAtLT58WWVzfCBJW1Nob3cgdGhlIGN1c3RvbSB0aXRsZV1cbi8vIEggLS0+fE5vfCBKW1Nob3cgdGhlIGRlZmF1bHQgJ1VuYW1uZWQgT2JqZWN0J11cbi8vIEQgLS0+fE5vfCBFXG4vLyBDIC0tPnxOb3QgaW4gY3JlYXRlIG1vZGV8IEVbU2hvdyBEYXRhRmllbGQgVmFsdWVdXG4vLyBgYGBcbi8qKlxuICogQ29tcHV0ZSB0aGUgdGl0bGUgZm9yIHRoZSBvYmplY3QgcGFnZS5cbiAqXG4gKiBAcGFyYW0gb0hlYWRlckluZm8gVGhlIEBVSS5IZWFkZXJJbmZvIGFubm90YXRpb24gY29udGVudFxuICogQHBhcmFtIG9WaWV3RGF0YSBUaGUgdmlldyBkYXRhIG9iamVjdCB3ZSdyZSBjdXJyZW50bHkgb25cbiAqIEBwYXJhbSBmdWxsQ29udGV4dFBhdGggVGhlIGZ1bGwgY29udGV4dCBwYXRoIHVzZWQgdG8gcmVhY2ggdGhhdCBvYmplY3QgcGFnZVxuICogQHJldHVybnMgVGhlIGJpbmRpbmcgZXhwcmVzc2lvbiBmb3IgdGhlIG9iamVjdCBwYWdlIHRpdGxlXG4gKi9cbmV4cG9ydCBjb25zdCBnZXRFeHByZXNzaW9uRm9yVGl0bGUgPSBmdW5jdGlvbihcblx0b0hlYWRlckluZm86IEhlYWRlckluZm9UeXBlIHwgdW5kZWZpbmVkLFxuXHRvVmlld0RhdGE6IFZpZXdEYXRhLFxuXHRmdWxsQ29udGV4dFBhdGg6IERhdGFNb2RlbE9iamVjdFBhdGhcbik6IEJpbmRpbmdFeHByZXNzaW9uPHN0cmluZz4ge1xuXHRjb25zdCB0aXRsZU5vSGVhZGVySW5mbyA9IENvbW1vblV0aWxzLmdldFRyYW5zbGF0ZWRUZXh0KFwiVF9ORVdfT0JKRUNUXCIsIG9WaWV3RGF0YS5yZXNvdXJjZUJ1bmRsZSwgbnVsbCwgb1ZpZXdEYXRhLmVudGl0eVNldCk7XG5cblx0Y29uc3QgdGl0bGVXaXRoSGVhZGVySW5mbyA9IENvbW1vblV0aWxzLmdldFRyYW5zbGF0ZWRUZXh0KFxuXHRcdFwiVF9BTk5PVEFUSU9OX0hFTFBFUl9ERUZBVUxUX09CSkVDVF9QQUdFX0hFQURFUl9USVRMRVwiLFxuXHRcdG9WaWV3RGF0YS5yZXNvdXJjZUJ1bmRsZSxcblx0XHRudWxsLFxuXHRcdG9WaWV3RGF0YS5lbnRpdHlTZXRcblx0KTtcblxuXHRjb25zdCBvRW1wdHlIZWFkZXJJbmZvVGl0bGUgPVxuXHRcdG9IZWFkZXJJbmZvPy5UaXRsZSA9PT0gdW5kZWZpbmVkIHx8IG9IZWFkZXJJbmZvPy5UaXRsZSA9PT0gXCJcIiB8fCAob0hlYWRlckluZm8/LlRpdGxlIGFzIERhdGFGaWVsZFR5cGVzKT8uVmFsdWUgPT09IFwiXCI7XG5cblx0Y29uc3QgdGl0bGVGb3JBY3RpdmVIZWFkZXJOb0hlYWRlckluZm8gPSAhb0VtcHR5SGVhZGVySW5mb1RpdGxlXG5cdFx0PyBDb21tb25VdGlscy5nZXRUcmFuc2xhdGVkVGV4dChcIlRfQU5OT1RBVElPTl9IRUxQRVJfREVGQVVMVF9PQkpFQ1RfUEFHRV9IRUFERVJfVElUTEVfTk9fSEVBREVSX0lORk9cIiwgb1ZpZXdEYXRhLnJlc291cmNlQnVuZGxlKVxuXHRcdDogXCJcIjtcblxuXHRsZXQgdGl0bGVWYWx1ZUV4cHJlc3Npb24gPSBhbm5vdGF0aW9uRXhwcmVzc2lvbigob0hlYWRlckluZm8/LlRpdGxlIGFzIERhdGFGaWVsZFR5cGVzKT8uVmFsdWUpO1xuXHRpZiAoKG9IZWFkZXJJbmZvPy5UaXRsZSBhcyBEYXRhRmllbGRUeXBlcyk/LlZhbHVlPy4kdGFyZ2V0Py5hbm5vdGF0aW9ucz8uQ29tbW9uPy5UZXh0Py5hbm5vdGF0aW9ucz8uVUk/LlRleHRBcnJhbmdlbWVudCkge1xuXHRcdC8vIEluIGNhc2UgYW4gZXhwbGljaXQgdGV4dCBhcnJhbmdlbWVudCB3YXMgc2V0IHdlIG1ha2UgdXNlIG9mIGl0IGluIHRoZSBkZXNjcmlwdGlvbiBhcyB3ZWxsXG5cdFx0dGl0bGVWYWx1ZUV4cHJlc3Npb24gPSBhZGRUZXh0QXJyYW5nZW1lbnRUb0JpbmRpbmdFeHByZXNzaW9uKHRpdGxlVmFsdWVFeHByZXNzaW9uLCBmdWxsQ29udGV4dFBhdGgpO1xuXHR9XG5cblx0dGl0bGVWYWx1ZUV4cHJlc3Npb24gPSBmb3JtYXRWYWx1ZVJlY3Vyc2l2ZWx5KHRpdGxlVmFsdWVFeHByZXNzaW9uLCBmdWxsQ29udGV4dFBhdGgpO1xuXG5cdC8vIElmIHRoZXJlIGlzIGEgVHlwZU5hbWUgZGVmaW5lZCwgc2hvdyB0aGUgZGVmYXVsdCB0aXRsZSAnTmV3ICsgVHlwZU5hbWUnLCBvdGhlcndpc2Ugc2hvdyB0aGUgY3VzdG9tIHRpdGxlIG9yIHRoZSBkZWZhdWx0ICdOZXcgb2JqZWN0J1xuXHRjb25zdCBjcmVhdGVNb2RlVGl0bGUgPSBvSGVhZGVySW5mbz8uVHlwZU5hbWVcblx0XHQ/IGNvbmNhdCh0aXRsZVdpdGhIZWFkZXJJbmZvLCBcIiBcIiwgYW5ub3RhdGlvbkV4cHJlc3Npb24ob0hlYWRlckluZm8uVHlwZU5hbWUudG9TdHJpbmcoKSkpXG5cdFx0OiB0aXRsZU5vSGVhZGVySW5mbztcblxuXHRyZXR1cm4gY29tcGlsZUJpbmRpbmcoXG5cdFx0aWZFbHNlKFxuXHRcdFx0Ly8gSWYgQ3JlYXRlIE1vZGUgJiYgRW1wdHkgZXhwcmVzc2lvblxuXHRcdFx0YW5kKFVJLklzQ3JlYXRlTW9kZSwgdGl0bGVWYWx1ZUV4cHJlc3Npb24gJiYgaXNFbXB0eSh0aXRsZVZhbHVlRXhwcmVzc2lvbikpLFxuXG5cdFx0XHRjcmVhdGVNb2RlVGl0bGUsXG5cdFx0XHQvLyBPdGhlcndpc2Ugc2hvdyB0aGUgZGVmYXVsdCBleHByZXNzaW9uXG5cdFx0XHRpZkVsc2UodGl0bGVWYWx1ZUV4cHJlc3Npb24gJiYgaXNFbXB0eSh0aXRsZVZhbHVlRXhwcmVzc2lvbiksIHRpdGxlRm9yQWN0aXZlSGVhZGVyTm9IZWFkZXJJbmZvLCB0aXRsZVZhbHVlRXhwcmVzc2lvbilcblx0XHQpXG5cdCk7XG59O1xuXG4vKipcbiAqIFJldHJpZXZlcyB0aGUgZXhwcmVzc2lvbiBmb3IgdGhlIGRlc2NyaXB0aW9uIG9mIGFuIG9iamVjdCBwYWdlLlxuICpcbiAqIEBwYXJhbSBvSGVhZGVySW5mbyBUaGUgQFVJLkhlYWRlckluZm8gYW5ub3RhdGlvbiBjb250ZW50XG4gKiBAcGFyYW0gZnVsbENvbnRleHRQYXRoIFRoZSBmdWxsIGNvbnRleHQgcGF0aCB1c2VkIHRvIHJlYWNoIHRoYXQgb2JqZWN0IHBhZ2VcbiAqIEByZXR1cm5zIFRoZSBiaW5kaW5nIGV4cHJlc3Npb24gZm9yIHRoZSBvYmplY3QgcGFnZSBkZXNjcmlwdGlvblxuICovXG5leHBvcnQgY29uc3QgZ2V0RXhwcmVzc2lvbkZvckRlc2NyaXB0aW9uID0gZnVuY3Rpb24oXG5cdG9IZWFkZXJJbmZvOiBIZWFkZXJJbmZvVHlwZSB8IHVuZGVmaW5lZCxcblx0ZnVsbENvbnRleHRQYXRoOiBEYXRhTW9kZWxPYmplY3RQYXRoXG4pOiBCaW5kaW5nRXhwcmVzc2lvbjxzdHJpbmc+IHtcblx0bGV0IGJpbmRpbmdFeHByZXNzaW9uID0gYW5ub3RhdGlvbkV4cHJlc3Npb24oKG9IZWFkZXJJbmZvPy5EZXNjcmlwdGlvbiBhcyBEYXRhRmllbGRUeXBlcyk/LlZhbHVlKTtcblx0aWYgKChvSGVhZGVySW5mbz8uRGVzY3JpcHRpb24gYXMgRGF0YUZpZWxkVHlwZXMpPy5WYWx1ZT8uJHRhcmdldD8uYW5ub3RhdGlvbnM/LkNvbW1vbj8uVGV4dD8uYW5ub3RhdGlvbnM/LlVJPy5UZXh0QXJyYW5nZW1lbnQpIHtcblx0XHQvLyBJbiBjYXNlIGFuIGV4cGxpY2l0IHRleHQgYXJyYW5nZW1lbnQgd2FzIHNldCB3ZSBtYWtlIHVzZSBvZiBpdCBpbiB0aGUgZGVzY3JpcHRpb24gYXMgd2VsbFxuXHRcdGJpbmRpbmdFeHByZXNzaW9uID0gYWRkVGV4dEFycmFuZ2VtZW50VG9CaW5kaW5nRXhwcmVzc2lvbihiaW5kaW5nRXhwcmVzc2lvbiwgZnVsbENvbnRleHRQYXRoKTtcblx0fVxuXG5cdHJldHVybiBjb21waWxlQmluZGluZyhmb3JtYXRWYWx1ZVJlY3Vyc2l2ZWx5KGJpbmRpbmdFeHByZXNzaW9uLCBmdWxsQ29udGV4dFBhdGgpKTtcbn07XG5cbi8qKlxuICogUmV0dXJuIHRoZSBleHByZXNzaW9uIGZvciB0aGUgc2F2ZSBidXR0b24uXG4gKlxuICogQHBhcmFtIG9WaWV3RGF0YSBUaGUgY3VycmVudCB2aWV3IGRhdGFcbiAqIEBwYXJhbSBmdWxsQ29udGV4dFBhdGggVGhlIHBhdGggdXNlZCB1cCB1bnRpbCBoZXJlXG4gKiBAcmV0dXJucyBUaGUgYmluZGluZyBleHByZXNzaW9uIHRoYXQgc2hvd3MgdGhlIHJpZ2h0IHNhdmUgYnV0dG9uIHRleHRcbiAqL1xuZXhwb3J0IGNvbnN0IGdldEV4cHJlc3Npb25Gb3JTYXZlQnV0dG9uID0gZnVuY3Rpb24ob1ZpZXdEYXRhOiBWaWV3RGF0YSwgZnVsbENvbnRleHRQYXRoOiBEYXRhTW9kZWxPYmplY3RQYXRoKTogQmluZGluZ0V4cHJlc3Npb248c3RyaW5nPiB7XG5cdGNvbnN0IHNhdmVCdXR0b25UZXh0ID0gQ29tbW9uVXRpbHMuZ2V0VHJhbnNsYXRlZFRleHQoXCJUX09QX09CSkVDVF9QQUdFX1NBVkVcIiwgb1ZpZXdEYXRhLnJlc291cmNlQnVuZGxlKTtcblx0Y29uc3QgY3JlYXRlQnV0dG9uVGV4dCA9IENvbW1vblV0aWxzLmdldFRyYW5zbGF0ZWRUZXh0KFwiVF9PUF9PQkpFQ1RfUEFHRV9DUkVBVEVcIiwgb1ZpZXdEYXRhLnJlc291cmNlQnVuZGxlKTtcblx0bGV0IHNhdmVFeHByZXNzaW9uO1xuXHRpZiAoaXNTdGlja3lTZXNzaW9uU3VwcG9ydGVkKGZ1bGxDb250ZXh0UGF0aC5zdGFydGluZ0VudGl0eVNldCkpIHtcblx0XHQvLyBJZiB3ZSdyZSBpbiBzdGlja3kgbW9kZSBBTkQgdGhlIHVpIGlzIGluIGNyZWF0ZSBtb2RlLCBzaG93IENyZWF0ZSwgZWxzZSBzaG93IFNhdmVcblx0XHRzYXZlRXhwcmVzc2lvbiA9IGlmRWxzZShVSS5Jc0NyZWF0ZU1vZGVTdGlja3ksIGNyZWF0ZUJ1dHRvblRleHQsIHNhdmVCdXR0b25UZXh0KTtcblx0fSBlbHNlIHtcblx0XHQvLyBJZiB3ZSdyZSBpbiBkcmFmdCBBTkQgdGhlIGRyYWZ0IGlzIGEgbmV3IG9iamVjdCAoIUlzQWN0aXZlRW50aXR5ICYmICFIYXNBY3RpdmVFbnRpdHkpLCBzaG93IGNyZWF0ZSwgZWxzZSBzaG93IHNhdmVcblx0XHRzYXZlRXhwcmVzc2lvbiA9IGlmRWxzZShEcmFmdC5Jc05ld09iamVjdCwgY3JlYXRlQnV0dG9uVGV4dCwgc2F2ZUJ1dHRvblRleHQpO1xuXHR9XG5cdHJldHVybiBjb21waWxlQmluZGluZyhzYXZlRXhwcmVzc2lvbik7XG59O1xuIl19
@@ -52,14 +52,20 @@ export const getExpressionForTitle = function(
52
52
  oViewData.entitySet
53
53
  );
54
54
 
55
- const titleForActiveHeaderNoHeaderInfo = CommonUtils.getTranslatedText(
56
- "T_ANNOTATION_HELPER_DEFAULT_OBJECT_PAGE_HEADER_TITLE_NO_HEADER_INFO",
57
- oViewData.resourceBundle
58
- );
59
- const titleValueExpression = formatValueRecursively(
60
- addTextArrangementToBindingExpression(annotationExpression((oHeaderInfo?.Title as DataFieldTypes)?.Value), fullContextPath),
61
- fullContextPath
62
- );
55
+ const oEmptyHeaderInfoTitle =
56
+ oHeaderInfo?.Title === undefined || oHeaderInfo?.Title === "" || (oHeaderInfo?.Title as DataFieldTypes)?.Value === "";
57
+
58
+ const titleForActiveHeaderNoHeaderInfo = !oEmptyHeaderInfoTitle
59
+ ? CommonUtils.getTranslatedText("T_ANNOTATION_HELPER_DEFAULT_OBJECT_PAGE_HEADER_TITLE_NO_HEADER_INFO", oViewData.resourceBundle)
60
+ : "";
61
+
62
+ let titleValueExpression = annotationExpression((oHeaderInfo?.Title as DataFieldTypes)?.Value);
63
+ if ((oHeaderInfo?.Title as DataFieldTypes)?.Value?.$target?.annotations?.Common?.Text?.annotations?.UI?.TextArrangement) {
64
+ // In case an explicit text arrangement was set we make use of it in the description as well
65
+ titleValueExpression = addTextArrangementToBindingExpression(titleValueExpression, fullContextPath);
66
+ }
67
+
68
+ titleValueExpression = formatValueRecursively(titleValueExpression, fullContextPath);
63
69
 
64
70
  // If there is a TypeName defined, show the default title 'New + TypeName', otherwise show the custom title or the default 'New object'
65
71
  const createModeTitle = oHeaderInfo?.TypeName
@@ -89,15 +95,13 @@ export const getExpressionForDescription = function(
89
95
  oHeaderInfo: HeaderInfoType | undefined,
90
96
  fullContextPath: DataModelObjectPath
91
97
  ): BindingExpression<string> {
92
- return compileBinding(
93
- formatValueRecursively(
94
- addTextArrangementToBindingExpression(
95
- annotationExpression((oHeaderInfo?.Description as DataFieldTypes)?.Value),
96
- fullContextPath
97
- ),
98
- fullContextPath
99
- )
100
- );
98
+ let bindingExpression = annotationExpression((oHeaderInfo?.Description as DataFieldTypes)?.Value);
99
+ if ((oHeaderInfo?.Description as DataFieldTypes)?.Value?.$target?.annotations?.Common?.Text?.annotations?.UI?.TextArrangement) {
100
+ // In case an explicit text arrangement was set we make use of it in the description as well
101
+ bindingExpression = addTextArrangementToBindingExpression(bindingExpression, fullContextPath);
102
+ }
103
+
104
+ return compileBinding(formatValueRecursively(bindingExpression, fullContextPath));
101
105
  };
102
106
 
103
107
  /**
@@ -100,7 +100,7 @@
100
100
  type="{path: 'entitySet>./@com.sap.vocabularies.UI.v1.Identification', formatter: 'CORE.buildEmphasizedButtonExpression'}"
101
101
  text="{sap.fe.i18n>C_COMMON_OBJECT_PAGE_EDIT}"
102
102
  enabled="{= OP.getEnabledExpressionForHeaderActions(${operationAvailable>}, ${entitySet>@}, ${operationAvailable>@@MODEL.format}) }"
103
- visible="{= OP.getButtonVisiblityForHeaderActions(${entitySet>@}, %{entitySet>@com.sap.vocabularies.UI.v1.UpdateHidden@@MODEL.value}, ${entityType>@com.sap.vocabularies.UI.v1.UpdateHidden@@MODEL.value}, ${viewData>/}) }"
103
+ visible="{headerAction>visible}"
104
104
  press="cmd:Edit"
105
105
  >
106
106
  <layoutData>
@@ -117,13 +117,13 @@
117
117
  id="fe::StandardAction::Delete"
118
118
  type="Default"
119
119
  text="{sap.fe.i18n>C_COMMON_OBJECT_PAGE_DELETE}"
120
- visible="{= OP.getDeleteButtonVisibility(${entitySet>@Org.OData.Capabilities.V1.DeleteRestrictions/Deletable@@MODEL.value}, ${viewData>viewLevel}, ${entitySet>@com.sap.vocabularies.UI.v1.DeleteHidden@@MODEL.value}, ${headerAction>parentEntityDeleteEnabled}, ${entityType>@com.sap.vocabularies.UI.v1.DeleteHidden@@MODEL.value})}"
120
+ visible="{headerAction>visible}"
121
121
  enabled="{= ${headerAction>enabled} !== undefined ? ${headerAction>enabled} : OP.getDeleteButtonEnabled(${entitySet>@Org.OData.Capabilities.V1.DeleteRestrictions/Deletable@@MODEL.value}, ${headerAction>parentEntityDeleteEnabled})}"
122
122
  press="cmd:DeleteObject"
123
123
  ariaHasPopup="Dialog"
124
124
  />
125
125
  </template:elseif>
126
- <template:elseif test="{= ${converterContext>showDraftToggle} === true &amp;&amp; ${headerAction>type} === 'SwitchToActiveObject'}">
126
+ <template:elseif test="{= ${headerAction>type} === 'SwitchToActiveObject' &amp;&amp; OP.checkDraftState(${entitySet>@}) }">
127
127
  <Button
128
128
  id="fe::StandardAction::SwitchToActiveObject"
129
129
  type="Default"
@@ -132,7 +132,7 @@
132
132
  press="cmd:SwitchToActiveObject"
133
133
  />
134
134
  </template:elseif>
135
- <template:elseif test="{= ${converterContext>showDraftToggle} === true &amp;&amp; ${headerAction>type} === 'SwitchToDraftObject'}">
135
+ <template:elseif test="{= ${headerAction>type} === 'SwitchToDraftObject' &amp;&amp; OP.checkDraftState(${entitySet>@}) }">
136
136
  <Button
137
137
  id="fe::StandardAction::SwitchToDraftObject"
138
138
  type="Default"
@@ -7,6 +7,7 @@
7
7
  xmlns:core="sap.ui.core"
8
8
  xmlns:dt="sap.ui.dt"
9
9
  xmlns:fl="sap.ui.fl"
10
+ xmlns:fpm="sap.fe.macros.fpm"
10
11
  xmlns:template="http://schemas.sap.com/sapui5/extension/sap.ui.core.template/1"
11
12
  xmlns:formdata="http://schemas.sap.com/sapui5/extension/sap.ui.core.CustomData/1"
12
13
  template:require="{
@@ -93,61 +94,66 @@
93
94
  </f:formElements>
94
95
  </f:FormContainer>
95
96
  <template:if test="{headerSection>subSections}">
96
- <template:repeat list="{path: 'headerSection>subSections', filters: {path: 'type', operator: 'EQ', value1: 'Form'}}" var="subSection">
97
+ <template:repeat
98
+ list="{path: 'headerSection>subSections', filters: [{path: 'type', operator: 'EQ', value1: 'Form'}, {path: 'type', operator: 'EQ', value1: 'XMLFragment'}]}"
99
+ var="subSection"
100
+ >
97
101
  <template:if test="{= !${subSection>stashed} }">
98
102
  <template:then>
99
- <template:with path="subSection>annotationPath" var="facet">
100
- <template:repeat list="{path: 'subSection>formDefinition/formContainers'}" var="formContainer">
101
- <template:if test="{= MODEL.getNavigationPath(${facet>Target/$AnnotationPath}) }">
102
- <template:then>
103
- <template:with path="formContainer>entitySet" var="targetEntitySet">
104
- <macro:FormContainer
105
- id="{= ${formContainer>id} ? ID.generate(['fe', 'HeaderFacet', 'FormContainer', ${formContainer>id} ]) : undefined }"
106
- designtimeSettings="{= ${subSection>flexSettings/designtime} === 'Default' ? 'sap/fe/macros/FormContainer.designtime' : ${subSection>flexSettings/designtime}}"
107
- title="{facet>@@MODEL.label}"
108
- displayMode="Edit"
109
- entitySet="{targetEntitySet>}"
110
- navigationPath="{= MODEL.getNavigationPath(${facet>Target/$AnnotationPath}) ? MODEL.getNavigationPath(${facet>Target/$AnnotationPath}) : ''}"
111
- dataFieldCollection="{formContainer>formElements}"
112
- visibilityPath="{= ${subSection>./@com.sap.vocabularies.UI.v1.Hidden/$Path} ? ${subSection>./@com.sap.vocabularies.UI.v1.Hidden/$Path} : '' }"
113
- />
114
- </template:with>
115
- </template:then>
116
- <template:else>
117
- <macro:FormContainer
118
- id="{= ${formContainer>id} ? ID.generate(['fe', 'HeaderFacet', 'FormContainer', ${formContainer>id} ]) : undefined }"
119
- designtimeSettings="{= ${subSection>flexSettings/designtime} === 'Default' ? 'sap/fe/macros/FormContainer.designtime' : ${subSection>flexSettings/designtime}}"
120
- title="{facet>@@MODEL.label}"
121
- displayMode="Edit"
122
- entitySet="{entitySet>}"
123
- dataFieldCollection="{formContainer>formElements}"
124
- visibilityPath="{= ${subSection>./@com.sap.vocabularies.UI.v1.Hidden/$Path} ? ${subSection>./@com.sap.vocabularies.UI.v1.Hidden/$Path} : '' }"
103
+ <template:if test="{= !${subSection>template} }">
104
+ <template:then>
105
+ <template:with path="subSection>annotationPath" var="facet">
106
+ <template:repeat list="{path: 'subSection>formDefinition/formContainers'}" var="formContainer">
107
+ <template:if test="{= MODEL.getNavigationPath(${facet>Target/$AnnotationPath}) }">
108
+ <template:then>
109
+ <template:with path="formContainer>entitySet" var="targetEntitySet">
110
+ <macro:FormContainer
111
+ id="{= ${formContainer>id} ? ID.generate(['fe', 'HeaderFacet', 'FormContainer', ${formContainer>id} ]) : undefined }"
112
+ designtimeSettings="{= ${subSection>flexSettings/designtime} === 'Default' ? 'sap/fe/macros/FormContainer.designtime' : ${subSection>flexSettings/designtime}}"
113
+ title="{facet>@@MODEL.label}"
114
+ displayMode="Edit"
115
+ entitySet="{targetEntitySet>}"
116
+ navigationPath="{= MODEL.getNavigationPath(${facet>Target/$AnnotationPath}) ? MODEL.getNavigationPath(${facet>Target/$AnnotationPath}) : ''}"
117
+ dataFieldCollection="{formContainer>formElements}"
118
+ visibilityPath="{= ${subSection>./@com.sap.vocabularies.UI.v1.Hidden/$Path} ? ${subSection>./@com.sap.vocabularies.UI.v1.Hidden/$Path} : '' }"
119
+ />
120
+ </template:with>
121
+ </template:then>
122
+ <template:else>
123
+ <macro:FormContainer
124
+ id="{= ${formContainer>id} ? ID.generate(['fe', 'HeaderFacet', 'FormContainer', ${formContainer>id} ]) : undefined }"
125
+ designtimeSettings="{= ${subSection>flexSettings/designtime} === 'Default' ? 'sap/fe/macros/FormContainer.designtime' : ${subSection>flexSettings/designtime}}"
126
+ title="{facet>@@MODEL.label}"
127
+ displayMode="Edit"
128
+ entitySet="{entitySet>}"
129
+ dataFieldCollection="{formContainer>formElements}"
130
+ visibilityPath="{= ${subSection>./@com.sap.vocabularies.UI.v1.Hidden/$Path} ? ${subSection>./@com.sap.vocabularies.UI.v1.Hidden/$Path} : '' }"
131
+ />
132
+ </template:else>
133
+ </template:if>
134
+ </template:repeat>
135
+ </template:with>
136
+ </template:then>
137
+ <template:else>
138
+ <f:FormContainer
139
+ id="{= ${subSection>id} ? ID.generate([${subSection>id}, 'CustomFormContainer', ${subSection>}]) : undefined }"
140
+ title="{subSection>title}"
141
+ visible="{subSection>visibile}"
142
+ dt:designtime="{= ${subSection>flexSettings/designtime} === 'Default' ? 'sap/ui/layout/designtime/form/FormContainer.designtime' : ${subSection>flexSettings/designtime}}"
143
+ >
144
+ <f:formElements>
145
+ <fpm:CustomFragment
146
+ id="{= ${subSection>id} ? ID.generate([${subSection>id}, 'CustomFragment', ${subSection>}]) : undefined }"
147
+ fragmentName="{subSection>template}"
148
+ contextPath="{entitySet>}"
125
149
  />
126
- </template:else>
127
- </template:if>
128
- </template:repeat>
129
- </template:with>
150
+ </f:formElements>
151
+ </f:FormContainer>
152
+ </template:else>
153
+ </template:if>
130
154
  </template:then>
131
155
  </template:if>
132
156
  </template:repeat>
133
- <!--
134
- <template:with path="headerSection>subSections/0" var="subSection">
135
- <template:repeat list="{path: 'subSection>formDefinition/formContainers'}" var="formContainer">
136
- <template:with path="formContainer>annotationPath" var="facet">
137
- <template:with path="formContainer>entitySet" var="targetEntitySet">
138
- <macro:FormContainer
139
- id="{= ID.generate([${formContainer>id}, 'EditableHeaderFormContainer', 'Content']) }"
140
- title="{facet>@@MODEL.label}"
141
- displayMode="Edit"
142
- entitySet="{entitySet>}"
143
- dataFieldCollection="{formContainer>formElements}"
144
- visibilityPath="{= ${subSection>./@com.sap.vocabularies.UI.v1.Hidden/$Path} ? ${subSection>./@com.sap.vocabularies.UI.v1.Hidden/$Path} : '' }"
145
- />
146
- </template:with>
147
- </template:with>
148
- </template:repeat>
149
- </template:with>
150
- -->
151
157
  </template:if>
152
158
  </f:formContainers>
153
159
  </f:Form>
@@ -22,7 +22,7 @@
22
22
  asyncMode="true"
23
23
  visible="{= CORE.getFooterVisible(${converterContext>footerActions}, ${entityType>./@com.sap.vocabularies.UI.v1.Identification})}"
24
24
  >
25
- <core:InvisibleText id="fe::FooterBar::MessageButton::AriaText" text="{sap.fe.i18n>C_COMMON_SAPFE_TECHNICAL_DETAILS_GROUP_MESSAGES}" />
25
+ <core:InvisibleText id="fe::FooterBar::MessageButton::AriaText" text="{sap.fe.i18n>C_COMMON_SAPFE_ERROR_MESSAGES_PAGE_BUTTON_ARIA_TEXT}" />
26
26
  <common:MessageButton
27
27
  id="fe::FooterBar::MessageButton"
28
28
  messageChange="_getFooterVisibility"
@@ -42,10 +42,10 @@
42
42
  </template:with>
43
43
  </template:with>
44
44
  </template:then>
45
- <template:else>
45
+ <template:elseif test="{= ${converterHeaderFacet>fragmentName}}">
46
46
  <!-- Custom header facets from manifest (FPM) -->
47
47
  <core:Fragment fragmentName="sap.fe.templates.ObjectPage.view.fragments.HeaderFacetCustomContainer" type="XML" />
48
- </template:else>
48
+ </template:elseif>
49
49
  </template:if>
50
50
  </template:repeat>
51
51
  </template:with>
@@ -45,7 +45,6 @@
45
45
  contextPath="{collection>}"
46
46
  metaPath="{headerFacet>Target/$AnnotationPath/}"
47
47
  navigationType="{= OP.getMicroChartTitleAsLink(${viewData>controlConfiguration}[${headerFacet>Target/$AnnotationPath}]['navigation'])}"
48
- chartTitleDescribedBy="{= OP.getChartTitleDescribedBy(${viewData>}, ${headerFacet>}, ${sap.fe.i18n>T_COMMON_HEADERDP_TITLE_LINK_INPAGE_ARIA}) }"
49
48
  onTitlePressed="{= OP.getExpressionForMicroChartTitlePress(${viewData>controlConfiguration}[${headerFacet>Target/$AnnotationPath}]['navigation'], ${manifest>/sap.app/crossNavigation/outbounds}, ${collection>@sapui.name})}"
50
49
  />
51
50
  </template:with>