@sapui5/sap.fe.templates 1.106.0 → 1.107.1

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 (22) hide show
  1. package/package.json +1 -1
  2. package/src/sap/fe/templates/.library +1 -1
  3. package/src/sap/fe/templates/ListReport/ListReport.view.xml +1 -1
  4. package/src/sap/fe/templates/ListReport/ListReportController.controller.js +5 -2
  5. package/src/sap/fe/templates/ListReport/ListReportController.controller.ts +5 -1
  6. package/src/sap/fe/templates/ListReport/overrides/IntentBasedNavigation.js +2 -2
  7. package/src/sap/fe/templates/ListReport/overrides/IntentBasedNavigation.ts +1 -1
  8. package/src/sap/fe/templates/ListReport/overrides/Share.js +1 -12
  9. package/src/sap/fe/templates/ListReport/overrides/Share.ts +1 -14
  10. package/src/sap/fe/templates/ObjectPage/ExtensionAPI.js +132 -3
  11. package/src/sap/fe/templates/ObjectPage/ExtensionAPI.ts +88 -1
  12. package/src/sap/fe/templates/ObjectPage/ObjectPage.view.xml +3 -26
  13. package/src/sap/fe/templates/ObjectPage/ObjectPageController.controller.js +40 -14
  14. package/src/sap/fe/templates/ObjectPage/ObjectPageController.controller.ts +38 -13
  15. package/src/sap/fe/templates/ObjectPage/ObjectPageTemplating.js +2 -2
  16. package/src/sap/fe/templates/ObjectPage/ObjectPageTemplating.ts +1 -1
  17. package/src/sap/fe/templates/ObjectPage/overrides/MessageHandler.js +2 -2
  18. package/src/sap/fe/templates/ObjectPage/overrides/MessageHandler.ts +2 -1
  19. package/src/sap/fe/templates/ObjectPage/overrides/Share.js +2 -2
  20. package/src/sap/fe/templates/ObjectPage/overrides/Share.ts +1 -1
  21. package/src/sap/fe/templates/ObjectPage/view/fragments/HeadingContent.fragment.xml +30 -0
  22. package/src/sap/fe/templates/library.js +1 -1
@@ -31,13 +31,7 @@ function getCountUrl(oController: ListReportController) {
31
31
  }
32
32
  return baseUrl + aSupportedParams.join("&");
33
33
  }
34
- function getShareUrl() {
35
- const sHash = HashChanger.getInstance().getHash();
36
- const sBasePath = (HashChanger.getInstance() as any).hrefForAppSpecificHash
37
- ? (HashChanger.getInstance() as any).hrefForAppSpecificHash("")
38
- : "";
39
- return sHash ? sBasePath + sHash : window.location.hash;
40
- }
34
+
41
35
  function getShareEmailUrl() {
42
36
  const oUShellContainer = sap.ushell && sap.ushell.Container;
43
37
  if (oUShellContainer) {
@@ -109,13 +103,6 @@ const ShareOverride = {
109
103
  Log.error(error);
110
104
  });
111
105
 
112
- Promise.resolve(getShareUrl())
113
- .then(function (sUrl: any) {
114
- oShareMetadata.url = sUrl;
115
- })
116
- .catch(function (error: any) {
117
- Log.error(error);
118
- });
119
106
  return Promise.resolve(getShareEmailUrl()).then(function (sFLPUrl: any) {
120
107
  oShareMetadata.email.url = sFLPUrl;
121
108
  return oShareMetadata;
@@ -2,14 +2,29 @@
2
2
  * SAP UI development toolkit for HTML5 (SAPUI5)
3
3
  * (c) Copyright 2009-2021 SAP SE. All rights reserved
4
4
  */
5
- sap.ui.define(["sap/fe/core/CommonUtils", "sap/fe/core/converters/helpers/ID", "sap/fe/core/ExtensionAPI", "sap/fe/core/helpers/ClassSupport"], function (CommonUtils, ID, ExtensionAPI, ClassSupport) {
5
+ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/converters/helpers/ID", "sap/fe/core/ExtensionAPI", "sap/fe/core/helpers/ClassSupport", "sap/ui/core/library", "sap/ui/core/message/Message"], function (Log, CommonUtils, ID, ExtensionAPI, ClassSupport, library, Message) {
6
6
  "use strict";
7
7
 
8
8
  var _dec, _class;
9
9
 
10
+ var MessageType = library.MessageType;
10
11
  var defineUI5Class = ClassSupport.defineUI5Class;
11
12
  var getSideContentLayoutID = ID.getSideContentLayoutID;
12
13
 
14
+ function _catch(body, recover) {
15
+ try {
16
+ var result = body();
17
+ } catch (e) {
18
+ return recover(e);
19
+ }
20
+
21
+ if (result && result.then) {
22
+ return result.then(void 0, recover);
23
+ }
24
+
25
+ return result;
26
+ }
27
+
13
28
  function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; _setPrototypeOf(subClass, superClass); }
14
29
 
15
30
  function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }
@@ -116,7 +131,7 @@ sap.ui.define(["sap/fe/core/CommonUtils", "sap/fe/core/converters/helpers/ID", "
116
131
  return oTable && oTable.isA("sap.ui.mdc.Table") && oTable.getSelectedContexts() || [];
117
132
  }
118
133
  /**
119
- * Displays or hides the side content of an object page block.
134
+ * Displays or hides the side content of an object page.
120
135
  *
121
136
  * @alias sap.fe.templates.ObjectPage.ExtensionAPI#showSideContent
122
137
  * @param sSubSectionKey Key of the side content fragment as defined in the manifest.json
@@ -143,10 +158,124 @@ sap.ui.define(["sap/fe/core/CommonUtils", "sap/fe/core/converters/helpers/ID", "
143
158
 
144
159
  _proto.getBindingContext = function getBindingContext() {
145
160
  return this._view.getBindingContext();
161
+ }
162
+ /**
163
+ * Build a message to be displayed below the anchor bar.
164
+ *
165
+ * @alias sap.fe.templates.ObjectPage.ExtensionAPI#_buildOPMessage
166
+ * @param {sap.ui.core.message.Message[]} messages Array of messages used to generated the message
167
+ * @returns {Promise<Message>} Promise containing the generated message
168
+ * @private
169
+ */
170
+ ;
171
+
172
+ _proto._buildOPMessage = function _buildOPMessage(messages) {
173
+ try {
174
+ var _this2 = this;
175
+
176
+ var view = _this2._view;
177
+ return Promise.resolve(view.getModel("sap.fe.i18n").getResourceBundle()).then(function (resourceBundle) {
178
+ var message = null;
179
+
180
+ switch (messages.length) {
181
+ case 0:
182
+ break;
183
+
184
+ case 1:
185
+ message = messages[0];
186
+ break;
187
+
188
+ default:
189
+ var messageStats = {
190
+ "Error": {
191
+ id: 2,
192
+ count: 0
193
+ },
194
+ "Warning": {
195
+ id: 1,
196
+ count: 0
197
+ },
198
+ "Information": {
199
+ id: 0,
200
+ count: 0
201
+ }
202
+ };
203
+ message = messages.reduce(function (acc, currentValue) {
204
+ var currentType = currentValue.getType();
205
+ acc.setType(messageStats[currentType].id > messageStats[acc.getType()].id ? currentType : acc.getType());
206
+ messageStats[currentType].count++;
207
+ return acc;
208
+ }, new Message({
209
+ type: MessageType.Information
210
+ }));
211
+
212
+ if (messageStats.Error.count === 0 && messageStats.Warning.count === 0 && messageStats.Information.count > 0) {
213
+ message.setMessage(resourceBundle.getText("OBJECTPAGESTATE_INFORMATION"));
214
+ } else if (messageStats.Error.count > 0 && messageStats.Warning.count > 0 || messageStats.Information.count > 0) {
215
+ message.setMessage(resourceBundle.getText("OBJECTPAGESTATE_ISSUE"));
216
+ } else {
217
+ message.setMessage(resourceBundle.getText(message.getType() === MessageType.Error ? "OBJECTPAGESTATE_ERROR" : "OBJECTPAGESTATE_WARNING"));
218
+ }
219
+
220
+ }
221
+
222
+ return message;
223
+ });
224
+ } catch (e) {
225
+ return Promise.reject(e);
226
+ }
227
+ }
228
+ /**
229
+ * Displays the message strip below the anchor bar.
230
+ *
231
+ * @alias sap.fe.templates.ObjectPage.ExtensionAPI#showMessages
232
+ * @param {sap.ui.core.message.Message} messages The message to be displayed
233
+ * @public
234
+ */
235
+ ;
236
+
237
+ _proto.showMessages = function showMessages(messages) {
238
+ try {
239
+ var _this4 = this;
240
+
241
+ var view = _this4._view;
242
+ var internalModelContext = view.getBindingContext("internal");
243
+
244
+ var _temp2 = _catch(function () {
245
+ return Promise.resolve(_this4._buildOPMessage(messages)).then(function (message) {
246
+ if (message) {
247
+ internalModelContext === null || internalModelContext === void 0 ? void 0 : internalModelContext.setProperty("OPMessageStripVisibility", true);
248
+ internalModelContext === null || internalModelContext === void 0 ? void 0 : internalModelContext.setProperty("OPMessageStripText", message.getMessage());
249
+ internalModelContext === null || internalModelContext === void 0 ? void 0 : internalModelContext.setProperty("OPMessageStripType", message.getType());
250
+ } else {
251
+ _this4.hideMessage();
252
+ }
253
+ });
254
+ }, function () {
255
+ Log.error("Cannot display ObjectPage message");
256
+ });
257
+
258
+ return Promise.resolve(_temp2 && _temp2.then ? _temp2.then(function () {}) : void 0);
259
+ } catch (e) {
260
+ return Promise.reject(e);
261
+ }
262
+ }
263
+ /**
264
+ * Hides the message strip below the anchor bar.
265
+ *
266
+ * @alias sap.fe.templates.ObjectPage.ExtensionAPI#hideMessage
267
+ * @public
268
+ */
269
+ ;
270
+
271
+ _proto.hideMessage = function hideMessage() {
272
+ var view = this._view;
273
+ var internalModelContext = view.getBindingContext("internal");
274
+ internalModelContext === null || internalModelContext === void 0 ? void 0 : internalModelContext.setProperty("OPMessageStripVisibility", false);
146
275
  };
147
276
 
148
277
  return ObjectPageExtensionAPI;
149
278
  }(ExtensionAPI)) || _class);
150
279
  return ObjectPageExtensionAPI;
151
280
  }, false);
152
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJPYmplY3RQYWdlRXh0ZW5zaW9uQVBJIiwiZGVmaW5lVUk1Q2xhc3MiLCJyZWZyZXNoIiwidlBhdGgiLCJvQmluZGluZ0NvbnRleHQiLCJfdmlldyIsImdldEJpbmRpbmdDb250ZXh0IiwiUHJvbWlzZSIsInJlc29sdmUiLCJvQXBwQ29tcG9uZW50IiwiQ29tbW9uVXRpbHMiLCJnZXRBcHBDb21wb25lbnQiLCJvU2lkZUVmZmVjdHNTZXJ2aWNlIiwiZ2V0U2lkZUVmZmVjdHNTZXJ2aWNlIiwib01ldGFNb2RlbCIsImdldE1vZGVsIiwiZ2V0TWV0YU1vZGVsIiwib1NpZGVFZmZlY3RzIiwiVGFyZ2V0UHJvcGVydGllcyIsIlRhcmdldEVudGl0aWVzIiwiYVBhdGhzIiwic1BhdGgiLCJzQmFzZUVudGl0eVNldCIsInNLaW5kIiwidW5kZWZpbmVkIiwicHVzaCIsIiROYXZpZ2F0aW9uUHJvcGVydHlQYXRoIiwiQXJyYXkiLCJpc0FycmF5IiwiX2NvbnRyb2xsZXIiLCJnZXRPd25lckNvbXBvbmVudCIsImdldEVudGl0eVNldCIsImkiLCJsZW5ndGgiLCIkUHJvcGVydHlQYXRoIiwiZ2V0T2JqZWN0IiwicmVqZWN0IiwicmVxdWVzdFNpZGVFZmZlY3RzIiwiY29uY2F0IiwiZ2V0U2VsZWN0ZWRDb250ZXh0cyIsInNUYWJsZUlkIiwib1RhYmxlIiwiYnlJZCIsImlzQSIsImdldENvbnRlbnQiLCJzaG93U2lkZUNvbnRlbnQiLCJzU3ViU2VjdGlvbktleSIsImJTaG93Iiwic0Jsb2NrSUQiLCJnZXRTaWRlQ29udGVudExheW91dElEIiwib0Jsb2NrIiwiYkJsb2NrU3RhdGUiLCJnZXRTaG93U2lkZUNvbnRlbnQiLCJzZXRTaG93U2lkZUNvbnRlbnQiLCJFeHRlbnNpb25BUEkiXSwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzIjpbIkV4dGVuc2lvbkFQSS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgQ29tbW9uVXRpbHMgZnJvbSBcInNhcC9mZS9jb3JlL0NvbW1vblV0aWxzXCI7XG5pbXBvcnQgeyBnZXRTaWRlQ29udGVudExheW91dElEIH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvaGVscGVycy9JRFwiO1xuaW1wb3J0IEV4dGVuc2lvbkFQSSBmcm9tIFwic2FwL2ZlL2NvcmUvRXh0ZW5zaW9uQVBJXCI7XG5pbXBvcnQgdHlwZSB7IEVuaGFuY2VXaXRoVUk1IH0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvQ2xhc3NTdXBwb3J0XCI7XG5pbXBvcnQgeyBkZWZpbmVVSTVDbGFzcyB9IGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL0NsYXNzU3VwcG9ydFwiO1xuaW1wb3J0IHR5cGUgVGFibGVBUEkgZnJvbSBcInNhcC9mZS9tYWNyb3MvdGFibGUvVGFibGVBUElcIjtcbmltcG9ydCB0eXBlIER5bmFtaWNTaWRlQ29udGVudCBmcm9tIFwic2FwL3VpL2xheW91dC9EeW5hbWljU2lkZUNvbnRlbnRcIjtcbmltcG9ydCB0eXBlIENvbnRleHQgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9Db250ZXh0XCI7XG5pbXBvcnQgdHlwZSBPRGF0YU1ldGFNb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L09EYXRhTWV0YU1vZGVsXCI7XG5cbi8qKlxuICogRXh0ZW5zaW9uIEFQSSBmb3Igb2JqZWN0IHBhZ2VzIG9uIFNBUCBGaW9yaSBlbGVtZW50cyBmb3IgT0RhdGEgVjQuXG4gKlxuICogQGFsaWFzIHNhcC5mZS50ZW1wbGF0ZXMuT2JqZWN0UGFnZS5FeHRlbnNpb25BUElcbiAqIEBwdWJsaWNcbiAqIEBoaWRlY29uc3RydWN0b3JcbiAqIEBmaW5hbFxuICogQHNpbmNlIDEuNzkuMFxuICovXG5AZGVmaW5lVUk1Q2xhc3MoXCJzYXAuZmUudGVtcGxhdGVzLk9iamVjdFBhZ2UuRXh0ZW5zaW9uQVBJXCIpXG5jbGFzcyBPYmplY3RQYWdlRXh0ZW5zaW9uQVBJIGV4dGVuZHMgRXh0ZW5zaW9uQVBJIHtcblx0LyoqXG5cdCAqIFJlZnJlc2hlcyBlaXRoZXIgdGhlIHdob2xlIG9iamVjdCBwYWdlIG9yIG9ubHkgcGFydHMgb2YgaXQuXG5cdCAqXG5cdCAqIEBhbGlhcyBzYXAuZmUudGVtcGxhdGVzLk9iamVjdFBhZ2UuRXh0ZW5zaW9uQVBJI3JlZnJlc2hcblx0ICogQHBhcmFtIFt2UGF0aF0gUGF0aCBvciBhcnJheSBvZiBwYXRocyByZWZlcnJpbmcgdG8gZW50aXRpZXMgb3IgcHJvcGVydGllcyB0byBiZSByZWZyZXNoZWQuXG5cdCAqIElmIG9taXR0ZWQsIHRoZSB3aG9sZSBvYmplY3QgcGFnZSBpcyByZWZyZXNoZWQuIFRoZSBwYXRoIFwiXCIgcmVmcmVzaGVzIHRoZSBlbnRpdHkgYXNzaWduZWQgdG8gdGhlIG9iamVjdCBwYWdlXG5cdCAqIHdpdGhvdXQgbmF2aWdhdGlvbnNcblx0ICogQHJldHVybnMgUmVzb2x2ZWQgb25jZSB0aGUgZGF0YSBpcyByZWZyZXNoZWQgb3IgcmVqZWN0ZWQgaWYgdGhlIHJlcXVlc3QgZmFpbGVkXG5cdCAqIEBwdWJsaWNcblx0ICovXG5cdHJlZnJlc2godlBhdGg6IHN0cmluZyB8IHN0cmluZ1tdIHwgdW5kZWZpbmVkKSB7XG5cdFx0Y29uc3Qgb0JpbmRpbmdDb250ZXh0ID0gdGhpcy5fdmlldy5nZXRCaW5kaW5nQ29udGV4dCgpIGFzIENvbnRleHQ7XG5cdFx0aWYgKCFvQmluZGluZ0NvbnRleHQpIHtcblx0XHRcdC8vIG5vdGhpbmcgdG8gYmUgcmVmcmVzaGVkIC0gZG8gbm90IGJsb2NrIHRoZSBhcHAhXG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG5cdFx0fVxuXHRcdGNvbnN0IG9BcHBDb21wb25lbnQgPSBDb21tb25VdGlscy5nZXRBcHBDb21wb25lbnQodGhpcy5fdmlldyksXG5cdFx0XHRvU2lkZUVmZmVjdHNTZXJ2aWNlID0gb0FwcENvbXBvbmVudC5nZXRTaWRlRWZmZWN0c1NlcnZpY2UoKSxcblx0XHRcdG9NZXRhTW9kZWwgPSBvQmluZGluZ0NvbnRleHQuZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKSBhcyBPRGF0YU1ldGFNb2RlbCxcblx0XHRcdG9TaWRlRWZmZWN0czogYW55ID0ge1xuXHRcdFx0XHRUYXJnZXRQcm9wZXJ0aWVzOiBbXSxcblx0XHRcdFx0VGFyZ2V0RW50aXRpZXM6IFtdXG5cdFx0XHR9O1xuXHRcdGxldCBhUGF0aHMsIHNQYXRoLCBzQmFzZUVudGl0eVNldCwgc0tpbmQ7XG5cblx0XHRpZiAodlBhdGggPT09IHVuZGVmaW5lZCB8fCB2UGF0aCA9PT0gbnVsbCkge1xuXHRcdFx0Ly8gd2UganVzdCBhZGQgYW4gZW1wdHkgcGF0aCB3aGljaCBzaG91bGQgcmVmcmVzaCB0aGUgcGFnZSB3aXRoIGFsbCBkZXBlbmRlbnQgYmluZGluZ3Ncblx0XHRcdG9TaWRlRWZmZWN0cy5UYXJnZXRFbnRpdGllcy5wdXNoKHtcblx0XHRcdFx0JE5hdmlnYXRpb25Qcm9wZXJ0eVBhdGg6IFwiXCJcblx0XHRcdH0pO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRhUGF0aHMgPSBBcnJheS5pc0FycmF5KHZQYXRoKSA/IHZQYXRoIDogW3ZQYXRoXTtcblx0XHRcdHNCYXNlRW50aXR5U2V0ID0gKHRoaXMuX2NvbnRyb2xsZXIuZ2V0T3duZXJDb21wb25lbnQoKSBhcyBhbnkpLmdldEVudGl0eVNldCgpO1xuXG5cdFx0XHRmb3IgKGxldCBpID0gMDsgaSA8IGFQYXRocy5sZW5ndGg7IGkrKykge1xuXHRcdFx0XHRzUGF0aCA9IGFQYXRoc1tpXTtcblx0XHRcdFx0aWYgKHNQYXRoID09PSBcIlwiKSB7XG5cdFx0XHRcdFx0Ly8gYW4gZW1wdHkgcGF0aCBzaGFsbCByZWZyZXNoIHRoZSBlbnRpdHkgd2l0aG91dCBkZXBlbmRlbmNpZXMgd2hpY2ggbWVhbnMgKiBmb3IgdGhlIG1vZGVsXG5cdFx0XHRcdFx0b1NpZGVFZmZlY3RzLlRhcmdldFByb3BlcnRpZXMucHVzaCh7XG5cdFx0XHRcdFx0XHQkUHJvcGVydHlQYXRoOiBcIipcIlxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHNLaW5kID0gb01ldGFNb2RlbC5nZXRPYmplY3QoYC8ke3NCYXNlRW50aXR5U2V0fS8ke3NQYXRofS8ka2luZGApO1xuXG5cdFx0XHRcdFx0aWYgKHNLaW5kID09PSBcIk5hdmlnYXRpb25Qcm9wZXJ0eVwiKSB7XG5cdFx0XHRcdFx0XHRvU2lkZUVmZmVjdHMuVGFyZ2V0RW50aXRpZXMucHVzaCh7XG5cdFx0XHRcdFx0XHRcdCROYXZpZ2F0aW9uUHJvcGVydHlQYXRoOiBzUGF0aFxuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0fSBlbHNlIGlmIChzS2luZCkge1xuXHRcdFx0XHRcdFx0b1NpZGVFZmZlY3RzLlRhcmdldFByb3BlcnRpZXMucHVzaCh7XG5cdFx0XHRcdFx0XHRcdCRQcm9wZXJ0eVBhdGg6IHNQYXRoXG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0cmV0dXJuIFByb21pc2UucmVqZWN0KGAke3NQYXRofSBpcyBub3QgYSB2YWxpZCBwYXRoIHRvIGJlIHJlZnJlc2hlZGApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gb1NpZGVFZmZlY3RzU2VydmljZS5yZXF1ZXN0U2lkZUVmZmVjdHMob1NpZGVFZmZlY3RzLlRhcmdldEVudGl0aWVzLmNvbmNhdChvU2lkZUVmZmVjdHMuVGFyZ2V0UHJvcGVydGllcyksIG9CaW5kaW5nQ29udGV4dCk7XG5cdH1cblxuXHQvKipcblx0ICogR2V0cyB0aGUgbGlzdCBlbnRyaWVzIGN1cnJlbnRseSBzZWxlY3RlZCBmb3IgdGhlIHRhYmxlLlxuXHQgKlxuXHQgKiBAYWxpYXMgc2FwLmZlLnRlbXBsYXRlcy5PYmplY3RQYWdlLkV4dGVuc2lvbkFQSSNnZXRTZWxlY3RlZENvbnRleHRzXG5cdCAqIEBwYXJhbSBzVGFibGVJZCBUaGUgSUQgaWRlbnRpZnlpbmcgdGhlIHRhYmxlIHRoZSBzZWxlY3RlZCBjb250ZXh0IGlzIHJlcXVlc3RlZCBmb3Jcblx0ICogQHJldHVybnMgQXJyYXkgY29udGFpbmluZyB0aGUgc2VsZWN0ZWQgY29udGV4dHNcblx0ICogQHB1YmxpY1xuXHQgKi9cblx0Z2V0U2VsZWN0ZWRDb250ZXh0cyhzVGFibGVJZDogc3RyaW5nKSB7XG5cdFx0bGV0IG9UYWJsZSA9IHRoaXMuX3ZpZXcuYnlJZChzVGFibGVJZCk7XG5cdFx0aWYgKG9UYWJsZSAmJiBvVGFibGUuaXNBKFwic2FwLmZlLm1hY3Jvcy50YWJsZS5UYWJsZUFQSVwiKSkge1xuXHRcdFx0b1RhYmxlID0gKG9UYWJsZSBhcyBFbmhhbmNlV2l0aFVJNTxUYWJsZUFQST4pLmdldENvbnRlbnQoKTtcblx0XHR9XG5cdFx0cmV0dXJuIChvVGFibGUgJiYgb1RhYmxlLmlzQShcInNhcC51aS5tZGMuVGFibGVcIikgJiYgKG9UYWJsZSBhcyBhbnkpLmdldFNlbGVjdGVkQ29udGV4dHMoKSkgfHwgW107XG5cdH1cblxuXHQvKipcblx0ICogRGlzcGxheXMgb3IgaGlkZXMgdGhlIHNpZGUgY29udGVudCBvZiBhbiBvYmplY3QgcGFnZSBibG9jay5cblx0ICpcblx0ICogQGFsaWFzIHNhcC5mZS50ZW1wbGF0ZXMuT2JqZWN0UGFnZS5FeHRlbnNpb25BUEkjc2hvd1NpZGVDb250ZW50XG5cdCAqIEBwYXJhbSBzU3ViU2VjdGlvbktleSBLZXkgb2YgdGhlIHNpZGUgY29udGVudCBmcmFnbWVudCBhcyBkZWZpbmVkIGluIHRoZSBtYW5pZmVzdC5qc29uXG5cdCAqIEBwYXJhbSBbYlNob3ddIE9wdGlvbmFsIEJvb2xlYW4gZmxhZyB0byBzaG93IG9yIGhpZGUgdGhlIHNpZGUgY29udGVudFxuXHQgKiBAcHVibGljXG5cdCAqL1xuXHRzaG93U2lkZUNvbnRlbnQoc1N1YlNlY3Rpb25LZXk6IHN0cmluZywgYlNob3c6IGJvb2xlYW4gfCB1bmRlZmluZWQpIHtcblx0XHRjb25zdCBzQmxvY2tJRCA9IGdldFNpZGVDb250ZW50TGF5b3V0SUQoc1N1YlNlY3Rpb25LZXkpLFxuXHRcdFx0b0Jsb2NrID0gdGhpcy5fdmlldy5ieUlkKHNCbG9ja0lEKSxcblx0XHRcdGJCbG9ja1N0YXRlID0gYlNob3cgPT09IHVuZGVmaW5lZCA/ICEob0Jsb2NrIGFzIER5bmFtaWNTaWRlQ29udGVudCkuZ2V0U2hvd1NpZGVDb250ZW50KCkgOiBiU2hvdztcblx0XHQob0Jsb2NrIGFzIER5bmFtaWNTaWRlQ29udGVudCkuc2V0U2hvd1NpZGVDb250ZW50KGJCbG9ja1N0YXRlLCBmYWxzZSk7XG5cdH1cblxuXHQvKipcblx0ICogR2V0cyB0aGUgYm91bmQgY29udGV4dCBvZiB0aGUgY3VycmVudCBvYmplY3QgcGFnZS5cblx0ICpcblx0ICogQGFsaWFzIHNhcC5mZS50ZW1wbGF0ZXMuT2JqZWN0UGFnZS5FeHRlbnNpb25BUEkjZ2V0QmluZGluZ0NvbnRleHRcblx0ICogQHJldHVybnMgQ29udGV4dCBib3VuZCB0byB0aGUgb2JqZWN0IHBhZ2Vcblx0ICogQHB1YmxpY1xuXHQgKi9cblx0Z2V0QmluZGluZ0NvbnRleHQoKSB7XG5cdFx0cmV0dXJuIHRoaXMuX3ZpZXcuZ2V0QmluZGluZ0NvbnRleHQoKTtcblx0fVxufVxuXG5leHBvcnQgZGVmYXVsdCBPYmplY3RQYWdlRXh0ZW5zaW9uQVBJO1xuIl0sIm1hcHBpbmdzIjoiO0FBQUE7QUFBQTtBQUFBOzs7Ozs7Ozs7Ozs7O0VBVUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO01BRU1BLHNCLFdBRExDLGNBQWMsQ0FBQywwQ0FBRCxDOzs7Ozs7Ozs7SUFFZDtBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtXQUNDQyxPLEdBQUEsaUJBQVFDLEtBQVIsRUFBOEM7TUFDN0MsSUFBTUMsZUFBZSxHQUFHLEtBQUtDLEtBQUwsQ0FBV0MsaUJBQVgsRUFBeEI7O01BQ0EsSUFBSSxDQUFDRixlQUFMLEVBQXNCO1FBQ3JCO1FBQ0EsT0FBT0csT0FBTyxDQUFDQyxPQUFSLEVBQVA7TUFDQTs7TUFDRCxJQUFNQyxh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
281
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJib2R5IiwicmVjb3ZlciIsInJlc3VsdCIsImUiLCJ0aGVuIiwiT2JqZWN0UGFnZUV4dGVuc2lvbkFQSSIsImRlZmluZVVJNUNsYXNzIiwicmVmcmVzaCIsInZQYXRoIiwib0JpbmRpbmdDb250ZXh0IiwiX3ZpZXciLCJnZXRCaW5kaW5nQ29udGV4dCIsIlByb21pc2UiLCJyZXNvbHZlIiwib0FwcENvbXBvbmVudCIsIkNvbW1vblV0aWxzIiwiZ2V0QXBwQ29tcG9uZW50Iiwib1NpZGVFZmZlY3RzU2VydmljZSIsImdldFNpZGVFZmZlY3RzU2VydmljZSIsIm9NZXRhTW9kZWwiLCJnZXRNb2RlbCIsImdldE1ldGFNb2RlbCIsIm9TaWRlRWZmZWN0cyIsIlRhcmdldFByb3BlcnRpZXMiLCJUYXJnZXRFbnRpdGllcyIsImFQYXRocyIsInNQYXRoIiwic0Jhc2VFbnRpdHlTZXQiLCJzS2luZCIsInVuZGVmaW5lZCIsInB1c2giLCIkTmF2aWdhdGlvblByb3BlcnR5UGF0aCIsIkFycmF5IiwiaXNBcnJheSIsIl9jb250cm9sbGVyIiwiZ2V0T3duZXJDb21wb25lbnQiLCJnZXRFbnRpdHlTZXQiLCJpIiwibGVuZ3RoIiwiJFByb3BlcnR5UGF0aCIsImdldE9iamVjdCIsInJlamVjdCIsInJlcXVlc3RTaWRlRWZmZWN0cyIsImNvbmNhdCIsImdldFNlbGVjdGVkQ29udGV4dHMiLCJzVGFibGVJZCIsIm9UYWJsZSIsImJ5SWQiLCJpc0EiLCJnZXRDb250ZW50Iiwic2hvd1NpZGVDb250ZW50Iiwic1N1YlNlY3Rpb25LZXkiLCJiU2hvdyIsInNCbG9ja0lEIiwiZ2V0U2lkZUNvbnRlbnRMYXlvdXRJRCIsIm9CbG9jayIsImJCbG9ja1N0YXRlIiwiZ2V0U2hvd1NpZGVDb250ZW50Iiwic2V0U2hvd1NpZGVDb250ZW50IiwiX2J1aWxkT1BNZXNzYWdlIiwibWVzc2FnZXMiLCJ2aWV3IiwiZ2V0UmVzb3VyY2VCdW5kbGUiLCJyZXNvdXJjZUJ1bmRsZSIsIm1lc3NhZ2UiLCJtZXNzYWdlU3RhdHMiLCJpZCIsImNvdW50IiwicmVkdWNlIiwiYWNjIiwiY3VycmVudFZhbHVlIiwiY3VycmVudFR5cGUiLCJnZXRUeXBlIiwic2V0VHlwZSIsIk1lc3NhZ2UiLCJ0eXBlIiwiTWVzc2FnZVR5cGUiLCJJbmZvcm1hdGlvbiIsIkVycm9yIiwiV2FybmluZyIsInNldE1lc3NhZ2UiLCJnZXRUZXh0Iiwic2hvd01lc3NhZ2VzIiwiaW50ZXJuYWxNb2RlbENvbnRleHQiLCJzZXRQcm9wZXJ0eSIsImdldE1lc3NhZ2UiLCJoaWRlTWVzc2FnZSIsIkxvZyIsImVycm9yIiwiRXh0ZW5zaW9uQVBJIl0sInNvdXJjZVJvb3QiOiIuIiwic291cmNlcyI6WyJFeHRlbnNpb25BUEkudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IExvZyBmcm9tIFwic2FwL2Jhc2UvTG9nXCI7XG5pbXBvcnQgQ29tbW9uVXRpbHMgZnJvbSBcInNhcC9mZS9jb3JlL0NvbW1vblV0aWxzXCI7XG5pbXBvcnQgeyBnZXRTaWRlQ29udGVudExheW91dElEIH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvaGVscGVycy9JRFwiO1xuaW1wb3J0IEV4dGVuc2lvbkFQSSBmcm9tIFwic2FwL2ZlL2NvcmUvRXh0ZW5zaW9uQVBJXCI7XG5pbXBvcnQgdHlwZSB7IEVuaGFuY2VXaXRoVUk1IH0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvQ2xhc3NTdXBwb3J0XCI7XG5pbXBvcnQgeyBkZWZpbmVVSTVDbGFzcyB9IGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL0NsYXNzU3VwcG9ydFwiO1xuaW1wb3J0IHR5cGUgVGFibGVBUEkgZnJvbSBcInNhcC9mZS9tYWNyb3MvdGFibGUvVGFibGVBUElcIjtcbmltcG9ydCB7IE1lc3NhZ2VUeXBlIH0gZnJvbSBcInNhcC91aS9jb3JlL2xpYnJhcnlcIjtcbmltcG9ydCBNZXNzYWdlIGZyb20gXCJzYXAvdWkvY29yZS9tZXNzYWdlL01lc3NhZ2VcIjtcbmltcG9ydCB0eXBlIER5bmFtaWNTaWRlQ29udGVudCBmcm9tIFwic2FwL3VpL2xheW91dC9EeW5hbWljU2lkZUNvbnRlbnRcIjtcbmltcG9ydCB0eXBlIENvbnRleHQgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9Db250ZXh0XCI7XG5pbXBvcnQgdHlwZSBPRGF0YU1ldGFNb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L09EYXRhTWV0YU1vZGVsXCI7XG5pbXBvcnQgUmVzb3VyY2VNb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL3Jlc291cmNlL1Jlc291cmNlTW9kZWxcIjtcblxuLyoqXG4gKiBFeHRlbnNpb24gQVBJIGZvciBvYmplY3QgcGFnZXMgb24gU0FQIEZpb3JpIGVsZW1lbnRzIGZvciBPRGF0YSBWNC5cbiAqXG4gKiBAYWxpYXMgc2FwLmZlLnRlbXBsYXRlcy5PYmplY3RQYWdlLkV4dGVuc2lvbkFQSVxuICogQHB1YmxpY1xuICogQGhpZGVjb25zdHJ1Y3RvclxuICogQGZpbmFsXG4gKiBAc2luY2UgMS43OS4wXG4gKi9cbkBkZWZpbmVVSTVDbGFzcyhcInNhcC5mZS50ZW1wbGF0ZXMuT2JqZWN0UGFnZS5FeHRlbnNpb25BUElcIilcbmNsYXNzIE9iamVjdFBhZ2VFeHRlbnNpb25BUEkgZXh0ZW5kcyBFeHRlbnNpb25BUEkge1xuXHQvKipcblx0ICogUmVmcmVzaGVzIGVpdGhlciB0aGUgd2hvbGUgb2JqZWN0IHBhZ2Ugb3Igb25seSBwYXJ0cyBvZiBpdC5cblx0ICpcblx0ICogQGFsaWFzIHNhcC5mZS50ZW1wbGF0ZXMuT2JqZWN0UGFnZS5FeHRlbnNpb25BUEkjcmVmcmVzaFxuXHQgKiBAcGFyYW0gW3ZQYXRoXSBQYXRoIG9yIGFycmF5IG9mIHBhdGhzIHJlZmVycmluZyB0byBlbnRpdGllcyBvciBwcm9wZXJ0aWVzIHRvIGJlIHJlZnJlc2hlZC5cblx0ICogSWYgb21pdHRlZCwgdGhlIHdob2xlIG9iamVjdCBwYWdlIGlzIHJlZnJlc2hlZC4gVGhlIHBhdGggXCJcIiByZWZyZXNoZXMgdGhlIGVudGl0eSBhc3NpZ25lZCB0byB0aGUgb2JqZWN0IHBhZ2Vcblx0ICogd2l0aG91dCBuYXZpZ2F0aW9uc1xuXHQgKiBAcmV0dXJucyBSZXNvbHZlZCBvbmNlIHRoZSBkYXRhIGlzIHJlZnJlc2hlZCBvciByZWplY3RlZCBpZiB0aGUgcmVxdWVzdCBmYWlsZWRcblx0ICogQHB1YmxpY1xuXHQgKi9cblx0cmVmcmVzaCh2UGF0aDogc3RyaW5nIHwgc3RyaW5nW10gfCB1bmRlZmluZWQpIHtcblx0XHRjb25zdCBvQmluZGluZ0NvbnRleHQgPSB0aGlzLl92aWV3LmdldEJpbmRpbmdDb250ZXh0KCkgYXMgQ29udGV4dDtcblx0XHRpZiAoIW9CaW5kaW5nQ29udGV4dCkge1xuXHRcdFx0Ly8gbm90aGluZyB0byBiZSByZWZyZXNoZWQgLSBkbyBub3QgYmxvY2sgdGhlIGFwcCFcblx0XHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcblx0XHR9XG5cdFx0Y29uc3Qgb0FwcENvbXBvbmVudCA9IENvbW1vblV0aWxzLmdldEFwcENvbXBvbmVudCh0aGlzLl92aWV3KSxcblx0XHRcdG9TaWRlRWZmZWN0c1NlcnZpY2UgPSBvQXBwQ29tcG9uZW50LmdldFNpZGVFZmZlY3RzU2VydmljZSgpLFxuXHRcdFx0b01ldGFNb2RlbCA9IG9CaW5kaW5nQ29udGV4dC5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpIGFzIE9EYXRhTWV0YU1vZGVsLFxuXHRcdFx0b1NpZGVFZmZlY3RzOiBhbnkgPSB7XG5cdFx0XHRcdFRhcmdldFByb3BlcnRpZXM6IFtdLFxuXHRcdFx0XHRUYXJnZXRFbnRpdGllczogW11cblx0XHRcdH07XG5cdFx0bGV0IGFQYXRocywgc1BhdGgsIHNCYXNlRW50aXR5U2V0LCBzS2luZDtcblxuXHRcdGlmICh2UGF0aCA9PT0gdW5kZWZpbmVkIHx8IHZQYXRoID09PSBudWxsKSB7XG5cdFx0XHQvLyB3ZSBqdXN0IGFkZCBhbiBlbXB0eSBwYXRoIHdoaWNoIHNob3VsZCByZWZyZXNoIHRoZSBwYWdlIHdpdGggYWxsIGRlcGVuZGVudCBiaW5kaW5nc1xuXHRcdFx0b1NpZGVFZmZlY3RzLlRhcmdldEVudGl0aWVzLnB1c2goe1xuXHRcdFx0XHQkTmF2aWdhdGlvblByb3BlcnR5UGF0aDogXCJcIlxuXHRcdFx0fSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGFQYXRocyA9IEFycmF5LmlzQXJyYXkodlBhdGgpID8gdlBhdGggOiBbdlBhdGhdO1xuXHRcdFx0c0Jhc2VFbnRpdHlTZXQgPSAodGhpcy5fY29udHJvbGxlci5nZXRPd25lckNvbXBvbmVudCgpIGFzIGFueSkuZ2V0RW50aXR5U2V0KCk7XG5cblx0XHRcdGZvciAobGV0IGkgPSAwOyBpIDwgYVBhdGhzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdHNQYXRoID0gYVBhdGhzW2ldO1xuXHRcdFx0XHRpZiAoc1BhdGggPT09IFwiXCIpIHtcblx0XHRcdFx0XHQvLyBhbiBlbXB0eSBwYXRoIHNoYWxsIHJlZnJlc2ggdGhlIGVudGl0eSB3aXRob3V0IGRlcGVuZGVuY2llcyB3aGljaCBtZWFucyAqIGZvciB0aGUgbW9kZWxcblx0XHRcdFx0XHRvU2lkZUVmZmVjdHMuVGFyZ2V0UHJvcGVydGllcy5wdXNoKHtcblx0XHRcdFx0XHRcdCRQcm9wZXJ0eVBhdGg6IFwiKlwiXG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0c0tpbmQgPSBvTWV0YU1vZGVsLmdldE9iamVjdChgLyR7c0Jhc2VFbnRpdHlTZXR9LyR7c1BhdGh9LyRraW5kYCk7XG5cblx0XHRcdFx0XHRpZiAoc0tpbmQgPT09IFwiTmF2aWdhdGlvblByb3BlcnR5XCIpIHtcblx0XHRcdFx0XHRcdG9TaWRlRWZmZWN0cy5UYXJnZXRFbnRpdGllcy5wdXNoKHtcblx0XHRcdFx0XHRcdFx0JE5hdmlnYXRpb25Qcm9wZXJ0eVBhdGg6IHNQYXRoXG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHR9IGVsc2UgaWYgKHNLaW5kKSB7XG5cdFx0XHRcdFx0XHRvU2lkZUVmZmVjdHMuVGFyZ2V0UHJvcGVydGllcy5wdXNoKHtcblx0XHRcdFx0XHRcdFx0JFByb3BlcnR5UGF0aDogc1BhdGhcblx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gUHJvbWlzZS5yZWplY3QoYCR7c1BhdGh9IGlzIG5vdCBhIHZhbGlkIHBhdGggdG8gYmUgcmVmcmVzaGVkYCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiBvU2lkZUVmZmVjdHNTZXJ2aWNlLnJlcXVlc3RTaWRlRWZmZWN0cyhvU2lkZUVmZmVjdHMuVGFyZ2V0RW50aXRpZXMuY29uY2F0KG9TaWRlRWZmZWN0cy5UYXJnZXRQcm9wZXJ0aWVzKSwgb0JpbmRpbmdDb250ZXh0KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXRzIHRoZSBsaXN0IGVudHJpZXMgY3VycmVudGx5IHNlbGVjdGVkIGZvciB0aGUgdGFibGUuXG5cdCAqXG5cdCAqIEBhbGlhcyBzYXAuZmUudGVtcGxhdGVzLk9iamVjdFBhZ2UuRXh0ZW5zaW9uQVBJI2dldFNlbGVjdGVkQ29udGV4dHNcblx0ICogQHBhcmFtIHNUYWJsZUlkIFRoZSBJRCBpZGVudGlmeWluZyB0aGUgdGFibGUgdGhlIHNlbGVjdGVkIGNvbnRleHQgaXMgcmVxdWVzdGVkIGZvclxuXHQgKiBAcmV0dXJucyBBcnJheSBjb250YWluaW5nIHRoZSBzZWxlY3RlZCBjb250ZXh0c1xuXHQgKiBAcHVibGljXG5cdCAqL1xuXHRnZXRTZWxlY3RlZENvbnRleHRzKHNUYWJsZUlkOiBzdHJpbmcpIHtcblx0XHRsZXQgb1RhYmxlID0gdGhpcy5fdmlldy5ieUlkKHNUYWJsZUlkKTtcblx0XHRpZiAob1RhYmxlICYmIG9UYWJsZS5pc0EoXCJzYXAuZmUubWFjcm9zLnRhYmxlLlRhYmxlQVBJXCIpKSB7XG5cdFx0XHRvVGFibGUgPSAob1RhYmxlIGFzIEVuaGFuY2VXaXRoVUk1PFRhYmxlQVBJPikuZ2V0Q29udGVudCgpO1xuXHRcdH1cblx0XHRyZXR1cm4gKG9UYWJsZSAmJiBvVGFibGUuaXNBKFwic2FwLnVpLm1kYy5UYWJsZVwiKSAmJiAob1RhYmxlIGFzIGFueSkuZ2V0U2VsZWN0ZWRDb250ZXh0cygpKSB8fCBbXTtcblx0fVxuXG5cdC8qKlxuXHQgKiBEaXNwbGF5cyBvciBoaWRlcyB0aGUgc2lkZSBjb250ZW50IG9mIGFuIG9iamVjdCBwYWdlLlxuXHQgKlxuXHQgKiBAYWxpYXMgc2FwLmZlLnRlbXBsYXRlcy5PYmplY3RQYWdlLkV4dGVuc2lvbkFQSSNzaG93U2lkZUNvbnRlbnRcblx0ICogQHBhcmFtIHNTdWJTZWN0aW9uS2V5IEtleSBvZiB0aGUgc2lkZSBjb250ZW50IGZyYWdtZW50IGFzIGRlZmluZWQgaW4gdGhlIG1hbmlmZXN0Lmpzb25cblx0ICogQHBhcmFtIFtiU2hvd10gT3B0aW9uYWwgQm9vbGVhbiBmbGFnIHRvIHNob3cgb3IgaGlkZSB0aGUgc2lkZSBjb250ZW50XG5cdCAqIEBwdWJsaWNcblx0ICovXG5cdHNob3dTaWRlQ29udGVudChzU3ViU2VjdGlvbktleTogc3RyaW5nLCBiU2hvdzogYm9vbGVhbiB8IHVuZGVmaW5lZCkge1xuXHRcdGNvbnN0IHNCbG9ja0lEID0gZ2V0U2lkZUNvbnRlbnRMYXlvdXRJRChzU3ViU2VjdGlvbktleSksXG5cdFx0XHRvQmxvY2sgPSB0aGlzLl92aWV3LmJ5SWQoc0Jsb2NrSUQpLFxuXHRcdFx0YkJsb2NrU3RhdGUgPSBiU2hvdyA9PT0gdW5kZWZpbmVkID8gIShvQmxvY2sgYXMgRHluYW1pY1NpZGVDb250ZW50KS5nZXRTaG93U2lkZUNvbnRlbnQoKSA6IGJTaG93O1xuXHRcdChvQmxvY2sgYXMgRHluYW1pY1NpZGVDb250ZW50KS5zZXRTaG93U2lkZUNvbnRlbnQoYkJsb2NrU3RhdGUsIGZhbHNlKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXRzIHRoZSBib3VuZCBjb250ZXh0IG9mIHRoZSBjdXJyZW50IG9iamVjdCBwYWdlLlxuXHQgKlxuXHQgKiBAYWxpYXMgc2FwLmZlLnRlbXBsYXRlcy5PYmplY3RQYWdlLkV4dGVuc2lvbkFQSSNnZXRCaW5kaW5nQ29udGV4dFxuXHQgKiBAcmV0dXJucyBDb250ZXh0IGJvdW5kIHRvIHRoZSBvYmplY3QgcGFnZVxuXHQgKiBAcHVibGljXG5cdCAqL1xuXHRnZXRCaW5kaW5nQ29udGV4dCgpIHtcblx0XHRyZXR1cm4gdGhpcy5fdmlldy5nZXRCaW5kaW5nQ29udGV4dCgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEJ1aWxkIGEgbWVzc2FnZSB0byBiZSBkaXNwbGF5ZWQgYmVsb3cgdGhlIGFuY2hvciBiYXIuXG5cdCAqXG5cdCAqIEBhbGlhcyBzYXAuZmUudGVtcGxhdGVzLk9iamVjdFBhZ2UuRXh0ZW5zaW9uQVBJI19idWlsZE9QTWVzc2FnZVxuXHQgKiBAcGFyYW0ge3NhcC51aS5jb3JlLm1lc3NhZ2UuTWVzc2FnZVtdfSBtZXNzYWdlcyBBcnJheSBvZiBtZXNzYWdlcyB1c2VkIHRvIGdlbmVyYXRlZCB0aGUgbWVzc2FnZVxuXHQgKiBAcmV0dXJucyB7UHJvbWlzZTxNZXNzYWdlPn0gUHJvbWlzZSBjb250YWluaW5nIHRoZSBnZW5lcmF0ZWQgbWVzc2FnZVxuXHQgKiBAcHJpdmF0ZVxuXHQgKi9cblx0YXN5bmMgX2J1aWxkT1BNZXNzYWdlKG1lc3NhZ2VzOiBNZXNzYWdlW10pOiBQcm9taXNlPE1lc3NhZ2UgfCBudWxsPiB7XG5cdFx0Y29uc3QgdmlldyA9IHRoaXMuX3ZpZXc7XG5cdFx0Y29uc3QgcmVzb3VyY2VCdW5kbGUgPSBhd2FpdCAodmlldy5nZXRNb2RlbChcInNhcC5mZS5pMThuXCIpIGFzIFJlc291cmNlTW9kZWwpLmdldFJlc291cmNlQnVuZGxlKCk7XG5cdFx0bGV0IG1lc3NhZ2U6IE1lc3NhZ2UgfCBudWxsID0gbnVsbDtcblx0XHRzd2l0Y2ggKG1lc3NhZ2VzLmxlbmd0aCkge1xuXHRcdFx0Y2FzZSAwOlxuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgMTpcblx0XHRcdFx0bWVzc2FnZSA9IG1lc3NhZ2VzWzBdO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdGNvbnN0IG1lc3NhZ2VTdGF0czogeyBba2V5OiBzdHJpbmddOiBhbnkgfSA9IHtcblx0XHRcdFx0XHRcIkVycm9yXCI6IHsgaWQ6IDIsIGNvdW50OiAwIH0sXG5cdFx0XHRcdFx0XCJXYXJuaW5nXCI6IHsgaWQ6IDEsIGNvdW50OiAwIH0sXG5cdFx0XHRcdFx0XCJJbmZvcm1hdGlvblwiOiB7IGlkOiAwLCBjb3VudDogMCB9XG5cdFx0XHRcdH07XG5cdFx0XHRcdG1lc3NhZ2UgPSBtZXNzYWdlcy5yZWR1Y2UoKGFjYywgY3VycmVudFZhbHVlKSA9PiB7XG5cdFx0XHRcdFx0Y29uc3QgY3VycmVudFR5cGUgPSBjdXJyZW50VmFsdWUuZ2V0VHlwZSgpO1xuXHRcdFx0XHRcdGFjYy5zZXRUeXBlKG1lc3NhZ2VTdGF0c1tjdXJyZW50VHlwZV0uaWQgPiBtZXNzYWdlU3RhdHNbYWNjLmdldFR5cGUoKV0uaWQgPyBjdXJyZW50VHlwZSA6IGFjYy5nZXRUeXBlKCkpO1xuXHRcdFx0XHRcdG1lc3NhZ2VTdGF0c1tjdXJyZW50VHlwZV0uY291bnQrKztcblx0XHRcdFx0XHRyZXR1cm4gYWNjO1xuXHRcdFx0XHR9LCBuZXcgTWVzc2FnZSh7IHR5cGU6IE1lc3NhZ2VUeXBlLkluZm9ybWF0aW9uIH0pKTtcblxuXHRcdFx0XHRpZiAobWVzc2FnZVN0YXRzLkVycm9yLmNvdW50ID09PSAwICYmIG1lc3NhZ2VTdGF0cy5XYXJuaW5nLmNvdW50ID09PSAwICYmIG1lc3NhZ2VTdGF0cy5JbmZvcm1hdGlvbi5jb3VudCA+IDApIHtcblx0XHRcdFx0XHRtZXNzYWdlLnNldE1lc3NhZ2UocmVzb3VyY2VCdW5kbGUuZ2V0VGV4dChcIk9CSkVDVFBBR0VTVEFURV9JTkZPUk1BVElPTlwiKSk7XG5cdFx0XHRcdH0gZWxzZSBpZiAoKG1lc3NhZ2VTdGF0cy5FcnJvci5jb3VudCA+IDAgJiYgbWVzc2FnZVN0YXRzLldhcm5pbmcuY291bnQgPiAwKSB8fCBtZXNzYWdlU3RhdHMuSW5mb3JtYXRpb24uY291bnQgPiAwKSB7XG5cdFx0XHRcdFx0bWVzc2FnZS5zZXRNZXNzYWdlKHJlc291cmNlQnVuZGxlLmdldFRleHQoXCJPQkpFQ1RQQUdFU1RBVEVfSVNTVUVcIikpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdG1lc3NhZ2Uuc2V0TWVzc2FnZShcblx0XHRcdFx0XHRcdHJlc291cmNlQnVuZGxlLmdldFRleHQoXG5cdFx0XHRcdFx0XHRcdG1lc3NhZ2UuZ2V0VHlwZSgpID09PSBNZXNzYWdlVHlwZS5FcnJvciA/IFwiT0JKRUNUUEFHRVNUQVRFX0VSUk9SXCIgOiBcIk9CSkVDVFBBR0VTVEFURV9XQVJOSU5HXCJcblx0XHRcdFx0XHRcdClcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiBtZXNzYWdlO1xuXHR9XG5cblx0LyoqXG5cdCAqIERpc3BsYXlzIHRoZSBtZXNzYWdlIHN0cmlwIGJlbG93IHRoZSBhbmNob3IgYmFyLlxuXHQgKlxuXHQgKiBAYWxpYXMgc2FwLmZlLnRlbXBsYXRlcy5PYmplY3RQYWdlLkV4dGVuc2lvbkFQSSNzaG93TWVzc2FnZXNcblx0ICogQHBhcmFtIHtzYXAudWkuY29yZS5tZXNzYWdlLk1lc3NhZ2V9IG1lc3NhZ2VzIFRoZSBtZXNzYWdlIHRvIGJlIGRpc3BsYXllZFxuXHQgKiBAcHVibGljXG5cdCAqL1xuXG5cdGFzeW5jIHNob3dNZXNzYWdlcyhtZXNzYWdlczogTWVzc2FnZVtdKSB7XG5cdFx0Y29uc3QgdmlldyA9IHRoaXMuX3ZpZXc7XG5cdFx0Y29uc3QgaW50ZXJuYWxNb2RlbENvbnRleHQgPSB2aWV3LmdldEJpbmRpbmdDb250ZXh0KFwiaW50ZXJuYWxcIik7XG5cdFx0dHJ5IHtcblx0XHRcdGNvbnN0IG1lc3NhZ2UgPSBhd2FpdCB0aGlzLl9idWlsZE9QTWVzc2FnZShtZXNzYWdlcyk7XG5cdFx0XHRpZiAobWVzc2FnZSkge1xuXHRcdFx0XHQoaW50ZXJuYWxNb2RlbENvbnRleHQgYXMgYW55KT8uc2V0UHJvcGVydHkoXCJPUE1lc3NhZ2VTdHJpcFZpc2liaWxpdHlcIiwgdHJ1ZSk7XG5cdFx0XHRcdChpbnRlcm5hbE1vZGVsQ29udGV4dCBhcyBhbnkpPy5zZXRQcm9wZXJ0eShcIk9QTWVzc2FnZVN0cmlwVGV4dFwiLCBtZXNzYWdlLmdldE1lc3NhZ2UoKSk7XG5cdFx0XHRcdChpbnRlcm5hbE1vZGVsQ29udGV4dCBhcyBhbnkpPy5zZXRQcm9wZXJ0eShcIk9QTWVzc2FnZVN0cmlwVHlwZVwiLCBtZXNzYWdlLmdldFR5cGUoKSk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR0aGlzLmhpZGVNZXNzYWdlKCk7XG5cdFx0XHR9XG5cdFx0fSBjYXRjaCAoZXJyKSB7XG5cdFx0XHRMb2cuZXJyb3IoXCJDYW5ub3QgZGlzcGxheSBPYmplY3RQYWdlIG1lc3NhZ2VcIik7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIEhpZGVzIHRoZSBtZXNzYWdlIHN0cmlwIGJlbG93IHRoZSBhbmNob3IgYmFyLlxuXHQgKlxuXHQgKiBAYWxpYXMgc2FwLmZlLnRlbXBsYXRlcy5PYmplY3RQYWdlLkV4dGVuc2lvbkFQSSNoaWRlTWVzc2FnZVxuXHQgKiBAcHVibGljXG5cdCAqL1xuXHRoaWRlTWVzc2FnZSgpIHtcblx0XHRjb25zdCB2aWV3ID0gdGhpcy5fdmlldztcblx0XHRjb25zdCBpbnRlcm5hbE1vZGVsQ29udGV4dCA9IHZpZXcuZ2V0QmluZGluZ0NvbnRleHQoXCJpbnRlcm5hbFwiKTtcblx0XHQoaW50ZXJuYWxNb2RlbENvbnRleHQgYXMgYW55KT8uc2V0UHJvcGVydHkoXCJPUE1lc3NhZ2VTdHJpcFZpc2liaWxpdHlcIiwgZmFsc2UpO1xuXHR9XG59XG5cbmV4cG9ydCBkZWZhdWx0IE9iamVjdFBhZ2VFeHRlbnNpb25BUEk7XG4iXSwibWFwcGluZ3MiOiI7QUFBQTtBQUFBO0FBQUE7Ozs7Ozs7Ozs7RUFrakJPLGdCQUFnQkEsSUFBaEIsRUFBc0JDLE9BQXRCLEVBQStCO0lB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
@@ -1,12 +1,16 @@
1
+ import Log from "sap/base/Log";
1
2
  import CommonUtils from "sap/fe/core/CommonUtils";
2
3
  import { getSideContentLayoutID } from "sap/fe/core/converters/helpers/ID";
3
4
  import ExtensionAPI from "sap/fe/core/ExtensionAPI";
4
5
  import type { EnhanceWithUI5 } from "sap/fe/core/helpers/ClassSupport";
5
6
  import { defineUI5Class } from "sap/fe/core/helpers/ClassSupport";
6
7
  import type TableAPI from "sap/fe/macros/table/TableAPI";
8
+ import { MessageType } from "sap/ui/core/library";
9
+ import Message from "sap/ui/core/message/Message";
7
10
  import type DynamicSideContent from "sap/ui/layout/DynamicSideContent";
8
11
  import type Context from "sap/ui/model/odata/v4/Context";
9
12
  import type ODataMetaModel from "sap/ui/model/odata/v4/ODataMetaModel";
13
+ import ResourceModel from "sap/ui/model/resource/ResourceModel";
10
14
 
11
15
  /**
12
16
  * Extension API for object pages on SAP Fiori elements for OData V4.
@@ -97,7 +101,7 @@ class ObjectPageExtensionAPI extends ExtensionAPI {
97
101
  }
98
102
 
99
103
  /**
100
- * Displays or hides the side content of an object page block.
104
+ * Displays or hides the side content of an object page.
101
105
  *
102
106
  * @alias sap.fe.templates.ObjectPage.ExtensionAPI#showSideContent
103
107
  * @param sSubSectionKey Key of the side content fragment as defined in the manifest.json
@@ -121,6 +125,89 @@ class ObjectPageExtensionAPI extends ExtensionAPI {
121
125
  getBindingContext() {
122
126
  return this._view.getBindingContext();
123
127
  }
128
+
129
+ /**
130
+ * Build a message to be displayed below the anchor bar.
131
+ *
132
+ * @alias sap.fe.templates.ObjectPage.ExtensionAPI#_buildOPMessage
133
+ * @param {sap.ui.core.message.Message[]} messages Array of messages used to generated the message
134
+ * @returns {Promise<Message>} Promise containing the generated message
135
+ * @private
136
+ */
137
+ async _buildOPMessage(messages: Message[]): Promise<Message | null> {
138
+ const view = this._view;
139
+ const resourceBundle = await (view.getModel("sap.fe.i18n") as ResourceModel).getResourceBundle();
140
+ let message: Message | null = null;
141
+ switch (messages.length) {
142
+ case 0:
143
+ break;
144
+ case 1:
145
+ message = messages[0];
146
+ break;
147
+ default:
148
+ const messageStats: { [key: string]: any } = {
149
+ "Error": { id: 2, count: 0 },
150
+ "Warning": { id: 1, count: 0 },
151
+ "Information": { id: 0, count: 0 }
152
+ };
153
+ message = messages.reduce((acc, currentValue) => {
154
+ const currentType = currentValue.getType();
155
+ acc.setType(messageStats[currentType].id > messageStats[acc.getType()].id ? currentType : acc.getType());
156
+ messageStats[currentType].count++;
157
+ return acc;
158
+ }, new Message({ type: MessageType.Information }));
159
+
160
+ if (messageStats.Error.count === 0 && messageStats.Warning.count === 0 && messageStats.Information.count > 0) {
161
+ message.setMessage(resourceBundle.getText("OBJECTPAGESTATE_INFORMATION"));
162
+ } else if ((messageStats.Error.count > 0 && messageStats.Warning.count > 0) || messageStats.Information.count > 0) {
163
+ message.setMessage(resourceBundle.getText("OBJECTPAGESTATE_ISSUE"));
164
+ } else {
165
+ message.setMessage(
166
+ resourceBundle.getText(
167
+ message.getType() === MessageType.Error ? "OBJECTPAGESTATE_ERROR" : "OBJECTPAGESTATE_WARNING"
168
+ )
169
+ );
170
+ }
171
+ }
172
+ return message;
173
+ }
174
+
175
+ /**
176
+ * Displays the message strip below the anchor bar.
177
+ *
178
+ * @alias sap.fe.templates.ObjectPage.ExtensionAPI#showMessages
179
+ * @param {sap.ui.core.message.Message} messages The message to be displayed
180
+ * @public
181
+ */
182
+
183
+ async showMessages(messages: Message[]) {
184
+ const view = this._view;
185
+ const internalModelContext = view.getBindingContext("internal");
186
+ try {
187
+ const message = await this._buildOPMessage(messages);
188
+ if (message) {
189
+ (internalModelContext as any)?.setProperty("OPMessageStripVisibility", true);
190
+ (internalModelContext as any)?.setProperty("OPMessageStripText", message.getMessage());
191
+ (internalModelContext as any)?.setProperty("OPMessageStripType", message.getType());
192
+ } else {
193
+ this.hideMessage();
194
+ }
195
+ } catch (err) {
196
+ Log.error("Cannot display ObjectPage message");
197
+ }
198
+ }
199
+
200
+ /**
201
+ * Hides the message strip below the anchor bar.
202
+ *
203
+ * @alias sap.fe.templates.ObjectPage.ExtensionAPI#hideMessage
204
+ * @public
205
+ */
206
+ hideMessage() {
207
+ const view = this._view;
208
+ const internalModelContext = view.getBindingContext("internal");
209
+ (internalModelContext as any)?.setProperty("OPMessageStripVisibility", false);
210
+ }
124
211
  }
125
212
 
126
213
  export default ObjectPageExtensionAPI;
@@ -18,8 +18,7 @@
18
18
  CONTACT: 'sap/fe/macros/contact/ContactHelper',
19
19
  UI: 'sap/fe/core/templating/UIFormatters',
20
20
  COMMON: 'sap/fe/macros/CommonHelper',
21
- COMMONFORMATTERS: 'sap/fe/core/templating/CommonFormatters',
22
- DATAFIELDHELPER : 'sap/fe/core/converters/helpers/DataFieldHelper'
21
+ COMMONFORMATTERS: 'sap/fe/core/templating/CommonFormatters'
23
22
  }"
24
23
  >
25
24
  <template:with path="entitySet>./" var="entityType">
@@ -127,32 +126,10 @@
127
126
  <uxap:ObjectPageDynamicHeaderTitle primaryArea="Begin" areaShrinkRatio="1:0:1.6">
128
127
  <core:Fragment fragmentName="sap.fe.templates.ObjectPage.view.fragments.Heading" type="XML" />
129
128
  <uxap:expandedContent>
130
- <FlexBox>
131
- <template:if test="{entityType>@com.sap.vocabularies.UI.v1.HeaderInfo/Description}">
132
- <template:if
133
- test="{= !DATAFIELDHELPER.isHeaderStaticallyHidden(${headerInfo>Description@@UI.getDataModelObjectPath})}"
134
- >
135
- <Label
136
- text="{= OP.getExpressionForDescription(${headerInfo>@@UI.getConverterContext}, ${fullContextPath>@@UI.getDataModelObjectPath})}"
137
- wrapping="true"
138
- />
139
- </template:if>
140
- </template:if>
141
- </FlexBox>
129
+ <core:Fragment fragmentName="sap.fe.templates.ObjectPage.view.fragments.HeadingContent" type="XML" />
142
130
  </uxap:expandedContent>
143
131
  <uxap:snappedContent>
144
- <FlexBox>
145
- <template:if test="{entityType>@com.sap.vocabularies.UI.v1.HeaderInfo/Description}">
146
- <template:if
147
- test="{= !DATAFIELDHELPER.isHeaderStaticallyHidden(${headerInfo>Description@@UI.getDataModelObjectPath})}"
148
- >
149
- <Label
150
- text="{= OP.getExpressionForDescription(${headerInfo>@@UI.getConverterContext}, ${fullContextPath>@@UI.getDataModelObjectPath})}"
151
- wrapping="true"
152
- />
153
- </template:if>
154
- </template:if>
155
- </FlexBox>
132
+ <core:Fragment fragmentName="sap.fe.templates.ObjectPage.view.fragments.HeadingContent" type="XML" />
156
133
  </uxap:snappedContent>
157
134
  <uxap:content>
158
135
  <template:if test="{entitySet>@com.sap.vocabularies.Common.v1.DraftRoot}">