@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.
- package/package.json +1 -1
- package/src/sap/fe/templates/.library +1 -1
- package/src/sap/fe/templates/AnalyticalListPage/manifest.json +1 -1
- package/src/sap/fe/templates/ListReport/manifest.json +1 -1
- package/src/sap/fe/templates/ObjectPage/ObjectPageController.controller.js +34 -20
- package/src/sap/fe/templates/ObjectPage/ObjectPageController.controller.ts +34 -19
- package/src/sap/fe/templates/ObjectPage/manifest.json +1 -1
- package/src/sap/fe/templates/ObjectPage/overrides/ViewState.js +119 -2
- package/src/sap/fe/templates/ObjectPage/overrides/ViewState.ts +152 -1
- package/src/sap/fe/templates/library.js +1 -1
|
@@ -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
|
-
|
|
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.
|
|
515
|
+
const blocks = oSubSection.getBlocks() as SubSectionBlock[];
|
|
516
|
+
blocks.forEach((block) => block.setBindingContext(undefined));
|
|
502
517
|
}
|
|
503
518
|
|
|
504
519
|
_onBackNavigationInDraft(oContext: any) {
|
|
@@ -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
|
-
|
|
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.
|
|
39
|
+
version: "1.120.13",
|
|
40
40
|
noLibraryCSS: true
|
|
41
41
|
});
|
|
42
42
|
if (!thisLib.ObjectPage) {
|