@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.
Files changed (96) hide show
  1. package/package.json +5 -5
  2. package/src/sap/fe/core/.library +1 -1
  3. package/src/sap/fe/core/AnnotationHelper.js +2 -2
  4. package/src/sap/fe/core/CommonUtils.js +59 -274
  5. package/src/sap/fe/core/RouterProxy.js +52 -64
  6. package/src/sap/fe/core/TemplateComponent.js +2 -2
  7. package/src/sap/fe/core/TransactionHelper.js +18 -22
  8. package/src/sap/fe/core/actions/messageHandling.js +80 -4
  9. package/src/sap/fe/core/actions/operations.js +42 -23
  10. package/src/sap/fe/core/controllerextensions/EditFlow.js +36 -21
  11. package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.js +9 -3
  12. package/src/sap/fe/core/controllerextensions/InternalRouting.js +20 -50
  13. package/src/sap/fe/core/controllerextensions/MessageHandler.js +222 -102
  14. package/src/sap/fe/core/controllerextensions/ViewState.js +33 -6
  15. package/src/sap/fe/core/controls/CustomQuickViewPage.js +109 -111
  16. package/src/sap/fe/core/controls/filterbar.d.js +8 -0
  17. package/src/sap/fe/core/controls/filterbar.d.ts +0 -0
  18. package/src/sap/fe/core/converters/ManifestSettings.js +2 -1
  19. package/src/sap/fe/core/converters/ManifestSettings.ts +4 -1
  20. package/src/sap/fe/core/converters/MetaModelConverter.js +10 -1
  21. package/src/sap/fe/core/converters/MetaModelConverter.ts +9 -1
  22. package/src/sap/fe/core/converters/annotations/DataField.js +2 -2
  23. package/src/sap/fe/core/converters/annotations/DataField.ts +1 -1
  24. package/src/sap/fe/core/converters/common/AnnotationConverter.js +67 -40
  25. package/src/sap/fe/core/converters/controls/Common/Action.js +6 -3
  26. package/src/sap/fe/core/converters/controls/Common/Action.ts +6 -3
  27. package/src/sap/fe/core/converters/controls/Common/Form.js +57 -18
  28. package/src/sap/fe/core/converters/controls/Common/Form.ts +51 -13
  29. package/src/sap/fe/core/converters/controls/Common/Table.js +130 -19
  30. package/src/sap/fe/core/converters/controls/Common/Table.ts +139 -18
  31. package/src/sap/fe/core/converters/helpers/ID.js +9 -1
  32. package/src/sap/fe/core/converters/helpers/ID.ts +4 -0
  33. package/src/sap/fe/core/converters/templates/ListReportConverter.js +18 -7
  34. package/src/sap/fe/core/converters/templates/ListReportConverter.ts +17 -12
  35. package/src/sap/fe/core/designtime/AppComponent.designtime.js +2 -1
  36. package/src/sap/fe/core/formatters/TableFormatter.js +27 -4
  37. package/src/sap/fe/core/formatters/TableFormatter.ts +20 -3
  38. package/src/sap/fe/core/helpers/KeepAliveHelper.js +211 -0
  39. package/src/sap/fe/core/helpers/KeepAliveHelper.ts +202 -0
  40. package/src/sap/fe/core/helpers/KeepAliveRefreshTypes.js +32 -0
  41. package/src/sap/fe/core/helpers/KeepAliveRefreshTypes.ts +36 -0
  42. package/src/sap/fe/core/helpers/ModelHelper.js +51 -0
  43. package/src/sap/fe/core/library.js +1 -1
  44. package/src/sap/fe/core/messagebundle.properties +15 -1
  45. package/src/sap/fe/core/messagebundle_ar.properties +10 -0
  46. package/src/sap/fe/core/messagebundle_bg.properties +10 -0
  47. package/src/sap/fe/core/messagebundle_ca.properties +10 -0
  48. package/src/sap/fe/core/messagebundle_cs.properties +10 -0
  49. package/src/sap/fe/core/messagebundle_cy.properties +10 -0
  50. package/src/sap/fe/core/messagebundle_da.properties +10 -0
  51. package/src/sap/fe/core/messagebundle_de.properties +10 -0
  52. package/src/sap/fe/core/messagebundle_el.properties +10 -0
  53. package/src/sap/fe/core/messagebundle_en.properties +10 -0
  54. package/src/sap/fe/core/messagebundle_en_GB.properties +10 -0
  55. package/src/sap/fe/core/messagebundle_en_US_sappsd.properties +6 -0
  56. package/src/sap/fe/core/messagebundle_en_US_saprigi.properties +11 -1
  57. package/src/sap/fe/core/messagebundle_en_US_saptrc.properties +11 -1
  58. package/src/sap/fe/core/messagebundle_es.properties +10 -0
  59. package/src/sap/fe/core/messagebundle_es_MX.properties +10 -0
  60. package/src/sap/fe/core/messagebundle_et.properties +10 -0
  61. package/src/sap/fe/core/messagebundle_fi.properties +10 -0
  62. package/src/sap/fe/core/messagebundle_fr.properties +10 -0
  63. package/src/sap/fe/core/messagebundle_fr_CA.properties +10 -0
  64. package/src/sap/fe/core/messagebundle_hi.properties +10 -0
  65. package/src/sap/fe/core/messagebundle_hr.properties +10 -0
  66. package/src/sap/fe/core/messagebundle_hu.properties +10 -0
  67. package/src/sap/fe/core/messagebundle_id.properties +11 -1
  68. package/src/sap/fe/core/messagebundle_it.properties +10 -0
  69. package/src/sap/fe/core/messagebundle_iw.properties +10 -0
  70. package/src/sap/fe/core/messagebundle_ja.properties +19 -9
  71. package/src/sap/fe/core/messagebundle_kk.properties +10 -0
  72. package/src/sap/fe/core/messagebundle_ko.properties +10 -0
  73. package/src/sap/fe/core/messagebundle_lt.properties +10 -0
  74. package/src/sap/fe/core/messagebundle_lv.properties +10 -0
  75. package/src/sap/fe/core/messagebundle_ms.properties +10 -0
  76. package/src/sap/fe/core/messagebundle_nl.properties +10 -0
  77. package/src/sap/fe/core/messagebundle_no.properties +10 -0
  78. package/src/sap/fe/core/messagebundle_pl.properties +10 -0
  79. package/src/sap/fe/core/messagebundle_pt.properties +11 -1
  80. package/src/sap/fe/core/messagebundle_pt_PT.properties +10 -0
  81. package/src/sap/fe/core/messagebundle_ro.properties +10 -0
  82. package/src/sap/fe/core/messagebundle_ru.properties +10 -0
  83. package/src/sap/fe/core/messagebundle_sh.properties +10 -0
  84. package/src/sap/fe/core/messagebundle_sk.properties +10 -0
  85. package/src/sap/fe/core/messagebundle_sl.properties +10 -0
  86. package/src/sap/fe/core/messagebundle_sv.properties +10 -0
  87. package/src/sap/fe/core/messagebundle_th.properties +10 -0
  88. package/src/sap/fe/core/messagebundle_tr.properties +10 -0
  89. package/src/sap/fe/core/messagebundle_uk.properties +10 -0
  90. package/src/sap/fe/core/messagebundle_vi.properties +10 -0
  91. package/src/sap/fe/core/messagebundle_zh_CN.properties +10 -0
  92. package/src/sap/fe/core/messagebundle_zh_TW.properties +10 -0
  93. package/src/sap/fe/core/services/RoutingServiceFactory.js +30 -19
  94. package/src/sap/fe/core/services/TemplatedViewServiceFactory.js +1 -1
  95. package/src/sap/fe/core/templating/EntitySetHelper.js +80 -7
  96. 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;
@@ -106,7 +106,7 @@ sap.ui.define(
106
106
  interfaces: [],
107
107
  controls: [],
108
108
  elements: [],
109
- version: "1.96.0",
109
+ version: "1.97.0",
110
110
  noLibraryCSS: true,
111
111
  extensions: {
112
112
  //Configuration used for rule loading of Support Assistant
@@ -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