@sapui5/sap.fe.core 1.95.0 → 1.98.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 (207) 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 +3 -3
  4. package/src/sap/fe/core/AppComponent.js +9 -44
  5. package/src/sap/fe/core/AppStateHandler.js +2 -2
  6. package/src/sap/fe/core/BaseController.js +1 -1
  7. package/src/sap/fe/core/BusyLocker.js +13 -1
  8. package/src/sap/fe/core/CommonUtils.js +129 -219
  9. package/src/sap/fe/core/ExtensionAPI.js +14 -6
  10. package/src/sap/fe/core/PageController.js +9 -35
  11. package/src/sap/fe/core/RouterProxy.js +79 -75
  12. package/src/sap/fe/core/Synchronization.js +1 -1
  13. package/src/sap/fe/core/TemplateComponent.js +16 -7
  14. package/src/sap/fe/core/TemplateModel.js +1 -1
  15. package/src/sap/fe/core/TransactionHelper.js +183 -65
  16. package/src/sap/fe/core/actions/draft.js +50 -23
  17. package/src/sap/fe/core/actions/messageHandling.js +86 -7
  18. package/src/sap/fe/core/actions/nonDraft.js +1 -1
  19. package/src/sap/fe/core/actions/operations.js +75 -33
  20. package/src/sap/fe/core/actions/sticky.js +1 -1
  21. package/src/sap/fe/core/controllerextensions/ControllerExtensionMetadata.js +1 -1
  22. package/src/sap/fe/core/controllerextensions/EditFlow.js +276 -122
  23. package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.js +1 -1
  24. package/src/sap/fe/core/controllerextensions/InternalEditFlow.js +14 -6
  25. package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.js +90 -46
  26. package/src/sap/fe/core/controllerextensions/InternalRouting.js +234 -232
  27. package/src/sap/fe/core/controllerextensions/KPIManagement.js +539 -209
  28. package/src/sap/fe/core/controllerextensions/KPIManagement.ts +550 -213
  29. package/src/sap/fe/core/controllerextensions/MassEdit.js +79 -0
  30. package/src/sap/fe/core/controllerextensions/MessageHandler.js +227 -103
  31. package/src/sap/fe/core/controllerextensions/PageReady.js +2 -2
  32. package/src/sap/fe/core/controllerextensions/PageReady.ts +3 -7
  33. package/src/sap/fe/core/controllerextensions/Paginator.js +38 -12
  34. package/src/sap/fe/core/controllerextensions/Placeholder.js +16 -19
  35. package/src/sap/fe/core/controllerextensions/Routing.js +17 -2
  36. package/src/sap/fe/core/controllerextensions/RoutingListener.js +1 -1
  37. package/src/sap/fe/core/controllerextensions/Share.js +20 -7
  38. package/src/sap/fe/core/controllerextensions/SideEffects.js +8 -9
  39. package/src/sap/fe/core/controllerextensions/SideEffects.ts +19 -17
  40. package/src/sap/fe/core/controllerextensions/ViewState.js +54 -9
  41. package/src/sap/fe/core/controls/ActionParameterDialog.fragment.xml +40 -34
  42. package/src/sap/fe/core/controls/ActionParameterDialogValueHelp.fragment.xml +35 -0
  43. package/src/sap/fe/core/controls/CommandExecution.js +1 -1
  44. package/src/sap/fe/core/controls/ConditionalWrapper.js +1 -1
  45. package/src/sap/fe/core/controls/CustomQuickViewPage.js +110 -109
  46. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.js +7 -4
  47. package/src/sap/fe/core/controls/FieldWrapper.js +10 -4
  48. package/src/sap/fe/core/controls/FilterBar.js +1 -1
  49. package/src/sap/fe/core/controls/FormElementWrapper.js +1 -6
  50. package/src/sap/fe/core/controls/MultiValueParameterDelegate.js +45 -0
  51. package/src/sap/fe/core/controls/NonComputedVisibleKeyFieldsDialog.fragment.xml +1 -1
  52. package/src/sap/fe/core/controls/filterbar/FilterContainer.js +1 -1
  53. package/src/sap/fe/core/controls/filterbar/VisualFilter.js +1 -1
  54. package/src/sap/fe/core/controls/filterbar/VisualFilterContainer.js +1 -1
  55. package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.js +1 -1
  56. package/src/sap/fe/core/controls/massEdit/MassEditDialog.fragment.xml +106 -0
  57. package/src/sap/fe/core/controls/massEdit/MassEditHandlers.js +78 -0
  58. package/src/sap/fe/core/converters/ConverterContext.js +13 -1
  59. package/src/sap/fe/core/converters/ConverterContext.ts +10 -0
  60. package/src/sap/fe/core/converters/ManifestSettings.js +2 -1
  61. package/src/sap/fe/core/converters/ManifestSettings.ts +7 -1
  62. package/src/sap/fe/core/converters/ManifestWrapper.js +18 -7
  63. package/src/sap/fe/core/converters/ManifestWrapper.ts +15 -6
  64. package/src/sap/fe/core/converters/MetaModelConverter.js +920 -882
  65. package/src/sap/fe/core/converters/MetaModelConverter.ts +829 -853
  66. package/src/sap/fe/core/converters/annotations/DataField.js +54 -4
  67. package/src/sap/fe/core/converters/annotations/DataField.ts +53 -3
  68. package/src/sap/fe/core/converters/common/AnnotationConverter.js +83 -48
  69. package/src/sap/fe/core/converters/controls/Common/Action.js +15 -3
  70. package/src/sap/fe/core/converters/controls/Common/Action.ts +12 -3
  71. package/src/sap/fe/core/converters/controls/Common/Chart.js +1 -3
  72. package/src/sap/fe/core/converters/controls/Common/Chart.ts +0 -2
  73. package/src/sap/fe/core/converters/controls/Common/Form.js +68 -21
  74. package/src/sap/fe/core/converters/controls/Common/Form.ts +60 -16
  75. package/src/sap/fe/core/converters/controls/Common/KPI.js +331 -248
  76. package/src/sap/fe/core/converters/controls/Common/KPI.ts +355 -287
  77. package/src/sap/fe/core/converters/controls/Common/Table.js +426 -332
  78. package/src/sap/fe/core/converters/controls/Common/Table.ts +516 -383
  79. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.js +468 -0
  80. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.ts +609 -0
  81. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.js +30 -13
  82. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.ts +31 -12
  83. package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.js +2 -2
  84. package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.ts +1 -1
  85. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.js +15 -7
  86. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.ts +27 -6
  87. package/src/sap/fe/core/converters/helpers/Aggregation.js +8 -1
  88. package/src/sap/fe/core/converters/helpers/Aggregation.ts +9 -1
  89. package/src/sap/fe/core/converters/helpers/BindingHelper.js +3 -2
  90. package/src/sap/fe/core/converters/helpers/BindingHelper.ts +2 -2
  91. package/src/sap/fe/core/converters/helpers/ID.js +9 -1
  92. package/src/sap/fe/core/converters/helpers/ID.ts +6 -2
  93. package/src/sap/fe/core/converters/helpers/IssueManager.js +7 -5
  94. package/src/sap/fe/core/converters/helpers/IssueManager.ts +6 -4
  95. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.js +2 -2
  96. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.ts +1 -1
  97. package/src/sap/fe/core/converters/templates/ListReportConverter.js +34 -4
  98. package/src/sap/fe/core/converters/templates/ListReportConverter.ts +36 -7
  99. package/src/sap/fe/core/converters/templates/ObjectPageConverter.js +2 -5
  100. package/src/sap/fe/core/converters/templates/ObjectPageConverter.ts +1 -2
  101. package/src/sap/fe/core/designtime/AppComponent.designtime.js +11 -2
  102. package/src/sap/fe/core/formatters/FPMFormatter.js +1 -1
  103. package/src/sap/fe/core/formatters/FPMFormatter.ts +8 -3
  104. package/src/sap/fe/core/formatters/TableFormatter.js +27 -4
  105. package/src/sap/fe/core/formatters/TableFormatter.ts +20 -3
  106. package/src/sap/fe/core/formatters/ValueFormatter.js +30 -5
  107. package/src/sap/fe/core/formatters/ValueFormatter.ts +25 -3
  108. package/src/sap/fe/core/fpm/Component.js +2 -2
  109. package/src/sap/fe/core/helpers/AppStartupHelper.js +359 -0
  110. package/src/sap/fe/core/helpers/AppStartupHelper.ts +388 -0
  111. package/src/sap/fe/core/helpers/BindingExpression.js +199 -111
  112. package/src/sap/fe/core/helpers/BindingExpression.ts +193 -102
  113. package/src/sap/fe/core/helpers/DynamicAnnotationPathHelper.js +1 -1
  114. package/src/sap/fe/core/helpers/EditState.js +1 -1
  115. package/src/sap/fe/core/helpers/ExcelFormatHelper.js +1 -3
  116. package/src/sap/fe/core/helpers/FPMHelper.js +1 -1
  117. package/src/sap/fe/core/helpers/KeepAliveHelper.js +211 -0
  118. package/src/sap/fe/core/helpers/KeepAliveHelper.ts +202 -0
  119. package/src/sap/fe/core/helpers/KeepAliveRefreshTypes.js +32 -0
  120. package/src/sap/fe/core/helpers/KeepAliveRefreshTypes.ts +36 -0
  121. package/src/sap/fe/core/helpers/MassEditHelper.js +678 -0
  122. package/src/sap/fe/core/helpers/ModelHelper.js +64 -1
  123. package/src/sap/fe/core/helpers/PasteHelper.js +7 -1
  124. package/src/sap/fe/core/helpers/SemanticDateOperators.js +1 -1
  125. package/src/sap/fe/core/helpers/SemanticKeyHelper.js +1 -1
  126. package/src/sap/fe/core/helpers/StableIdHelper.js +2 -2
  127. package/src/sap/fe/core/helpers/StableIdHelper.ts +1 -1
  128. package/src/sap/fe/core/library.js +28 -2
  129. package/src/sap/fe/core/library.support.js +10 -4
  130. package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.js +62 -0
  131. package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.ts +66 -0
  132. package/src/sap/fe/core/messagebundle.properties +67 -3
  133. package/src/sap/fe/core/messagebundle_ar.properties +40 -3
  134. package/src/sap/fe/core/messagebundle_bg.properties +40 -3
  135. package/src/sap/fe/core/messagebundle_ca.properties +41 -4
  136. package/src/sap/fe/core/messagebundle_cs.properties +41 -4
  137. package/src/sap/fe/core/messagebundle_cy.properties +40 -3
  138. package/src/sap/fe/core/messagebundle_da.properties +40 -3
  139. package/src/sap/fe/core/messagebundle_de.properties +40 -3
  140. package/src/sap/fe/core/messagebundle_el.properties +40 -3
  141. package/src/sap/fe/core/messagebundle_en.properties +37 -0
  142. package/src/sap/fe/core/messagebundle_en_GB.properties +37 -0
  143. package/src/sap/fe/core/messagebundle_en_US_sappsd.properties +37 -0
  144. package/src/sap/fe/core/messagebundle_en_US_saprigi.properties +46 -2
  145. package/src/sap/fe/core/messagebundle_en_US_saptrc.properties +44 -0
  146. package/src/sap/fe/core/messagebundle_es.properties +40 -3
  147. package/src/sap/fe/core/messagebundle_es_MX.properties +41 -4
  148. package/src/sap/fe/core/messagebundle_et.properties +40 -3
  149. package/src/sap/fe/core/messagebundle_fi.properties +40 -3
  150. package/src/sap/fe/core/messagebundle_fr.properties +41 -4
  151. package/src/sap/fe/core/messagebundle_fr_CA.properties +40 -3
  152. package/src/sap/fe/core/messagebundle_hi.properties +40 -3
  153. package/src/sap/fe/core/messagebundle_hr.properties +40 -3
  154. package/src/sap/fe/core/messagebundle_hu.properties +41 -4
  155. package/src/sap/fe/core/messagebundle_id.properties +42 -5
  156. package/src/sap/fe/core/messagebundle_it.properties +40 -3
  157. package/src/sap/fe/core/messagebundle_iw.properties +40 -3
  158. package/src/sap/fe/core/messagebundle_ja.properties +49 -12
  159. package/src/sap/fe/core/messagebundle_kk.properties +40 -3
  160. package/src/sap/fe/core/messagebundle_ko.properties +40 -3
  161. package/src/sap/fe/core/messagebundle_lt.properties +40 -3
  162. package/src/sap/fe/core/messagebundle_lv.properties +40 -3
  163. package/src/sap/fe/core/messagebundle_ms.properties +40 -3
  164. package/src/sap/fe/core/messagebundle_nl.properties +40 -3
  165. package/src/sap/fe/core/messagebundle_no.properties +40 -3
  166. package/src/sap/fe/core/messagebundle_pl.properties +40 -3
  167. package/src/sap/fe/core/messagebundle_pt.properties +42 -5
  168. package/src/sap/fe/core/messagebundle_pt_PT.properties +40 -3
  169. package/src/sap/fe/core/messagebundle_ro.properties +40 -3
  170. package/src/sap/fe/core/messagebundle_ru.properties +40 -3
  171. package/src/sap/fe/core/messagebundle_sh.properties +40 -3
  172. package/src/sap/fe/core/messagebundle_sk.properties +40 -3
  173. package/src/sap/fe/core/messagebundle_sl.properties +40 -3
  174. package/src/sap/fe/core/messagebundle_sv.properties +41 -4
  175. package/src/sap/fe/core/messagebundle_th.properties +40 -3
  176. package/src/sap/fe/core/messagebundle_tr.properties +40 -3
  177. package/src/sap/fe/core/messagebundle_uk.properties +40 -3
  178. package/src/sap/fe/core/messagebundle_vi.properties +40 -3
  179. package/src/sap/fe/core/messagebundle_zh_CN.properties +40 -3
  180. package/src/sap/fe/core/messagebundle_zh_TW.properties +40 -3
  181. package/src/sap/fe/core/services/AsyncComponentServiceFactory.js +1 -1
  182. package/src/sap/fe/core/services/CacheHandlerServiceFactory.js +1 -1
  183. package/src/sap/fe/core/services/EnvironmentServiceFactory.js +4 -3
  184. package/src/sap/fe/core/services/EnvironmentServiceFactory.ts +3 -0
  185. package/src/sap/fe/core/services/NavigationServiceFactory.js +1 -1
  186. package/src/sap/fe/core/services/ResourceModelServiceFactory.js +1 -1
  187. package/src/sap/fe/core/services/RoutingServiceFactory.js +98 -328
  188. package/src/sap/fe/core/services/ShellServicesFactory.js +31 -2
  189. package/src/sap/fe/core/services/ShellServicesFactory.ts +30 -1
  190. package/src/sap/fe/core/services/SideEffectsServiceFactory.js +8 -5
  191. package/src/sap/fe/core/services/SideEffectsServiceFactory.ts +11 -6
  192. package/src/sap/fe/core/services/TemplatedViewServiceFactory.js +14 -5
  193. package/src/sap/fe/core/services/view/TemplatingErrorPage.controller.js +1 -1
  194. package/src/sap/fe/core/support/InvalidAnnotationColumnKey.support.js +38 -0
  195. package/src/sap/fe/core/support/InvalidAnnotationColumnKey.support.ts +18 -0
  196. package/src/sap/fe/core/templating/DataModelPathHelper.js +8 -37
  197. package/src/sap/fe/core/templating/DataModelPathHelper.ts +13 -33
  198. package/src/sap/fe/core/templating/DisplayModeFormatter.js +114 -0
  199. package/src/sap/fe/core/templating/DisplayModeFormatter.ts +86 -0
  200. package/src/sap/fe/core/templating/EntitySetHelper.js +86 -3
  201. package/src/sap/fe/core/templating/EntitySetHelper.ts +44 -0
  202. package/src/sap/fe/core/templating/FilterHelper.js +10 -7
  203. package/src/sap/fe/core/templating/FilterHelper.ts +8 -6
  204. package/src/sap/fe/core/templating/PropertyHelper.js +2 -2
  205. package/src/sap/fe/core/templating/PropertyHelper.ts +1 -1
  206. package/src/sap/fe/core/templating/UIFormatters.js +47 -107
  207. package/src/sap/fe/core/templating/UIFormatters.ts +76 -72
@@ -1,6 +1,6 @@
1
1
  /*!
2
2
  * SAPUI5
3
- * (c) Copyright 2009-2021 SAP SE. All rights reserved.
3
+ * (c) Copyright 2009-2022 SAP SE. All rights reserved.
4
4
  */
5
5
  /* eslint-disable no-alert */
6
6
  sap.ui.define(
@@ -128,6 +128,7 @@ sap.ui.define(
128
128
  this._bDisableOnHashChange = false;
129
129
  this._bIgnoreRestore = false;
130
130
  this._bCleanedRestore = false;
131
+ this._bForceFocus = true; // Trigger the focus mechanism for the first view displayed by the app
131
132
  },
132
133
 
133
134
  destroy: function() {
@@ -158,6 +159,14 @@ sap.ui.define(
158
159
  return this._oRouter.getHashChanger().getHash();
159
160
  },
160
161
 
162
+ isFocusForced: function() {
163
+ return this._bForceFocus;
164
+ },
165
+
166
+ setFocusForced: function(bForced) {
167
+ this._bForceFocus = bForced;
168
+ },
169
+
161
170
  /**
162
171
  * Resets the internal variable sIAppStateKey.
163
172
  *
@@ -180,42 +189,31 @@ sap.ui.define(
180
189
  * @param {string} sHash Hash to be navigated to
181
190
  * @param {boolean} bPreserveHistory If set to true, non-ancestor entries in history will be retained
182
191
  * @param {boolean} bDisablePreservationCache If set to true, cache preservation mechanism is disabled for the current navigation
183
- * @returns {Promise} Promise that is resolved when the navigation is finalized
192
+ * @param {boolean} bForceFocus If set to true, the logic to set the focus once the navigation is finalized will be triggered (onPageReady)
193
+ * @returns {Promise} Promise (resolved when the navigation is finalized) that returns 'true' if a navigation took place, 'false' if the navigation didn't happen
184
194
  * @ui5-restricted
185
195
  */
186
- navToHash: function(sHash, bPreserveHistory, bDisablePreservationCache) {
196
+ navToHash: function(sHash, bPreserveHistory, bDisablePreservationCache, bForceFocus) {
187
197
  var that = this;
188
198
 
189
199
  if (this._oRouteMatchSynchronization) {
190
200
  return this._oRouteMatchSynchronization.waitFor().then(function() {
191
201
  that._oRouteMatchSynchronization = null;
192
- return that._internalNavToHash(sHash, bPreserveHistory, bDisablePreservationCache);
202
+ return that._internalNavToHash(sHash, bPreserveHistory, bDisablePreservationCache, bForceFocus);
193
203
  });
194
204
  } else {
195
205
  if (this._bActivateRouteMatchSynchro) {
196
206
  this.waitForRouteMatchBeforeNavigation();
197
207
  }
198
- return that._internalNavToHash(sHash, bPreserveHistory, bDisablePreservationCache);
208
+ return that._internalNavToHash(sHash, bPreserveHistory, bDisablePreservationCache, bForceFocus);
199
209
  }
200
210
  },
201
211
 
202
- _internalNavToHash: function(sHash, bPreserveHistory, bDisablePreservationCache) {
203
- var that = this,
204
- sLastFocusControlId = sap.ui.getCore().getCurrentFocusedControlId(),
205
- sLastFocusInfo =
206
- sLastFocusControlId && sap.ui.getCore().byId(sLastFocusControlId)
207
- ? sap.ui
208
- .getCore()
209
- .byId(sLastFocusControlId)
210
- .getFocusInfo()
211
- : null,
212
- shashBeforeRoutechanged = this.getHash();
213
-
212
+ _internalNavToHash: function(sHash, bPreserveHistory, bDisablePreservationCache, bForceFocus) {
214
213
  // Add the app state in the hash if needed
215
214
  if (this.fclEnabled && this.sIAppStateKey && !findAppStateInHash(sHash)) {
216
215
  sHash = setAppStateInHash(sHash, this.sIAppStateKey);
217
216
  }
218
- var oNewState = this._extractStateFromHash(sHash);
219
217
 
220
218
  if (!this.checkHashWithGuard(sHash)) {
221
219
  if (!this.oResourceBundle) {
@@ -226,15 +224,28 @@ sap.ui.define(
226
224
  // in the EditFlow we rely on a UI5 mechanism that displays a confirm dialog.
227
225
  if (!confirm(this.oResourceBundle.getText("C_ROUTER_PROXY_SAPFE_EXIT_NOTSAVED_MESSAGE"))) {
228
226
  // The user clicked on Cancel --> cancel navigation
229
- return Promise.resolve();
227
+ return Promise.resolve(false);
230
228
  }
231
229
  this.bIsGuardCrossAllowed = true;
232
230
  }
231
+
232
+ // In case the navigation will cause a new view to be displayed, we force the focus
233
+ // I.e. if the keys for the hash we're navigating to is a superset of the current hash keys.
234
+ var oNewState = this._extractStateFromHash(sHash);
235
+ if (!this._bForceFocus) {
236
+ // If the focus was already forced, keep it
237
+ var aCurrentHashKeys = this._extractKeysFromHash(this.getHash());
238
+ this._bForceFocus =
239
+ bForceFocus ||
240
+ (aCurrentHashKeys.length < oNewState.keys.length &&
241
+ aCurrentHashKeys.every(function(key, index) {
242
+ return key === oNewState.keys[index];
243
+ }));
244
+ }
245
+
233
246
  var oHistoryAction = this._pushNewState(oNewState, false, bPreserveHistory, bDisablePreservationCache);
234
247
 
235
- return this._rebuildBrowserHistory(oHistoryAction, false).then(function() {
236
- that.storeFocusForHash(sLastFocusControlId, sLastFocusInfo, shashBeforeRoutechanged);
237
- });
248
+ return this._rebuildBrowserHistory(oHistoryAction, false);
238
249
  },
239
250
 
240
251
  /**
@@ -258,34 +269,6 @@ sap.ui.define(
258
269
  }
259
270
  },
260
271
 
261
- getFocusControlForCurrentHash: function() {
262
- var sCurrenthash = this.getHash();
263
- var oLastFocusedControl;
264
- for (var i = this._oManagedHistory.length - 1; i >= 0; i--) {
265
- if (sCurrenthash === this._oManagedHistory[i].hash) {
266
- oLastFocusedControl = this._oManagedHistory[i].oLastFocusControl;
267
- break;
268
- } else {
269
- this._oManagedHistory[i].oLastFocusControl = undefined;
270
- }
271
- }
272
-
273
- return oLastFocusedControl;
274
- },
275
-
276
- storeFocusForHash: function(sLastFocusControlId, sLastFocusInfo, sHash) {
277
- var oManagedhistory = this._oManagedHistory;
278
- for (var i = 0; i < oManagedhistory.length; i++) {
279
- if (sHash === oManagedhistory[i].hash) {
280
- oManagedhistory[i].oLastFocusControl = {
281
- controlId: sLastFocusControlId,
282
- focusInfo: sLastFocusInfo
283
- };
284
- break;
285
- }
286
- }
287
- },
288
-
289
272
  /**
290
273
  * Navigates back in the history.
291
274
  *
@@ -432,6 +415,24 @@ sap.ui.define(
432
415
  this._bActivateRouteMatchSynchro = false;
433
416
  },
434
417
 
418
+ _extractKeysFromHash: function(sHash) {
419
+ if (sHash === undefined) {
420
+ sHash = "";
421
+ }
422
+ var sHashNoParams = sHash.split("?")[0]; // remove params
423
+ var aTokens = sHashNoParams.split("/");
424
+ var aKeys = [];
425
+
426
+ aTokens.forEach(function(sToken) {
427
+ var regexKey = /[^\(\)]+\([^\(\)]+\)/; // abc(def)
428
+ if (regexKey.test(sToken)) {
429
+ aKeys.push(sToken.split("(")[0]);
430
+ }
431
+ });
432
+
433
+ return aKeys;
434
+ },
435
+
435
436
  /**
436
437
  * Builds a state from a hash.
437
438
  *
@@ -441,22 +442,13 @@ sap.ui.define(
441
442
  * @ui5-restricted
442
443
  */
443
444
  _extractStateFromHash: function(sHash) {
444
- var oState = {
445
- keys: []
446
- };
447
-
448
- // Retrieve object keys
449
445
  if (sHash === undefined) {
450
446
  sHash = "";
451
447
  }
452
- var sHashNoParams = sHash.split("?")[0];
453
- var sTokens = sHashNoParams.split("/");
454
- sTokens.forEach(function(sToken) {
455
- var regexKey = /[^\(\)]+\([^\(\)]+\)/; // abc(def)
456
- if (regexKey.test(sToken)) {
457
- oState.keys.push(sToken.split("(")[0]);
458
- }
459
- });
448
+
449
+ var oState = {
450
+ keys: this._extractKeysFromHash(sHash)
451
+ };
460
452
 
461
453
  // Retrieve layout (if any)
462
454
  var aLayout = sHash.match(new RegExp("\\?.*" + enumURLParams.LAYOUTPARAM + "=([^&]*)"));
@@ -518,7 +510,6 @@ sap.ui.define(
518
510
  }
519
511
 
520
512
  // 3. Then pop all states until we find an ancestor of the new state, or we find a state that need to be preserved
521
- var oLastFocusControl;
522
513
  var oLastRemovedItem;
523
514
  while (this._oManagedHistory.length > 0) {
524
515
  var oTopState = this._oManagedHistory[this._oManagedHistory.length - 1];
@@ -527,13 +518,11 @@ sap.ui.define(
527
518
  this._compareCacheStates(oTopState, oNewState) !== enumState.ANCESTOR
528
519
  ) {
529
520
  // The top state is not an ancestor of oNewState and is not preserved --> we can pop it
530
- oLastFocusControl = oTopState.oLastFocusControl;
531
521
  oLastRemovedItem = this._oManagedHistory.pop();
532
522
  iPopCount++;
533
523
  } else if (oTopState.preserved && removeAppStateInHash(oTopState.hash) === removeAppStateInHash(oNewState.hash)) {
534
524
  // We try to add a state that is already in cache (due to preserved flag) but with a different iapp-state
535
525
  // --> we should delete the previous entry (it will be later replaced by the new one) and stop popping
536
- oLastFocusControl = oTopState.oLastFocusControl;
537
526
  oLastRemovedItem = this._oManagedHistory.pop();
538
527
  iPopCount++;
539
528
  oNewState.preserved = true;
@@ -565,7 +554,6 @@ sap.ui.define(
565
554
  }
566
555
 
567
556
  // 5. Now we can push the state at the top of the internal history
568
- oNewState.oLastFocusControl = oLastFocusControl;
569
557
  var bHasSameHash = oLastRemovedItem && oNewState.hash === oLastRemovedItem.hash;
570
558
  if (this._oManagedHistory.length === 0 || this._oManagedHistory[this._oManagedHistory.length - 1].hash !== oNewState.hash) {
571
559
  this._oManagedHistory.push(oNewState);
@@ -619,12 +607,12 @@ sap.ui.define(
619
607
  },
620
608
 
621
609
  /**
622
- * Rebuilds the browser history from the app root page.
610
+ * Synchronizes the browser history with the internal history of the routerProxy, and triggers a navigation if needed.
623
611
  *
624
612
  * @memberof sap.fe.core.RouterProxy
625
613
  * @param {object} oHistoryAction Specifies the navigation action to be performed
626
- * @param {boolean} bRebuildOnly `true` if rebuilding history
627
- * @returns {Promise} A promise that is resolved when the navigation is finalized
614
+ * @param {boolean} bRebuildOnly `true` if internal history is currently being rebuilt
615
+ * @returns {Promise} Promise (resolved when the navigation is finalized) that returns 'true' if a navigation took place, 'false' if the navigation didn't happen
628
616
  * @ui5-restricted
629
617
  * @final
630
618
  */
@@ -652,7 +640,7 @@ sap.ui.define(
652
640
  }
653
641
 
654
642
  that.bIsRebuildHistoryRunning = false;
655
- resolve();
643
+ resolve(true); // a navigation occurred
656
644
  }
657
645
 
658
646
  // Async callbacks when navigating back, in order to let all notifications and events get processed
@@ -667,7 +655,7 @@ sap.ui.define(
667
655
  function backAsync() {
668
656
  window.removeEventListener("popstate", backAsync);
669
657
  that.bIsRebuildHistoryRunning = false;
670
- resolve();
658
+ resolve(true); // a navigation occurred
671
659
  }
672
660
 
673
661
  that._bIgnoreRestore = true;
@@ -677,14 +665,14 @@ sap.ui.define(
677
665
  that._oRouter.getHashChanger().replaceHash(oTargetState.hash);
678
666
  history.replaceState(Object.assign({ feLevel: newLevel }, history.state), "");
679
667
  that.bIsRebuildHistoryRunning = false;
680
- resolve();
668
+ resolve(true); // a navigation occurred
681
669
  break;
682
670
 
683
671
  case "append":
684
672
  that._oRouter.getHashChanger().setHash(oTargetState.hash);
685
673
  history.replaceState(Object.assign({ feLevel: newLevel }, history.state), "");
686
674
  that.bIsRebuildHistoryRunning = false;
687
- resolve();
675
+ resolve(true); // a navigation occurred
688
676
  break;
689
677
 
690
678
  case "back":
@@ -701,7 +689,7 @@ sap.ui.define(
701
689
  default:
702
690
  // No navigation
703
691
  that.bIsRebuildHistoryRunning = false;
704
- resolve();
692
+ resolve(false); // no navigation --> resolve to false
705
693
  }
706
694
  });
707
695
  },
@@ -815,6 +803,22 @@ sap.ui.define(
815
803
  return !sPrevHash || !that.checkHashWithGuard(sPrevHash);
816
804
  }
817
805
  return false;
806
+ },
807
+
808
+ /**
809
+ * Checks if the last 2 entries in the history share the same context.
810
+ *
811
+ * @returns {boolean} `true` if they share the same context.
812
+ */
813
+ checkIfBackHasSameContext: function() {
814
+ if (this._oManagedHistory.length < 2) {
815
+ return false;
816
+ }
817
+
818
+ var oCurrentState = this._oManagedHistory[this._oManagedHistory.length - 1];
819
+ var oPreviousState = this._oManagedHistory[this._oManagedHistory.length - 2];
820
+
821
+ return oCurrentState.hash.split("?")[0] === oPreviousState.hash.split("?")[0];
818
822
  }
819
823
  });
820
824
  }
@@ -1,6 +1,6 @@
1
1
  /*!
2
2
  * SAPUI5
3
- * (c) Copyright 2009-2021 SAP SE. All rights reserved.
3
+ * (c) Copyright 2009-2022 SAP SE. All rights reserved.
4
4
  */
5
5
  sap.ui.define(["sap/base/Log", "sap/ui/base/Object"], function(Log, BaseObject) {
6
6
  "use strict";
@@ -1,10 +1,10 @@
1
1
  /*!
2
2
  * SAPUI5
3
- * (c) Copyright 2009-2021 SAP SE. All rights reserved.
3
+ * (c) Copyright 2009-2022 SAP SE. All rights reserved.
4
4
  */
5
5
  sap.ui.define(
6
- ["sap/ui/core/UIComponent", "sap/fe/core/CommonUtils", "sap/base/Log"],
7
- function(UIComponent, CommonUtils, Log) {
6
+ ["sap/ui/core/UIComponent", "sap/fe/core/CommonUtils", "sap/ui/mdc/p13n/StateUtil", "sap/base/Log"],
7
+ function(UIComponent, CommonUtils, StateUtil, Log) {
8
8
  "use strict";
9
9
 
10
10
  var TemplateComponent = UIComponent.extend("sap.fe.core.TemplateComponent", {
@@ -12,7 +12,7 @@ sap.ui.define(
12
12
  interfaces: ["sap.ui.core.IAsyncContentCreation"],
13
13
  properties: {
14
14
  /**
15
- * OData EntitySet name
15
+ * Name of the OData entity set
16
16
  */
17
17
  entitySet: {
18
18
  type: "string",
@@ -93,6 +93,15 @@ sap.ui.define(
93
93
  init: function() {
94
94
  this.oAppComponent = CommonUtils.getAppComponent(this);
95
95
  UIComponent.prototype.init.apply(this, arguments);
96
+ var oStateChangedHandler = function(oEvent) {
97
+ var oControl = oEvent.getParameter("control");
98
+ if (oControl.isA("sap.ui.mdc.Table") || oControl.isA("sap.ui.mdc.FilterBar")) {
99
+ var oMacroAPI = oControl.getParent();
100
+ oMacroAPI.fireStateChanged();
101
+ }
102
+ };
103
+ StateUtil.detachStateChange(oStateChangedHandler);
104
+ StateUtil.attachStateChange(oStateChangedHandler);
96
105
  },
97
106
 
98
107
  // This method is called by UI5 core to access to the component containing the customizing configuration.
@@ -102,11 +111,11 @@ sap.ui.define(
102
111
  return this.oAppComponent;
103
112
  },
104
113
 
105
- onPageReady: function(oLastFocusedControl) {
114
+ onPageReady: function(mParameters) {
106
115
  if (this.getRootControl() && this.getRootControl().getController() && this.getRootControl().getController().onPageReady) {
107
116
  this.getRootControl()
108
117
  .getController()
109
- .onPageReady(oLastFocusedControl);
118
+ .onPageReady(mParameters);
110
119
  }
111
120
  },
112
121
 
@@ -141,7 +150,7 @@ sap.ui.define(
141
150
  .getController()
142
151
  ._getPageTitleInformation();
143
152
  } else {
144
- return Promise.resolve({});
153
+ return {};
145
154
  }
146
155
  },
147
156
 
@@ -1,6 +1,6 @@
1
1
  /*!
2
2
  * SAPUI5
3
- * (c) Copyright 2009-2021 SAP SE. All rights reserved.
3
+ * (c) Copyright 2009-2022 SAP SE. All rights reserved.
4
4
  */
5
5
  sap.ui.define(["sap/base/Log", "sap/ui/base/Object", "sap/ui/model/json/JSONModel"], function(Log, BaseObject, JSONModel) {
6
6
  "use strict";