@sapui5/sap.suite.ui.generic.template 1.120.48 → 1.120.50

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 CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sapui5/sap.suite.ui.generic.template",
3
- "version": "1.120.48",
3
+ "version": "1.120.50",
4
4
  "description": "SAPUI5 Library sap.suite.ui.generic.template",
5
5
  "keywords": [
6
6
  "sapui5",
@@ -7,7 +7,7 @@
7
7
 
8
8
  (c) Copyright 2009-2015 SAP SE. All rights reserved
9
9
  </copyright>
10
- <version>1.120.48</version>
10
+ <version>1.120.50</version>
11
11
 
12
12
  <documentation>Library with generic Suite UI templates.</documentation>
13
13
 
@@ -8,7 +8,7 @@
8
8
  "i18n": "i18n/i18n.properties",
9
9
  "applicationVersion": {
10
10
  "__comment": "applicationVersion oder componentversion??",
11
- "version": "1.120.48"
11
+ "version": "1.120.50"
12
12
  },
13
13
  "title": "{{TITLE}}",
14
14
  "description": "{{DESCRIPTION}}",
@@ -8,7 +8,7 @@
8
8
  "i18n": "i18n/i18n.properties",
9
9
  "applicationVersion": {
10
10
  "__comment": "applicationVersion oder componentversion??",
11
- "version": "1.120.48"
11
+ "version": "1.120.50"
12
12
  },
13
13
  "title": "Canvas",
14
14
  "description": "Canvas Page",
@@ -37,7 +37,7 @@ CONTACT_FAX=\u4F20\u771F
37
37
 
38
38
  CONTACT_ADDRESS=\u5730\u5740
39
39
 
40
- MESSAGE_SINGLE_VALUE_L_FORM=\u8FC7\u6EE4\u5668 "{0}" \u4E0E\u6807\u7B7E "{1}" \u65E0\u5173\u3002\u8BBE\u7F6E\u6B64\u8FC7\u6EE4\u5668\u5BF9\u7ED3\u679C\u6CA1\u6709\u5F71\u54CD\u3002
40
+ MESSAGE_SINGLE_VALUE_L_FORM=\u8FC7\u6EE4\u5668\u201C{0}\u201D\u4E0E\u6807\u7B7E\u201C{1}\u201D\u65E0\u5173\u3002\u8BBE\u7F6E\u6B64\u8FC7\u6EE4\u5668\u5BF9\u7ED3\u679C\u6CA1\u6709\u5F71\u54CD\u3002
41
41
 
42
42
  MESSAGE_SINGLE_VALUE_S_FORM=\u65E0\u6CD5\u5728 "{1}" \u6807\u7B7E\u4E0A\u6309 "{0}" \u8FDB\u884C\u8FC7\u6EE4\u3002
43
43
 
@@ -53,7 +53,7 @@ EDIT_REMAINING={1} \u4E2A\u5BF9\u8C61\u4E2D\u6709 {0} \u4E2A\u65E0\u6CD5\u8FDB\u
53
53
 
54
54
  EDIT_REMAINING_PLURAL={1} \u4E2A\u5BF9\u8C61\u4E2D\u6709 {0} \u4E2A\u65E0\u6CD5\u8FDB\u884C\u7F16\u8F91\u3002\u5982\u679C\u6709\u4EBA\u6B63\u5728\u5904\u7406\u8BE5\u5BF9\u8C61\u6216\u4E0D\u5141\u8BB8\u7F16\u8F91\uFF0C\u5C31\u53EF\u80FD\u4F1A\u53D1\u751F\u8FD9\u79CD\u60C5\u51B5\u3002\n\n \u662F\u5426\u8981\u7F16\u8F91\u5176\u4F59 {2} \u4E2A\u5BF9\u8C61\uFF1F
55
55
 
56
- MESSAGE_MULTIPLE_VALUES_L_FORM=\u67D0\u4E9B\u8FC7\u6EE4\u5668\u4E0E\u6807\u7B7E "{1}" \u65E0\u5173 ({0})\u3002\u8BBE\u7F6E\u8FD9\u4E9B\u8FC7\u6EE4\u5668\u5BF9\u7ED3\u679C\u6CA1\u6709\u5F71\u54CD\u3002
56
+ MESSAGE_MULTIPLE_VALUES_L_FORM=\u67D0\u4E9B\u8FC7\u6EE4\u5668\u4E0E\u6807\u7B7E\u201C{1}\u201D\u65E0\u5173 ({0})\u3002\u8BBE\u7F6E\u8FD9\u4E9B\u8FC7\u6EE4\u5668\u5BF9\u7ED3\u679C\u6CA1\u6709\u5F71\u54CD\u3002
57
57
 
58
58
  MESSAGE_MULTIPLE_VALUES_S_FORM=\u65E0\u6CD5\u5728 "{1}" \u6807\u7B7E\u4E0A\u4F7F\u7528\u4EE5\u4E0B\u8FC7\u6EE4\u5668\uFF1A"{0}"\u3002
59
59
 
@@ -8,7 +8,7 @@
8
8
  "i18n": "i18n/i18n.properties",
9
9
  "applicationVersion": {
10
10
  "__comment": "applicationVersion oder componentversion??",
11
- "version": "1.120.48"
11
+ "version": "1.120.50"
12
12
  },
13
13
  "title": "{{TITLE}}",
14
14
  "description": "{{DESCRIPTION}}",
@@ -6,7 +6,7 @@
6
6
  "type": "component",
7
7
  "i18n": "i18n/i18n.properties",
8
8
  "applicationVersion": {
9
- "version": "1.120.48"
9
+ "version": "1.120.50"
10
10
  },
11
11
  "title": "{{TITLE}}",
12
12
  "description": "{{DESCRIPTION}}",
@@ -6,7 +6,7 @@
6
6
  "type": "component",
7
7
  "i18n": "i18n/i18n.properties",
8
8
  "applicationVersion": {
9
- "version": "1.120.48"
9
+ "version": "1.120.50"
10
10
  },
11
11
  "title": "{{TITLE}}",
12
12
  "description": "{{DESCRIPTION}}",
@@ -6,7 +6,7 @@
6
6
  "type": "component",
7
7
  "i18n": "i18n/i18n.properties",
8
8
  "applicationVersion": {
9
- "version": "1.120.48"
9
+ "version": "1.120.50"
10
10
  },
11
11
  "title": "{{TITLE}}",
12
12
  "description": "{{DESCRIPTION}}",
@@ -36,6 +36,12 @@ sap.ui.define([
36
36
  var bIsApplying = false;
37
37
  var aBasicFilters = [];
38
38
  var oSmartFilterBar = oControl;
39
+ // Holds SVM callbacks once setSVMWrapperCallbacks is called. The afterVariantLoad handler
40
+ // is attached eagerly (in fnInitialize) so it fires even when setSVMWrapperCallbacks has
41
+ // not yet been called (race condition on second navigation: bAllControlsInitialized=true
42
+ // causes fnApplyVariantState to run synchronously, triggering afterVariantLoad before the
43
+ // Promise.all in SmartVariantManagementWrapper resolves and calls setSVMWrapperCallbacks).
44
+ var oSVMWrapperCallbacks = null;
39
45
 
40
46
  var oVariantManagementInitializedPromise;
41
47
 
@@ -50,14 +56,39 @@ sap.ui.define([
50
56
 
51
57
  // Initialize variant management promise
52
58
  oVariantManagementInitializedPromise = oSmartFilterBar.getInitializedPromise();
59
+
60
+ // Attach afterVariantLoad eagerly so custom filter state is restored regardless of
61
+ // when setSVMWrapperCallbacks is called. setManagedControlStates is only called if
62
+ // SVM callbacks are already available; otherwise those controls are restored via the
63
+ // iAppState path (SmartVariantManagementWrapper.fnSetManagedControlStates).
64
+ oSmartFilterBar.attachAfterVariantLoad(function(){
65
+ var oCustomData = oSmartFilterBar.getCustomFilterData();
66
+ // variant stored with 1.103 or later: all customFilter data stored in property customFilters
67
+ // legacy variant stored with 1.102 or earlier: customFilters (from storing point of view) separated according to their origin
68
+ var oCustomFiltersState = oCustomData[dataPropertyNameGeneric].customFilters || {
69
+ editState: oCustomData[dataPropertyNameGeneric].editStateFilter,
70
+ appExtension: oCustomData[dataPropertyNameCustom],
71
+ adaptationExtensions: oCustomData[dataPropertyNameExtension]
72
+ };
73
+ aBasicFilters = oSmartFilterBar.getAllFilterItems(true);
74
+ mParams.oCustomFiltersWrapper.setState(oCustomFiltersState);
75
+ if (oSVMWrapperCallbacks) {
76
+ oSVMWrapperCallbacks.setManagedControlStates(oCustomData[dataPropertyNameGeneric]);
77
+ }
78
+ });
53
79
  }
54
80
 
81
+ // When a variant is loaded, correspondingly we have to get the customData and apply the states to the controls not known to SVM. Again, event and method are implemented
82
+ // in SFB instead of SVM where it would make more sense.
83
+ // Here the event is afterVariantLoad, as the variant content known to SVM/SFB has first to be applied to the SFB, which will also pass the custom data accordingly. Only
84
+ // after this has happened, we can get the custom data from SFB.
55
85
  // Attach to variantFetch and variantLoad events to be able to store and restore also custom filters and state of other controls (in case of page VM) with variant.
56
86
  // Events for storing/restoring are provided by SFB, data to be stored/restored can come from 3 sources:
57
87
  // - standard filters: handled directly by SFB
58
88
  // - extension filters: provided from mParams.oCustomFiltersWrapper
59
89
  // - other controls being part of VM: provided by oSVMWrapperCallbacks (controls with direct connection to VM are skipped in SVM wrapper)
60
- function setSVMWrapperCallbacks(oSVMWrapperCallbacks){
90
+ function setSVMWrapperCallbacks(oCallbacks){
91
+ oSVMWrapperCallbacks = oCallbacks;
61
92
  // Before saving the current state as a new variant, we need to provide all state data of controls controlled by VM, but not known to it with setCustomFilterData. From a
62
93
  // logical point of view, the event (beforeVariantFetch) as well as the method to store the extension data (setCustomFilterData) belong to SVM, but both are implemented
63
94
  // in SFB. Additionally, beforeVariantSave would actually be the name more logical to the consumer, however that name had been used earlier and was deprecated and
@@ -68,26 +99,8 @@ sap.ui.define([
68
99
  oCustomData[dataPropertyNameGeneric].customFilters = mParams.oCustomFiltersWrapper.getState();
69
100
  oSmartFilterBar.setCustomFilterData(oCustomData);
70
101
  });
71
-
72
- // When a variant is loaded, correspondingly we have to get the customData and apply the states to the controls not known to SVM. Again, event and method are implemented
73
- // in SFB instead of SVM where it would make more sense.
74
- // Here the event is afterVariantLoad, as the variant content known to SVM/SFB has first to be applied to the SFB, which will also pass the custom data accordingly. Only
75
- // after this has happened, we can get the custom data from SFB.
76
- oSmartFilterBar.attachAfterVariantLoad(function(){
77
- var oCustomData = oSmartFilterBar.getCustomFilterData();
78
- // variant stored with 1.103 or later: all customFilter data stored in property customFilters
79
- // legacy variant stored with 1.102 or earlier: customFilters (from storing point of view) separated according to their origin
80
- var oCustomFiltersState = oCustomData[dataPropertyNameGeneric].customFilters || {
81
- editState: oCustomData[dataPropertyNameGeneric].editStateFilter,
82
- appExtension: oCustomData[dataPropertyNameCustom],
83
- adaptationExtensions: oCustomData[dataPropertyNameExtension]
84
- };
85
- aBasicFilters = oSmartFilterBar.getAllFilterItems(true);
86
- mParams.oCustomFiltersWrapper.setState(oCustomFiltersState);
87
- oSVMWrapperCallbacks.setManagedControlStates(oCustomData[dataPropertyNameGeneric]);
88
- });
89
-
90
102
  }
103
+
91
104
  function fnGetState() {
92
105
  var oUiState = oSmartFilterBar.getUiState();
93
106
  // UiState is not Serializable, but a managed object, containing information only partly relevant
@@ -153,6 +153,13 @@ sap.ui.define([
153
153
  oState.variantId = oState.sVariantId;
154
154
  }
155
155
 
156
+ // Compare current passed and control states. If states are same, setting state make no change, but trigger table refresh.
157
+ // For performance reason we compare object stringified versions. Object key order should not change as it only get applied at runtime.
158
+ var oControlState = bVariantManagementActive ? oVariantManagementStateWrapper.getState() : oSmartControlStateWrapper.getState();
159
+ if (JSON.stringify(oState) === JSON.stringify(oControlState)) {
160
+ return;
161
+ }
162
+
156
163
  if (bVariantManagementActive) {
157
164
  // In case VariantManagement is configured
158
165
  oVariantManagementStateWrapper.setState(oState);
@@ -631,6 +631,7 @@ sap.ui.define([
631
631
 
632
632
  function restore(){
633
633
  oTemplateContract.oBusyHelper.setBusyReason("exiting", false);
634
+ oTemplateContract.oApplicationProxy.resetExternalNavigation();
634
635
  for (var sComponentId in oTemplateContract.componentRegistry){
635
636
  var oRegistryEntry = oTemplateContract.componentRegistry[sComponentId];
636
637
  if (oRegistryEntry.methods.onRestore) {
@@ -926,6 +927,7 @@ sap.ui.define([
926
927
  var fnNormalizePagesMapToArray = testableHelper.testable(fnNormalizePagesMapToArray, "fnNormalizePagesMapToArray");
927
928
  getConfig = testableHelper.testable(getConfig, "getConfig");
928
929
  testableHelper.testable(setLeaveAppPromise, "AppComponent_setLeaveAppPromise");
930
+ testableHelper.testable(restore, "AppComponent_restore");
929
931
  /* eslint-enable */
930
932
 
931
933
  return oMethods;
@@ -939,7 +941,7 @@ sap.ui.define([
939
941
  * @extends sap.ui.core.UIComponent
940
942
  * @abstract
941
943
  * @author SAP SE
942
- * @version 1.120.48
944
+ * @version 1.120.50
943
945
  * @name sap.suite.ui.generic.template.lib.AppComponent
944
946
  */
945
947
  return UIComponent.extend("sap.suite.ui.generic.template.lib.AppComponent", {
@@ -84,6 +84,11 @@ sap.ui.define(["sap/ui/base/Object",
84
84
  */
85
85
  function getMethods(oTemplateContract) {
86
86
 
87
+ // Set on first fnNavigateExternal call; blocks re-entry until reset. NavigationHandler.navigate() calls fnOnError
88
+ // on all failure paths and does not call it on the success path (app is leaving). The two valid reset points are
89
+ // therefore fnOnErrorWrapper (navigation failed) and AppComponent.restore() (FLP re-activated this app).
90
+ var bExternalNavigationTriggered = false;
91
+
87
92
  var oFocusHelper = new FocusHelper(oTemplateContract);
88
93
  var oContextBookkeeping = new ContextBookkeeping(oTemplateContract);
89
94
  var mEntitySetToETagInfo = Object.create(null); // maps the name of the entity sets which have been already checked for eTag
@@ -673,8 +678,13 @@ sap.ui.define(["sap/ui/base/Object",
673
678
  if (oCurrentNavigationHandler === GHOSTNAVIGATIONHANDLER){
674
679
  return;
675
680
  }
681
+ if (bExternalNavigationTriggered){
682
+ return;
683
+ }
684
+ bExternalNavigationTriggered = true;
676
685
  oTemplateContract.oNavigationControllerProxy.leave();
677
- var fnOnErrorWrapper = function(){
686
+ var fnOnErrorWrapper = function () {
687
+ bExternalNavigationTriggered = false;
678
688
  oFocusHelper.setNextFocus(Function.prototype); // Do not change focus in case exiting the application fails
679
689
  oTemplateContract.oBusyHelper.setBusyReason("exiting", false); // in error case we are not navigating away
680
690
  if (fnOnError){
@@ -802,6 +812,18 @@ sap.ui.define(["sap/ui/base/Object",
802
812
  oTemplateContract.oNavigationControllerProxy.preloadComponent(sRouteName);
803
813
  }
804
814
 
815
+ // Returns true when a navigation call will open in a new tab rather than replacing the current app.
816
+ // sap-ushell-navmode (manifest-level) takes priority; sap-ushell-next-navmode (FLP startup parameter,
817
+ // system-level) is the fallback — mirroring how NavigationHandler itself determines explace.
818
+ function fnIsExplaceNavigation(oOutboundParameters) {
819
+ if (oOutboundParameters && oOutboundParameters["sap-ushell-navmode"] === "explace") {
820
+ return true;
821
+ }
822
+ var oComponentData = oTemplateContract.oAppComponent.getComponentData && oTemplateContract.oAppComponent.getComponentData();
823
+ var oStartupParams = oComponentData && oComponentData.startupParameters;
824
+ return !!(oStartupParams && oStartupParams["sap-ushell-next-navmode"] && oStartupParams["sap-ushell-next-navmode"][0] === "explace");
825
+ }
826
+
805
827
  oTemplateContract.oApplicationProxy = { // inject own api for AppComponent into the Template Contract. Other classes (NavigationController, BusyHelper) will call these functions accordingly.
806
828
  getDraftSiblingPromise: oContextBookkeeping.getDraftSiblingPromise,
807
829
  getSiblingPromise: oContextBookkeeping.getSiblingPromise,
@@ -835,7 +857,10 @@ sap.ui.define(["sap/ui/base/Object",
835
857
  removeTransientMessages: fnRemoveTransientMessages,
836
858
  getTransientMessages: getTransientMessages,
837
859
  setNextFocus: oFocusHelper.setNextFocus,
838
- setStates: setStates
860
+ setStates: setStates,
861
+ resetExternalNavigation: function() {
862
+ bExternalNavigationTriggered = false;
863
+ }
839
864
  };
840
865
 
841
866
  return {
@@ -903,6 +928,7 @@ sap.ui.define(["sap/ui/base/Object",
903
928
  mustRequireRequestsCanonical: mustRequireRequestsCanonical,
904
929
  getNavigationHandler: getNavigationHandler,
905
930
  navigateExternal: fnNavigateExternal,
931
+ isExplaceNavigation: fnIsExplaceNavigation,
906
932
  getStatePreservationMode: getStatePreservationMode,
907
933
  setObjectInEditMode: fnSetObjectInEditMode,
908
934
  getObjectInEditMode: fnGetObjectInEditMode,
@@ -712,7 +712,16 @@ sap.ui.define(["sap/ui/base/Object",
712
712
  }
713
713
 
714
714
  // null object has to be passed as the fourth argument (i.e. for oInnerAppData) to the navigate method as an indicator that the state should not be overwritten
715
- oServices.oApplication.navigateExternal(oOutbound.semanticObject, oOutbound.action, oSelectionVariant.toJSONString(), null, oCommonUtils.handleError);
715
+ // Explace outbounds must bypass fnNavigateExternal to avoid setting the app busy and consuming the re-entry guard.
716
+ // getNavigationHandler() returns a ghost stub (no .navigate) when ghostapp=true — guard before calling.
717
+ if (oServices.oApplication.isExplaceNavigation(oOutbound.parameters)) {
718
+ var oNavHandler = oServices.oApplication.getNavigationHandler();
719
+ if (oNavHandler.navigate) {
720
+ oNavHandler.navigate(oOutbound.semanticObject, oOutbound.action, oSelectionVariant.toJSONString(), null, oCommonUtils.handleError, null, "explace");
721
+ }
722
+ } else {
723
+ oServices.oApplication.navigateExternal(oOutbound.semanticObject, oOutbound.action, oSelectionVariant.toJSONString(), null, oCommonUtils.handleError);
724
+ }
716
725
  }
717
726
 
718
727
  function fnNavigateIntentSmartLink(oOutbound, oEventSource) {
@@ -725,7 +734,15 @@ sap.ui.define(["sap/ui/base/Object",
725
734
  oCommonUtils.removePropertiesFromNavigationContext(oSelectionVariant, oEventSource);
726
735
  oController.adaptNavigationParameterExtension(oSelectionVariant, oObjectInfo);
727
736
  oCommonUtils.setComponentRefreshBehaviour(oOutbound);
728
- oServices.oApplication.navigateExternal(oOutbound.semanticObject, oOutbound.action, oSelectionVariant.toJSONString(), null, oCommonUtils.handleError);
737
+ // SmartLink outbounds have no manifest parameters so sap-ushell-navmode is never set.
738
+ // System-level sap-ushell-next-navmode can still force a new tab — bypass the re-entry guard in that case.
739
+ if (oServices.oApplication.isExplaceNavigation()) {
740
+ if (oNavigationHandler.navigate) {
741
+ oNavigationHandler.navigate(oOutbound.semanticObject, oOutbound.action, oSelectionVariant.toJSONString(), null, oCommonUtils.handleError, null, "explace");
742
+ }
743
+ } else {
744
+ oServices.oApplication.navigateExternal(oOutbound.semanticObject, oOutbound.action, oSelectionVariant.toJSONString(), null, oCommonUtils.handleError);
745
+ }
729
746
  }
730
747
 
731
748
  function fnHideTitleArea(oSmLiContent,aContactTitleArea) {
@@ -2498,7 +2515,16 @@ sap.ui.define(["sap/ui/base/Object",
2498
2515
  var oSelectionVariant = fnBuildSelectionVariantForNavigation(oOutbound, [], oContext);
2499
2516
  oController.adaptNavigationParameterExtension(oSelectionVariant, oOutbound);
2500
2517
  oCommonUtils.setComponentRefreshBehaviour(oOutbound);
2501
- oServices.oApplication.navigateExternal(oOutbound.semanticObject, oOutbound.action, oSelectionVariant.toJSONString(), null, oCommonUtils.handleError);
2518
+ // Explace outbounds must bypass fnNavigateExternal to avoid setting the app busy and consuming the re-entry guard.
2519
+ // getNavigationHandler() returns a ghost stub (no .navigate) when ghostapp=true — guard before calling.
2520
+ if (oServices.oApplication.isExplaceNavigation(oOutbound.parameters)) {
2521
+ var oNavHandler = oServices.oApplication.getNavigationHandler();
2522
+ if (oNavHandler.navigate) {
2523
+ oNavHandler.navigate(oOutbound.semanticObject, oOutbound.action, oSelectionVariant.toJSONString(), null, oCommonUtils.handleError, null, "explace");
2524
+ }
2525
+ } else {
2526
+ oServices.oApplication.navigateExternal(oOutbound.semanticObject, oOutbound.action, oSelectionVariant.toJSONString(), null, oCommonUtils.handleError);
2527
+ }
2502
2528
  }
2503
2529
 
2504
2530
  function onSmartFieldInitialise(oEvent,sViewId){
@@ -716,10 +716,10 @@ sap.ui.define(["sap/ui/base/Object",
716
716
 
717
717
  setComponentRefreshBehaviour(oOutbound);
718
718
 
719
- // We now ensure that the 'sap-ushell-navmode' parameter is passed to the NavigationHandler.navigate method
720
- // and skip setting the app to busy mode when opening a new tab
721
- if (oOutbound.parameters["sap-ushell-navmode"] === "explace") {
722
- oNavigationHandler.navigate(oOutbound.semanticObject, oOutbound.action, oSelectionVariant.toJSONString(), null, null, null, oOutbound.parameters["sap-ushell-navmode"]);
719
+ // We now skip setting the app to busy mode when opening a new tab and bypass the re-entry guard (fnNavigateExternal) for explace navigations:
720
+ // the source app stays alive when a new tab is opened, so without the bypass AppComponent.restore() is never called and the guard is never reset.
721
+ if (oServices.oApplication.isExplaceNavigation(oOutbound.parameters)) {
722
+ oNavigationHandler.navigate(oOutbound.semanticObject, oOutbound.action, oSelectionVariant.toJSONString(), null, null, null, "explace");
723
723
  } else {
724
724
  oServices.oApplication.navigateExternal(oOutbound.semanticObject, oOutbound.action, oSelectionVariant.toJSONString(), null, fnHandleError);
725
725
  //null object has to be passed to the NavigationHandler as an
@@ -811,7 +811,8 @@ sap.ui.define(["sap/ui/base/Object",
811
811
  // oResponse is never going to have the value for oDatafield.name in the encoded format, hence the transformation into encodedURI.
812
812
  // It may happen that the oResponse[oDatafield.name] contains some special characters (for ex: space) but in a decoded manner.
813
813
  // but the route for Context Navigation requires the route string in the encoded way.
814
- var sEncodedFieldValueFromODataResponse = encodeURIComponent(oResponse[oDatafield.name]);
814
+ var sFieldValueFromODataResponse = oResponse[oDatafield.name];
815
+ var sEncodedFieldValueFromODataResponse = encodeURIComponent(sFieldValueFromODataResponse);
815
816
  switch (oDatafield.type) {
816
817
  case "Edm.Guid":
817
818
  if (oResponse.DraftAdministrativeData && oResponse.DraftAdministrativeData.DraftIsCreatedByMe) {
@@ -838,6 +839,10 @@ sap.ui.define(["sap/ui/base/Object",
838
839
  var sFormattedvalue = ODataUtils.formatValue(sEncodedFieldValueFromODataResponse, oDatafield.type);
839
840
  sRoute += sKeySeparator + oDatafield.name + "=" + sFormattedvalue;
840
841
  break;
842
+ case "Edm.DateTime":
843
+ var sFormattedvalue = ODataUtils.formatValue(sFieldValueFromODataResponse, oDatafield.type);
844
+ sRoute += sKeySeparator + oDatafield.name + "=" + encodeURIComponent(sFormattedvalue);
845
+ break;
841
846
  default:
842
847
  if (typeof sEncodedFieldValueFromODataResponse === "string") {
843
848
  sRoute += sKeySeparator + oDatafield.name + "=" + "'" + sEncodedFieldValueFromODataResponse + "'";
@@ -43,6 +43,7 @@ sap.ui.define(["sap/suite/ui/generic/template/genericUtilities/metadataAnalyser"
43
43
  var oAppComponent = oComponent.getAppComponent();
44
44
  var oUIManifest = oAppComponent.getManifestEntry("sap.ui");
45
45
  var oAppManifest = oAppComponent.getManifestEntry("sap.app");
46
+ var oOutbounds = oAppManifest && oAppManifest["crossNavigation"] && oAppManifest["crossNavigation"]["outbounds"];
46
47
  if (oAppManifest && oAppManifest["crossNavigation"]) {
47
48
  delete oAppManifest["crossNavigation"];
48
49
  }
@@ -51,7 +52,7 @@ sap.ui.define(["sap/suite/ui/generic/template/genericUtilities/metadataAnalyser"
51
52
  oAppManifest.id = InsightsCardHelper.getCardId(oAppComponent);
52
53
  oManifest["sap.app"] = fnCreateManifestSapApp(oAppManifest);
53
54
  oManifest["sap.ui"] = oUIManifest;
54
- oManifest["sap.card"] = fnCreateManifestSapCard(oCardDefinition);
55
+ oManifest["sap.card"] = fnCreateManifestSapCard(oCardDefinition, oOutbounds);
55
56
  oManifest["sap.insights"] = fnCreateManifestSapInsight(oCardDefinition);
56
57
  oManifest["sap.ui5"] = fnCreateSapui5();
57
58
  return oManifest;
@@ -85,7 +86,7 @@ sap.ui.define(["sap/suite/ui/generic/template/genericUtilities/metadataAnalyser"
85
86
  return oManifestAppData;
86
87
  };
87
88
 
88
- var fnCreateManifestSapCard = function (oCardDefinition) {
89
+ var fnCreateManifestSapCard = function (oCardDefinition, oOutbounds) {
89
90
  var oCardConfig = {};
90
91
  var sComponentName = oCardDefinition['component'].getMetadata().getName();
91
92
  oCardConfig["type"] = getCardType(sComponentName);
@@ -98,7 +99,7 @@ sap.ui.define(["sap/suite/ui/generic/template/genericUtilities/metadataAnalyser"
98
99
  } else {
99
100
  oCardConfig["content"] = InsightsCardHelper.fnCreateManifestSapTableCardContent(oCardDefinition, oCardConfig);
100
101
  }
101
- InsightsCardHelper.getCardActions(oCardDefinition, oCardConfig);
102
+ InsightsCardHelper.getCardActions(oCardDefinition, oCardConfig, oOutbounds);
102
103
  return oCardConfig;
103
104
  };
104
105
 
@@ -696,7 +697,7 @@ sap.ui.define(["sap/suite/ui/generic/template/genericUtilities/metadataAnalyser"
696
697
  return aDimensions;
697
698
  };
698
699
 
699
- InsightsCardHelper.getCardActions = function (oCardDefinition, oSapCard) {
700
+ InsightsCardHelper.getCardActions = function (oCardDefinition, oSapCard, oOutbounds) {
700
701
  var sHash = window.hasher.getHash(), aSemanticObjAction = sHash.split('&/')[0];
701
702
 
702
703
  if (aSemanticObjAction.includes('?')) {
@@ -720,6 +721,10 @@ sap.ui.define(["sap/suite/ui/generic/template/genericUtilities/metadataAnalyser"
720
721
  }];
721
722
 
722
723
  var oContentParams = JSON.parse(JSON.stringify(oHeaderParams));
724
+ var oRowOutbound = fnGetRowNavigationOutbound(oOutbounds, aSemanticObjAction[0]);
725
+ if (oRowOutbound) {
726
+ oContentParams.ibnTarget = oRowOutbound;
727
+ }
723
728
 
724
729
  var oContentParameterValue = [{
725
730
  "type": "Navigation",
@@ -742,6 +747,21 @@ sap.ui.define(["sap/suite/ui/generic/template/genericUtilities/metadataAnalyser"
742
747
  }
743
748
  };
744
749
 
750
+ var fnGetRowNavigationOutbound = function (oOutbounds, sSemanticObject) {
751
+ if (!oOutbounds || !sSemanticObject) {
752
+ return null;
753
+ }
754
+ var oResult = null;
755
+ Object.keys(oOutbounds).some(function (sKey) {
756
+ var oOutbound = oOutbounds[sKey];
757
+ if (oOutbound && oOutbound.semanticObject === sSemanticObject && oOutbound.action) {
758
+ oResult = { semanticObject: oOutbound.semanticObject, action: oOutbound.action };
759
+ return oOutbound.action === "displayFactSheet";
760
+ }
761
+ });
762
+ return oResult;
763
+ };
764
+
745
765
  var fnGetLineItemAnnotation = function (oCardDefinition) {
746
766
  var oEntityType = oCardDefinition['entityType'];
747
767
  var aCustomData = oCardDefinition['currentControlHandler'].getControl().getCustomData();
@@ -3102,7 +3102,7 @@ sap.ui.define(["sap/ui/base/Object",
3102
3102
  * @param {sap.suite.ui.generic.template.lib.AppComponent} oAppComponent The AppComponent instance
3103
3103
  * @public
3104
3104
  * @extends sap.ui.base.Object
3105
- * @version 1.120.48
3105
+ * @version 1.120.50
3106
3106
  * @since 1.30.0
3107
3107
  * @alias sap.suite.ui.generic.template.lib.NavigationController
3108
3108
  */
@@ -60,7 +60,7 @@ sap.ui.define([
60
60
  interfaces: [],
61
61
  controls: [],
62
62
  elements: [],
63
- version: "1.120.48",
63
+ version: "1.120.50",
64
64
  extensions: {
65
65
  //Configuration used for rule loading of Support Assistant
66
66
  "sap.ui.support": {