@sapui5/sap.fe.core 1.96.0 → 1.97.0
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 +5 -5
- package/src/sap/fe/core/.library +1 -1
- package/src/sap/fe/core/AnnotationHelper.js +2 -2
- package/src/sap/fe/core/CommonUtils.js +59 -274
- package/src/sap/fe/core/RouterProxy.js +52 -64
- package/src/sap/fe/core/TemplateComponent.js +2 -2
- package/src/sap/fe/core/TransactionHelper.js +18 -22
- package/src/sap/fe/core/actions/messageHandling.js +80 -4
- package/src/sap/fe/core/actions/operations.js +42 -23
- package/src/sap/fe/core/controllerextensions/EditFlow.js +36 -21
- package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.js +9 -3
- package/src/sap/fe/core/controllerextensions/InternalRouting.js +20 -50
- package/src/sap/fe/core/controllerextensions/MessageHandler.js +222 -102
- package/src/sap/fe/core/controllerextensions/ViewState.js +33 -6
- package/src/sap/fe/core/controls/CustomQuickViewPage.js +109 -111
- package/src/sap/fe/core/controls/filterbar.d.js +8 -0
- package/src/sap/fe/core/controls/filterbar.d.ts +0 -0
- package/src/sap/fe/core/converters/ManifestSettings.js +2 -1
- package/src/sap/fe/core/converters/ManifestSettings.ts +4 -1
- package/src/sap/fe/core/converters/MetaModelConverter.js +10 -1
- package/src/sap/fe/core/converters/MetaModelConverter.ts +9 -1
- package/src/sap/fe/core/converters/annotations/DataField.js +2 -2
- package/src/sap/fe/core/converters/annotations/DataField.ts +1 -1
- package/src/sap/fe/core/converters/common/AnnotationConverter.js +67 -40
- package/src/sap/fe/core/converters/controls/Common/Action.js +6 -3
- package/src/sap/fe/core/converters/controls/Common/Action.ts +6 -3
- package/src/sap/fe/core/converters/controls/Common/Form.js +57 -18
- package/src/sap/fe/core/converters/controls/Common/Form.ts +51 -13
- package/src/sap/fe/core/converters/controls/Common/Table.js +130 -19
- package/src/sap/fe/core/converters/controls/Common/Table.ts +139 -18
- package/src/sap/fe/core/converters/helpers/ID.js +9 -1
- package/src/sap/fe/core/converters/helpers/ID.ts +4 -0
- package/src/sap/fe/core/converters/templates/ListReportConverter.js +18 -7
- package/src/sap/fe/core/converters/templates/ListReportConverter.ts +17 -12
- package/src/sap/fe/core/designtime/AppComponent.designtime.js +2 -1
- package/src/sap/fe/core/formatters/TableFormatter.js +27 -4
- package/src/sap/fe/core/formatters/TableFormatter.ts +20 -3
- package/src/sap/fe/core/helpers/KeepAliveHelper.js +211 -0
- package/src/sap/fe/core/helpers/KeepAliveHelper.ts +202 -0
- package/src/sap/fe/core/helpers/KeepAliveRefreshTypes.js +32 -0
- package/src/sap/fe/core/helpers/KeepAliveRefreshTypes.ts +36 -0
- package/src/sap/fe/core/helpers/ModelHelper.js +51 -0
- package/src/sap/fe/core/library.js +1 -1
- package/src/sap/fe/core/messagebundle.properties +15 -1
- package/src/sap/fe/core/messagebundle_ar.properties +10 -0
- package/src/sap/fe/core/messagebundle_bg.properties +10 -0
- package/src/sap/fe/core/messagebundle_ca.properties +10 -0
- package/src/sap/fe/core/messagebundle_cs.properties +10 -0
- package/src/sap/fe/core/messagebundle_cy.properties +10 -0
- package/src/sap/fe/core/messagebundle_da.properties +10 -0
- package/src/sap/fe/core/messagebundle_de.properties +10 -0
- package/src/sap/fe/core/messagebundle_el.properties +10 -0
- package/src/sap/fe/core/messagebundle_en.properties +10 -0
- package/src/sap/fe/core/messagebundle_en_GB.properties +10 -0
- package/src/sap/fe/core/messagebundle_en_US_sappsd.properties +6 -0
- package/src/sap/fe/core/messagebundle_en_US_saprigi.properties +11 -1
- package/src/sap/fe/core/messagebundle_en_US_saptrc.properties +11 -1
- package/src/sap/fe/core/messagebundle_es.properties +10 -0
- package/src/sap/fe/core/messagebundle_es_MX.properties +10 -0
- package/src/sap/fe/core/messagebundle_et.properties +10 -0
- package/src/sap/fe/core/messagebundle_fi.properties +10 -0
- package/src/sap/fe/core/messagebundle_fr.properties +10 -0
- package/src/sap/fe/core/messagebundle_fr_CA.properties +10 -0
- package/src/sap/fe/core/messagebundle_hi.properties +10 -0
- package/src/sap/fe/core/messagebundle_hr.properties +10 -0
- package/src/sap/fe/core/messagebundle_hu.properties +10 -0
- package/src/sap/fe/core/messagebundle_id.properties +11 -1
- package/src/sap/fe/core/messagebundle_it.properties +10 -0
- package/src/sap/fe/core/messagebundle_iw.properties +10 -0
- package/src/sap/fe/core/messagebundle_ja.properties +19 -9
- package/src/sap/fe/core/messagebundle_kk.properties +10 -0
- package/src/sap/fe/core/messagebundle_ko.properties +10 -0
- package/src/sap/fe/core/messagebundle_lt.properties +10 -0
- package/src/sap/fe/core/messagebundle_lv.properties +10 -0
- package/src/sap/fe/core/messagebundle_ms.properties +10 -0
- package/src/sap/fe/core/messagebundle_nl.properties +10 -0
- package/src/sap/fe/core/messagebundle_no.properties +10 -0
- package/src/sap/fe/core/messagebundle_pl.properties +10 -0
- package/src/sap/fe/core/messagebundle_pt.properties +11 -1
- package/src/sap/fe/core/messagebundle_pt_PT.properties +10 -0
- package/src/sap/fe/core/messagebundle_ro.properties +10 -0
- package/src/sap/fe/core/messagebundle_ru.properties +10 -0
- package/src/sap/fe/core/messagebundle_sh.properties +10 -0
- package/src/sap/fe/core/messagebundle_sk.properties +10 -0
- package/src/sap/fe/core/messagebundle_sl.properties +10 -0
- package/src/sap/fe/core/messagebundle_sv.properties +10 -0
- package/src/sap/fe/core/messagebundle_th.properties +10 -0
- package/src/sap/fe/core/messagebundle_tr.properties +10 -0
- package/src/sap/fe/core/messagebundle_uk.properties +10 -0
- package/src/sap/fe/core/messagebundle_vi.properties +10 -0
- package/src/sap/fe/core/messagebundle_zh_CN.properties +10 -0
- package/src/sap/fe/core/messagebundle_zh_TW.properties +10 -0
- package/src/sap/fe/core/services/RoutingServiceFactory.js +30 -19
- package/src/sap/fe/core/services/TemplatedViewServiceFactory.js +1 -1
- package/src/sap/fe/core/templating/EntitySetHelper.js +80 -7
- package/src/sap/fe/core/templating/EntitySetHelper.ts +42 -2
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* SAP UI development toolkit for HTML5 (SAPUI5)
|
|
3
|
+
* (c) Copyright 2009-2021 SAP SE. All rights reserved
|
|
4
|
+
*/
|
|
5
|
+
sap.ui.define(["sap/base/Log", "sap/fe/core/helpers/ModelHelper", "sap/fe/core/helpers/KeepAliveRefreshTypes"], function (Log, ModelHelper, KeepAliveRefreshTypes) {
|
|
6
|
+
"use strict";
|
|
7
|
+
|
|
8
|
+
var PATH_TO_STORE = KeepAliveRefreshTypes.PATH_TO_STORE;
|
|
9
|
+
var RefreshStrategyType = KeepAliveRefreshTypes.RefreshStrategyType;
|
|
10
|
+
var getEntitySetPath = ModelHelper.getEntitySetPath;
|
|
11
|
+
|
|
12
|
+
// Private functions - start
|
|
13
|
+
var _fnSimplifyEntitySetPath = function (metaModel, entitySetPathToUse) {
|
|
14
|
+
var entitySetPath = getEntitySetPath(entitySetPathToUse);
|
|
15
|
+
var entitySet = entitySetPath.indexOf("$NavigationPropertyBinding") > -1 && metaModel.getObject(entitySetPath);
|
|
16
|
+
return entitySet ? "/" + entitySet : entitySetPathToUse;
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
var _fnIsApplicable = function (primaryPath, key, strategy) {
|
|
20
|
+
return primaryPath === key || strategy === RefreshStrategyType.IncludingDependents && primaryPath.startsWith(key);
|
|
21
|
+
};
|
|
22
|
+
/**
|
|
23
|
+
* Check if given path resides in the context path provided.
|
|
24
|
+
*
|
|
25
|
+
* @param {ODataMetaModel} metaModel MetaModel to be used
|
|
26
|
+
* @param {string} contextPath Context path to be used
|
|
27
|
+
* @param {string} path Path to be used
|
|
28
|
+
* @param {RefreshStrategyType} strategy Strategy, it could be 'self' | 'includingDependents'
|
|
29
|
+
* @returns {boolean} Returns true if the context path is applicable.
|
|
30
|
+
*/
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
var _isPathApplicableToContextPath = function (metaModel, contextPath, path, strategy) {
|
|
34
|
+
var contextPathToCheck = contextPath.startsWith("/") ? contextPath : "/" + contextPath,
|
|
35
|
+
pathToCheck = path.startsWith("/") ? path : "/" + path;
|
|
36
|
+
|
|
37
|
+
if (!_fnIsApplicable(contextPathToCheck, pathToCheck, strategy)) {
|
|
38
|
+
contextPathToCheck = _fnSimplifyEntitySetPath(metaModel, contextPathToCheck);
|
|
39
|
+
|
|
40
|
+
if (!_fnIsApplicable(contextPathToCheck, pathToCheck, strategy)) {
|
|
41
|
+
pathToCheck = _fnSimplifyEntitySetPath(metaModel, pathToCheck);
|
|
42
|
+
} else {
|
|
43
|
+
return true;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
return _fnIsApplicable(contextPathToCheck, pathToCheck, strategy);
|
|
48
|
+
}; // Private functions - end
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* Get controls to refresh in a view.
|
|
52
|
+
*
|
|
53
|
+
* @param {View} view View of the controls
|
|
54
|
+
* @param {Control[]} controls Context path to be used
|
|
55
|
+
* @returns {Control[]} Returns controls that need to be refreshed.
|
|
56
|
+
*/
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
var getControlsForRefresh = function (view, controls) {
|
|
60
|
+
var controlsForRefresh = [];
|
|
61
|
+
var metaModel = view.getModel().getMetaModel();
|
|
62
|
+
var internalModel = view.getModel("internal");
|
|
63
|
+
var refreshStrategy = internalModel.getProperty(PATH_TO_STORE) || {};
|
|
64
|
+
|
|
65
|
+
if (controls) {
|
|
66
|
+
controls.forEach(function (control) {
|
|
67
|
+
var contextPath = control.data("targetCollectionPath");
|
|
68
|
+
|
|
69
|
+
for (var key in refreshStrategy) {
|
|
70
|
+
var strategy = refreshStrategy[key];
|
|
71
|
+
|
|
72
|
+
if (controlsForRefresh.indexOf(control) === -1 && _isPathApplicableToContextPath(metaModel, contextPath, key, strategy)) {
|
|
73
|
+
controlsForRefresh.push(control);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
return controlsForRefresh;
|
|
80
|
+
};
|
|
81
|
+
/**
|
|
82
|
+
* Get refresh strategy for the control for a context path.
|
|
83
|
+
*
|
|
84
|
+
* @param {Control} control Control from which refresh info is needed
|
|
85
|
+
* @param {string} contextPath ContextPath for properities
|
|
86
|
+
* @returns {RefreshStrategyType} Returns strategy for control refresh.
|
|
87
|
+
*/
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
var getControlRefreshStrategyForContextPath = function (control, contextPath) {
|
|
91
|
+
var metaModel = control.getModel().getMetaModel();
|
|
92
|
+
var internalModel = control.getModel("internal");
|
|
93
|
+
var refreshStrategy = internalModel.getProperty(PATH_TO_STORE) || {};
|
|
94
|
+
var strategy;
|
|
95
|
+
|
|
96
|
+
if (contextPath) {
|
|
97
|
+
for (var key in refreshStrategy) {
|
|
98
|
+
var strategyToCheck = refreshStrategy[key];
|
|
99
|
+
|
|
100
|
+
if (_isPathApplicableToContextPath(metaModel, contextPath, key, strategyToCheck)) {
|
|
101
|
+
strategy = strategyToCheck;
|
|
102
|
+
|
|
103
|
+
if (strategy === "includingDependents") {
|
|
104
|
+
break;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
return strategy;
|
|
111
|
+
};
|
|
112
|
+
/**
|
|
113
|
+
* Get refresh info from view.
|
|
114
|
+
*
|
|
115
|
+
* @param {View} view View from which refresh info is needed
|
|
116
|
+
* @returns {RefreshStrategyType | undefined} Returns strategy for view refresh.
|
|
117
|
+
*/
|
|
118
|
+
|
|
119
|
+
|
|
120
|
+
var getViewRefreshInfo = function (view) {
|
|
121
|
+
var viewData = view.getViewData(),
|
|
122
|
+
contextPath = viewData && ((viewData === null || viewData === void 0 ? void 0 : viewData.contextPath) || "/" + (viewData === null || viewData === void 0 ? void 0 : viewData.entitySet));
|
|
123
|
+
return KeepAliveHelper.getControlRefreshStrategyForContextPath(view, contextPath);
|
|
124
|
+
};
|
|
125
|
+
/**
|
|
126
|
+
* Get refresh strategy for an intent.
|
|
127
|
+
*
|
|
128
|
+
* @param {RefreshStrategies} refreshStrategies RefreshStrategies to consider
|
|
129
|
+
* @param {string} semanticObject Outbound Semantic Object
|
|
130
|
+
* @param {string} action Outbound Action
|
|
131
|
+
* @returns {SORefreshStrategy | undefined} Returns refresh strategies to use for the intent.
|
|
132
|
+
*/
|
|
133
|
+
|
|
134
|
+
|
|
135
|
+
var getRefreshStrategyForIntent = function (refreshStrategies, semanticObject, action) {
|
|
136
|
+
var soAction = semanticObject && action && semanticObject + "-" + action;
|
|
137
|
+
var intents = refreshStrategies.intents;
|
|
138
|
+
var soActionIntentMatch = intents && soAction && intents[soAction];
|
|
139
|
+
var soIntentMatch = !soActionIntentMatch && intents && semanticObject && intents[semanticObject];
|
|
140
|
+
return soActionIntentMatch || soIntentMatch || (refreshStrategies === null || refreshStrategies === void 0 ? void 0 : refreshStrategies.defaultBehavior) || (refreshStrategies === null || refreshStrategies === void 0 ? void 0 : refreshStrategies._feDefault);
|
|
141
|
+
};
|
|
142
|
+
/**
|
|
143
|
+
* Store control refresh strategy for hash in the internal model.
|
|
144
|
+
*
|
|
145
|
+
* @param {Control} control Control for the refresh strategy
|
|
146
|
+
* @param {SOAction} hash Shell hash object
|
|
147
|
+
*/
|
|
148
|
+
|
|
149
|
+
|
|
150
|
+
var storeControlRefreshStrategyForHash = function (control, hash) {
|
|
151
|
+
if (control && control.getModel("viewData") && control.getModel("internal")) {
|
|
152
|
+
var viewData = control.getModel("viewData");
|
|
153
|
+
var refreshStrategies = viewData.getProperty(PATH_TO_STORE);
|
|
154
|
+
|
|
155
|
+
if (refreshStrategies) {
|
|
156
|
+
var internalModel = control.getModel("internal");
|
|
157
|
+
var refreshStrategy = KeepAliveHelper.getRefreshStrategyForIntent(refreshStrategies, hash === null || hash === void 0 ? void 0 : hash.semanticObject, hash === null || hash === void 0 ? void 0 : hash.action);
|
|
158
|
+
internalModel.setProperty(PATH_TO_STORE, refreshStrategy);
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
};
|
|
162
|
+
/**
|
|
163
|
+
* Method to refresh and restore the view if neccessary.
|
|
164
|
+
*
|
|
165
|
+
* @param {object} view Control for the refresh strategy
|
|
166
|
+
* @returns {object} A promise after view refresh and restore are triggered
|
|
167
|
+
*/
|
|
168
|
+
|
|
169
|
+
|
|
170
|
+
var restoreView = function (view) {
|
|
171
|
+
var internalModelContext = view.getBindingContext("internal");
|
|
172
|
+
var controller = view.getController();
|
|
173
|
+
var viewState = controller === null || controller === void 0 ? void 0 : controller.viewState;
|
|
174
|
+
var refreshBindings = Promise.resolve();
|
|
175
|
+
|
|
176
|
+
if (internalModelContext.getProperty("restoreStatus") === "pending") {
|
|
177
|
+
if (viewState.refreshViewBindings) {
|
|
178
|
+
refreshBindings = viewState.refreshViewBindings();
|
|
179
|
+
refreshBindings.then(function () {
|
|
180
|
+
Log.info("FE V4: Refresh was triggered successfull: " + view.getId());
|
|
181
|
+
}).catch(function (err) {
|
|
182
|
+
Log.warning("FE V4: Refresh was unsuccessfull: " + view.getId(), err);
|
|
183
|
+
});
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
refreshBindings = refreshBindings.then(function () {
|
|
187
|
+
viewState.onRestore();
|
|
188
|
+
internalModelContext.setProperty("restoreStatus", "done");
|
|
189
|
+
}).catch(function (error) {
|
|
190
|
+
Log.warning("FE V4: Restore was unsuccessfull: " + view.getId(), error);
|
|
191
|
+
});
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
return refreshBindings;
|
|
195
|
+
};
|
|
196
|
+
/**
|
|
197
|
+
* helper class for KeepAlive feature in sap.fe.
|
|
198
|
+
*/
|
|
199
|
+
|
|
200
|
+
|
|
201
|
+
var KeepAliveHelper = {
|
|
202
|
+
getControlsForRefresh: getControlsForRefresh,
|
|
203
|
+
getControlRefreshStrategyForContextPath: getControlRefreshStrategyForContextPath,
|
|
204
|
+
getViewRefreshInfo: getViewRefreshInfo,
|
|
205
|
+
getRefreshStrategyForIntent: getRefreshStrategyForIntent,
|
|
206
|
+
storeControlRefreshStrategyForHash: storeControlRefreshStrategyForHash,
|
|
207
|
+
restoreView: restoreView
|
|
208
|
+
};
|
|
209
|
+
return KeepAliveHelper;
|
|
210
|
+
}, false);
|
|
211
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIktlZXBBbGl2ZUhlbHBlci50cyJdLCJuYW1lcyI6WyJfZm5TaW1wbGlmeUVudGl0eVNldFBhdGgiLCJtZXRhTW9kZWwiLCJlbnRpdHlTZXRQYXRoVG9Vc2UiLCJlbnRpdHlTZXRQYXRoIiwiZ2V0RW50aXR5U2V0UGF0aCIsImVudGl0eVNldCIsImluZGV4T2YiLCJnZXRPYmplY3QiLCJfZm5Jc0FwcGxpY2FibGUiLCJwcmltYXJ5UGF0aCIsImtleSIsInN0cmF0ZWd5IiwiUmVmcmVzaFN0cmF0ZWd5VHlwZSIsIkluY2x1ZGluZ0RlcGVuZGVudHMiLCJzdGFydHNXaXRoIiwiX2lzUGF0aEFwcGxpY2FibGVUb0NvbnRleHRQYXRoIiwiY29udGV4dFBhdGgiLCJwYXRoIiwiY29udGV4dFBhdGhUb0NoZWNrIiwicGF0aFRvQ2hlY2siLCJnZXRDb250cm9sc0ZvclJlZnJlc2giLCJ2aWV3IiwiY29udHJvbHMiLCJjb250cm9sc0ZvclJlZnJlc2giLCJnZXRNb2RlbCIsImdldE1ldGFNb2RlbCIsImludGVybmFsTW9kZWwiLCJyZWZyZXNoU3RyYXRlZ3kiLCJnZXRQcm9wZXJ0eSIsIlBBVEhfVE9fU1RPUkUiLCJmb3JFYWNoIiwiY29udHJvbCIsImRhdGEiLCJwdXNoIiwiZ2V0Q29udHJvbFJlZnJlc2hTdHJhdGVneUZvckNvbnRleHRQYXRoIiwic3RyYXRlZ3lUb0NoZWNrIiwiZ2V0Vmlld1JlZnJlc2hJbmZvIiwidmlld0RhdGEiLCJnZXRWaWV3RGF0YSIsIktlZXBBbGl2ZUhlbHBlciIsImdldFJlZnJlc2hTdHJhdGVneUZvckludGVudCIsInJlZnJlc2hTdHJhdGVnaWVzIiwic2VtYW50aWNPYmplY3QiLCJhY3Rpb24iLCJzb0FjdGlvbiIsImludGVudHMiLCJzb0FjdGlvbkludGVudE1hdGNoIiwic29JbnRlbnRNYXRjaCIsImRlZmF1bHRCZWhhdmlvciIsIl9mZURlZmF1bHQiLCJzdG9yZUNvbnRyb2xSZWZyZXNoU3RyYXRlZ3lGb3JIYXNoIiwiaGFzaCIsInNldFByb3BlcnR5IiwicmVzdG9yZVZpZXciLCJpbnRlcm5hbE1vZGVsQ29udGV4dCIsImdldEJpbmRpbmdDb250ZXh0IiwiY29udHJvbGxlciIsImdldENvbnRyb2xsZXIiLCJ2aWV3U3RhdGUiLCJyZWZyZXNoQmluZGluZ3MiLCJQcm9taXNlIiwicmVzb2x2ZSIsInJlZnJlc2hWaWV3QmluZGluZ3MiLCJ0aGVuIiwiTG9nIiwiaW5mbyIsImdldElkIiwiY2F0Y2giLCJlcnIiLCJ3YXJuaW5nIiwib25SZXN0b3JlIiwiZXJyb3IiXSwibWFwcGluZ3MiOiI7QUFBQTtBQUNBO0FBQ0E7Ozs7Ozs7O0FBYUE7QUFDQSxNQUFNQSx3QkFBd0IsR0FBRyxVQUFTQyxTQUFULEVBQW9DQyxrQkFBcEMsRUFBd0U7QUFDeEcsUUFBTUMsYUFBYSxHQUFHQyxnQkFBZ0IsQ0FBQ0Ysa0JBQUQsQ0FBdEM7QUFDQSxRQUFNRyxTQUFTLEdBQUdGLGFBQWEsQ0FBQ0csT0FBZCxDQUFzQiw0QkFBdEIsSUFBc0QsQ0FBQyxDQUF2RCxJQUE0REwsU0FBUyxDQUFDTSxTQUFWLENBQW9CSixhQUFwQixDQUE5RTtBQUNBLFdBQU9FLFNBQVMsR0FBRyxNQUFNQSxTQUFULEdBQXFCSCxrQkFBckM7QUFDQSxHQUpEOztBQUtBLE1BQU1NLGVBQWUsR0FBRyxVQUFTQyxXQUFULEVBQThCQyxHQUE5QixFQUEyQ0MsUUFBM0MsRUFBbUY7QUFDMUcsV0FBT0YsV0FBVyxLQUFLQyxHQUFoQixJQUF3QkMsUUFBUSxLQUFLQyxtQkFBbUIsQ0FBQ0MsbUJBQWpDLElBQXdESixXQUFXLENBQUNLLFVBQVosQ0FBdUJKLEdBQXZCLENBQXZGO0FBQ0EsR0FGRDtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBQ0EsTUFBTUssOEJBQThCLEdBQUcsVUFDdENkLFNBRHNDLEVBRXRDZSxXQUZzQyxFQUd0Q0MsSUFIc0MsRUFJdENOLFFBSnNDLEVBSzVCO0FBQ1YsUUFBSU8sa0JBQWtCLEdBQUdGLFdBQVcsQ0FBQ0Ys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QWtCLEVBQWxCQSxrQkFIdUI7QUFJdkJJLElBQUFBLDJCQUEyQixFQUEzQkEsMkJBSnVCO0FBS3ZCVSxJQUFBQSxrQ0FBa0MsRUFBbENBLGtDQUx1QjtBQU12QkcsSUFBQUEsV0FBVyxFQUFYQTtBQU51QixHQUF4QjtTQVFlZCxlIiwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb250cm9sIH0gZnJvbSBcInNhcC91aS9jb3JlXCI7XG5pbXBvcnQgeyBWaWV3IH0gZnJvbSBcInNhcC91aS9jb3JlL212Y1wiO1xuaW1wb3J0IHsgTG9nIH0gZnJvbSBcInNhcC9iYXNlXCI7XG5pbXBvcnQgeyBPRGF0YU1ldGFNb2RlbCB9IGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjRcIjtcbmltcG9ydCB7IGdldEVudGl0eVNldFBhdGggfSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9Nb2RlbEhlbHBlclwiO1xuaW1wb3J0IHsgQmFzZU1hbmlmZXN0U2V0dGluZ3MgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9NYW5pZmVzdFNldHRpbmdzXCI7XG5pbXBvcnQgeyBKU09OTW9kZWwgfSBmcm9tIFwic2FwL3VpL21vZGVsL2pzb25cIjtcbmltcG9ydCB7XG5cdFJlZnJlc2hTdHJhdGVneVR5cGUsXG5cdFNPUmVmcmVzaFN0cmF0ZWd5LFxuXHRSZWZyZXNoU3RyYXRlZ2llcyxcblx0UEFUSF9UT19TVE9SRSxcblx0U09BY3Rpb25cbn0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvS2VlcEFsaXZlUmVmcmVzaFR5cGVzXCI7XG5cbi8vIFByaXZhdGUgZnVuY3Rpb25zIC0gc3RhcnRcbmNvbnN0IF9mblNpbXBsaWZ5RW50aXR5U2V0UGF0aCA9IGZ1bmN0aW9uKG1ldGFNb2RlbDogT0RhdGFNZXRhTW9kZWwsIGVudGl0eVNldFBhdGhUb1VzZTogc3RyaW5nKTogc3RyaW5nIHtcblx0Y29uc3QgZW50aXR5U2V0UGF0aCA9IGdldEVudGl0eVNldFBhdGgoZW50aXR5U2V0UGF0aFRvVXNlKTtcblx0Y29uc3QgZW50aXR5U2V0ID0gZW50aXR5U2V0UGF0aC5pbmRleE9mKFwiJE5hdmlnYXRpb25Qcm9wZXJ0eUJpbmRpbmdcIikgPiAtMSAmJiBtZXRhTW9kZWwuZ2V0T2JqZWN0KGVudGl0eVNldFBhdGgpO1xuXHRyZXR1cm4gZW50aXR5U2V0ID8gXCIvXCIgKyBlbnRpdHlTZXQgOiBlbnRpdHlTZXRQYXRoVG9Vc2U7XG59O1xuY29uc3QgX2ZuSXNBcHBsaWNhYmxlID0gZnVuY3Rpb24ocHJpbWFyeVBhdGg6IHN0cmluZywga2V5OiBzdHJpbmcsIHN0cmF0ZWd5OiBSZWZyZXNoU3RyYXRlZ3lUeXBlKTogYm9vbGVhbiB7XG5cdHJldHVybiBwcmltYXJ5UGF0aCA9PT0ga2V5IHx8IChzdHJhdGVneSA9PT0gUmVmcmVzaFN0cmF0ZWd5VHlwZS5JbmNsdWRpbmdEZXBlbmRlbnRzICYmIHByaW1hcnlQYXRoLnN0YXJ0c1dpdGgoa2V5KSk7XG59O1xuLyoqXG4gKiBDaGVjayBpZiBnaXZlbiBwYXRoIHJlc2lkZXMgaW4gdGhlIGNvbnRleHQgcGF0aCBwcm92aWRlZC5cbiAqXG4gKiBAcGFyYW0ge09EYXRhTWV0YU1vZGVsfSBtZXRhTW9kZWwgTWV0YU1vZGVsIHRvIGJlIHVzZWRcbiAqIEBwYXJhbSB7c3RyaW5nfSBjb250ZXh0UGF0aCBDb250ZXh0IHBhdGggdG8gYmUgdXNlZFxuICogQHBhcmFtIHtzdHJpbmd9IHBhdGggUGF0aCB0byBiZSB1c2VkXG4gKiBAcGFyYW0ge1JlZnJlc2hTdHJhdGVneVR5cGV9IHN0cmF0ZWd5IFN0cmF0ZWd5LCBpdCBjb3VsZCBiZSAnc2VsZicgfCAnaW5jbHVkaW5nRGVwZW5kZW50cydcbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIHRydWUgaWYgdGhlIGNvbnRleHQgcGF0aCBpcyBhcHBsaWNhYmxlLlxuICovXG5jb25zdCBfaXNQYXRoQXBwbGljYWJsZVRvQ29udGV4dFBhdGggPSBmdW5jdGlvbihcblx0bWV0YU1vZGVsOiBPRGF0YU1ldGFNb2RlbCxcblx0Y29udGV4dFBhdGg6IHN0cmluZyxcblx0cGF0aDogc3RyaW5nLFxuXHRzdHJhdGVneTogUmVmcmVzaFN0cmF0ZWd5VHlwZVxuKTogYm9vbGVhbiB7XG5cdGxldCBjb250ZXh0UGF0aFRvQ2hlY2sgPSBjb250ZXh0UGF0aC5zdGFydHNXaXRoKFwiL1wiKSA/IGNvbnRleHRQYXRoIDogXCIvXCIgKyBjb250ZXh0UGF0aCxcblx0XHRwYXRoVG9DaGVjayA9IHBhdGguc3RhcnRzV2l0aChcIi9cIikgPyBwYXRoIDogXCIvXCIgKyBwYXRoO1xuXHRpZiAoIV9mbklzQXBwbGljYWJsZShjb250ZXh0UGF0aFRvQ2hlY2ssIHBhdGhUb0NoZWNrLCBzdHJhdGVneSkpIHtcblx0XHRjb250ZXh0UGF0aFRvQ2hlY2sgPSBfZm5TaW1wbGlmeUVudGl0eVNldFBhdGgobWV0YU1vZGVsLCBjb250ZXh0UGF0aFRvQ2hlY2spO1xuXHRcdGlmICghX2ZuSXNBcHBsaWNhYmxlKGNvbnRleHRQYXRoVG9DaGVjaywgcGF0aFRvQ2hlY2ssIHN0cmF0ZWd5KSkge1xuXHRcdFx0cGF0aFRvQ2hlY2sgPSBfZm5TaW1wbGlmeUVudGl0eVNldFBhdGgobWV0YU1vZGVsLCBwYXRoVG9DaGVjayk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gX2ZuSXNBcHBsaWNhYmxlKGNvbnRleHRQYXRoVG9DaGVjaywgcGF0aFRvQ2hlY2ssIHN0cmF0ZWd5KTtcbn07XG4vLyBQcml2YXRlIGZ1bmN0aW9ucyAtIGVuZFxuLyoqXG4gKiBHZXQgY29udHJvbHMgdG8gcmVmcmVzaCBpbiBhIHZpZXcuXG4gKlxuICogQHBhcmFtIHtWaWV3fSB2aWV3IFZpZXcgb2YgdGhlIGNvbnRyb2xzXG4gKiBAcGFyYW0ge0NvbnRyb2xbXX0gY29udHJvbHMgQ29udGV4dCBwYXRoIHRvIGJlIHVzZWRcbiAqIEByZXR1cm5zIHtDb250cm9sW119IFJldHVybnMgY29udHJvbHMgdGhhdCBuZWVkIHRvIGJlIHJlZnJlc2hlZC5cbiAqL1xuY29uc3QgZ2V0Q29udHJvbHNGb3JSZWZyZXNoID0gZnVuY3Rpb24odmlldzogVmlldywgY29udHJvbHM6IENvbnRyb2xbXSk6IENvbnRyb2xbXSB7XG5cdGNvbnN0IGNvbnRyb2xzRm9yUmVmcmVzaDogQ29udHJvbFtdID0gW107XG5cdGNvbnN0IG1ldGFNb2RlbCA9IHZpZXcuZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKSBhcyBPRGF0YU1ldGFNb2RlbDtcblx0Y29uc3QgaW50ZXJuYWxNb2RlbCA9IHZpZXcuZ2V0TW9kZWwoXCJpbnRlcm5hbFwiKTtcblx0Y29uc3QgcmVmcmVzaFN0cmF0ZWd5ID0gaW50ZXJuYWxNb2RlbC5nZXRQcm9wZXJ0eShQQVRIX1RPX1NUT1JFKSB8fCB7fTtcblx0aWYgKGNvbnRyb2xzKSB7XG5cdFx0Y29udHJvbHMuZm9yRWFjaChmdW5jdGlvbihjb250cm9sKSB7XG5cdFx0XHRjb25zdCBjb250ZXh0UGF0aCA9IGNvbnRyb2wuZGF0YShcInRhcmdldENvbGxlY3Rpb25QYXRoXCIpO1xuXHRcdFx0Zm9yIChjb25zdCBrZXkgaW4gcmVmcmVzaFN0cmF0ZWd5KSB7XG5cdFx0XHRcdGNvbnN0IHN0cmF0ZWd5ID0gcmVmcmVzaFN0cmF0ZWd5W2tleV07XG5cdFx0XHRcdGlmIChjb250cm9sc0ZvclJlZnJlc2guaW5kZXhPZihjb250cm9sKSA9PT0gLTEgJiYgX2lzUGF0aEFwcGxpY2FibGVUb0NvbnRleHRQYXRoKG1ldGFNb2RlbCwgY29udGV4dFBhdGgsIGtleSwgc3RyYXRlZ3kpKSB7XG5cdFx0XHRcdFx0Y29udHJvbHNGb3JSZWZyZXNoLnB1c2goY29udHJvbCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9KTtcblx0fVxuXHRyZXR1cm4gY29udHJvbHNGb3JSZWZyZXNoO1xufTtcbi8qKlxuICogR2V0IHJlZnJlc2ggc3RyYXRlZ3kgZm9yIHRoZSBjb250cm9sIGZvciBhIGNvbnRleHQgcGF0aC5cbiAqXG4gKiBAcGFyYW0ge0NvbnRyb2x9IGNvbnRyb2wgQ29udHJvbCBmcm9tIHdoaWNoIHJlZnJlc2ggaW5mbyBpcyBuZWVkZWRcbiAqIEBwYXJhbSB7c3RyaW5nfSBjb250ZXh0UGF0aCBDb250ZXh0UGF0aCBmb3IgcHJvcGVyaXRpZXNcbiAqIEByZXR1cm5zIHtSZWZyZXNoU3RyYXRlZ3lUeXBlfSBSZXR1cm5zIHN0cmF0ZWd5IGZvciBjb250cm9sIHJlZnJlc2guXG4gKi9cbmNvbnN0IGdldENvbnRyb2xSZWZyZXNoU3RyYXRlZ3lGb3JDb250ZXh0UGF0aCA9IGZ1bmN0aW9uKGNvbnRyb2w6IENvbnRyb2wsIGNvbnRleHRQYXRoOiBzdHJpbmcpOiBSZWZyZXNoU3RyYXRlZ3lUeXBlIHwgdW5kZWZpbmVkIHtcblx0Y29uc3QgbWV0YU1vZGVsID0gY29udHJvbC5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpIGFzIE9EYXRhTWV0YU1vZGVsO1xuXHRjb25zdCBpbnRlcm5hbE1vZGVsID0gY29udHJvbC5nZXRNb2RlbChcImludGVybmFsXCIpO1xuXHRjb25zdCByZWZyZXNoU3RyYXRlZ3kgPSBpbnRlcm5hbE1vZGVsLmdldFByb3BlcnR5KFBBVEhfVE9fU1RPUkUpIHx8IHt9O1xuXHRsZXQgc3RyYXRlZ3k7XG5cdGlmIChjb250ZXh0UGF0aCkge1xuXHRcdGZvciAoY29uc3Qga2V5IGluIHJlZnJlc2hTdHJhdGVneSkge1xuXHRcdFx0Y29uc3Qgc3RyYXRlZ3lUb0NoZWNrID0gcmVmcmVzaFN0cmF0ZWd5W2tleV07XG5cdFx0XHRpZiAoX2lzUGF0aEFwcGxpY2FibGVUb0NvbnRleHRQYXRoKG1ldGFNb2RlbCwgY29udGV4dFBhdGgsIGtleSwgc3RyYXRlZ3lUb0NoZWNrKSkge1xuXHRcdFx0XHRzdHJhdGVneSA9IHN0cmF0ZWd5VG9DaGVjaztcblx0XHRcdFx0aWYgKHN0cmF0ZWd5ID09PSBcImluY2x1ZGluZ0RlcGVuZGVudHNcIikge1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cdHJldHVybiBzdHJhdGVneTtcbn07XG4vKipcbiAqIEdldCByZWZyZXNoIGluZm8gZnJvbSB2aWV3LlxuICpcbiAqIEBwYXJhbSB7Vmlld30gdmlldyBWaWV3IGZyb20gd2hpY2ggcmVmcmVzaCBpbmZvIGlzIG5lZWRlZFxuICogQHJldHVybnMge1JlZnJlc2hTdHJhdGVneVR5cGUgfCB1bmRlZmluZWR9IFJldHVybnMgc3RyYXRlZ3kgZm9yIHZpZXcgcmVmcmVzaC5cbiAqL1xuY29uc3QgZ2V0Vmlld1JlZnJlc2hJbmZvID0gZnVuY3Rpb24odmlldzogVmlldyk6IFJlZnJlc2hTdHJhdGVneVR5cGUgfCB1bmRlZmluZWQge1xuXHRjb25zdCB2aWV3RGF0YSA9IHZpZXcuZ2V0Vmlld0RhdGEoKSBhcyBCYXNlTWFuaWZlc3RTZXR0aW5ncyxcblx0XHRjb250ZXh0UGF0aCA9IHZpZXdEYXRhICYmICh2aWV3RGF0YT8uY29udGV4dFBhdGggfHwgXCIvXCIgKyB2aWV3RGF0YT8uZW50aXR5U2V0KTtcblx0cmV0dXJuIEtlZXBBbGl2ZUhlbHBlci5nZXRDb250cm9sUmVmcmVzaFN0cmF0ZWd5Rm9yQ29udGV4dFBhdGgodmlldywgY29udGV4dFBhdGgpO1xufTtcblxuLyoqXG4gKiBHZXQgcmVmcmVzaCBzdHJhdGVneSBmb3IgYW4gaW50ZW50LlxuICpcbiAqIEBwYXJhbSB7UmVmcmVzaFN0cmF0ZWdpZXN9IHJlZnJlc2hTdHJhdGVnaWVzIFJlZnJlc2hTdHJhdGVnaWVzIHRvIGNvbnNpZGVyXG4gKiBAcGFyYW0ge3N0cmluZ30gc2VtYW50aWNPYmplY3QgT3V0Ym91bmQgU2VtYW50aWMgT2JqZWN0XG4gKiBAcGFyYW0ge3N0cmluZ30gYWN0aW9uIE91dGJvdW5kIEFjdGlvblxuICogQHJldHVybnMge1NPUmVmcmVzaFN0cmF0ZWd5IHwgdW5kZWZpbmVkfSBSZXR1cm5zIHJlZnJlc2ggc3RyYXRlZ2llcyB0byB1c2UgZm9yIHRoZSBpbnRlbnQuXG4gKi9cbmNvbnN0IGdldFJlZnJlc2hTdHJhdGVneUZvckludGVudCA9IGZ1bmN0aW9uKFxuXHRyZWZyZXNoU3RyYXRlZ2llczogUmVmcmVzaFN0cmF0ZWdpZXMsXG5cdHNlbWFudGljT2JqZWN0Pzogc3RyaW5nLFxuXHRhY3Rpb24/OiBzdHJpbmdcbik6IFNPUmVmcmVzaFN0cmF0ZWd5IHwgdW5kZWZpbmVkIHtcblx0Y29uc3Qgc29BY3Rpb24gPSBzZW1hbnRpY09iamVjdCAmJiBhY3Rpb24gJiYgc2VtYW50aWNPYmplY3QgKyBcIi1cIiArIGFjdGlvbjtcblx0Y29uc3QgaW50ZW50cyA9IHJlZnJlc2hTdHJhdGVnaWVzLmludGVudHM7XG5cdGNvbnN0IHNvQWN0aW9uSW50ZW50TWF0Y2ggPSBpbnRlbnRzICYmIHNvQWN0aW9uICYmIGludGVudHNbc29BY3Rpb25dO1xuXHRjb25zdCBzb0ludGVudE1hdGNoID0gIXNvQWN0aW9uSW50ZW50TWF0Y2ggJiYgaW50ZW50cyAmJiBzZW1hbnRpY09iamVjdCAmJiBpbnRlbnRzW3NlbWFudGljT2JqZWN0XTtcblxuXHRyZXR1cm4gc29BY3Rpb25JbnRlbnRNYXRjaCB8fCBzb0ludGVudE1hdGNoIHx8IHJlZnJlc2hTdHJhdGVnaWVzPy5kZWZhdWx0QmVoYXZpb3IgfHwgcmVmcmVzaFN0cmF0ZWdpZXM/Ll9mZURlZmF1bHQ7XG59O1xuLyoqXG4gKiBTdG9yZSBjb250cm9sIHJlZnJlc2ggc3RyYXRlZ3kgZm9yIGhhc2ggaW4gdGhlIGludGVybmFsIG1vZGVsLlxuICpcbiAqIEBwYXJhbSB7Q29udHJvbH0gY29udHJvbCBDb250cm9sIGZvciB0aGUgcmVmcmVzaCBzdHJhdGVneVxuICogQHBhcmFtIHtTT0FjdGlvbn0gaGFzaCBTaGVsbCBoYXNoIG9iamVjdFxuICovXG5jb25zdCBzdG9yZUNvbnRyb2xSZWZyZXNoU3RyYXRlZ3lGb3JIYXNoID0gZnVuY3Rpb24oY29udHJvbDogQ29udHJvbCwgaGFzaDogU09BY3Rpb24pOiB2b2lkIHtcblx0aWYgKGNvbnRyb2wgJiYgY29udHJvbC5nZXRNb2RlbChcInZpZXdEYXRhXCIpICYmIGNvbnRyb2wuZ2V0TW9kZWwoXCJpbnRlcm5hbFwiKSkge1xuXHRcdGNvbnN0IHZpZXdEYXRhID0gY29udHJvbC5nZXRNb2RlbChcInZpZXdEYXRhXCIpO1xuXHRcdGNvbnN0IHJlZnJlc2hTdHJhdGVnaWVzOiBSZWZyZXNoU3RyYXRlZ2llcyA9IHZpZXdEYXRhLmdldFByb3BlcnR5KFBBVEhfVE9fU1RPUkUpO1xuXHRcdGlmIChyZWZyZXNoU3RyYXRlZ2llcykge1xuXHRcdFx0Y29uc3QgaW50ZXJuYWxNb2RlbCA9IGNvbnRyb2wuZ2V0TW9kZWwoXCJpbnRlcm5hbFwiKTtcblx0XHRcdGNvbnN0IHJlZnJlc2hTdHJhdGVneTogU09SZWZyZXNoU3RyYXRlZ3kgfCB1bmRlZmluZWQgPSBLZWVwQWxpdmVIZWxwZXIuZ2V0UmVmcmVzaFN0cmF0ZWd5Rm9ySW50ZW50KFxuXHRcdFx0XHRyZWZyZXNoU3RyYXRlZ2llcyxcblx0XHRcdFx0aGFzaD8uc2VtYW50aWNPYmplY3QsXG5cdFx0XHRcdGhhc2g/LmFjdGlvblxuXHRcdFx0KTtcblx0XHRcdChpbnRlcm5hbE1vZGVsIGFzIEpTT05Nb2RlbDx7fT4pLnNldFByb3BlcnR5KFBBVEhfVE9fU1RPUkUsIHJlZnJlc2hTdHJhdGVneSk7XG5cdFx0fVxuXHR9XG59O1xuXG4vKipcbiAqIE1ldGhvZCB0byByZWZyZXNoIGFuZCByZXN0b3JlIHRoZSB2aWV3IGlmIG5lY2Nlc3NhcnkuXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IHZpZXcgQ29udHJvbCBmb3IgdGhlIHJlZnJlc2ggc3RyYXRlZ3lcbiAqIEByZXR1cm5zIHtvYmplY3R9IEEgcHJvbWlzZSBhZnRlciB2aWV3IHJlZnJlc2ggYW5kIHJlc3RvcmUgYXJlIHRyaWdnZXJlZFxuICovXG5jb25zdCByZXN0b3JlVmlldyA9IGZ1bmN0aW9uKHZpZXc6IFZpZXcpOiBQcm9taXNlPGFueT4ge1xuXHRjb25zdCBpbnRlcm5hbE1vZGVsQ29udGV4dCA9IHZpZXcuZ2V0QmluZGluZ0NvbnRleHQoXCJpbnRlcm5hbFwiKTtcblx0Y29uc3QgY29udHJvbGxlciA9IHZpZXcuZ2V0Q29udHJvbGxlcigpO1xuXHRjb25zdCB2aWV3U3RhdGUgPSAoY29udHJvbGxlciBhcyBhbnkpPy52aWV3U3RhdGU7XG5cdGxldCByZWZyZXNoQmluZGluZ3MgPSBQcm9taXNlLnJlc29sdmUoKTtcblx0aWYgKGludGVybmFsTW9kZWxDb250ZXh0LmdldFByb3BlcnR5KFwicmVzdG9yZVN0YXR1c1wiKSA9PT0gXCJwZW5kaW5nXCIpIHtcblx0XHRpZiAodmlld1N0YXRlLnJlZnJlc2hWaWV3QmluZGluZ3MpIHtcblx0XHRcdHJlZnJlc2hCaW5kaW5ncyA9IHZpZXdTdGF0ZS5yZWZyZXNoVmlld0JpbmRpbmdzKCk7XG5cdFx0XHRyZWZyZXNoQmluZGluZ3Ncblx0XHRcdFx0LnRoZW4oZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0TG9nLmluZm8oXCJGRSBWNDogUmVmcmVzaCB3YXMgdHJpZ2dlcmVkIHN1Y2Nlc3NmdWxsOiBcIiArIHZpZXcuZ2V0SWQoKSk7XG5cdFx0XHRcdH0pXG5cdFx0XHRcdC5jYXRjaChmdW5jdGlvbihlcnIpIHtcblx0XHRcdFx0XHRMb2cud2FybmluZyhcIkZFIFY0OiBSZWZyZXNoIHdhcyB1bnN1Y2Nlc3NmdWxsOiBcIiArIHZpZXcuZ2V0SWQoKSwgZXJyKTtcblx0XHRcdFx0fSk7XG5cdFx0fVxuXHRcdHJlZnJlc2hCaW5kaW5ncyA9IHJlZnJlc2hCaW5kaW5nc1xuXHRcdFx0LnRoZW4oZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHZpZXdTdGF0ZS5vblJlc3RvcmUoKTtcblx0XHRcdFx0aW50ZXJuYWxNb2RlbENvbnRleHQuc2V0UHJvcGVydHkoXCJyZXN0b3JlU3RhdHVzXCIsIFwiZG9uZVwiKTtcblx0XHRcdH0pXG5cdFx0XHQuY2F0Y2goZnVuY3Rpb24oZXJyb3IpIHtcblx0XHRcdFx0TG9nLndhcm5pbmcoXCJGRSBWNDogUmVzdG9yZSB3YXMgdW5zdWNjZXNzZnVsbDogXCIgKyB2aWV3LmdldElkKCksIGVycm9yKTtcblx0XHRcdH0pO1xuXHR9XG5cdHJldHVybiByZWZyZXNoQmluZGluZ3M7XG59O1xuXG4vKipcbiAqIGhlbHBlciBjbGFzcyBmb3IgS2VlcEFsaXZlIGZlYXR1cmUgaW4gc2FwLmZlLlxuICovXG5jb25zdCBLZWVwQWxpdmVIZWxwZXIgPSB7XG5cdGdldENvbnRyb2xzRm9yUmVmcmVzaCxcblx0Z2V0Q29udHJvbFJlZnJlc2hTdHJhdGVneUZvckNvbnRleHRQYXRoLFxuXHRnZXRWaWV3UmVmcmVzaEluZm8sXG5cdGdldFJlZnJlc2hTdHJhdGVneUZvckludGVudCxcblx0c3RvcmVDb250cm9sUmVmcmVzaFN0cmF0ZWd5Rm9ySGFzaCxcblx0cmVzdG9yZVZpZXdcbn07XG5leHBvcnQgZGVmYXVsdCBLZWVwQWxpdmVIZWxwZXI7XG4iXX0=
|
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
import { Control } from "sap/ui/core";
|
|
2
|
+
import { View } from "sap/ui/core/mvc";
|
|
3
|
+
import { Log } from "sap/base";
|
|
4
|
+
import { ODataMetaModel } from "sap/ui/model/odata/v4";
|
|
5
|
+
import { getEntitySetPath } from "sap/fe/core/helpers/ModelHelper";
|
|
6
|
+
import { BaseManifestSettings } from "sap/fe/core/converters/ManifestSettings";
|
|
7
|
+
import { JSONModel } from "sap/ui/model/json";
|
|
8
|
+
import {
|
|
9
|
+
RefreshStrategyType,
|
|
10
|
+
SORefreshStrategy,
|
|
11
|
+
RefreshStrategies,
|
|
12
|
+
PATH_TO_STORE,
|
|
13
|
+
SOAction
|
|
14
|
+
} from "sap/fe/core/helpers/KeepAliveRefreshTypes";
|
|
15
|
+
|
|
16
|
+
// Private functions - start
|
|
17
|
+
const _fnSimplifyEntitySetPath = function(metaModel: ODataMetaModel, entitySetPathToUse: string): string {
|
|
18
|
+
const entitySetPath = getEntitySetPath(entitySetPathToUse);
|
|
19
|
+
const entitySet = entitySetPath.indexOf("$NavigationPropertyBinding") > -1 && metaModel.getObject(entitySetPath);
|
|
20
|
+
return entitySet ? "/" + entitySet : entitySetPathToUse;
|
|
21
|
+
};
|
|
22
|
+
const _fnIsApplicable = function(primaryPath: string, key: string, strategy: RefreshStrategyType): boolean {
|
|
23
|
+
return primaryPath === key || (strategy === RefreshStrategyType.IncludingDependents && primaryPath.startsWith(key));
|
|
24
|
+
};
|
|
25
|
+
/**
|
|
26
|
+
* Check if given path resides in the context path provided.
|
|
27
|
+
*
|
|
28
|
+
* @param {ODataMetaModel} metaModel MetaModel to be used
|
|
29
|
+
* @param {string} contextPath Context path to be used
|
|
30
|
+
* @param {string} path Path to be used
|
|
31
|
+
* @param {RefreshStrategyType} strategy Strategy, it could be 'self' | 'includingDependents'
|
|
32
|
+
* @returns {boolean} Returns true if the context path is applicable.
|
|
33
|
+
*/
|
|
34
|
+
const _isPathApplicableToContextPath = function(
|
|
35
|
+
metaModel: ODataMetaModel,
|
|
36
|
+
contextPath: string,
|
|
37
|
+
path: string,
|
|
38
|
+
strategy: RefreshStrategyType
|
|
39
|
+
): boolean {
|
|
40
|
+
let contextPathToCheck = contextPath.startsWith("/") ? contextPath : "/" + contextPath,
|
|
41
|
+
pathToCheck = path.startsWith("/") ? path : "/" + path;
|
|
42
|
+
if (!_fnIsApplicable(contextPathToCheck, pathToCheck, strategy)) {
|
|
43
|
+
contextPathToCheck = _fnSimplifyEntitySetPath(metaModel, contextPathToCheck);
|
|
44
|
+
if (!_fnIsApplicable(contextPathToCheck, pathToCheck, strategy)) {
|
|
45
|
+
pathToCheck = _fnSimplifyEntitySetPath(metaModel, pathToCheck);
|
|
46
|
+
} else {
|
|
47
|
+
return true;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
return _fnIsApplicable(contextPathToCheck, pathToCheck, strategy);
|
|
51
|
+
};
|
|
52
|
+
// Private functions - end
|
|
53
|
+
/**
|
|
54
|
+
* Get controls to refresh in a view.
|
|
55
|
+
*
|
|
56
|
+
* @param {View} view View of the controls
|
|
57
|
+
* @param {Control[]} controls Context path to be used
|
|
58
|
+
* @returns {Control[]} Returns controls that need to be refreshed.
|
|
59
|
+
*/
|
|
60
|
+
const getControlsForRefresh = function(view: View, controls: Control[]): Control[] {
|
|
61
|
+
const controlsForRefresh: Control[] = [];
|
|
62
|
+
const metaModel = view.getModel().getMetaModel() as ODataMetaModel;
|
|
63
|
+
const internalModel = view.getModel("internal");
|
|
64
|
+
const refreshStrategy = internalModel.getProperty(PATH_TO_STORE) || {};
|
|
65
|
+
if (controls) {
|
|
66
|
+
controls.forEach(function(control) {
|
|
67
|
+
const contextPath = control.data("targetCollectionPath");
|
|
68
|
+
for (const key in refreshStrategy) {
|
|
69
|
+
const strategy = refreshStrategy[key];
|
|
70
|
+
if (controlsForRefresh.indexOf(control) === -1 && _isPathApplicableToContextPath(metaModel, contextPath, key, strategy)) {
|
|
71
|
+
controlsForRefresh.push(control);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
return controlsForRefresh;
|
|
77
|
+
};
|
|
78
|
+
/**
|
|
79
|
+
* Get refresh strategy for the control for a context path.
|
|
80
|
+
*
|
|
81
|
+
* @param {Control} control Control from which refresh info is needed
|
|
82
|
+
* @param {string} contextPath ContextPath for properities
|
|
83
|
+
* @returns {RefreshStrategyType} Returns strategy for control refresh.
|
|
84
|
+
*/
|
|
85
|
+
const getControlRefreshStrategyForContextPath = function(control: Control, contextPath: string): RefreshStrategyType | undefined {
|
|
86
|
+
const metaModel = control.getModel().getMetaModel() as ODataMetaModel;
|
|
87
|
+
const internalModel = control.getModel("internal");
|
|
88
|
+
const refreshStrategy = internalModel.getProperty(PATH_TO_STORE) || {};
|
|
89
|
+
let strategy;
|
|
90
|
+
if (contextPath) {
|
|
91
|
+
for (const key in refreshStrategy) {
|
|
92
|
+
const strategyToCheck = refreshStrategy[key];
|
|
93
|
+
if (_isPathApplicableToContextPath(metaModel, contextPath, key, strategyToCheck)) {
|
|
94
|
+
strategy = strategyToCheck;
|
|
95
|
+
if (strategy === "includingDependents") {
|
|
96
|
+
break;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
return strategy;
|
|
102
|
+
};
|
|
103
|
+
/**
|
|
104
|
+
* Get refresh info from view.
|
|
105
|
+
*
|
|
106
|
+
* @param {View} view View from which refresh info is needed
|
|
107
|
+
* @returns {RefreshStrategyType | undefined} Returns strategy for view refresh.
|
|
108
|
+
*/
|
|
109
|
+
const getViewRefreshInfo = function(view: View): RefreshStrategyType | undefined {
|
|
110
|
+
const viewData = view.getViewData() as BaseManifestSettings,
|
|
111
|
+
contextPath = viewData && (viewData?.contextPath || "/" + viewData?.entitySet);
|
|
112
|
+
return KeepAliveHelper.getControlRefreshStrategyForContextPath(view, contextPath);
|
|
113
|
+
};
|
|
114
|
+
|
|
115
|
+
/**
|
|
116
|
+
* Get refresh strategy for an intent.
|
|
117
|
+
*
|
|
118
|
+
* @param {RefreshStrategies} refreshStrategies RefreshStrategies to consider
|
|
119
|
+
* @param {string} semanticObject Outbound Semantic Object
|
|
120
|
+
* @param {string} action Outbound Action
|
|
121
|
+
* @returns {SORefreshStrategy | undefined} Returns refresh strategies to use for the intent.
|
|
122
|
+
*/
|
|
123
|
+
const getRefreshStrategyForIntent = function(
|
|
124
|
+
refreshStrategies: RefreshStrategies,
|
|
125
|
+
semanticObject?: string,
|
|
126
|
+
action?: string
|
|
127
|
+
): SORefreshStrategy | undefined {
|
|
128
|
+
const soAction = semanticObject && action && semanticObject + "-" + action;
|
|
129
|
+
const intents = refreshStrategies.intents;
|
|
130
|
+
const soActionIntentMatch = intents && soAction && intents[soAction];
|
|
131
|
+
const soIntentMatch = !soActionIntentMatch && intents && semanticObject && intents[semanticObject];
|
|
132
|
+
|
|
133
|
+
return soActionIntentMatch || soIntentMatch || refreshStrategies?.defaultBehavior || refreshStrategies?._feDefault;
|
|
134
|
+
};
|
|
135
|
+
/**
|
|
136
|
+
* Store control refresh strategy for hash in the internal model.
|
|
137
|
+
*
|
|
138
|
+
* @param {Control} control Control for the refresh strategy
|
|
139
|
+
* @param {SOAction} hash Shell hash object
|
|
140
|
+
*/
|
|
141
|
+
const storeControlRefreshStrategyForHash = function(control: Control, hash: SOAction): void {
|
|
142
|
+
if (control && control.getModel("viewData") && control.getModel("internal")) {
|
|
143
|
+
const viewData = control.getModel("viewData");
|
|
144
|
+
const refreshStrategies: RefreshStrategies = viewData.getProperty(PATH_TO_STORE);
|
|
145
|
+
if (refreshStrategies) {
|
|
146
|
+
const internalModel = control.getModel("internal");
|
|
147
|
+
const refreshStrategy: SORefreshStrategy | undefined = KeepAliveHelper.getRefreshStrategyForIntent(
|
|
148
|
+
refreshStrategies,
|
|
149
|
+
hash?.semanticObject,
|
|
150
|
+
hash?.action
|
|
151
|
+
);
|
|
152
|
+
(internalModel as JSONModel<{}>).setProperty(PATH_TO_STORE, refreshStrategy);
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
};
|
|
156
|
+
|
|
157
|
+
/**
|
|
158
|
+
* Method to refresh and restore the view if neccessary.
|
|
159
|
+
*
|
|
160
|
+
* @param {object} view Control for the refresh strategy
|
|
161
|
+
* @returns {object} A promise after view refresh and restore are triggered
|
|
162
|
+
*/
|
|
163
|
+
const restoreView = function(view: View): Promise<any> {
|
|
164
|
+
const internalModelContext = view.getBindingContext("internal");
|
|
165
|
+
const controller = view.getController();
|
|
166
|
+
const viewState = (controller as any)?.viewState;
|
|
167
|
+
let refreshBindings = Promise.resolve();
|
|
168
|
+
if (internalModelContext.getProperty("restoreStatus") === "pending") {
|
|
169
|
+
if (viewState.refreshViewBindings) {
|
|
170
|
+
refreshBindings = viewState.refreshViewBindings();
|
|
171
|
+
refreshBindings
|
|
172
|
+
.then(function() {
|
|
173
|
+
Log.info("FE V4: Refresh was triggered successfull: " + view.getId());
|
|
174
|
+
})
|
|
175
|
+
.catch(function(err) {
|
|
176
|
+
Log.warning("FE V4: Refresh was unsuccessfull: " + view.getId(), err);
|
|
177
|
+
});
|
|
178
|
+
}
|
|
179
|
+
refreshBindings = refreshBindings
|
|
180
|
+
.then(function() {
|
|
181
|
+
viewState.onRestore();
|
|
182
|
+
internalModelContext.setProperty("restoreStatus", "done");
|
|
183
|
+
})
|
|
184
|
+
.catch(function(error) {
|
|
185
|
+
Log.warning("FE V4: Restore was unsuccessfull: " + view.getId(), error);
|
|
186
|
+
});
|
|
187
|
+
}
|
|
188
|
+
return refreshBindings;
|
|
189
|
+
};
|
|
190
|
+
|
|
191
|
+
/**
|
|
192
|
+
* helper class for KeepAlive feature in sap.fe.
|
|
193
|
+
*/
|
|
194
|
+
const KeepAliveHelper = {
|
|
195
|
+
getControlsForRefresh,
|
|
196
|
+
getControlRefreshStrategyForContextPath,
|
|
197
|
+
getViewRefreshInfo,
|
|
198
|
+
getRefreshStrategyForIntent,
|
|
199
|
+
storeControlRefreshStrategyForHash,
|
|
200
|
+
restoreView
|
|
201
|
+
};
|
|
202
|
+
export default KeepAliveHelper;
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* SAP UI development toolkit for HTML5 (SAPUI5)
|
|
3
|
+
* (c) Copyright 2009-2021 SAP SE. All rights reserved
|
|
4
|
+
*/
|
|
5
|
+
sap.ui.define([], function () {
|
|
6
|
+
"use strict";
|
|
7
|
+
|
|
8
|
+
var _exports = {};
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Enumeration for supported refresh strategy type
|
|
12
|
+
*/
|
|
13
|
+
var RefreshStrategyType;
|
|
14
|
+
/**
|
|
15
|
+
* Configuration of a RefreshStrategy
|
|
16
|
+
*/
|
|
17
|
+
|
|
18
|
+
(function (RefreshStrategyType) {
|
|
19
|
+
RefreshStrategyType["Self"] = "self";
|
|
20
|
+
RefreshStrategyType["IncludingDependents"] = "includingDependents";
|
|
21
|
+
})(RefreshStrategyType || (RefreshStrategyType = {}));
|
|
22
|
+
|
|
23
|
+
_exports.RefreshStrategyType = RefreshStrategyType;
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Path used to store information
|
|
27
|
+
*/
|
|
28
|
+
var PATH_TO_STORE = "/refreshStrategyOnAppRestore";
|
|
29
|
+
_exports.PATH_TO_STORE = PATH_TO_STORE;
|
|
30
|
+
return _exports;
|
|
31
|
+
}, false);
|
|
32
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIktlZXBBbGl2ZVJlZnJlc2hUeXBlcy50cyJdLCJuYW1lcyI6WyJSZWZyZXNoU3RyYXRlZ3lUeXBlIiwiUEFUSF9UT19TVE9SRSJdLCJtYXBwaW5ncyI6IjtBQUFBO0FBQ0E7QUFDQTs7Ozs7O0FBRkE7QUFDQTtBQUNBO01BQ1lBLG1CO0FBSVo7QUFDQTtBQUNBOzthQU5ZQSxtQjtBQUFBQSxJQUFBQSxtQjtBQUFBQSxJQUFBQSxtQjtLQUFBQSxtQixLQUFBQSxtQjs7OztBQTZCWjtBQUNBO0FBQ0E7QUFDTyxNQUFNQyxhQUFxQixHQUFHLDhCQUE5QiIsInNvdXJjZVJvb3QiOiIuIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBFbnVtZXJhdGlvbiBmb3Igc3VwcG9ydGVkIHJlZnJlc2ggc3RyYXRlZ3kgdHlwZVxuICovXG5leHBvcnQgZW51bSBSZWZyZXNoU3RyYXRlZ3lUeXBlIHtcblx0U2VsZiA9IFwic2VsZlwiLFxuXHRJbmNsdWRpbmdEZXBlbmRlbnRzID0gXCJpbmNsdWRpbmdEZXBlbmRlbnRzXCJcbn1cbi8qKlxuICogQ29uZmlndXJhdGlvbiBvZiBhIFJlZnJlc2hTdHJhdGVneVxuICovXG5leHBvcnQgdHlwZSBTT1JlZnJlc2hTdHJhdGVneSA9IHtcblx0W2VudGl0eVNldE5hbWVPckNvbnRleHRQYXRoOiBzdHJpbmddOiBSZWZyZXNoU3RyYXRlZ3lUeXBlO1xufTtcbi8qKlxuICogQ29uZmlndXJhdGlvbiBvZiBhIFJlZnJlc2hTdHJhdGVnaWVzXG4gKi9cbmV4cG9ydCB0eXBlIFJlZnJlc2hTdHJhdGVnaWVzID0ge1xuXHRpbnRlbnRzPzoge1xuXHRcdFtzb0FjdGlvbjogc3RyaW5nXTogU09SZWZyZXNoU3RyYXRlZ3k7IC8vICdzb0FjdGlvbicgZm9ybWF0IGlzIFwiPFNlbWFudGljT2JqZWN0Pi08QWN0aW9uPlwiXG5cdH07XG5cdGRlZmF1bHRCZWhhdmlvcj86IFNPUmVmcmVzaFN0cmF0ZWd5O1xuXHRfZmVEZWZhdWx0PzogU09SZWZyZXNoU3RyYXRlZ3k7XG59O1xuXG4vKipcbiAqIENvbmZpZ3VyYXRpb24gZm9yIGhhc2ggd2l0aCBzZW1hbnRpY09iamVjdCBhbmQgYWN0aW9uXG4gKi9cbmV4cG9ydCB0eXBlIFNPQWN0aW9uID0ge1xuXHRzZW1hbnRpY09iamVjdD86IHN0cmluZztcblx0YWN0aW9uPzogc3RyaW5nO1xufTtcblxuLyoqXG4gKiBQYXRoIHVzZWQgdG8gc3RvcmUgaW5mb3JtYXRpb25cbiAqL1xuZXhwb3J0IGNvbnN0IFBBVEhfVE9fU1RPUkU6IHN0cmluZyA9IFwiL3JlZnJlc2hTdHJhdGVneU9uQXBwUmVzdG9yZVwiO1xuIl19
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Enumeration for supported refresh strategy type
|
|
3
|
+
*/
|
|
4
|
+
export enum RefreshStrategyType {
|
|
5
|
+
Self = "self",
|
|
6
|
+
IncludingDependents = "includingDependents"
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Configuration of a RefreshStrategy
|
|
10
|
+
*/
|
|
11
|
+
export type SORefreshStrategy = {
|
|
12
|
+
[entitySetNameOrContextPath: string]: RefreshStrategyType;
|
|
13
|
+
};
|
|
14
|
+
/**
|
|
15
|
+
* Configuration of a RefreshStrategies
|
|
16
|
+
*/
|
|
17
|
+
export type RefreshStrategies = {
|
|
18
|
+
intents?: {
|
|
19
|
+
[soAction: string]: SORefreshStrategy; // 'soAction' format is "<SemanticObject>-<Action>"
|
|
20
|
+
};
|
|
21
|
+
defaultBehavior?: SORefreshStrategy;
|
|
22
|
+
_feDefault?: SORefreshStrategy;
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Configuration for hash with semanticObject and action
|
|
27
|
+
*/
|
|
28
|
+
export type SOAction = {
|
|
29
|
+
semanticObject?: string;
|
|
30
|
+
action?: string;
|
|
31
|
+
};
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Path used to store information
|
|
35
|
+
*/
|
|
36
|
+
export const PATH_TO_STORE: string = "/refreshStrategyOnAppRestore";
|
|
@@ -170,6 +170,57 @@ sap.ui.define([], function() {
|
|
|
170
170
|
var aFilterFunctions = oMetaModel.getObject("/@Org.OData.Capabilities.V1.FilterFunctions");
|
|
171
171
|
// Get filter functions defined at EntityContainer and check for existence of 'tolower'
|
|
172
172
|
return aFilterFunctions ? aFilterFunctions.indexOf("tolower") === -1 : true;
|
|
173
|
+
},
|
|
174
|
+
|
|
175
|
+
/**
|
|
176
|
+
* Get MetaPath for the context.
|
|
177
|
+
*
|
|
178
|
+
* @param {Context} oContext Context to be used
|
|
179
|
+
* @returns {string | undefined} Returns meta path for the context.
|
|
180
|
+
*/
|
|
181
|
+
getMetaPathForContext: function(oContext) {
|
|
182
|
+
var oModel = oContext.getModel(),
|
|
183
|
+
oMetaModel = oModel.getMetaModel(),
|
|
184
|
+
sPath = oContext.getPath();
|
|
185
|
+
return oMetaModel && sPath && oMetaModel.getMetaPath(sPath);
|
|
186
|
+
},
|
|
187
|
+
|
|
188
|
+
/**
|
|
189
|
+
* Get MetaPath for the listbinding.
|
|
190
|
+
*
|
|
191
|
+
* @param {View} oView View of the control using listBinding
|
|
192
|
+
* @param {ODataListBinding | string} vListBinding ODataListBinding object or the binding path for a temporary list binding
|
|
193
|
+
* @returns {string | undefined} Returns meta path for the listbinding.
|
|
194
|
+
*/
|
|
195
|
+
getAbsoluteMetaPathForListBinding: function(oView, vListBinding) {
|
|
196
|
+
var oMetaModel = oView.getModel().getMetaModel();
|
|
197
|
+
var sMetaPath;
|
|
198
|
+
|
|
199
|
+
if (typeof vListBinding === "string") {
|
|
200
|
+
if (vListBinding.startsWith("/")) {
|
|
201
|
+
// absolute path
|
|
202
|
+
sMetaPath = oMetaModel.getMetaPath(vListBinding);
|
|
203
|
+
} else {
|
|
204
|
+
// relative path
|
|
205
|
+
var oBindingContext = oView.getBindingContext();
|
|
206
|
+
var sRootContextPath = oBindingContext.getPath();
|
|
207
|
+
sMetaPath = oMetaModel.getMetaPath(sRootContextPath + "/" + vListBinding);
|
|
208
|
+
}
|
|
209
|
+
} else {
|
|
210
|
+
// we already get a list binding use this one
|
|
211
|
+
var oBinding = vListBinding;
|
|
212
|
+
var oRootBinding = oBinding.getRootBinding();
|
|
213
|
+
if (oBinding === oRootBinding) {
|
|
214
|
+
// absolute path
|
|
215
|
+
sMetaPath = oMetaModel.getMetaPath(oBinding.getPath());
|
|
216
|
+
} else {
|
|
217
|
+
// relative path
|
|
218
|
+
var sRootBindingPath = oRootBinding.getPath();
|
|
219
|
+
var sRelativePath = oBinding.getPath();
|
|
220
|
+
sMetaPath = oMetaModel.getMetaPath(sRootBindingPath + "/" + sRelativePath);
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
return sMetaPath;
|
|
173
224
|
}
|
|
174
225
|
};
|
|
175
226
|
return ModelHelper;
|
|
@@ -43,7 +43,7 @@ C_TO=To
|
|
|
43
43
|
C_APP_COMPONENT_SAPFE_APPSTART_TECHNICAL_ISSUES=Application could not be started due to technical issues.
|
|
44
44
|
|
|
45
45
|
# YMSG, ETAG Technical Error
|
|
46
|
-
C_APP_COMPONENT_SAPFE_ETAG_TECHNICAL_ISSUES=Your changes could not be saved. Refresh the data to work with the most recent version.
|
|
46
|
+
C_APP_COMPONENT_SAPFE_ETAG_TECHNICAL_ISSUES=Your changes could not be saved. Refresh the data to work with the most recent version.
|
|
47
47
|
|
|
48
48
|
# YMSG, ETAG Error with Late Property
|
|
49
49
|
C_APP_COMPONENT_SAPFE_ETAG_LATE_PROPERTY=This action may not work. Refresh the data to work with the most recent version.
|
|
@@ -152,6 +152,20 @@ C_COMMON_SAPFE_ERROR=Error
|
|
|
152
152
|
# XTIT, 24: Title of the NavContainer Error Messages Page
|
|
153
153
|
C_MESSAGE_HANDLING_SAPFE_ERROR_MESSAGES_PAGE_TITLE=Messages
|
|
154
154
|
|
|
155
|
+
# XTIT, 24: Title of the 503 Error Messages Page
|
|
156
|
+
C_MESSAGE_HANDLING_SAPFE_503_TITLE=Sorry, this service is temporarily unavailable.
|
|
157
|
+
|
|
158
|
+
# XTIT, 24: Description of the 503 Error Messages Page
|
|
159
|
+
C_MESSAGE_HANDLING_SAPFE_503_DESC=Please try again in a few minutes.
|
|
160
|
+
|
|
161
|
+
C_MESSAGE_HANDLING_SAPFE_503_ERROR = We expect it to be available again on {0}.
|
|
162
|
+
|
|
163
|
+
C_MESSAGE_HANDLING_SAPFE_503_ERROR_DAY = We expect it to be available again at {0}.
|
|
164
|
+
|
|
165
|
+
C_MESSAGE_HANDLING_SAPFE_503_ERROR_YEAR = We expect it to be available again on {0}.
|
|
166
|
+
|
|
167
|
+
C_MESSAGE_HANDLING_SAPFE_503_ERROR_NO_RETRY_AFTER = Please try again later.
|
|
168
|
+
|
|
155
169
|
# XTIT, 24: Title text of Error Message Box
|
|
156
170
|
C_COMMON_SAPFE_ERROR_MESSAGES_PAGE_TITLE_ERROR=Error
|
|
157
171
|
|
|
@@ -86,14 +86,22 @@ T_MESSAGE_GROUP_TITLE_TABLE_DENOMINATOR=\u0627\u0644\u062C\u062F\u0648\u0644
|
|
|
86
86
|
|
|
87
87
|
T_MESSAGE_BUTTON_SAPFE_MESSAGE_GROUP_LAST_ACTION=\u0622\u062E\u0631 \u0625\u062C\u0631\u0627\u0621
|
|
88
88
|
|
|
89
|
+
T_MESSAGE_ITEM_SUBTITLE_CREATION_ROW_INDICATOR=<\u062C\u062F\u064A\u062F>
|
|
90
|
+
|
|
89
91
|
T_MESSAGE_ITEM_SUBTITLE_INDICATOR_UNKNOWN=\u063A\u064A\u0631 \u0645\u0639\u0631\u0648\u0641
|
|
90
92
|
|
|
93
|
+
T_COLUMN_INDICATOR_IN_TABLE_DEFINITION=\u0645\u062E\u0641\u0649
|
|
94
|
+
|
|
91
95
|
T_MESSAGE_ITEM_SUBTITLE=\u0627\u0644\u0635\u0641 {0}\u060C \u0627\u0644\u0639\u0645\u0648\u062F \: {1}
|
|
92
96
|
|
|
93
97
|
C_COMMON_SAPFE_ERROR=\u062E\u0637\u0623
|
|
94
98
|
|
|
95
99
|
C_MESSAGE_HANDLING_SAPFE_ERROR_MESSAGES_PAGE_TITLE=\u0627\u0644\u0631\u0633\u0627\u0626\u0644
|
|
96
100
|
|
|
101
|
+
C_MESSAGE_HANDLING_SAPFE_503_TITLE=Sorry, this service is temporarily unavailable.
|
|
102
|
+
|
|
103
|
+
C_MESSAGE_HANDLING_SAPFE_503_Description=Please try {0}.
|
|
104
|
+
|
|
97
105
|
C_COMMON_SAPFE_ERROR_MESSAGES_PAGE_TITLE_ERROR=\u062E\u0637\u0623
|
|
98
106
|
|
|
99
107
|
C_MESSAGE_HANDLING_SAPFE_ERROR_MESSAGES_PAGE_TITLE_WARNING=\u062A\u062D\u0630\u064A\u0631
|
|
@@ -221,6 +229,8 @@ C_DRAFT_EDIT_STATE_DRAFT_LOCKED_FILTER=\u0645\u0624\u0645\u0651\u064E\u0646 \u06
|
|
|
221
229
|
|
|
222
230
|
C_DRAFT_EDIT_STATE_DRAFT_UNSAVED_CHANGES_FILTER=\u062A\u063A\u064A\u064A\u0631\u0627\u062A \u063A\u064A\u0631 \u0645\u062D\u0641\u0648\u0638\u0629 \u0628\u0648\u0627\u0633\u0637\u0629 \u0645\u0633\u062A\u062E\u062F\u0645 \u0622\u062E\u0631
|
|
223
231
|
|
|
232
|
+
C_DRAFT_EDIT_STATE_DRAFT_ALL_HIDING_DRAFTS_FILTER=\u0627\u0644\u0643\u0644 (\u062C\u0627\u0631\u064D \u0625\u062E\u0641\u0627\u0621 \u0627\u0644\u0645\u0633\u0648\u062F\u0627\u062A)
|
|
233
|
+
|
|
224
234
|
T_COMMON_SAPFE_ACTION_SHARE=\u0645\u0634\u0627\u0631\u0643\u0629
|
|
225
235
|
|
|
226
236
|
|