@sapui5/sap.fe.templates 1.120.11 → 1.120.13

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.
@@ -62,6 +62,7 @@ import type ObjectPageDynamicHeaderTitle from "sap/uxap/ObjectPageDynamicHeaderT
62
62
  import type ObjectPageLayout from "sap/uxap/ObjectPageLayout";
63
63
  import type ObjectPageSection from "sap/uxap/ObjectPageSection";
64
64
  import type ObjectPageSubSection from "sap/uxap/ObjectPageSubSection";
65
+ import type ObjectPageComponent from "./Component";
65
66
  import IntentBasedNavigationOverride from "./overrides/IntentBasedNavigation";
66
67
  import InternalRoutingOverride from "./overrides/InternalRouting";
67
68
  import MessageHandlerOverride from "./overrides/MessageHandler";
@@ -366,24 +367,7 @@ class ObjectPageController extends PageController {
366
367
  this._initializePagination(oContext, oInternalModel, mParameters?.listBinding);
367
368
 
368
369
  if (oObjectPage.getEnableLazyLoading()) {
369
- const aSections = oObjectPage.getSections();
370
- const bUseIconTabBar = oObjectPage.getUseIconTabBar();
371
- let iSkip = 2;
372
- const bIsInEditMode = this.getView().getModel("ui").getProperty("/isEditable");
373
- const bEditableHeader = (this.getView().getViewData() as any).editableHeaderContent;
374
- for (let iSection = 0; iSection < aSections.length; iSection++) {
375
- const oSection = aSections[iSection];
376
- const aSubSections = oSection.getSubSections();
377
- for (let iSubSection = 0; iSubSection < aSubSections.length; iSubSection++, iSkip--) {
378
- // In IconTabBar mode keep the second section bound if there is an editable header and we are switching to display mode
379
- if (iSkip < 1 || (bUseIconTabBar && (iSection > 1 || (iSection === 1 && !bEditableHeader && !bIsInEditMode)))) {
380
- const oSubSection = aSubSections[iSubSection];
381
- if (oSubSection.data().isVisibilityDynamic !== "true") {
382
- oSubSection.setBindingContext(null as any);
383
- }
384
- }
385
- }
386
- }
370
+ this._disableBlocksBindings(oObjectPage);
387
371
  }
388
372
 
389
373
  if (this.placeholder.isPlaceholderEnabled() && mParameters.showPlaceholder) {
@@ -420,6 +404,36 @@ class ObjectPageController extends PageController {
420
404
  return oFirstClickableElement;
421
405
  }
422
406
 
407
+ /**
408
+ * Disable the bindings of blocks in object page layout based on its overall content.
409
+ *
410
+ * @param objectPage Object Page Layout control
411
+ */
412
+ _disableBlocksBindings(this: ObjectPageController, objectPage: ObjectPageLayout): void {
413
+ const aSections = objectPage.getSections();
414
+ const bUseIconTabBar = objectPage.getUseIconTabBar();
415
+ let iSkip = 2;
416
+ const bIsInEditMode = this.getView().getModel("ui").getProperty("/isEditable");
417
+ const bEditableHeader = (this.getView().getViewData() as ObjectPageComponent).editableHeaderContent;
418
+ for (let iSection = 0; iSection < aSections.length; iSection++) {
419
+ const oSection = aSections[iSection];
420
+ const aSubSections = oSection.getSubSections();
421
+ for (let iSubSection = 0; iSubSection < aSubSections.length; iSubSection++, iSkip--) {
422
+ // In IconTabBar mode keep the second section bound if there is an editable header and we are switching to display mode
423
+ if (iSkip < 1 || (bUseIconTabBar && (iSection > 1 || (iSection === 1 && !bEditableHeader && !bIsInEditMode)))) {
424
+ const oSubSection = aSubSections[iSubSection];
425
+ if (oSubSection.data().isVisibilityDynamic !== "true") {
426
+ // SubSection's binding is enabled.
427
+ oSubSection.setBindingContext(undefined);
428
+ const blocks = oSubSection.getBlocks() as SubSectionBlock[];
429
+ // SubSection's contents binding is disabled.
430
+ blocks.forEach((block) => block.setBindingContext(null));
431
+ }
432
+ }
433
+ }
434
+ }
435
+ }
436
+
423
437
  _getFirstEmptyMandatoryFieldFromSubSection(aSubSections: any) {
424
438
  if (aSubSections) {
425
439
  for (let subSection = 0; subSection < aSubSections.length; subSection++) {
@@ -498,7 +512,8 @@ class ObjectPageController extends PageController {
498
512
 
499
513
  _handleSubSectionEnteredViewPort(oEvent: any) {
500
514
  const oSubSection = oEvent.getParameter("subSection");
501
- oSubSection.setBindingContext(undefined);
515
+ const blocks = oSubSection.getBlocks() as SubSectionBlock[];
516
+ blocks.forEach((block) => block.setBindingContext(undefined));
502
517
  }
503
518
 
504
519
  _onBackNavigationInDraft(oContext: any) {
@@ -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.13"
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.13",
40
40
  noLibraryCSS: true
41
41
  });
42
42
  if (!thisLib.ObjectPage) {