@sapui5/sap.fe.templates 1.120.11 → 1.120.12

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sapui5/sap.fe.templates",
3
- "version": "1.120.11",
3
+ "version": "1.120.12",
4
4
  "description": "SAPUI5 Library sap.fe.templates",
5
5
  "keywords": [
6
6
  "sapui5",
@@ -6,7 +6,7 @@
6
6
  SAP UI development toolkit for HTML5 (SAPUI5)
7
7
  (c) Copyright 2009-2021 SAP SE. All rights reserved
8
8
  </copyright>
9
- <version>1.120.11</version>
9
+ <version>1.120.12</version>
10
10
 
11
11
  <documentation>UI5 library: sap.fe.templates</documentation>
12
12
 
@@ -4,7 +4,7 @@
4
4
  "id": "sap.fe.templates.AnalyticalListPage",
5
5
  "type": "component",
6
6
  "applicationVersion": {
7
- "version": "1.120.11"
7
+ "version": "1.120.12"
8
8
  },
9
9
  "title": "Analytical List Page",
10
10
  "tags": {
@@ -4,7 +4,7 @@
4
4
  "id": "sap.fe.templates.ListReport",
5
5
  "type": "component",
6
6
  "applicationVersion": {
7
- "version": "1.120.11"
7
+ "version": "1.120.12"
8
8
  },
9
9
  "title": "List Report",
10
10
  "tags": {
@@ -4,7 +4,7 @@
4
4
  "id": "sap.fe.templates.ObjectPage",
5
5
  "type": "component",
6
6
  "applicationVersion": {
7
- "version": "1.120.11"
7
+ "version": "1.120.12"
8
8
  },
9
9
  "title": "Object Page",
10
10
  "tags": {
@@ -2,11 +2,128 @@
2
2
  * SAP UI development toolkit for HTML5 (SAPUI5)
3
3
  * (c) Copyright 2009-2023 SAP SE. All rights reserved
4
4
  */
5
- sap.ui.define(["sap/fe/core/helpers/KeepAliveHelper", "sap/fe/core/library"], function (KeepAliveHelper, CoreLibrary) {
5
+ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/helpers/KeepAliveHelper", "sap/fe/core/helpers/ModelHelper", "sap/fe/core/library"], function (Log, CommonUtils, KeepAliveHelper, ModelHelper, CoreLibrary) {
6
6
  "use strict";
7
7
 
8
8
  const VariantManagement = CoreLibrary.VariantManagement;
9
+ const opControlHandlers = {
10
+ retrieve: function (oOPLayout) {
11
+ return {
12
+ selectedSection: oOPLayout.getSelectedSection()
13
+ };
14
+ },
15
+ apply: function (opLayout, controlState) {
16
+ const selectedSection = controlState === null || controlState === void 0 ? void 0 : controlState.selectedSection;
17
+ if (selectedSection) {
18
+ const opSectionToSelect = opLayout.getSections().find(section => section.getId() === selectedSection);
19
+ if ((opSectionToSelect === null || opSectionToSelect === void 0 ? void 0 : opSectionToSelect.getVisible()) === false) {
20
+ const controller = this.getView().getController();
21
+ controller.pageReady.waitPageReady().then(function () {
22
+ opLayout.setSelectedSection(selectedSection);
23
+ return undefined;
24
+ }).catch(err => {
25
+ const message = err instanceof Error ? err.message : String(err);
26
+ Log.error(`FE V4 : OP : ViewState : ObjectPageLayout state couldn't be applied : ${message}`);
27
+ });
28
+ } else {
29
+ opLayout.setSelectedSection(selectedSection);
30
+ }
31
+ }
32
+ },
33
+ refreshBinding: function (oOPLayout) {
34
+ const oBindingContext = oOPLayout.getBindingContext();
35
+ if (oBindingContext !== null && oBindingContext !== void 0 && oBindingContext.getBinding()) {
36
+ const oBinding = oBindingContext.getBinding();
37
+ const sMetaPath = ModelHelper.getMetaPathForContext(oBindingContext);
38
+ const sStrategy = KeepAliveHelper.getControlRefreshStrategyForContextPath(oOPLayout, sMetaPath);
39
+ if (sStrategy === "self") {
40
+ // Refresh main context and 1-1 navigation properties or OP
41
+ const oModel = oBindingContext.getModel(),
42
+ oMetaModel = oModel.getMetaModel(),
43
+ oNavigationProperties = CommonUtils.getContextPathProperties(oMetaModel, sMetaPath, {
44
+ $kind: "NavigationProperty"
45
+ }) || {},
46
+ aNavPropertiesToRequest = Object.keys(oNavigationProperties).reduce(function (aPrev, sNavProp) {
47
+ if (oNavigationProperties[sNavProp].$isCollection !== true) {
48
+ aPrev.push({
49
+ $NavigationPropertyPath: sNavProp
50
+ });
51
+ }
52
+ return aPrev;
53
+ }, []),
54
+ aProperties = [{
55
+ $PropertyPath: "*"
56
+ }],
57
+ sGroupId = oBinding.getGroupId();
58
+ oBindingContext.requestSideEffects(aProperties.concat(aNavPropertiesToRequest), sGroupId);
59
+ } else if (sStrategy === "includingDependents") {
60
+ // Complete refresh
61
+ oBinding.refresh();
62
+ }
63
+ } else {
64
+ Log.info(`ObjectPage: ${oOPLayout.getId()} was not refreshed. No binding found!`);
65
+ }
66
+ }
67
+ };
9
68
  const ViewStateExtensionOverride = {
69
+ _getObjectPageLayout: function () {
70
+ const view = this.getView();
71
+ const controller = view.getController();
72
+ return controller._getObjectPageLayoutControl();
73
+ },
74
+ /**
75
+ * Get the state handler for ObjectPageLayout in view.
76
+ *
77
+ * @param control The control for state interaction
78
+ * @returns State handler
79
+ */
80
+ _getOPStateHandler: function (control) {
81
+ const viewOP = ViewStateExtensionOverride._getObjectPageLayout.call(this);
82
+ if (viewOP === control) {
83
+ return {
84
+ retrieve: opControlHandlers.retrieve,
85
+ apply: opControlHandlers.apply
86
+ };
87
+ }
88
+ },
89
+ /**
90
+ * Get the refresh handler for ObjectPageLayout in view.
91
+ *
92
+ * @param control The control being refreshed
93
+ * @returns Refresh handler
94
+ */
95
+ _getOPRefreshHandler: function (control) {
96
+ const viewOP = ViewStateExtensionOverride._getObjectPageLayout.call(this);
97
+ if (viewOP === control) {
98
+ return {
99
+ refreshBinding: opControlHandlers.refreshBinding
100
+ };
101
+ }
102
+ },
103
+ /**
104
+ * Pass the state handlers of object page view according to the control in concern.
105
+ *
106
+ * @param control The control for state interaction
107
+ * @param controlStateHandlers State handlers
108
+ */
109
+ adaptControlStateHandler: function (control, controlStateHandlers) {
110
+ const opStateHandler = ViewStateExtensionOverride._getOPStateHandler.call(this, control);
111
+ if (opStateHandler) {
112
+ controlStateHandlers.push(opStateHandler);
113
+ }
114
+ },
115
+ /**
116
+ * Pass the refresh handlers of object page view according to the control being refreshed.
117
+ *
118
+ * @param control The control being refreshed
119
+ * @param controlRefreshHandlers Refresh handlers
120
+ */
121
+ adaptBindingRefreshHandler: function (control, controlRefreshHandlers) {
122
+ const opStateHandler = ViewStateExtensionOverride._getOPRefreshHandler.call(this, control);
123
+ if (opStateHandler) {
124
+ controlRefreshHandlers.push(opStateHandler);
125
+ }
126
+ },
10
127
  applyInitialStateOnly: function () {
11
128
  return false;
12
129
  },
@@ -66,4 +183,4 @@ sap.ui.define(["sap/fe/core/helpers/KeepAliveHelper", "sap/fe/core/library"], fu
66
183
  };
67
184
  return ViewStateExtensionOverride;
68
185
  }, false);
69
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJWYXJpYW50TWFuYWdlbWVudCIsIkNvcmVMaWJyYXJ5IiwiVmlld1N0YXRlRXh0ZW5zaW9uT3ZlcnJpZGUiLCJhcHBseUluaXRpYWxTdGF0ZU9ubHkiLCJhZGFwdFN0YXRlQ29udHJvbHMiLCJhU3RhdGVDb250cm9scyIsIm9WaWV3IiwiZ2V0VmlldyIsIm9Db250cm9sbGVyIiwiZ2V0Q29udHJvbGxlciIsIm9WaWV3RGF0YSIsImdldFZpZXdEYXRhIiwiYkNvbnRyb2xWTSIsInZhcmlhbnRNYW5hZ2VtZW50IiwiQ29udHJvbCIsIlBhZ2UiLCJOb25lIiwiRXJyb3IiLCJnZXRWYXJpYW50TWFuYWdlbWVudCIsIl9maW5kVGFibGVzIiwiZm9yRWFjaCIsIm9UYWJsZSIsIm9RdWlja0ZpbHRlciIsImdldFF1aWNrRmlsdGVyIiwicHVzaCIsImdldFZhcmlhbnQiLCJfZmluZENoYXJ0cyIsIm9DaGFydCIsImJ5SWQiLCJhZGFwdEJpbmRpbmdSZWZyZXNoQ29udHJvbHMiLCJhQ29udHJvbHMiLCJiYXNlIiwic1JlZnJlc2hTdHJhdGVneSIsIktlZXBBbGl2ZUhlbHBlciIsImdldFZpZXdSZWZyZXNoSW5mbyIsImFDb250cm9sc1RvUmVmcmVzaCIsIm9PYmplY3RQYWdlQ29udHJvbCIsIl9nZXRPYmplY3RQYWdlTGF5b3V0Q29udHJvbCIsImFWaWV3Q29udHJvbHMiLCJjb25jYXQiLCJnZXRDb250cm9sc0ZvclJlZnJlc2giLCJyZWR1Y2UiLCJhUHJldkNvbnRyb2xzIiwib0NvbnRyb2wiLCJpbmRleE9mIl0sInNvdXJjZVJvb3QiOiIuIiwic291cmNlcyI6WyJWaWV3U3RhdGUudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgVmlld1N0YXRlIGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9WaWV3U3RhdGVcIjtcbmltcG9ydCBLZWVwQWxpdmVIZWxwZXIgZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvS2VlcEFsaXZlSGVscGVyXCI7XG5pbXBvcnQgQ29yZUxpYnJhcnkgZnJvbSBcInNhcC9mZS9jb3JlL2xpYnJhcnlcIjtcbmltcG9ydCB0eXBlIE9iamVjdFBhZ2VDb250cm9sbGVyIGZyb20gXCJzYXAvZmUvdGVtcGxhdGVzL09iamVjdFBhZ2UvT2JqZWN0UGFnZUNvbnRyb2xsZXIuY29udHJvbGxlclwiO1xuaW1wb3J0IHR5cGUgQ29udHJvbCBmcm9tIFwic2FwL3VpL2NvcmUvQ29udHJvbFwiO1xuXG5jb25zdCBWYXJpYW50TWFuYWdlbWVudCA9IENvcmVMaWJyYXJ5LlZhcmlhbnRNYW5hZ2VtZW50O1xuXG5jb25zdCBWaWV3U3RhdGVFeHRlbnNpb25PdmVycmlkZSA9IHtcblx0YXBwbHlJbml0aWFsU3RhdGVPbmx5OiBmdW5jdGlvbiAoKSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9LFxuXHRhZGFwdFN0YXRlQ29udHJvbHM6IGZ1bmN0aW9uICh0aGlzOiBWaWV3U3RhdGUsIGFTdGF0ZUNvbnRyb2xzOiBhbnkpIHtcblx0XHRjb25zdCBvVmlldyA9IHRoaXMuZ2V0VmlldygpLFxuXHRcdFx0b0NvbnRyb2xsZXIgPSBvVmlldy5nZXRDb250cm9sbGVyKCksXG5cdFx0XHRvVmlld0RhdGEgPSBvVmlldy5nZXRWaWV3RGF0YSgpIGFzIGFueTtcblx0XHRsZXQgYkNvbnRyb2xWTSA9IGZhbHNlO1xuXG5cdFx0c3dpdGNoIChvVmlld0RhdGEudmFyaWFudE1hbmFnZW1lbnQpIHtcblx0XHRcdGNhc2UgVmFyaWFudE1hbmFnZW1lbnQuQ29udHJvbDpcblx0XHRcdFx0YkNvbnRyb2xWTSA9IHRydWU7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSBWYXJpYW50TWFuYWdlbWVudC5QYWdlOlxuXHRcdFx0Y2FzZSBWYXJpYW50TWFuYWdlbWVudC5Ob25lOlxuXHRcdFx0XHRicmVhaztcblx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihgdW5oYW5kbGVkIHZhcmlhbnQgc2V0dGluZzogJHtvVmlld0RhdGEuZ2V0VmFyaWFudE1hbmFnZW1lbnQoKX1gKTtcblx0XHR9XG5cblx0XHQob0NvbnRyb2xsZXIgYXMgT2JqZWN0UGFnZUNvbnRyb2xsZXIpLl9maW5kVGFibGVzKCkuZm9yRWFjaChmdW5jdGlvbiAob1RhYmxlOiBhbnkpIHtcblx0XHRcdGNvbnN0IG9RdWlja0ZpbHRlciA9IG9UYWJsZS5nZXRRdWlja0ZpbHRlcigpO1xuXHRcdFx0aWYgKG9RdWlja0ZpbHRlcikge1xuXHRcdFx0XHRhU3RhdGVDb250cm9scy5wdXNoKG9RdWlja0ZpbHRlcik7XG5cdFx0XHR9XG5cdFx0XHRpZiAoYkNvbnRyb2xWTSkge1xuXHRcdFx0XHRhU3RhdGVDb250cm9scy5wdXNoKG9UYWJsZS5nZXRWYXJpYW50KCkpO1xuXHRcdFx0fVxuXHRcdFx0YVN0YXRlQ29udHJvbHMucHVzaChvVGFibGUpO1xuXHRcdH0pO1xuXG5cdFx0KG9Db250cm9sbGVyIGFzIE9iamVjdFBhZ2VDb250cm9sbGVyKS5fZmluZENoYXJ0cygpLmZvckVhY2goZnVuY3Rpb24gKG9DaGFydDogYW55KSB7XG5cdFx0XHRpZiAoYkNvbnRyb2xWTSkge1xuXHRcdFx0XHRhU3RhdGVDb250cm9scy5wdXNoKG9DaGFydC5nZXRWYXJpYW50KCkpO1xuXHRcdFx0fVxuXHRcdFx0YVN0YXRlQ29udHJvbHMucHVzaChvQ2hhcnQpO1xuXHRcdH0pO1xuXG5cdFx0YVN0YXRlQ29udHJvbHMucHVzaChvVmlldy5ieUlkKFwiZmU6Ok9iamVjdFBhZ2VcIikpO1xuXHR9LFxuXHRhZGFwdEJpbmRpbmdSZWZyZXNoQ29udHJvbHM6IGZ1bmN0aW9uICh0aGlzOiBWaWV3U3RhdGUsIGFDb250cm9sczogYW55KSB7XG5cdFx0Y29uc3Qgb1ZpZXcgPSB0aGlzLmJhc2UuZ2V0VmlldygpLFxuXHRcdFx0c1JlZnJlc2hTdHJhdGVneSA9IEtlZXBBbGl2ZUhlbHBlci5nZXRWaWV3UmVmcmVzaEluZm8ob1ZpZXcpLFxuXHRcdFx0b0NvbnRyb2xsZXIgPSBvVmlldy5nZXRDb250cm9sbGVyKCk7XG5cdFx0bGV0IGFDb250cm9sc1RvUmVmcmVzaDogQ29udHJvbFtdID0gW107XG5cblx0XHRpZiAoc1JlZnJlc2hTdHJhdGVneSkge1xuXHRcdFx0Y29uc3Qgb09iamVjdFBhZ2VDb250cm9sID0gKG9Db250cm9sbGVyIGFzIE9iamVjdFBhZ2VDb250cm9sbGVyKS5fZ2V0T2JqZWN0UGFnZUxheW91dENvbnRyb2woKTtcblx0XHRcdGFDb250cm9sc1RvUmVmcmVzaC5wdXNoKG9PYmplY3RQYWdlQ29udHJvbCk7XG5cdFx0fVxuXHRcdGlmIChzUmVmcmVzaFN0cmF0ZWd5ICE9PSBcImluY2x1ZGluZ0RlcGVuZGVudHNcIikge1xuXHRcdFx0Y29uc3QgYVZpZXdDb250cm9scyA9IChvQ29udHJvbGxlciBhcyBPYmplY3RQYWdlQ29udHJvbGxlcikuX2ZpbmRUYWJsZXMoKTtcblx0XHRcdGFDb250cm9sc1RvUmVmcmVzaCA9IGFDb250cm9sc1RvUmVmcmVzaC5jb25jYXQoS2VlcEFsaXZlSGVscGVyLmdldENvbnRyb2xzRm9yUmVmcmVzaChvVmlldywgYVZpZXdDb250cm9scykgfHwgW10pO1xuXHRcdH1cblx0XHRyZXR1cm4gYUNvbnRyb2xzVG9SZWZyZXNoLnJlZHVjZShmdW5jdGlvbiAoYVByZXZDb250cm9sczogYW55LCBvQ29udHJvbDogYW55KSB7XG5cdFx0XHRpZiAoYVByZXZDb250cm9scy5pbmRleE9mKG9Db250cm9sKSA9PT0gLTEpIHtcblx0XHRcdFx0YVByZXZDb250cm9scy5wdXNoKG9Db250cm9sKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiBhUHJldkNvbnRyb2xzO1xuXHRcdH0sIGFDb250cm9scyk7XG5cdH1cbn07XG5cbmV4cG9ydCBkZWZhdWx0IFZpZXdTdGF0ZUV4dGVuc2lvbk92ZXJyaWRlO1xuIl0sIm1hcHBpbmdzIjoiO0FBQUE7QUFBQTtBQUFBOzs7O0VBTUEsTUFBTUEsaUJBQWlCLEdBQUdDLFdBQVcsQ0FBQ0QsaUJBQWlCO0VBRXZELE1BQU1FLDBCQUEw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
186
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJWYXJpYW50TWFuYWdlbWVudCIsIkNvcmVMaWJyYXJ5Iiwib3BDb250cm9sSGFuZGxlcnMiLCJyZXRyaWV2ZSIsIm9PUExheW91dCIsInNlbGVjdGVkU2VjdGlvbiIsImdldFNlbGVjdGVkU2VjdGlvbiIsImFwcGx5Iiwib3BMYXlvdXQiLCJjb250cm9sU3RhdGUiLCJvcFNlY3Rpb25Ub1NlbGVjdCIsImdldFNlY3Rpb25zIiwiZmluZCIsInNlY3Rpb24iLCJnZXRJZCIsImdldFZpc2libGUiLCJjb250cm9sbGVyIiwiZ2V0VmlldyIsImdldENvbnRyb2xsZXIiLCJwYWdlUmVhZHkiLCJ3YWl0UGFnZVJlYWR5IiwidGhlbiIsInNldFNlbGVjdGVkU2VjdGlvbiIsInVuZGVmaW5lZCIsImNhdGNoIiwiZXJyIiwibWVzc2FnZSIsIkVycm9yIiwiU3RyaW5nIiwiTG9nIiwiZXJyb3IiLCJyZWZyZXNoQmluZGluZyIsIm9CaW5kaW5nQ29udGV4dCIsImdldEJpbmRpbmdDb250ZXh0IiwiZ2V0QmluZGluZyIsIm9CaW5kaW5nIiwic01ldGFQYXRoIiwiTW9kZWxIZWxwZXIiLCJnZXRNZXRhUGF0aEZvckNvbnRleHQiLCJzU3RyYXRlZ3kiLCJLZWVwQWxpdmVIZWxwZXIiLCJnZXRDb250cm9sUmVmcmVzaFN0cmF0ZWd5Rm9yQ29udGV4dFBhdGgiLCJvTW9kZWwiLCJnZXRNb2RlbCIsIm9NZXRhTW9kZWwiLCJnZXRNZXRhTW9kZWwiLCJvTmF2aWdhdGlvblByb3BlcnRpZXMiLCJDb21tb25VdGlscyIsImdldENvbnRleHRQYXRoUHJvcGVydGllcyIsIiRraW5kIiwiYU5hdlByb3BlcnRpZXNUb1JlcXVlc3QiLCJPYmplY3QiLCJrZXlzIiwicmVkdWNlIiwiYVByZXYiLCJzTmF2UHJvcCIsIiRpc0NvbGxlY3Rpb24iLCJwdXNoIiwiJE5hdmlnYXRpb25Qcm9wZXJ0eVBhdGgiLCJhUHJvcGVydGllcyIsIiRQcm9wZXJ0eVBhdGgiLCJzR3JvdXBJZCIsImdldEdyb3VwSWQiLCJyZXF1ZXN0U2lkZUVmZmVjdHMiLCJjb25jYXQiLCJyZWZyZXNoIiwiaW5mbyIsIlZpZXdTdGF0ZUV4dGVuc2lvbk92ZXJyaWRlIiwiX2dldE9iamVjdFBhZ2VMYXlvdXQiLCJ2aWV3IiwiX2dldE9iamVjdFBhZ2VMYXlvdXRDb250cm9sIiwiX2dldE9QU3RhdGVIYW5kbGVyIiwiY29udHJvbCIsInZpZXdPUCIsImNhbGwiLCJfZ2V0T1BSZWZyZXNoSGFuZGxlciIsImFkYXB0Q29udHJvbFN0YXRlSGFuZGxlciIsImNvbnRyb2xTdGF0ZUhhbmRsZXJzIiwib3BTdGF0ZUhhbmRsZXIiLCJhZGFwdEJpbmRpbmdSZWZyZXNoSGFuZGxlciIsImNvbnRyb2xSZWZyZXNoSGFuZGxlcnMiLCJhcHBseUluaXRpYWxTdGF0ZU9ubHkiLCJhZGFwdFN0YXRlQ29udHJvbHMiLCJhU3RhdGVDb250cm9scyIsIm9WaWV3Iiwib0NvbnRyb2xsZXIiLCJvVmlld0RhdGEiLCJnZXRWaWV3RGF0YSIsImJDb250cm9sVk0iLCJ2YXJpYW50TWFuYWdlbWVudCIsIkNvbnRyb2wiLCJQYWdlIiwiTm9uZSIsImdldFZhcmlhbnRNYW5hZ2VtZW50IiwiX2ZpbmRUYWJsZXMiLCJmb3JFYWNoIiwib1RhYmxlIiwib1F1aWNrRmlsdGVyIiwiZ2V0UXVpY2tGaWx0ZXIiLCJnZXRWYXJpYW50IiwiX2ZpbmRDaGFydHMiLCJvQ2hhcnQiLCJieUlkIiwiYWRhcHRCaW5kaW5nUmVmcmVzaENvbnRyb2xzIiwiYUNvbnRyb2xzIiwiYmFzZSIsInNSZWZyZXNoU3RyYXRlZ3kiLCJnZXRWaWV3UmVmcmVzaEluZm8iLCJhQ29udHJvbHNUb1JlZnJlc2giLCJvT2JqZWN0UGFnZUNvbnRyb2wiLCJhVmlld0NvbnRyb2xzIiwiZ2V0Q29udHJvbHNGb3JSZWZyZXNoIiwiYVByZXZDb250cm9scyIsIm9Db250cm9sIiwiaW5kZXhPZiJdLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXMiOlsiVmlld1N0YXRlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBMb2cgZnJvbSBcInNhcC9iYXNlL0xvZ1wiO1xuaW1wb3J0IENvbW1vblV0aWxzIGZyb20gXCJzYXAvZmUvY29yZS9Db21tb25VdGlsc1wiO1xuaW1wb3J0IHR5cGUgVmlld1N0YXRlIGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9WaWV3U3RhdGVcIjtcbmltcG9ydCB7IHR5cGUgQ29udHJvbFN0YXRlSGFuZGxlciB9IGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9WaWV3U3RhdGVcIjtcbmltcG9ydCBLZWVwQWxpdmVIZWxwZXIgZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvS2VlcEFsaXZlSGVscGVyXCI7XG5pbXBvcnQgTW9kZWxIZWxwZXIgZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvTW9kZWxIZWxwZXJcIjtcbmltcG9ydCBDb3JlTGlicmFyeSBmcm9tIFwic2FwL2ZlL2NvcmUvbGlicmFyeVwiO1xuaW1wb3J0IHR5cGUgT2JqZWN0UGFnZUNvbnRyb2xsZXIgZnJvbSBcInNhcC9mZS90ZW1wbGF0ZXMvT2JqZWN0UGFnZS9PYmplY3RQYWdlQ29udHJvbGxlci5jb250cm9sbGVyXCI7XG5pbXBvcnQgdHlwZSBNYW5hZ2VkT2JqZWN0IGZyb20gXCJzYXAvdWkvYmFzZS9NYW5hZ2VkT2JqZWN0XCI7XG5pbXBvcnQgdHlwZSBDb250cm9sIGZyb20gXCJzYXAvdWkvY29yZS9Db250cm9sXCI7XG5pbXBvcnQgdHlwZSBDb250ZXh0IGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvQ29udGV4dFwiO1xuaW1wb3J0IHR5cGUgT2JqZWN0UGFnZUxheW91dCBmcm9tIFwic2FwL3V4YXAvT2JqZWN0UGFnZUxheW91dFwiO1xuaW1wb3J0IHR5cGUgT2JqZWN0UGFnZVNlY3Rpb24gZnJvbSBcInNhcC91eGFwL09iamVjdFBhZ2VTZWN0aW9uXCI7XG5pbXBvcnQgdHlwZSB7IE1ldGFNb2RlbE5hdlByb3BlcnR5IH0gZnJvbSBcInR5cGVzL21ldGFtb2RlbF90eXBlc1wiO1xuXG5jb25zdCBWYXJpYW50TWFuYWdlbWVudCA9IENvcmVMaWJyYXJ5LlZhcmlhbnRNYW5hZ2VtZW50O1xuZXhwb3J0IHR5cGUgT2JqZWN0UGFnZVN0YXRlID0geyBzZWxlY3RlZFNlY3Rpb246IHN0cmluZyB8IG51bGwgfTtcblxuY29uc3Qgb3BDb250cm9sSGFuZGxlcnMgPSB7XG5cdHJldHJpZXZlOiBmdW5jdGlvbiAob09QTGF5b3V0OiBPYmplY3RQYWdlTGF5b3V0KTogT2JqZWN0UGFnZVN0YXRlIHtcblx0XHRyZXR1cm4ge1xuXHRcdFx0c2VsZWN0ZWRTZWN0aW9uOiBvT1BMYXlvdXQuZ2V0U2VsZWN0ZWRTZWN0aW9uKClcblx0XHR9O1xuXHR9LFxuXHRhcHBseTogZnVuY3Rpb24gKHRoaXM6IFZpZXdTdGF0ZSwgb3BMYXlvdXQ6IE9iamVjdFBhZ2VMYXlvdXQsIGNvbnRyb2xTdGF0ZT86IHsgc2VsZWN0ZWRTZWN0aW9uOiBzdHJpbmcgfCBudWxsIH0pOiB2b2lkIHtcblx0XHRjb25zdCBzZWxlY3RlZFNlY3Rpb24gPSBjb250cm9sU3RhdGU/LnNlbGVjdGVkU2VjdGlvbjtcblx0XHRpZiAoc2VsZWN0ZWRTZWN0aW9uKSB7XG5cdFx0XHRjb25zdCBvcFNlY3Rpb25Ub1NlbGVjdCA9IG9wTGF5b3V0LmdldFNlY3Rpb25zKCkuZmluZCgoc2VjdGlvbjogT2JqZWN0UGFnZVNlY3Rpb24pID0+IHNlY3Rpb24uZ2V0SWQoKSA9PT0gc2VsZWN0ZWRTZWN0aW9uKTtcblx0XHRcdGlmIChvcFNlY3Rpb25Ub1NlbGVjdD8uZ2V0VmlzaWJsZSgpID09PSBmYWxzZSkge1xuXHRcdFx0XHRjb25zdCBjb250cm9sbGVyID0gdGhpcy5nZXRWaWV3KCkuZ2V0Q29udHJvbGxlcigpIGFzIE9iamVjdFBhZ2VDb250cm9sbGVyO1xuXHRcdFx0XHRjb250cm9sbGVyLnBhZ2VSZWFkeVxuXHRcdFx0XHRcdC53YWl0UGFnZVJlYWR5KClcblx0XHRcdFx0XHQudGhlbihmdW5jdGlvbiAoKTogdm9pZCB7XG5cdFx0XHRcdFx0XHRvcExheW91dC5zZXRTZWxlY3RlZFNlY3Rpb24oc2VsZWN0ZWRTZWN0aW9uKTtcblx0XHRcdFx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdFx0XHRcdFx0fSlcblx0XHRcdFx0XHQuY2F0Y2goKGVycjogdW5rbm93bik6IHZvaWQgPT4ge1xuXHRcdFx0XHRcdFx0Y29uc3QgbWVzc2FnZSA9IGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiBTdHJpbmcoZXJyKTtcblx0XHRcdFx0XHRcdExvZy5lcnJvcihgRkUgVjQgOiBPUCA6IFZpZXdTdGF0ZSA6IE9iamVjdFBhZ2VMYXlvdXQgc3RhdGUgY291bGRuJ3QgYmUgYXBwbGllZCA6ICR7bWVzc2FnZX1gKTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdG9wTGF5b3V0LnNldFNlbGVjdGVkU2VjdGlvbihzZWxlY3RlZFNlY3Rpb24pO1xuXHRcdFx0fVxuXHRcdH1cblx0fSxcblx0cmVmcmVzaEJpbmRpbmc6IGZ1bmN0aW9uIChvT1BMYXlvdXQ6IE9iamVjdFBhZ2VMYXlvdXQpOiB2b2lkIHtcblx0XHRjb25zdCBvQmluZGluZ0NvbnRleHQgPSBvT1BMYXlvdXQuZ2V0QmluZGluZ0NvbnRleHQoKSBhcyBDb250ZXh0IHwgdW5kZWZpbmVkO1xuXHRcdGlmIChvQmluZGluZ0NvbnRleHQ/LmdldEJpbmRpbmcoKSkge1xuXHRcdFx0Y29uc3Qgb0JpbmRpbmcgPSBvQmluZGluZ0NvbnRleHQuZ2V0QmluZGluZygpO1xuXHRcdFx0Y29uc3Qgc01ldGFQYXRoID0gTW9kZWxIZWxwZXIuZ2V0TWV0YVBhdGhGb3JDb250ZXh0KG9CaW5kaW5nQ29udGV4dCk7XG5cdFx0XHRjb25zdCBzU3RyYXRlZ3kgPSBLZWVwQWxpdmVIZWxwZXIuZ2V0Q29udHJvbFJlZnJlc2hTdHJhdGVneUZvckNvbnRleHRQYXRoKG9PUExheW91dCwgc01ldGFQYXRoKTtcblx0XHRcdGlmIChzU3RyYXRlZ3kgPT09IFwic2VsZlwiKSB7XG5cdFx0XHRcdC8vIFJlZnJlc2ggbWFpbiBjb250ZXh0IGFuZCAxLTEgbmF2aWdhdGlvbiBwcm9wZXJ0aWVzIG9yIE9QXG5cdFx0XHRcdGNvbnN0IG9Nb2RlbCA9IG9CaW5kaW5nQ29udGV4dC5nZXRNb2RlbCgpLFxuXHRcdFx0XHRcdG9NZXRhTW9kZWwgPSBvTW9kZWwuZ2V0TWV0YU1vZGVsKCksXG5cdFx0XHRcdFx0b05hdmlnYXRpb25Qcm9wZXJ0aWVzOiBSZWNvcmQ8c3RyaW5nLCBNZXRhTW9kZWxOYXZQcm9wZXJ0eT4gPVxuXHRcdFx0XHRcdFx0KENvbW1vblV0aWxzLmdldENvbnRleHRQYXRoUHJvcGVydGllcyhvTWV0YU1vZGVsLCBzTWV0YVBhdGgsIHtcblx0XHRcdFx0XHRcdFx0JGtpbmQ6IFwiTmF2aWdhdGlvblByb3BlcnR5XCJcblx0XHRcdFx0XHRcdH0pIGFzIFJlY29yZDxzdHJpbmcsIE1ldGFNb2RlbE5hdlByb3BlcnR5PikgfHwge30sXG5cdFx0XHRcdFx0YU5hdlByb3BlcnRpZXNUb1JlcXVlc3QgPSBPYmplY3Qua2V5cyhvTmF2aWdhdGlvblByb3BlcnRpZXMpLnJlZHVjZShmdW5jdGlvbiAoXG5cdFx0XHRcdFx0XHRhUHJldjogeyAkTmF2aWdhdGlvblByb3BlcnR5UGF0aDogc3RyaW5nIH1bXSxcblx0XHRcdFx0XHRcdHNOYXZQcm9wOiBzdHJpbmdcblx0XHRcdFx0XHQpIHtcblx0XHRcdFx0XHRcdGlmIChvTmF2aWdhdGlvblByb3BlcnRpZXNbc05hdlByb3BdLiRpc0NvbGxlY3Rpb24gIT09IHRydWUpIHtcblx0XHRcdFx0XHRcdFx0YVByZXYucHVzaCh7ICROYXZpZ2F0aW9uUHJvcGVydHlQYXRoOiBzTmF2UHJvcCB9KTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdHJldHVybiBhUHJldjtcblx0XHRcdFx0XHR9LCBbXSksXG5cdFx0XHRcdFx0YVByb3BlcnRpZXM6ICh7ICROYXZpZ2F0aW9uUHJvcGVydHlQYXRoOiBzdHJpbmcgfSB8IHsgJFByb3BlcnR5UGF0aDogc3RyaW5nIH0pW10gPSBbeyAkUHJvcGVydHlQYXRoOiBcIipcIiB9XSxcblx0XHRcdFx0XHRzR3JvdXBJZCA9IG9CaW5kaW5nLmdldEdyb3VwSWQoKTtcblxuXHRcdFx0XHRvQmluZGluZ0NvbnRleHQucmVxdWVzdFNpZGVFZmZlY3RzKGFQcm9wZXJ0aWVzLmNvbmNhdChhTmF2UHJvcGVydGllc1RvUmVxdWVzdCksIHNHcm91cElkKTtcblx0XHRcdH0gZWxzZSBpZiAoc1N0cmF0ZWd5ID09PSBcImluY2x1ZGluZ0RlcGVuZGVudHNcIikge1xuXHRcdFx0XHQvLyBDb21wbGV0ZSByZWZyZXNoXG5cdFx0XHRcdG9CaW5kaW5nLnJlZnJlc2goKTtcblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0TG9nLmluZm8oYE9iamVjdFBhZ2U6ICR7b09QTGF5b3V0LmdldElkKCl9IHdhcyBub3QgcmVmcmVzaGVkLiBObyBiaW5kaW5nIGZvdW5kIWApO1xuXHRcdH1cblx0fVxufTtcblxuY29uc3QgVmlld1N0YXRlRXh0ZW5zaW9uT3ZlcnJpZGUgPSB7XG5cdF9nZXRPYmplY3RQYWdlTGF5b3V0OiBmdW5jdGlvbiAodGhpczogVmlld1N0YXRlKTogT2JqZWN0UGFnZUxheW91dCB7XG5cdFx0Y29uc3QgdmlldyA9IHRoaXMuZ2V0VmlldygpO1xuXHRcdGNvbnN0IGNvbnRyb2xsZXIgPSB2aWV3LmdldENvbnRyb2xsZXIoKSBhcyBPYmplY3RQYWdlQ29udHJvbGxlcjtcblx0XHRyZXR1cm4gY29udHJvbGxlci5fZ2V0T2JqZWN0UGFnZUxheW91dENvbnRyb2woKTtcblx0fSxcblxuXHQvKipcblx0ICogR2V0IHRoZSBzdGF0ZSBoYW5kbGVyIGZvciBPYmplY3RQYWdlTGF5b3V0IGluIHZpZXcuXG5cdCAqXG5cdCAqIEBwYXJhbSBjb250cm9sIFRoZSBjb250cm9sIGZvciBzdGF0ZSBpbnRlcmFjdGlvblxuXHQgKiBAcmV0dXJucyBTdGF0ZSBoYW5kbGVyXG5cdCAqL1xuXHRfZ2V0T1BTdGF0ZUhhbmRsZXI6IGZ1bmN0aW9uIChcblx0XHR0aGlzOiBWaWV3U3RhdGUsXG5cdFx0Y29udHJvbDogTWFuYWdlZE9iamVjdFxuXHQpOiBDb250cm9sU3RhdGVIYW5kbGVyPE9iamVjdFBhZ2VMYXlvdXQsIE9iamVjdFBhZ2VTdGF0ZT4gfCB1bmRlZmluZWQge1xuXHRcdGNvbnN0IHZpZXdPUCA9IFZpZXdTdGF0ZUV4dGVuc2lvbk92ZXJyaWRlLl9nZXRPYmplY3RQYWdlTGF5b3V0LmNhbGwodGhpcyk7XG5cdFx0aWYgKHZpZXdPUCA9PT0gY29udHJvbCkge1xuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0cmV0cmlldmU6IG9wQ29udHJvbEhhbmRsZXJzLnJldHJpZXZlLFxuXHRcdFx0XHRhcHBseTogb3BDb250cm9sSGFuZGxlcnMuYXBwbHlcblx0XHRcdH07XG5cdFx0fVxuXHR9LFxuXG5cdC8qKlxuXHQgKiBHZXQgdGhlIHJlZnJlc2ggaGFuZGxlciBmb3IgT2JqZWN0UGFnZUxheW91dCBpbiB2aWV3LlxuXHQgKlxuXHQgKiBAcGFyYW0gY29udHJvbCBUaGUgY29udHJvbCBiZWluZyByZWZyZXNoZWRcblx0ICogQHJldHVybnMgUmVmcmVzaCBoYW5kbGVyXG5cdCAqL1xuXHRfZ2V0T1BSZWZyZXNoSGFuZGxlcjogZnVuY3Rpb24gKFxuXHRcdHRoaXM6IFZpZXdTdGF0ZSxcblx0XHRjb250cm9sOiBNYW5hZ2VkT2JqZWN0XG5cdCk6IENvbnRyb2xTdGF0ZUhhbmRsZXI8T2JqZWN0UGFnZUxheW91dCwgT2JqZWN0UGFnZVN0YXRlPiB8IHVuZGVmaW5lZCB7XG5cdFx0Y29uc3Qgdmlld09QID0gVmlld1N0YXRlRXh0ZW5zaW9uT3ZlcnJpZGUuX2dldE9iamVjdFBhZ2VMYXlvdXQuY2FsbCh0aGlzKTtcblx0XHRpZiAodmlld09QID09PSBjb250cm9sKSB7XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRyZWZyZXNoQmluZGluZzogb3BDb250cm9sSGFuZGxlcnMucmVmcmVzaEJpbmRpbmdcblx0XHRcdH07XG5cdFx0fVxuXHR9LFxuXG5cdC8qKlxuXHQgKiBQYXNzIHRoZSBzdGF0ZSBoYW5kbGVycyBvZiBvYmplY3QgcGFnZSB2aWV3IGFjY29yZGluZyB0byB0aGUgY29udHJvbCBpbiBjb25jZXJuLlxuXHQgKlxuXHQgKiBAcGFyYW0gY29udHJvbCBUaGUgY29udHJvbCBmb3Igc3RhdGUgaW50ZXJhY3Rpb25cblx0ICogQHBhcmFtIGNvbnRyb2xTdGF0ZUhhbmRsZXJzIFN0YXRlIGhhbmRsZXJzXG5cdCAqL1xuXHRhZGFwdENvbnRyb2xTdGF0ZUhhbmRsZXI6IGZ1bmN0aW9uIChcblx0XHR0aGlzOiBWaWV3U3RhdGUsXG5cdFx0Y29udHJvbDogTWFuYWdlZE9iamVjdCxcblx0XHRjb250cm9sU3RhdGVIYW5kbGVyczogQ29udHJvbFN0YXRlSGFuZGxlcjxPYmplY3RQYWdlTGF5b3V0LCBPYmplY3RQYWdlU3RhdGU+W11cblx0KTogdm9pZCB7XG5cdFx0Y29uc3Qgb3BTdGF0ZUhhbmRsZXIgPSBWaWV3U3RhdGVFeHRlbnNpb25PdmVycmlkZS5fZ2V0T1BTdGF0ZUhhbmRsZXIuY2FsbCh0aGlzLCBjb250cm9sKTtcblx0XHRpZiAob3BTdGF0ZUhhbmRsZXIpIHtcblx0XHRcdGNvbnRyb2xTdGF0ZUhhbmRsZXJzLnB1c2gob3BTdGF0ZUhhbmRsZXIpO1xuXHRcdH1cblx0fSxcblxuXHQvKipcblx0ICogUGFzcyB0aGUgcmVmcmVzaCBoYW5kbGVycyBvZiBvYmplY3QgcGFnZSB2aWV3IGFjY29yZGluZyB0byB0aGUgY29udHJvbCBiZWluZyByZWZyZXNoZWQuXG5cdCAqXG5cdCAqIEBwYXJhbSBjb250cm9sIFRoZSBjb250cm9sIGJlaW5nIHJlZnJlc2hlZFxuXHQgKiBAcGFyYW0gY29udHJvbFJlZnJlc2hIYW5kbGVycyBSZWZyZXNoIGhhbmRsZXJzXG5cdCAqL1xuXHRhZGFwdEJpbmRpbmdSZWZyZXNoSGFuZGxlcjogZnVuY3Rpb24gKFxuXHRcdHRoaXM6IFZpZXdTdGF0ZSxcblx0XHRjb250cm9sOiBNYW5hZ2VkT2JqZWN0LFxuXHRcdGNvbnRyb2xSZWZyZXNoSGFuZGxlcnM6IENvbnRyb2xTdGF0ZUhhbmRsZXI8T2JqZWN0UGFnZUxheW91dCwgT2JqZWN0UGFnZVN0YXRlPltdXG5cdCk6IHZvaWQge1xuXHRcdGNvbnN0IG9wU3RhdGVIYW5kbGVyID0gVmlld1N0YXRlRXh0ZW5zaW9uT3ZlcnJpZGUuX2dldE9QUmVmcmVzaEhhbmRsZXIuY2FsbCh0aGlzLCBjb250cm9sKTtcblx0XHRpZiAob3BTdGF0ZUhhbmRsZXIpIHtcblx0XHRcdGNvbnRyb2xSZWZyZXNoSGFuZGxlcnMucHVzaChvcFN0YXRlSGFuZGxlcik7XG5cdFx0fVxuXHR9LFxuXG5cdGFwcGx5SW5pdGlhbFN0YXRlT25seTogZnVuY3Rpb24gKCk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fSxcblx0YWRhcHRTdGF0ZUNvbnRyb2xzOiBmdW5jdGlvbiAodGhpczogVmlld1N0YXRlLCBhU3RhdGVDb250cm9sczogYW55KSB7XG5cdFx0Y29uc3Qgb1ZpZXcgPSB0aGlzLmdldFZpZXcoKSxcblx0XHRcdG9Db250cm9sbGVyID0gb1ZpZXcuZ2V0Q29udHJvbGxlcigpLFxuXHRcdFx0b1ZpZXdEYXRhID0gb1ZpZXcuZ2V0Vmlld0RhdGEoKSBhcyBhbnk7XG5cdFx0bGV0IGJDb250cm9sVk0gPSBmYWxzZTtcblxuXHRcdHN3aXRjaCAob1ZpZXdEYXRhLnZhcmlhbnRNYW5hZ2VtZW50KSB7XG5cdFx0XHRjYXNlIFZhcmlhbnRNYW5hZ2VtZW50LkNvbnRyb2w6XG5cdFx0XHRcdGJDb250cm9sVk0gPSB0cnVlO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgVmFyaWFudE1hbmFnZW1lbnQuUGFnZTpcblx0XHRcdGNhc2UgVmFyaWFudE1hbmFnZW1lbnQuTm9uZTpcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoYHVuaGFuZGxlZCB2YXJpYW50IHNldHRpbmc6ICR7b1ZpZXdEYXRhLmdldFZhcmlhbnRNYW5hZ2VtZW50KCl9YCk7XG5cdFx0fVxuXG5cdFx0KG9Db250cm9sbGVyIGFzIE9iamVjdFBhZ2VDb250cm9sbGVyKS5fZmluZFRhYmxlcygpLmZvckVhY2goZnVuY3Rpb24gKG9UYWJsZTogYW55KSB7XG5cdFx0XHRjb25zdCBvUXVpY2tGaWx0ZXIgPSBvVGFibGUuZ2V0UXVpY2tGaWx0ZXIoKTtcblx0XHRcdGlmIChvUXVpY2tGaWx0ZXIpIHtcblx0XHRcdFx0YVN0YXRlQ29udHJvbHMucHVzaChvUXVpY2tGaWx0ZXIpO1xuXHRcdFx0fVxuXHRcdFx0aWYgKGJDb250cm9sVk0pIHtcblx0XHRcdFx0YVN0YXRlQ29udHJvbHMucHVzaChvVGFibGUuZ2V0VmFyaWFudCgpKTtcblx0XHRcdH1cblx0XHRcdGFTdGF0ZUNvbnRyb2xzLnB1c2gob1RhYmxlKTtcblx0XHR9KTtcblxuXHRcdChvQ29udHJvbGxlciBhcyBPYmplY3RQYWdlQ29udHJvbGxlcikuX2ZpbmRDaGFydHMoKS5mb3JFYWNoKGZ1bmN0aW9uIChvQ2hhcnQ6IGFueSkge1xuXHRcdFx0aWYgKGJDb250cm9sVk0pIHtcblx0XHRcdFx0YVN0YXRlQ29udHJvbHMucHVzaChvQ2hhcnQuZ2V0VmFyaWFudCgpKTtcblx0XHRcdH1cblx0XHRcdGFTdGF0ZUNvbnRyb2xzLnB1c2gob0NoYXJ0KTtcblx0XHR9KTtcblxuXHRcdGFTdGF0ZUNvbnRyb2xzLnB1c2gob1ZpZXcuYnlJZChcImZlOjpPYmplY3RQYWdlXCIpKTtcblx0fSxcblx0YWRhcHRCaW5kaW5nUmVmcmVzaENvbnRyb2xzOiBmdW5jdGlvbiAodGhpczogVmlld1N0YXRlLCBhQ29udHJvbHM6IGFueSkge1xuXHRcdGNvbnN0IG9WaWV3ID0gdGhpcy5iYXNlLmdldFZpZXcoKSxcblx0XHRcdHNSZWZyZXNoU3RyYXRlZ3kgPSBLZWVwQWxpdmVIZWxwZXIuZ2V0Vmlld1JlZnJlc2hJbmZvKG9WaWV3KSxcblx0XHRcdG9Db250cm9sbGVyID0gb1ZpZXcuZ2V0Q29udHJvbGxlcigpO1xuXHRcdGxldCBhQ29udHJvbHNUb1JlZnJlc2g6IENvbnRyb2xbXSA9IFtdO1xuXG5cdFx0aWYgKHNSZWZyZXNoU3RyYXRlZ3kpIHtcblx0XHRcdGNvbnN0IG9PYmplY3RQYWdlQ29udHJvbCA9IChvQ29udHJvbGxlciBhcyBPYmplY3RQYWdlQ29udHJvbGxlcikuX2dldE9iamVjdFBhZ2VMYXlvdXRDb250cm9sKCk7XG5cdFx0XHRhQ29udHJvbHNUb1JlZnJlc2gucHVzaChvT2JqZWN0UGFnZUNvbnRyb2wpO1xuXHRcdH1cblx0XHRpZiAoc1JlZnJlc2hTdHJhdGVneSAhPT0gXCJpbmNsdWRpbmdEZXBlbmRlbnRzXCIpIHtcblx0XHRcdGNvbnN0IGFWaWV3Q29udHJvbHMgPSAob0NvbnRyb2xsZXIgYXMgT2JqZWN0UGFnZUNvbnRyb2xsZXIpLl9maW5kVGFibGVzKCk7XG5cdFx0XHRhQ29udHJvbHNUb1JlZnJlc2ggPSBhQ29udHJvbHNUb1JlZnJlc2guY29uY2F0KEtlZXBBbGl2ZUhlbHBlci5nZXRDb250cm9sc0ZvclJlZnJlc2gob1ZpZXcsIGFWaWV3Q29udHJvbHMpIHx8IFtdKTtcblx0XHR9XG5cdFx0cmV0dXJuIGFDb250cm9sc1RvUmVmcmVzaC5yZWR1Y2UoZnVuY3Rpb24gKGFQcmV2Q29udHJvbHM6IGFueSwgb0NvbnRyb2w6IGFueSkge1xuXHRcdFx0aWYgKGFQcmV2Q29udHJvbHMuaW5kZXhPZihvQ29udHJvbCkgPT09IC0xKSB7XG5cdFx0XHRcdGFQcmV2Q29udHJvbHMucHVzaChvQ29udHJvbCk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gYVByZXZDb250cm9scztcblx0XHR9LCBhQ29udHJvbHMpO1xuXHR9XG59O1xuXG5leHBvcnQgZGVmYXVsdCBWaWV3U3RhdGVFeHRlbnNpb25PdmVycmlkZTtcbiJdLCJtYXBwaW5ncyI6IjtBQUFBO0FBQUE7QUFBQTs7OztFQWVBLE1BQU1BLGlCQUFpQixHQUFHQyxXQUFXLENBQUNELGlCQUFpQjtFQUd2RCxNQUFNRSxpQkFB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
@@ -1,13 +1,164 @@
1
+ import Log from "sap/base/Log";
2
+ import CommonUtils from "sap/fe/core/CommonUtils";
1
3
  import type ViewState from "sap/fe/core/controllerextensions/ViewState";
4
+ import { type ControlStateHandler } from "sap/fe/core/controllerextensions/ViewState";
2
5
  import KeepAliveHelper from "sap/fe/core/helpers/KeepAliveHelper";
6
+ import ModelHelper from "sap/fe/core/helpers/ModelHelper";
3
7
  import CoreLibrary from "sap/fe/core/library";
4
8
  import type ObjectPageController from "sap/fe/templates/ObjectPage/ObjectPageController.controller";
9
+ import type ManagedObject from "sap/ui/base/ManagedObject";
5
10
  import type Control from "sap/ui/core/Control";
11
+ import type Context from "sap/ui/model/odata/v4/Context";
12
+ import type ObjectPageLayout from "sap/uxap/ObjectPageLayout";
13
+ import type ObjectPageSection from "sap/uxap/ObjectPageSection";
14
+ import type { MetaModelNavProperty } from "types/metamodel_types";
6
15
 
7
16
  const VariantManagement = CoreLibrary.VariantManagement;
17
+ export type ObjectPageState = { selectedSection: string | null };
18
+
19
+ const opControlHandlers = {
20
+ retrieve: function (oOPLayout: ObjectPageLayout): ObjectPageState {
21
+ return {
22
+ selectedSection: oOPLayout.getSelectedSection()
23
+ };
24
+ },
25
+ apply: function (this: ViewState, opLayout: ObjectPageLayout, controlState?: { selectedSection: string | null }): void {
26
+ const selectedSection = controlState?.selectedSection;
27
+ if (selectedSection) {
28
+ const opSectionToSelect = opLayout.getSections().find((section: ObjectPageSection) => section.getId() === selectedSection);
29
+ if (opSectionToSelect?.getVisible() === false) {
30
+ const controller = this.getView().getController() as ObjectPageController;
31
+ controller.pageReady
32
+ .waitPageReady()
33
+ .then(function (): void {
34
+ opLayout.setSelectedSection(selectedSection);
35
+ return undefined;
36
+ })
37
+ .catch((err: unknown): void => {
38
+ const message = err instanceof Error ? err.message : String(err);
39
+ Log.error(`FE V4 : OP : ViewState : ObjectPageLayout state couldn't be applied : ${message}`);
40
+ });
41
+ } else {
42
+ opLayout.setSelectedSection(selectedSection);
43
+ }
44
+ }
45
+ },
46
+ refreshBinding: function (oOPLayout: ObjectPageLayout): void {
47
+ const oBindingContext = oOPLayout.getBindingContext() as Context | undefined;
48
+ if (oBindingContext?.getBinding()) {
49
+ const oBinding = oBindingContext.getBinding();
50
+ const sMetaPath = ModelHelper.getMetaPathForContext(oBindingContext);
51
+ const sStrategy = KeepAliveHelper.getControlRefreshStrategyForContextPath(oOPLayout, sMetaPath);
52
+ if (sStrategy === "self") {
53
+ // Refresh main context and 1-1 navigation properties or OP
54
+ const oModel = oBindingContext.getModel(),
55
+ oMetaModel = oModel.getMetaModel(),
56
+ oNavigationProperties: Record<string, MetaModelNavProperty> =
57
+ (CommonUtils.getContextPathProperties(oMetaModel, sMetaPath, {
58
+ $kind: "NavigationProperty"
59
+ }) as Record<string, MetaModelNavProperty>) || {},
60
+ aNavPropertiesToRequest = Object.keys(oNavigationProperties).reduce(function (
61
+ aPrev: { $NavigationPropertyPath: string }[],
62
+ sNavProp: string
63
+ ) {
64
+ if (oNavigationProperties[sNavProp].$isCollection !== true) {
65
+ aPrev.push({ $NavigationPropertyPath: sNavProp });
66
+ }
67
+ return aPrev;
68
+ }, []),
69
+ aProperties: ({ $NavigationPropertyPath: string } | { $PropertyPath: string })[] = [{ $PropertyPath: "*" }],
70
+ sGroupId = oBinding.getGroupId();
71
+
72
+ oBindingContext.requestSideEffects(aProperties.concat(aNavPropertiesToRequest), sGroupId);
73
+ } else if (sStrategy === "includingDependents") {
74
+ // Complete refresh
75
+ oBinding.refresh();
76
+ }
77
+ } else {
78
+ Log.info(`ObjectPage: ${oOPLayout.getId()} was not refreshed. No binding found!`);
79
+ }
80
+ }
81
+ };
8
82
 
9
83
  const ViewStateExtensionOverride = {
10
- applyInitialStateOnly: function () {
84
+ _getObjectPageLayout: function (this: ViewState): ObjectPageLayout {
85
+ const view = this.getView();
86
+ const controller = view.getController() as ObjectPageController;
87
+ return controller._getObjectPageLayoutControl();
88
+ },
89
+
90
+ /**
91
+ * Get the state handler for ObjectPageLayout in view.
92
+ *
93
+ * @param control The control for state interaction
94
+ * @returns State handler
95
+ */
96
+ _getOPStateHandler: function (
97
+ this: ViewState,
98
+ control: ManagedObject
99
+ ): ControlStateHandler<ObjectPageLayout, ObjectPageState> | undefined {
100
+ const viewOP = ViewStateExtensionOverride._getObjectPageLayout.call(this);
101
+ if (viewOP === control) {
102
+ return {
103
+ retrieve: opControlHandlers.retrieve,
104
+ apply: opControlHandlers.apply
105
+ };
106
+ }
107
+ },
108
+
109
+ /**
110
+ * Get the refresh handler for ObjectPageLayout in view.
111
+ *
112
+ * @param control The control being refreshed
113
+ * @returns Refresh handler
114
+ */
115
+ _getOPRefreshHandler: function (
116
+ this: ViewState,
117
+ control: ManagedObject
118
+ ): ControlStateHandler<ObjectPageLayout, ObjectPageState> | undefined {
119
+ const viewOP = ViewStateExtensionOverride._getObjectPageLayout.call(this);
120
+ if (viewOP === control) {
121
+ return {
122
+ refreshBinding: opControlHandlers.refreshBinding
123
+ };
124
+ }
125
+ },
126
+
127
+ /**
128
+ * Pass the state handlers of object page view according to the control in concern.
129
+ *
130
+ * @param control The control for state interaction
131
+ * @param controlStateHandlers State handlers
132
+ */
133
+ adaptControlStateHandler: function (
134
+ this: ViewState,
135
+ control: ManagedObject,
136
+ controlStateHandlers: ControlStateHandler<ObjectPageLayout, ObjectPageState>[]
137
+ ): void {
138
+ const opStateHandler = ViewStateExtensionOverride._getOPStateHandler.call(this, control);
139
+ if (opStateHandler) {
140
+ controlStateHandlers.push(opStateHandler);
141
+ }
142
+ },
143
+
144
+ /**
145
+ * Pass the refresh handlers of object page view according to the control being refreshed.
146
+ *
147
+ * @param control The control being refreshed
148
+ * @param controlRefreshHandlers Refresh handlers
149
+ */
150
+ adaptBindingRefreshHandler: function (
151
+ this: ViewState,
152
+ control: ManagedObject,
153
+ controlRefreshHandlers: ControlStateHandler<ObjectPageLayout, ObjectPageState>[]
154
+ ): void {
155
+ const opStateHandler = ViewStateExtensionOverride._getOPRefreshHandler.call(this, control);
156
+ if (opStateHandler) {
157
+ controlRefreshHandlers.push(opStateHandler);
158
+ }
159
+ },
160
+
161
+ applyInitialStateOnly: function (): boolean {
11
162
  return false;
12
163
  },
13
164
  adaptStateControls: function (this: ViewState, aStateControls: any) {
@@ -36,7 +36,7 @@ sap.ui.define(["sap/f/library", "sap/fe/core/library", "sap/fe/macros/library",
36
36
  controls: [],
37
37
  elements: [],
38
38
  // eslint-disable-next-line no-template-curly-in-string
39
- version: "1.120.11",
39
+ version: "1.120.12",
40
40
  noLibraryCSS: true
41
41
  });
42
42
  if (!thisLib.ObjectPage) {