@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 +1 -1
- package/src/sap/suite/ui/generic/template/.library +1 -1
- package/src/sap/suite/ui/generic/template/AnalyticalListPage/manifest.json +1 -1
- package/src/sap/suite/ui/generic/template/Canvas/manifest.json +1 -1
- package/src/sap/suite/ui/generic/template/ListReport/i18n/i18n_zh_CN.properties +2 -2
- package/src/sap/suite/ui/generic/template/ListReport/manifest.json +1 -1
- package/src/sap/suite/ui/generic/template/ObjectPage/manifest.json +1 -1
- package/src/sap/suite/ui/generic/template/QuickCreate/manifest.json +1 -1
- package/src/sap/suite/ui/generic/template/QuickView/manifest.json +1 -1
- package/src/sap/suite/ui/generic/template/genericUtilities/controlStateWrapperFactory/SmartFilterBarWrapper.js +33 -20
- package/src/sap/suite/ui/generic/template/genericUtilities/controlStateWrapperFactory/SmartTableChartCommon.js +7 -0
- package/src/sap/suite/ui/generic/template/lib/AppComponent.js +3 -1
- package/src/sap/suite/ui/generic/template/lib/Application.js +28 -2
- package/src/sap/suite/ui/generic/template/lib/CommonEventHandlers.js +29 -3
- package/src/sap/suite/ui/generic/template/lib/CommonUtils.js +10 -5
- package/src/sap/suite/ui/generic/template/lib/insights/InsightsCardHelper.js +24 -4
- package/src/sap/suite/ui/generic/template/lib/navigation/NavigationController.js +1 -1
- package/src/sap/suite/ui/generic/template/library.js +1 -1
package/package.json
CHANGED
|
@@ -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
|
|
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
|
|
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
|
|
|
@@ -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(
|
|
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.
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
720
|
-
//
|
|
721
|
-
if (oOutbound.parameters
|
|
722
|
-
oNavigationHandler.navigate(oOutbound.semanticObject, oOutbound.action, oSelectionVariant.toJSONString(), null, null, null,
|
|
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
|
|
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
|
-
|
|
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.
|
|
3105
|
+
* @version 1.120.50
|
|
3106
3106
|
* @since 1.30.0
|
|
3107
3107
|
* @alias sap.suite.ui.generic.template.lib.NavigationController
|
|
3108
3108
|
*/
|