@sapui5/sap.suite.ui.generic.template 1.136.2 → 1.138.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/src/sap/suite/ui/generic/template/.library +1 -1
- package/src/sap/suite/ui/generic/template/AnalyticalListPage/i18n/i18n_en_US_saprigi.properties +3 -1
- package/src/sap/suite/ui/generic/template/AnalyticalListPage/i18n/i18n_iw.properties +3 -3
- 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/manifest.json +1 -1
- package/src/sap/suite/ui/generic/template/ObjectPage/controller/MessageSortingHandler.js +3 -0
- package/src/sap/suite/ui/generic/template/ObjectPage/controller/RelatedAppsHandler.js +18 -27
- package/src/sap/suite/ui/generic/template/ObjectPage/i18n/i18n.properties +1 -1
- package/src/sap/suite/ui/generic/template/ObjectPage/i18n/i18n_ar.properties +1 -1
- package/src/sap/suite/ui/generic/template/ObjectPage/i18n/i18n_bg.properties +1 -1
- package/src/sap/suite/ui/generic/template/ObjectPage/i18n/i18n_ca.properties +1 -1
- package/src/sap/suite/ui/generic/template/ObjectPage/i18n/i18n_cnr.properties +1 -1
- package/src/sap/suite/ui/generic/template/ObjectPage/i18n/i18n_cs.properties +1 -1
- package/src/sap/suite/ui/generic/template/ObjectPage/i18n/i18n_cy.properties +1 -1
- package/src/sap/suite/ui/generic/template/ObjectPage/i18n/i18n_da.properties +2 -2
- package/src/sap/suite/ui/generic/template/ObjectPage/i18n/i18n_de.properties +1 -1
- package/src/sap/suite/ui/generic/template/ObjectPage/i18n/i18n_el.properties +1 -1
- package/src/sap/suite/ui/generic/template/ObjectPage/i18n/i18n_en.properties +1 -1
- package/src/sap/suite/ui/generic/template/ObjectPage/i18n/i18n_en_GB.properties +1 -1
- package/src/sap/suite/ui/generic/template/ObjectPage/i18n/i18n_en_US_saprigi.properties +7 -1
- package/src/sap/suite/ui/generic/template/ObjectPage/i18n/i18n_es.properties +4 -4
- package/src/sap/suite/ui/generic/template/ObjectPage/i18n/i18n_es_MX.properties +1 -1
- package/src/sap/suite/ui/generic/template/ObjectPage/i18n/i18n_et.properties +1 -1
- package/src/sap/suite/ui/generic/template/ObjectPage/i18n/i18n_fi.properties +1 -1
- package/src/sap/suite/ui/generic/template/ObjectPage/i18n/i18n_fr.properties +1 -1
- package/src/sap/suite/ui/generic/template/ObjectPage/i18n/i18n_fr_CA.properties +1 -1
- package/src/sap/suite/ui/generic/template/ObjectPage/i18n/i18n_hi.properties +1 -1
- package/src/sap/suite/ui/generic/template/ObjectPage/i18n/i18n_hr.properties +1 -1
- package/src/sap/suite/ui/generic/template/ObjectPage/i18n/i18n_hu.properties +1 -1
- package/src/sap/suite/ui/generic/template/ObjectPage/i18n/i18n_id.properties +1 -1
- package/src/sap/suite/ui/generic/template/ObjectPage/i18n/i18n_it.properties +1 -1
- package/src/sap/suite/ui/generic/template/ObjectPage/i18n/i18n_iw.properties +1 -1
- package/src/sap/suite/ui/generic/template/ObjectPage/i18n/i18n_ja.properties +1 -1
- package/src/sap/suite/ui/generic/template/ObjectPage/i18n/i18n_kk.properties +1 -1
- package/src/sap/suite/ui/generic/template/ObjectPage/i18n/i18n_ko.properties +2 -2
- package/src/sap/suite/ui/generic/template/ObjectPage/i18n/i18n_lt.properties +1 -1
- package/src/sap/suite/ui/generic/template/ObjectPage/i18n/i18n_lv.properties +1 -1
- package/src/sap/suite/ui/generic/template/ObjectPage/i18n/i18n_mk.properties +1 -1
- package/src/sap/suite/ui/generic/template/ObjectPage/i18n/i18n_ms.properties +1 -1
- package/src/sap/suite/ui/generic/template/ObjectPage/i18n/i18n_nl.properties +1 -1
- package/src/sap/suite/ui/generic/template/ObjectPage/i18n/i18n_no.properties +1 -1
- package/src/sap/suite/ui/generic/template/ObjectPage/i18n/i18n_pl.properties +1 -1
- package/src/sap/suite/ui/generic/template/ObjectPage/i18n/i18n_pt.properties +1 -1
- package/src/sap/suite/ui/generic/template/ObjectPage/i18n/i18n_pt_PT.properties +1 -1
- package/src/sap/suite/ui/generic/template/ObjectPage/i18n/i18n_ro.properties +1 -1
- package/src/sap/suite/ui/generic/template/ObjectPage/i18n/i18n_ru.properties +1 -1
- package/src/sap/suite/ui/generic/template/ObjectPage/i18n/i18n_sh.properties +1 -1
- package/src/sap/suite/ui/generic/template/ObjectPage/i18n/i18n_sk.properties +1 -1
- package/src/sap/suite/ui/generic/template/ObjectPage/i18n/i18n_sl.properties +1 -1
- package/src/sap/suite/ui/generic/template/ObjectPage/i18n/i18n_sr.properties +1 -1
- package/src/sap/suite/ui/generic/template/ObjectPage/i18n/i18n_sv.properties +1 -1
- package/src/sap/suite/ui/generic/template/ObjectPage/i18n/i18n_th.properties +3 -3
- package/src/sap/suite/ui/generic/template/ObjectPage/i18n/i18n_tr.properties +1 -1
- package/src/sap/suite/ui/generic/template/ObjectPage/i18n/i18n_uk.properties +1 -1
- package/src/sap/suite/ui/generic/template/ObjectPage/i18n/i18n_vi.properties +1 -1
- package/src/sap/suite/ui/generic/template/ObjectPage/i18n/i18n_zh_CN.properties +1 -1
- package/src/sap/suite/ui/generic/template/ObjectPage/i18n/i18n_zh_TW.properties +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/detailTemplates/detailUtils.js +2 -1
- package/src/sap/suite/ui/generic/template/genericUtilities/controlStateWrapperFactory/SmartFilterBarWrapper.js +2 -11
- package/src/sap/suite/ui/generic/template/js/AnnotationHelper.js +9 -1
- package/src/sap/suite/ui/generic/template/js/AnnotationHelperStreamSupport.js +6 -3
- package/src/sap/suite/ui/generic/template/lib/AppComponent.js +8 -8
- package/src/sap/suite/ui/generic/template/lib/CRUDActionHandler.js +1 -0
- package/src/sap/suite/ui/generic/template/lib/CRUDManager.js +12 -0
- package/src/sap/suite/ui/generic/template/lib/MessageUtils.js +76 -5
- package/src/sap/suite/ui/generic/template/lib/ai/EasyFilterBarHandler.js +17 -7
- package/src/sap/suite/ui/generic/template/lib/navigation/NavigationController.js +11 -5
- package/src/sap/suite/ui/generic/template/lib/presentationControl/SmartTableHandler.js +6 -6
- package/src/sap/suite/ui/generic/template/library.js +1 -1
|
@@ -120,7 +120,7 @@ NEW_ENTRY_GROUP=\u041D\u043E\u0432\u0438 \u0443\u043D\u043E\u0441\u0438
|
|
|
120
120
|
|
|
121
121
|
EDIT_BUTTON_DESCRIPTION=\u0423\u0440\u0435\u0434\u0438\:
|
|
122
122
|
|
|
123
|
-
FOOTER_REGION_LABEL_ARIA=\
|
|
123
|
+
FOOTER_REGION_LABEL_ARIA=\u041F\u043E\u0434\u043D\u043E\u0436\u0458\u0435
|
|
124
124
|
|
|
125
125
|
NAVIGATE_FORWARD_KEYBOARD_SHORTCUT_DESC=\u0423\u0441\u043C\u0435\u0440\u0438 \u043D\u0430\u043F\u0440\u0435\u0434
|
|
126
126
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
|
|
2
|
-
TITLE=\
|
|
2
|
+
TITLE=\u0E2B\u0E19\u0E49\u0E32\u0E02\u0E2D\u0E07\u0E2D\u0E2D\u0E1A\u0E40\u0E08\u0E04
|
|
3
3
|
|
|
4
|
-
DESCRIPTION=\
|
|
4
|
+
DESCRIPTION=\u0E2B\u0E19\u0E49\u0E32\u0E02\u0E2D\u0E07\u0E2D\u0E2D\u0E1A\u0E40\u0E08\u0E04
|
|
5
5
|
|
|
6
6
|
EDIT=\u0E41\u0E01\u0E49\u0E44\u0E02
|
|
7
7
|
|
|
@@ -120,7 +120,7 @@ NEW_ENTRY_GROUP=\u0E23\u0E32\u0E22\u0E01\u0E32\u0E23\u0E43\u0E2B\u0E21\u0E48
|
|
|
120
120
|
|
|
121
121
|
EDIT_BUTTON_DESCRIPTION=\u0E41\u0E01\u0E49\u0E44\u0E02\:
|
|
122
122
|
|
|
123
|
-
FOOTER_REGION_LABEL_ARIA=\
|
|
123
|
+
FOOTER_REGION_LABEL_ARIA=\u0E2A\u0E48\u0E27\u0E19\u0E17\u0E49\u0E32\u0E22
|
|
124
124
|
|
|
125
125
|
NAVIGATE_FORWARD_KEYBOARD_SHORTCUT_DESC=\u0E40\u0E19\u0E27\u0E34\u0E40\u0E01\u0E15\u0E44\u0E1B\u0E02\u0E49\u0E32\u0E07\u0E2B\u0E19\u0E49\u0E32
|
|
126
126
|
|
|
@@ -120,7 +120,7 @@ NEW_ENTRY_GROUP=Yeni giri\u015Fler
|
|
|
120
120
|
|
|
121
121
|
EDIT_BUTTON_DESCRIPTION=D\u00FCzenle\:
|
|
122
122
|
|
|
123
|
-
FOOTER_REGION_LABEL_ARIA=
|
|
123
|
+
FOOTER_REGION_LABEL_ARIA=Sayfa altl\u0131\u011F\u0131
|
|
124
124
|
|
|
125
125
|
NAVIGATE_FORWARD_KEYBOARD_SHORTCUT_DESC=\u0130leri git
|
|
126
126
|
|
|
@@ -120,7 +120,7 @@ NEW_ENTRY_GROUP=\u041D\u043E\u0432\u0456 \u0437\u0430\u043F\u0438\u0441\u0438
|
|
|
120
120
|
|
|
121
121
|
EDIT_BUTTON_DESCRIPTION=\u0420\u0435\u0434\u0430\u0433\u0443\u0432\u0430\u0442\u0438\:
|
|
122
122
|
|
|
123
|
-
FOOTER_REGION_LABEL_ARIA=\
|
|
123
|
+
FOOTER_REGION_LABEL_ARIA=\u041D\u0438\u0436\u043D\u0456\u0439 \u043A\u043E\u043B\u043E\u043D\u0442\u0438\u0442\u0443\u043B
|
|
124
124
|
|
|
125
125
|
NAVIGATE_FORWARD_KEYBOARD_SHORTCUT_DESC=\u041F\u0435\u0440\u0435\u0439\u0442\u0438 \u0432\u043F\u0435\u0440\u0435\u0434
|
|
126
126
|
|
|
@@ -120,7 +120,7 @@ NEW_ENTRY_GROUP=Mu\u0323c nh\u00E2\u0323p m\u01A1\u0301i
|
|
|
120
120
|
|
|
121
121
|
EDIT_BUTTON_DESCRIPTION=Hi\u00EA\u0323u chi\u0309nh\:
|
|
122
122
|
|
|
123
|
-
FOOTER_REGION_LABEL_ARIA=
|
|
123
|
+
FOOTER_REGION_LABEL_ARIA=Ch\u00E2n trang
|
|
124
124
|
|
|
125
125
|
NAVIGATE_FORWARD_KEYBOARD_SHORTCUT_DESC=\u0110i\u1EC1u h\u01B0\u1EDBng t\u1EDBi
|
|
126
126
|
|
|
@@ -120,7 +120,7 @@ NEW_ENTRY_GROUP=\u65B0\u6761\u76EE
|
|
|
120
120
|
|
|
121
121
|
EDIT_BUTTON_DESCRIPTION=\u7F16\u8F91\uFF1A
|
|
122
122
|
|
|
123
|
-
FOOTER_REGION_LABEL_ARIA=\u9875\u811A
|
|
123
|
+
FOOTER_REGION_LABEL_ARIA=\u9875\u811A
|
|
124
124
|
|
|
125
125
|
NAVIGATE_FORWARD_KEYBOARD_SHORTCUT_DESC=\u5411\u524D\u5BFC\u822A
|
|
126
126
|
|
|
@@ -120,7 +120,7 @@ NEW_ENTRY_GROUP=\u65B0\u8F38\u5165\u9805
|
|
|
120
120
|
|
|
121
121
|
EDIT_BUTTON_DESCRIPTION=\u7DE8\u8F2F\uFF1A
|
|
122
122
|
|
|
123
|
-
FOOTER_REGION_LABEL_ARIA=\
|
|
123
|
+
FOOTER_REGION_LABEL_ARIA=\u8868\u5C3E
|
|
124
124
|
|
|
125
125
|
NAVIGATE_FORWARD_KEYBOARD_SHORTCUT_DESC=\u5411\u524D\u700F\u89BD
|
|
126
126
|
|
|
@@ -331,7 +331,7 @@ sap.ui.define([ "sap/suite/ui/generic/template/genericUtilities/FeLogger", "sap/
|
|
|
331
331
|
sAncestorsTitle += sSeperator;
|
|
332
332
|
}
|
|
333
333
|
sHeaderText = `${sObjectTitle} ${sObjectSubtitle} ${sAncestorsTitle} ${sTitle}`;
|
|
334
|
-
return {
|
|
334
|
+
return {headerText : sHeaderText};
|
|
335
335
|
}
|
|
336
336
|
|
|
337
337
|
return {
|
|
@@ -339,4 +339,5 @@ sap.ui.define([ "sap/suite/ui/generic/template/genericUtilities/FeLogger", "sap/
|
|
|
339
339
|
getControllerBase: getControllerBase,
|
|
340
340
|
fnConstructTitleAdditionalInfo: fnConstructTitleAdditionalInfo
|
|
341
341
|
};
|
|
342
|
+
|
|
342
343
|
});
|
|
@@ -78,7 +78,7 @@ sap.ui.define([
|
|
|
78
78
|
appExtension: oCustomData[dataPropertyNameCustom],
|
|
79
79
|
adaptationExtensions: oCustomData[dataPropertyNameExtension]
|
|
80
80
|
};
|
|
81
|
-
|
|
81
|
+
|
|
82
82
|
mParams.oCustomFiltersWrapper.setState(oCustomFiltersState);
|
|
83
83
|
oSVMWrapperCallbacks.setManagedControlStates(oCustomData[dataPropertyNameGeneric]);
|
|
84
84
|
/* SFB header state of a variant (standard or custom) gets determined by the Apply Automatically checkbox's value of the corresponding
|
|
@@ -190,12 +190,6 @@ sap.ui.define([
|
|
|
190
190
|
oSelectOptions = oSelectOptions && oSelectOptions.filter(function(oSelectOption){
|
|
191
191
|
return oSelectOption.PropertyName !== dataPropertyNameGeneric;
|
|
192
192
|
});
|
|
193
|
-
// Get standard filters that are part of the standard variant but are currently not visible in the filterbar.
|
|
194
|
-
// This is only done if the variant has been modified (i.e., it's dirty).
|
|
195
|
-
const aStandardItems = oSmartFilterBar.getVariantManagement?.().getModified?.() ? oSmartFilterBar.getAllFilterItems().filter(function(oFilterItem){
|
|
196
|
-
return oFilterItem.getGroupName() === sap.ui.comp.filterbar.FilterBar.INTERNAL_GROUP && !oFilterItem.getVisibleInFilterBar();
|
|
197
|
-
}) : [];
|
|
198
|
-
|
|
199
193
|
return {
|
|
200
194
|
selectOptions: oSelectOptions,
|
|
201
195
|
parameters: oUiState.getSelectionVariant().Parameters,
|
|
@@ -206,10 +200,7 @@ sap.ui.define([
|
|
|
206
200
|
}).map(function(oFilterItem){
|
|
207
201
|
return oFilterItem.getName();
|
|
208
202
|
}),
|
|
209
|
-
|
|
210
|
-
// This is necessary because when the variant is dirty and the iAppState is shared or the app is refreshed, the final iAppState is applied on top of the standard variant.
|
|
211
|
-
// Keeping track of removed standard filters when the variant is dirty ensures the filter state remains consistent and avoids unexpected behavior for users.
|
|
212
|
-
removedFilterItems: Array.from(new Set(aBasicFilters.concat(aStandardItems))).filter(function(oFilterItem){
|
|
203
|
+
removedFilterItems: aBasicFilters.filter(function(oFilterItem){
|
|
213
204
|
return !oFilterItem.getVisibleInFilterBar();
|
|
214
205
|
}).map(function(oFilterItem){
|
|
215
206
|
return oFilterItem.getName();
|
|
@@ -3017,7 +3017,7 @@ sap.ui.define(["sap/ui/model/odata/AnnotationHelper",
|
|
|
3017
3017
|
};
|
|
3018
3018
|
}
|
|
3019
3019
|
},
|
|
3020
|
-
|
|
3020
|
+
getTextArrangementFromAnnotations: function (oEntityType, oField) {
|
|
3021
3021
|
var sTextArrangement;
|
|
3022
3022
|
// 1. check TextArrangement definition for property directly - has prio 1
|
|
3023
3023
|
if (oField["com.sap.vocabularies.UI.v1.TextArrangement"] && oField["com.sap.vocabularies.UI.v1.TextArrangement"].EnumMember) {
|
|
@@ -3036,11 +3036,19 @@ sap.ui.define(["sap/ui/model/odata/AnnotationHelper",
|
|
|
3036
3036
|
sTextArrangement = oAnnotationHelper._mapTextArrangement4smartControl(oEntityType["com.sap.vocabularies.UI.v1.TextArrangement"].EnumMember);
|
|
3037
3037
|
}
|
|
3038
3038
|
}
|
|
3039
|
+
return sTextArrangement;
|
|
3040
|
+
},
|
|
3041
|
+
getTextArrangement: function(oEntityType, oField) {
|
|
3042
|
+
var sTextArrangement = this.getTextArrangementFromAnnotations(oEntityType, oField);
|
|
3039
3043
|
if (!sTextArrangement) { //coming from the title should get a readable description and underneath is the id - the default
|
|
3040
3044
|
sTextArrangement = "descriptionAndId";
|
|
3041
3045
|
}
|
|
3042
3046
|
return sTextArrangement;
|
|
3043
3047
|
},
|
|
3048
|
+
getTextArrangementForEasyFilter: function (oEntityType, oField) {
|
|
3049
|
+
var sTextArrangement = this.getTextArrangementFromAnnotations(oEntityType, oField) || "idAndDescription";
|
|
3050
|
+
return sTextArrangement;
|
|
3051
|
+
},
|
|
3044
3052
|
getTextArrangementPath: function (oField) {
|
|
3045
3053
|
return oField["com.sap.vocabularies.Common.v1.Text"] && oField["com.sap.vocabularies.Common.v1.Text"].Path;
|
|
3046
3054
|
},
|
|
@@ -126,13 +126,16 @@ sap.ui.define([
|
|
|
126
126
|
|
|
127
127
|
// funtion return the controlling binding path form by annotation/metadata/fieldcontrol path
|
|
128
128
|
getControlPath: function(oEntitySet, oFieldControl) {
|
|
129
|
+
var sPath = "";
|
|
129
130
|
var sAnnotationUpdatablePath = oEntitySet && oEntitySet["Org.OData.Capabilities.V1.UpdateRestrictions"] && oEntitySet["Org.OData.Capabilities.V1.UpdateRestrictions"]["Updatable"] && oEntitySet["Org.OData.Capabilities.V1.UpdateRestrictions"]["Updatable"].Path;
|
|
130
131
|
var sMetadataUpdatable = oEntitySet && (oEntitySet["sap:updatable"] || oEntitySet["sap:updatable-path"]);
|
|
131
132
|
if (sAnnotationUpdatablePath || sMetadataUpdatable) {
|
|
132
|
-
|
|
133
|
-
} else if (oFieldControl) {
|
|
134
|
-
return '${' + oFieldControl && oFieldControl.Path + '} > "1"';
|
|
133
|
+
sPath = '${' + (sAnnotationUpdatablePath || sMetadataUpdatable) + '} !== false';
|
|
135
134
|
}
|
|
135
|
+
if (oFieldControl) {
|
|
136
|
+
sPath += '&& ${' + oFieldControl && oFieldControl.Path + '} > "1"';
|
|
137
|
+
}
|
|
138
|
+
return sPath;
|
|
136
139
|
},
|
|
137
140
|
|
|
138
141
|
getDeleteStreamVisibility: function(oInterface, oMediaType, bIsDraftEnabled, oEntitySet){
|
|
@@ -32,7 +32,6 @@ sap.ui.define([
|
|
|
32
32
|
"sap/ui/model/json/JSONModel",
|
|
33
33
|
"sap/ui/model/odata/MessageScope",
|
|
34
34
|
"sap/ui/model/resource/ResourceModel",
|
|
35
|
-
"sap/ui/rta/RuntimeAuthoring",
|
|
36
35
|
"sap/ui/generic/app/ApplicationController",
|
|
37
36
|
"sap/suite/ui/generic/template/genericUtilities/ProcessObserver",
|
|
38
37
|
"sap/suite/ui/generic/template/designtime/utils/DesigntimeHandler",
|
|
@@ -76,7 +75,6 @@ sap.ui.define([
|
|
|
76
75
|
JSONModel,
|
|
77
76
|
MessageScope,
|
|
78
77
|
ResourceModel,
|
|
79
|
-
RuntimeAuthoring,
|
|
80
78
|
ApplicationController,
|
|
81
79
|
ProcessObserver,
|
|
82
80
|
DesigntimeHandler,
|
|
@@ -421,10 +419,6 @@ sap.ui.define([
|
|
|
421
419
|
oLogger.info("Init called for AppComponent " + sAppComponentId);
|
|
422
420
|
var oDesigntimeHandler = new DesigntimeHandler(oTemplateContract);
|
|
423
421
|
mDesigntimeHandlers[sAppComponentId] = oDesigntimeHandler;
|
|
424
|
-
if (RuntimeAuthoring.willRTAStartAfterReload()){
|
|
425
|
-
oLogger.info("AppComponent " + sAppComponentId + " has been restarted for RTA");
|
|
426
|
-
oDesigntimeHandler.start(true);
|
|
427
|
-
}
|
|
428
422
|
var oAppRegistryEntry = {
|
|
429
423
|
appComponent: oAppComponent,
|
|
430
424
|
oTemplateContract: oTemplateContract,
|
|
@@ -950,7 +944,7 @@ sap.ui.define([
|
|
|
950
944
|
* @public
|
|
951
945
|
* @extends sap.ui.core.UIComponent
|
|
952
946
|
* @author SAP SE
|
|
953
|
-
* @version 1.
|
|
947
|
+
* @version 1.138.0
|
|
954
948
|
* @name sap.suite.ui.generic.template.lib.AppComponent
|
|
955
949
|
*/
|
|
956
950
|
var oAppComponent = UIComponent.extend("sap.suite.ui.generic.template.lib.AppComponent", {
|
|
@@ -1073,10 +1067,16 @@ sap.ui.define([
|
|
|
1073
1067
|
designtime: {
|
|
1074
1068
|
tool : {
|
|
1075
1069
|
start: function(oAppComponent) {
|
|
1070
|
+
var RuntimeAuthoring = sap.ui.require("sap/ui/rta/RuntimeAuthoring");
|
|
1076
1071
|
var sAppComponentId = oAppComponent.getId();
|
|
1077
1072
|
oLogger.info("Ui Adaptation started for AppComponent " + sAppComponentId);
|
|
1078
1073
|
var oDesigntimeHandler = mDesigntimeHandlers[sAppComponentId];
|
|
1079
|
-
|
|
1074
|
+
if (RuntimeAuthoring && RuntimeAuthoring.willRTAStartAfterReload()){
|
|
1075
|
+
oLogger.info("AppComponent " + sAppComponentId + " has been restarted for RTA");
|
|
1076
|
+
oDesigntimeHandler.start(true);
|
|
1077
|
+
} else {
|
|
1078
|
+
oDesigntimeHandler.start();
|
|
1079
|
+
}
|
|
1080
1080
|
},
|
|
1081
1081
|
stop: function(oAppComponent) {
|
|
1082
1082
|
var sAppComponentId = oAppComponent.getId();
|
|
@@ -760,6 +760,14 @@ sap.ui.define(["sap/ui/base/Object",
|
|
|
760
760
|
aSuccess = aSuccess.concat(mapToArray(oParsedResult.mSuccess));
|
|
761
761
|
aWarningIndex = Object.keys(oParsedResult.mWarning);
|
|
762
762
|
aWarning = mapToArray(oParsedResult.mWarning);
|
|
763
|
+
aWarning.forEach((oWarning) => {
|
|
764
|
+
// Check if the response has a status code 412 (Precondition Failed)
|
|
765
|
+
if (oWarning?.response?.statusCode === "412"){
|
|
766
|
+
const oErrorReponse = JSON.parse(oWarning?.response?.responseText);
|
|
767
|
+
// Cache the error message to avoid duplicate display later
|
|
768
|
+
MessageUtils.cacheWarningMessage(oErrorReponse.error);
|
|
769
|
+
}
|
|
770
|
+
});
|
|
763
771
|
fnShowWarningPopupIfRequired(oParsedResult.aMessagesForUserDecision, fnDone.bind(null, aResponse));
|
|
764
772
|
};
|
|
765
773
|
var fnDone = function(aResponses){
|
|
@@ -811,6 +819,8 @@ sap.ui.define(["sap/ui/base/Object",
|
|
|
811
819
|
|
|
812
820
|
if (oResponseContext && oResponseContext !== oActionContext && oResponseContext.getPath() !== "/undefined"){
|
|
813
821
|
oServices.oApplication.setNextFocus(function(oBeforeData, fnFallback){
|
|
822
|
+
// Clear any cached error messages since the action has completed
|
|
823
|
+
MessageUtils.clearWarningCache();
|
|
814
824
|
fnFallback({
|
|
815
825
|
ignorePersistence: true
|
|
816
826
|
});
|
|
@@ -819,6 +829,8 @@ sap.ui.define(["sap/ui/base/Object",
|
|
|
819
829
|
} else {
|
|
820
830
|
// Restore focus, because we don't navigate out
|
|
821
831
|
oServices.oApplication.setNextFocus(function(oBeforeData, fnFallback){
|
|
832
|
+
// Clear any cached error messages since the action has completed
|
|
833
|
+
MessageUtils.clearWarningCache();
|
|
822
834
|
fnFallback();
|
|
823
835
|
});
|
|
824
836
|
}
|
|
@@ -26,6 +26,7 @@ sap.ui.define([
|
|
|
26
26
|
*/
|
|
27
27
|
var oLogger = new FeLogger("lib.MessageUtils").getLogger();
|
|
28
28
|
var oMessageManager = sap.ui.getCore().getMessageManager();
|
|
29
|
+
const aWarningCache = [];
|
|
29
30
|
|
|
30
31
|
/**
|
|
31
32
|
* Handles errors for all of Smart Templates.
|
|
@@ -400,14 +401,14 @@ sap.ui.define([
|
|
|
400
401
|
*/
|
|
401
402
|
function fnHandleTransientMessages(oTemplateContract, sActionLabel, oActionButtonConfig) {
|
|
402
403
|
var fnFilter = oTemplateContract.oApplicationProxy.isTransientMessageNoCustomMessage;
|
|
404
|
+
var sState; // Only one message which is a success (or info/None) message -> show as message toast
|
|
405
|
+
// Remove transient messages that already exist in the error cache
|
|
406
|
+
fnRemoveTransientMessages(isDuplicateMessage.bind(this));
|
|
403
407
|
var aTransientMessages = fnGetTransientMessages(false, fnFilter);
|
|
404
408
|
if (aTransientMessages.length === 0) { // no transient messages -> immediate return
|
|
405
409
|
return Promise.resolve();
|
|
406
410
|
}
|
|
407
411
|
fnRemoveTransientMessages(fnFilter); // remove transient messages from the message model. We can use aTransientMessages now.
|
|
408
|
-
|
|
409
|
-
var sState;
|
|
410
|
-
// Only one message which is a success (or info/None) message -> show as message toast
|
|
411
412
|
if (aTransientMessages.length === 1) {
|
|
412
413
|
sState = aTransientMessages[0].type;
|
|
413
414
|
if (sState === ValueState.Success || sState === ValueState.Information || sState === ValueState.None) {
|
|
@@ -418,7 +419,6 @@ sap.ui.define([
|
|
|
418
419
|
|
|
419
420
|
var oMsgDialogHeaderInfo = getMessageDialogTitleAndSeverity(aTransientMessages, oTemplateContract);
|
|
420
421
|
sState = oMsgDialogHeaderInfo.sSeverity;
|
|
421
|
-
|
|
422
422
|
// Now we know that we need to send a popup -> return a Promise that is resolved when the popup is closed
|
|
423
423
|
return new Promise(function(fnResolve){
|
|
424
424
|
// Now we prepare the controller of the dialog which will display the messages. However, we have to be careful.
|
|
@@ -604,6 +604,73 @@ sap.ui.define([
|
|
|
604
604
|
oMessageManager.removeMessages(aMessagesToBeDeleted);
|
|
605
605
|
}
|
|
606
606
|
|
|
607
|
+
/**
|
|
608
|
+
* Caches the error detail from a warning message, if available.
|
|
609
|
+
* This helps in tracking previously shown warnings to avoid duplicates.
|
|
610
|
+
*
|
|
611
|
+
* @param {object} oWarning - The warning object possibly containing error details.
|
|
612
|
+
*/
|
|
613
|
+
function cacheWarningMessage(oWarning){
|
|
614
|
+
const oError = oWarning?.innererror?.errordetails?.[0];
|
|
615
|
+
if (oError){
|
|
616
|
+
aWarningCache.push(oError);
|
|
617
|
+
}
|
|
618
|
+
}
|
|
619
|
+
|
|
620
|
+
/**
|
|
621
|
+
* Compares two message objects to check if they are equivalent.
|
|
622
|
+
* Only considers specific parameters in the comparison.
|
|
623
|
+
*
|
|
624
|
+
* @param {object} oMessageDetailsOld - The first error message object
|
|
625
|
+
* @param {object} oMessageDetailsNew - The second error message object.
|
|
626
|
+
* @returns {boolean} - True if both errors are the same, false otherwise.
|
|
627
|
+
*/
|
|
628
|
+
function areMessagesSame (oMessageDetailsOld, oMessageDetailsNew) {
|
|
629
|
+
// These are the properties used for comparison
|
|
630
|
+
// We have removed properties numericSeverity, additionalTargets, longtextUrl since they are only relevant for V4
|
|
631
|
+
const aParameters = ["code", "message", "severity", "target", "transition"];
|
|
632
|
+
for (const sParam of aParameters){
|
|
633
|
+
const bIsParamInOldMessage = sParam in oMessageDetailsOld;
|
|
634
|
+
const bIsParamInNewMessage = sParam in oMessageDetailsNew;
|
|
635
|
+
if (bIsParamInOldMessage && bIsParamInNewMessage) {
|
|
636
|
+
// Compare values if property exists in both objects
|
|
637
|
+
if (oMessageDetailsOld[sParam] !== oMessageDetailsNew[sParam]) {
|
|
638
|
+
return false;
|
|
639
|
+
}
|
|
640
|
+
} else if (bIsParamInOldMessage || bIsParamInNewMessage) {
|
|
641
|
+
// Property exists in only one object, not equal
|
|
642
|
+
return false;
|
|
643
|
+
}
|
|
644
|
+
}
|
|
645
|
+
return true;
|
|
646
|
+
}
|
|
647
|
+
|
|
648
|
+
/**
|
|
649
|
+
* Checks whether the given transient message is a duplicate of any cached error message.
|
|
650
|
+
*
|
|
651
|
+
* @param {object} oTransientMessage - The transient message containing technical details.
|
|
652
|
+
* @returns {boolean} - True if it's a duplicate, false otherwise.
|
|
653
|
+
*/
|
|
654
|
+
function isDuplicateMessage (oTransientMessage) {
|
|
655
|
+
const rawMessage = oTransientMessage?.technicalDetails?.headers?.["sap-message"];
|
|
656
|
+
if (!rawMessage) {
|
|
657
|
+
return false;
|
|
658
|
+
}
|
|
659
|
+
let oError;
|
|
660
|
+
oError = JSON.parse(rawMessage);
|
|
661
|
+
// Check if any cached error matches the parsed error
|
|
662
|
+
return aWarningCache.some((oCachedError) => this.areMessagesSame(oCachedError, oError));
|
|
663
|
+
}
|
|
664
|
+
|
|
665
|
+
/**
|
|
666
|
+
* Clears the stored cache of warning messages.
|
|
667
|
+
* Should be called when a fresh state is needed (e.g.,action completion).
|
|
668
|
+
*/
|
|
669
|
+
function clearWarningCache() {
|
|
670
|
+
// Empty the cache array in-place
|
|
671
|
+
aWarningCache.length = 0;
|
|
672
|
+
}
|
|
673
|
+
|
|
607
674
|
return {
|
|
608
675
|
operations: GenericMessageUtil.operations,
|
|
609
676
|
handleTransientMessages: fnHandleTransientMessages,
|
|
@@ -620,6 +687,10 @@ sap.ui.define([
|
|
|
620
687
|
getSeverityIconFromIconPool: getSeverityIconFromIconPool,
|
|
621
688
|
getIconColor: getIconColor,
|
|
622
689
|
getMessageDialogTitleAndSeverity: getMessageDialogTitleAndSeverity,
|
|
623
|
-
deleteMessages: deleteMessages
|
|
690
|
+
deleteMessages: deleteMessages,
|
|
691
|
+
cacheWarningMessage: cacheWarningMessage,
|
|
692
|
+
areMessagesSame: areMessagesSame,
|
|
693
|
+
isDuplicateMessage: isDuplicateMessage,
|
|
694
|
+
clearWarningCache: clearWarningCache
|
|
624
695
|
};
|
|
625
696
|
});
|
|
@@ -137,12 +137,22 @@ sap.ui.define([
|
|
|
137
137
|
});
|
|
138
138
|
});
|
|
139
139
|
} else if (oDefaultFilterValue) { // In cases where the default value is coming from the FLP user defaults and does not have ranges and the value is a single value
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
140
|
+
if (oFilterItemForQuery.dataType === "Edm.Boolean") {
|
|
141
|
+
var boolFilterValue = JSON.parse(oDefaultFilterValue);
|
|
142
|
+
aValues = [
|
|
143
|
+
{
|
|
144
|
+
operator: FilterOperator.EQ,
|
|
145
|
+
selectedValues: [{ value: boolFilterValue, description: boolFilterValue }]
|
|
146
|
+
}
|
|
147
|
+
];
|
|
148
|
+
} else {
|
|
149
|
+
aValues = [
|
|
150
|
+
{
|
|
151
|
+
operator: FilterOperator.EQ,
|
|
152
|
+
selectedValues: [oDefaultFilterValue]
|
|
153
|
+
}
|
|
154
|
+
];
|
|
155
|
+
}
|
|
146
156
|
}
|
|
147
157
|
oFilterItemForQuery.defaultValue = aValues;
|
|
148
158
|
}
|
|
@@ -574,7 +584,7 @@ sap.ui.define([
|
|
|
574
584
|
var oValueHelpProperty = oSFBMetaModel.getODataProperty(oValueHelpEntity, key);
|
|
575
585
|
var aResults = oResponse.results;
|
|
576
586
|
var sTextArrangementPath = AnnotationHelper.getTextArrangementPath(oValueHelpProperty);
|
|
577
|
-
var sTextArrangement = AnnotationHelper.
|
|
587
|
+
var sTextArrangement = AnnotationHelper.getTextArrangementForEasyFilter(oValueHelpEntity,oValueHelpProperty);
|
|
578
588
|
var navigationProperty = null;
|
|
579
589
|
var sEntityForTextDescription = null;
|
|
580
590
|
|
|
@@ -340,7 +340,13 @@ sap.ui.define(["sap/ui/base/Object",
|
|
|
340
340
|
|
|
341
341
|
fnInitializeHistory();
|
|
342
342
|
var fnInitializeRouter = bIsFirst ? oNavigationControllerProxy.initialize : Function.prototype;
|
|
343
|
-
|
|
343
|
+
// Parameter is used to override Hash logic, only applicable to case then FEv2 app is launched as embedded application from MyInbox;
|
|
344
|
+
var bIsAppEmbeddedOne = !!oComponentData
|
|
345
|
+
&& !!oComponentData.oStartupParameters
|
|
346
|
+
&& !!oComponentData.oStartupParameters['openMode']
|
|
347
|
+
&& oComponentData.oStartupParameters['openMode'].length > 0
|
|
348
|
+
&& oComponentData.oStartupParameters['openMode'].some(function (sValue) {return sValue === 'embedIntoDetailsNestedRouter';});
|
|
349
|
+
var oData = !bIsRestoring && (!oNavigationControllerProxy.oHashChanger.getHash() || bIsAppEmbeddedOne) && oComponentData;
|
|
344
350
|
var oStartupParameters = oData && oData.startupParameters;
|
|
345
351
|
if (oStartupParameters){
|
|
346
352
|
startupParameterHelper.parametersToNavigation(oTemplateContract, oStartupParameters).then(function(oMessageParameters){
|
|
@@ -2253,9 +2259,9 @@ sap.ui.define(["sap/ui/base/Object",
|
|
|
2253
2259
|
if (oTreeNode.contextTargets){
|
|
2254
2260
|
for (var i = 0; i < oTreeNode.contextTargets.length; i++){
|
|
2255
2261
|
var oContextTarget = oTreeNode.contextTargets[i];
|
|
2256
|
-
// Link control used for BreadCrumbs is bound to the context of the ancestor node as the description is fetched from
|
|
2257
|
-
// the ancestor object. Unfortunately, the OP where the link is on the OP & its context is propagated, even specific call
|
|
2258
|
-
// to set the context of ancestor node is not respected as the model find a context which is already bound. Hence, we need
|
|
2262
|
+
// Link control used for BreadCrumbs is bound to the context of the ancestor node as the description is fetched from
|
|
2263
|
+
// the ancestor object. Unfortunately, the OP where the link is on the OP & its context is propagated, even specific call
|
|
2264
|
+
// to set the context of ancestor node is not respected as the model find a context which is already bound. Hence, we need
|
|
2259
2265
|
// to break the propagation of current object context before setting the context of ancestor node.
|
|
2260
2266
|
oContextTarget.setBindingContext(null);
|
|
2261
2267
|
oTreeNode.bindElement(oContextTarget, null, false);
|
|
@@ -3210,7 +3216,7 @@ sap.ui.define(["sap/ui/base/Object",
|
|
|
3210
3216
|
* @param {sap.suite.ui.generic.template.lib.AppComponent} oAppComponent The AppComponent instance
|
|
3211
3217
|
* @public
|
|
3212
3218
|
* @extends sap.ui.base.Object
|
|
3213
|
-
* @version 1.
|
|
3219
|
+
* @version 1.138.0
|
|
3214
3220
|
* @since 1.30.0
|
|
3215
3221
|
* @alias sap.suite.ui.generic.template.lib.NavigationController
|
|
3216
3222
|
*/
|
|
@@ -588,18 +588,18 @@ sap.ui.define([
|
|
|
588
588
|
const filterIgnoredFields = function (sField) {
|
|
589
589
|
return !aIgnoreFields.has(sField);
|
|
590
590
|
};
|
|
591
|
-
const
|
|
592
|
-
return !!mPropertyByFieldName[sField]["com.sap.vocabularies.UI.v1.Hidden"];
|
|
591
|
+
const hasUIHiddenOrUndefined = function(sField) {
|
|
592
|
+
return !!mPropertyByFieldName[sField]["com.sap.vocabularies.UI.v1.Hidden"] || oItemContext.getProperty(sField) === undefined;
|
|
593
593
|
};
|
|
594
594
|
for (const oProperty of aProperties){
|
|
595
595
|
mPropertyByFieldName[oProperty.name] = oProperty;
|
|
596
596
|
}
|
|
597
597
|
//Filter unwanted fields ("IsActiveEntity", "DraftUUID") from technical keys
|
|
598
598
|
aTechnicalKeys = aTechnicalKeys.filter(key => filterIgnoredFields(key.name));
|
|
599
|
-
//Check for UI.Hidden fields, even if one of the field
|
|
600
|
-
aSemanticKeys = aSemanticKeys.some(key =>
|
|
601
|
-
aTechnicalKeys = aTechnicalKeys.some(key =>
|
|
602
|
-
if (oHeaderInfoField && oHeaderInfoField?.Title?.Value?.Path && !
|
|
599
|
+
//Check for UI.Hidden fields or undefined fields, even if one of the field satisfies these conditions we discard all the keys
|
|
600
|
+
aSemanticKeys = aSemanticKeys.some(key => hasUIHiddenOrUndefined(key.PropertyPath)) ? [] : aSemanticKeys;
|
|
601
|
+
aTechnicalKeys = aTechnicalKeys.some(key => hasUIHiddenOrUndefined(key.name)) ? [] : aTechnicalKeys;
|
|
602
|
+
if (oHeaderInfoField && oHeaderInfoField?.Title?.Value?.Path && !hasUIHiddenOrUndefined(oHeaderInfoField.Title.Value.Path)) { //HeaderInfoField is available
|
|
603
603
|
aRelevantColumns.push(getFieldProps(oHeaderInfoField.Title.Value.Path));
|
|
604
604
|
} else if (aSemanticKeys.length > 0){ //HeaderInfoField is not available, but SemanticKey is available
|
|
605
605
|
aRelevantColumns = aSemanticKeys.map(key => getFieldProps(key.PropertyPath));
|