@sapui5/sap.suite.ui.generic.template 1.133.0 → 1.134.2
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.properties +7 -7
- package/src/sap/suite/ui/generic/template/AnalyticalListPage/manifest.json +1 -1
- package/src/sap/suite/ui/generic/template/Canvas/extensionAPI/ExtensionAPI.js +11 -3
- package/src/sap/suite/ui/generic/template/Canvas/manifest.json +1 -1
- package/src/sap/suite/ui/generic/template/ListReport/extensionAPI/ExtensionAPI.js +11 -9
- package/src/sap/suite/ui/generic/template/ListReport/i18n/i18n.properties +3 -3
- package/src/sap/suite/ui/generic/template/ListReport/manifest.json +1 -1
- package/src/sap/suite/ui/generic/template/ListReport/view/ListReport.view.xml +1 -1
- package/src/sap/suite/ui/generic/template/ListReport/view/fragments/SmartFilterBar.fragment.xml +1 -1
- package/src/sap/suite/ui/generic/template/ObjectPage/controller/MessageSortingHandler.js +22 -5
- package/src/sap/suite/ui/generic/template/ObjectPage/extensionAPI/DraftTransactionController.js +8 -10
- package/src/sap/suite/ui/generic/template/ObjectPage/extensionAPI/ExtensionAPI.js +34 -14
- package/src/sap/suite/ui/generic/template/ObjectPage/i18n/i18n.properties +22 -4
- package/src/sap/suite/ui/generic/template/ObjectPage/manifest.json +1 -1
- package/src/sap/suite/ui/generic/template/ObjectPage/templateSpecificPreparationHelper.js +233 -125
- package/src/sap/suite/ui/generic/template/ObjectPage/view/fragments/Facet.fragment.xml +32 -27
- package/src/sap/suite/ui/generic/template/ObjectPage/view/fragments/SmartTable.fragment.xml +7 -11
- 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/designtime/controls/ObjectPageLayout.designtime.js +29 -12
- package/src/sap/suite/ui/generic/template/designtime/controls/SmartTable.designtime.js +29 -28
- package/src/sap/suite/ui/generic/template/designtime/floorplans/AnalyticalListPage.designtime.js +3 -1
- package/src/sap/suite/ui/generic/template/designtime/floorplans/ListReport.designtime.js +3 -1
- package/src/sap/suite/ui/generic/template/designtime/floorplans/ObjectPage.designtime.js +4 -1
- package/src/sap/suite/ui/generic/template/detailTemplates/DiscardEditHandler.js +13 -0
- package/src/sap/suite/ui/generic/template/fragments/DraftAdminDataPopover.fragment.xml +1 -0
- package/src/sap/suite/ui/generic/template/fragments/MessagePopover.fragment.xml +2 -2
- package/src/sap/suite/ui/generic/template/fragments/SmartControlContextMenu.fragment.xml +1 -1
- package/src/sap/suite/ui/generic/template/genericUtilities/filterHelper.js +3 -1
- package/src/sap/suite/ui/generic/template/js/AnnotationHelper.js +65 -8
- package/src/sap/suite/ui/generic/template/js/AnnotationHelperStreamSupport.js +1 -1
- package/src/sap/suite/ui/generic/template/lib/AppComponent.js +1 -2
- package/src/sap/suite/ui/generic/template/lib/Application.js +2 -0
- package/src/sap/suite/ui/generic/template/lib/ComponentUtils.js +13 -2
- package/src/sap/suite/ui/generic/template/lib/ContextBookkeeping.js +1 -0
- package/src/sap/suite/ui/generic/template/lib/ContextMenuHandler.js +124 -2
- package/src/sap/suite/ui/generic/template/lib/SideEffectUtil.js +39 -2
- package/src/sap/suite/ui/generic/template/lib/i18n/i18n.properties +17 -11
- package/src/sap/suite/ui/generic/template/lib/i18n/i18n_ar.properties +2 -0
- package/src/sap/suite/ui/generic/template/lib/i18n/i18n_bg.properties +4 -2
- package/src/sap/suite/ui/generic/template/lib/i18n/i18n_ca.properties +4 -2
- package/src/sap/suite/ui/generic/template/lib/i18n/i18n_cnr.properties +3 -1
- package/src/sap/suite/ui/generic/template/lib/i18n/i18n_cs.properties +3 -1
- package/src/sap/suite/ui/generic/template/lib/i18n/i18n_cy.properties +2 -0
- package/src/sap/suite/ui/generic/template/lib/i18n/i18n_da.properties +3 -1
- package/src/sap/suite/ui/generic/template/lib/i18n/i18n_de.properties +4 -2
- package/src/sap/suite/ui/generic/template/lib/i18n/i18n_el.properties +4 -2
- package/src/sap/suite/ui/generic/template/lib/i18n/i18n_en.properties +4 -2
- package/src/sap/suite/ui/generic/template/lib/i18n/i18n_en_GB.properties +4 -2
- package/src/sap/suite/ui/generic/template/lib/i18n/i18n_es.properties +4 -2
- package/src/sap/suite/ui/generic/template/lib/i18n/i18n_es_MX.properties +2 -0
- package/src/sap/suite/ui/generic/template/lib/i18n/i18n_et.properties +4 -2
- package/src/sap/suite/ui/generic/template/lib/i18n/i18n_fi.properties +3 -1
- package/src/sap/suite/ui/generic/template/lib/i18n/i18n_fr.properties +4 -2
- package/src/sap/suite/ui/generic/template/lib/i18n/i18n_fr_CA.properties +4 -2
- package/src/sap/suite/ui/generic/template/lib/i18n/i18n_hi.properties +2 -0
- package/src/sap/suite/ui/generic/template/lib/i18n/i18n_hr.properties +3 -1
- package/src/sap/suite/ui/generic/template/lib/i18n/i18n_hu.properties +6 -4
- package/src/sap/suite/ui/generic/template/lib/i18n/i18n_id.properties +3 -1
- package/src/sap/suite/ui/generic/template/lib/i18n/i18n_it.properties +4 -2
- package/src/sap/suite/ui/generic/template/lib/i18n/i18n_iw.properties +2 -0
- package/src/sap/suite/ui/generic/template/lib/i18n/i18n_ja.properties +3 -1
- package/src/sap/suite/ui/generic/template/lib/i18n/i18n_kk.properties +3 -1
- package/src/sap/suite/ui/generic/template/lib/i18n/i18n_ko.properties +3 -1
- package/src/sap/suite/ui/generic/template/lib/i18n/i18n_lt.properties +4 -2
- package/src/sap/suite/ui/generic/template/lib/i18n/i18n_lv.properties +4 -2
- package/src/sap/suite/ui/generic/template/lib/i18n/i18n_mk.properties +4 -2
- package/src/sap/suite/ui/generic/template/lib/i18n/i18n_ms.properties +3 -1
- package/src/sap/suite/ui/generic/template/lib/i18n/i18n_nl.properties +5 -3
- package/src/sap/suite/ui/generic/template/lib/i18n/i18n_no.properties +4 -2
- package/src/sap/suite/ui/generic/template/lib/i18n/i18n_pl.properties +2 -0
- package/src/sap/suite/ui/generic/template/lib/i18n/i18n_pt.properties +4 -2
- package/src/sap/suite/ui/generic/template/lib/i18n/i18n_pt_PT.properties +4 -2
- package/src/sap/suite/ui/generic/template/lib/i18n/i18n_ro.properties +4 -2
- package/src/sap/suite/ui/generic/template/lib/i18n/i18n_ru.properties +4 -2
- package/src/sap/suite/ui/generic/template/lib/i18n/i18n_sh.properties +3 -1
- package/src/sap/suite/ui/generic/template/lib/i18n/i18n_sk.properties +2 -0
- package/src/sap/suite/ui/generic/template/lib/i18n/i18n_sl.properties +4 -2
- package/src/sap/suite/ui/generic/template/lib/i18n/i18n_sr.properties +3 -1
- package/src/sap/suite/ui/generic/template/lib/i18n/i18n_sv.properties +4 -2
- package/src/sap/suite/ui/generic/template/lib/i18n/i18n_th.properties +3 -1
- package/src/sap/suite/ui/generic/template/lib/i18n/i18n_tr.properties +3 -1
- package/src/sap/suite/ui/generic/template/lib/i18n/i18n_uk.properties +4 -2
- package/src/sap/suite/ui/generic/template/lib/i18n/i18n_vi.properties +4 -2
- package/src/sap/suite/ui/generic/template/lib/i18n/i18n_zh_CN.properties +3 -1
- package/src/sap/suite/ui/generic/template/lib/i18n/i18n_zh_TW.properties +4 -2
- package/src/sap/suite/ui/generic/template/lib/navigation/NavigationController.js +32 -20
- package/src/sap/suite/ui/generic/template/lib/presentationControl/SmartTableHandler.js +4 -5
- package/src/sap/suite/ui/generic/template/library.js +1 -1
|
@@ -18,10 +18,10 @@ sap.ui.define([
|
|
|
18
18
|
|
|
19
19
|
/* This method returns an object with the following properties:
|
|
20
20
|
* sections: See method fnGetSections for description
|
|
21
|
-
* ...: todo
|
|
21
|
+
* ...: todo
|
|
22
22
|
*/
|
|
23
23
|
function fnGetTemplateSpecificParameters(oComponentUtils, oMetaModel, oOriginalSettings, oDevice, sLeadingEntitySet, oInternalManifest) {
|
|
24
|
-
|
|
24
|
+
|
|
25
25
|
function fnGetAnnotationWithDefaults(sAnnotationName, oAnnotation) {
|
|
26
26
|
// Provide optional properties of annotation with defaults according to vocabulary
|
|
27
27
|
// should best be done in metaModel itself
|
|
@@ -42,7 +42,7 @@ sap.ui.define([
|
|
|
42
42
|
}
|
|
43
43
|
return oResult;
|
|
44
44
|
}
|
|
45
|
-
|
|
45
|
+
|
|
46
46
|
function fnGetTargetAnnotation(oReferenceFacetContext) {
|
|
47
47
|
if (!oReferenceFacetContext.getObject().Target) {
|
|
48
48
|
// clarify how to deal with reference facet without target
|
|
@@ -51,7 +51,7 @@ sap.ui.define([
|
|
|
51
51
|
var sMetaModelPath = AHModel.resolvePath(oMetaModel.getContext(oReferenceFacetContext.sPath + "/Target"));
|
|
52
52
|
return sMetaModelPath && oMetaModel.getContext(sMetaModelPath).getObject();
|
|
53
53
|
}
|
|
54
|
-
|
|
54
|
+
|
|
55
55
|
function fnEnsureSectionAsSubsection(oSection){
|
|
56
56
|
// ensures, that the Section has a SubSection pointing to the same annotation and with the same data, except:
|
|
57
57
|
// - the subSection should not contain subSections again
|
|
@@ -60,7 +60,7 @@ sap.ui.define([
|
|
|
60
60
|
// - referenceFacet on 2nd level (subSection should be created referring to the collectionFacet on top level)
|
|
61
61
|
// - empty collectionFacet on top level, that should be replaced with ReplaceFacet extension (although this is rather
|
|
62
62
|
// replacing the whole section, we expect the extension not to contain a subSection, but we create the subSection)
|
|
63
|
-
|
|
63
|
+
|
|
64
64
|
oSection.subSections = oSection.subSections || [];
|
|
65
65
|
// if subSection already exists, do nothing
|
|
66
66
|
if (oSection.subSections.find(function(oSubSection){
|
|
@@ -68,13 +68,13 @@ sap.ui.define([
|
|
|
68
68
|
})) {
|
|
69
69
|
return;
|
|
70
70
|
}
|
|
71
|
-
|
|
71
|
+
|
|
72
72
|
var oSubSection = extend({}, oSection);
|
|
73
73
|
delete oSubSection.subSections;
|
|
74
74
|
oSubSection.blocks = [];
|
|
75
75
|
oSection.subSections.push(oSubSection);
|
|
76
76
|
}
|
|
77
|
-
|
|
77
|
+
|
|
78
78
|
var iMissingIdCounter = 0;
|
|
79
79
|
function fnGetSectionsFromAnnotations(sPath, bHeaderFacet, iLevel, oParentFacet) {
|
|
80
80
|
// Analysis of facets. Needs to be tolerant, as sometimes facets are defined in a way that seems to be meaningless,
|
|
@@ -114,12 +114,12 @@ sap.ui.define([
|
|
|
114
114
|
},
|
|
115
115
|
metaModelPath: sPath + "/" + i
|
|
116
116
|
};
|
|
117
|
-
|
|
117
|
+
|
|
118
118
|
// as intermediate step provide id also as an object with property id to simplify switching from generating facetId during templating
|
|
119
119
|
oFacetCurrentLevel.facetIdAsObject = {
|
|
120
|
-
id: oFacetCurrentLevel.additionalData.facetId
|
|
120
|
+
id: oFacetCurrentLevel.additionalData.facetId
|
|
121
121
|
};
|
|
122
|
-
|
|
122
|
+
|
|
123
123
|
// Note: fallbackIdByEnumerationForRuntime is not guaranteed to be stable, even from one session to the other, so don't use it in the view (as in
|
|
124
124
|
// view cache it would be kept, but in next session, a different one could be created). In fact, as this class is static, the missingIdCounter is shared
|
|
125
125
|
// between OPs, so depending on the order OP instances are loaded, the ids are different.
|
|
@@ -127,7 +127,7 @@ sap.ui.define([
|
|
|
127
127
|
// releases, this needs to be changed (either be using separate counters per OP instance, or maybe a completely different approach, e.g. stringifying the corresponding
|
|
128
128
|
// subObject in metaModel). This might make sense to be able to create all infoObjects upfront, or to get rid of infoObjects completely.
|
|
129
129
|
oFacetCurrentLevel.fallbackIdByEnumerationForRuntime = oFacetCurrentLevel.additionalData.facetId || "missingStableId#" + iMissingIdCounter++;
|
|
130
|
-
|
|
130
|
+
|
|
131
131
|
if (oFacet.RecordType === "com.sap.vocabularies.UI.v1.CollectionFacet") {
|
|
132
132
|
var aNextLevel = fnGetSectionsFromAnnotations(sPath + "/" + i + "/Facets", bHeaderFacet, iLevel + 1, oFacetCurrentLevel);
|
|
133
133
|
// in case of empty collectionFacet at top level, create also subSection to be used for ReplaceFacet extension
|
|
@@ -149,19 +149,20 @@ sap.ui.define([
|
|
|
149
149
|
bIsHeaderFacet: bHeaderFacet,
|
|
150
150
|
sAnnotationPath: oFacet.Target && oFacet.Target.AnnotationPath
|
|
151
151
|
});
|
|
152
|
-
|
|
152
|
+
|
|
153
153
|
oFacetCurrentLevel.annotations.Facet.annotation = fnGetAnnotationWithDefaults("com.sap.vocabularies.UI.v1.ReferenceFacet", oFacet);
|
|
154
154
|
// oBlock describes what is actually build out of the reference facet (except the section/subsection structure). Naming comes from ObjectPageSubSections default aggregation
|
|
155
155
|
// - think of whether this is the best naming here
|
|
156
156
|
var oBlock = extend({}, oFacetCurrentLevel);
|
|
157
|
-
|
|
157
|
+
|
|
158
158
|
// Todo: targetAnnotation is not really needed here (when just analyzing sections structure), but only later, when normalizing specific properties. Thus, it should be moved there.
|
|
159
159
|
// Currently, we keep it here, as we use fnNormalizeSections on all levels (-> should be split, targetAnnotation only needed on block level)
|
|
160
160
|
oBlock.targetAnnotation = fnGetTargetAnnotation(oMetaModel.getContext(sPath + "/" + i));
|
|
161
161
|
// if facet annotation is inconsistent, targetAnnotation would be undefined. Keep it here anyway, as extension might refer to it
|
|
162
|
-
|
|
162
|
+
fnProcessPresentationVariant(oBlock);
|
|
163
|
+
|
|
163
164
|
var oSubSection;
|
|
164
|
-
|
|
165
|
+
|
|
165
166
|
switch (iLevel) {
|
|
166
167
|
case 0:
|
|
167
168
|
// ignore reference facet with wrong target on first level (compatibility)
|
|
@@ -201,12 +202,41 @@ sap.ui.define([
|
|
|
201
202
|
});
|
|
202
203
|
return aResult;
|
|
203
204
|
}
|
|
204
|
-
|
|
205
|
+
|
|
206
|
+
function fnProcessPresentationVariant(oBlock) {
|
|
207
|
+
if (!oBlock.annotations.Facet.annotation.Target
|
|
208
|
+
|| !oBlock.annotations.Facet.annotation.Target.AnnotationPath
|
|
209
|
+
|| oBlock.annotations.Facet.annotation.Target.AnnotationPath.indexOf('com.sap.vocabularies.UI.v1.PresentationVariant') < 0) {
|
|
210
|
+
return;
|
|
211
|
+
}
|
|
212
|
+
// PresentationVariant detected. Try to find LineItem and get it's target annotations
|
|
213
|
+
var sTargetAnnotationTerm = oBlock.annotations.Facet.annotation.Target && oBlock.annotations.Facet.annotation.Target.AnnotationPath && oBlock.annotations.Facet.annotation.Target.AnnotationPath.split("@")[1],
|
|
214
|
+
sEntitySetName = oMetaModel.getObject(AHModel.gotoEntitySet(oMetaModel.getContext(oBlock.metaModelPath + "/Target"))).name,
|
|
215
|
+
oEntitySet = oMetaModel.getODataEntitySet(sEntitySetName),
|
|
216
|
+
oEntityType = oMetaModel.getODataEntityType(oEntitySet.entityType);
|
|
217
|
+
if (!oEntityType[sTargetAnnotationTerm]
|
|
218
|
+
|| !oEntityType[sTargetAnnotationTerm].Visualizations
|
|
219
|
+
|| !oEntityType[sTargetAnnotationTerm].Visualizations.length
|
|
220
|
+
|| !oEntityType[sTargetAnnotationTerm].Visualizations[0]
|
|
221
|
+
|| !oEntityType[sTargetAnnotationTerm].Visualizations[0].AnnotationPath
|
|
222
|
+
|| oEntityType[sTargetAnnotationTerm].Visualizations[0].AnnotationPath.indexOf('com.sap.vocabularies.UI.v1.LineItem') < 0) {
|
|
223
|
+
return;
|
|
224
|
+
}
|
|
225
|
+
// We have LineItem in Visualizations
|
|
226
|
+
// check if it's exist in Entity annotation and set it's content in oBlock.targetAnnotation for further processing
|
|
227
|
+
var sLineItemAnnotation = oEntityType[sTargetAnnotationTerm].Visualizations[0].AnnotationPath.split("@")[1];
|
|
228
|
+
if (!oEntityType[sLineItemAnnotation]) {
|
|
229
|
+
return;
|
|
230
|
+
}
|
|
231
|
+
oBlock.temporaryData.presentationVariantHasLineItem = true;
|
|
232
|
+
oBlock.targetAnnotation = oEntityType[sLineItemAnnotation];
|
|
233
|
+
}
|
|
234
|
+
|
|
205
235
|
var mTargetEntities = {};
|
|
206
236
|
function fnSetTargetEntity(oEntitySet, oSettings) {
|
|
207
237
|
//Process only if not already processed
|
|
208
238
|
if (!mTargetEntities[oEntitySet.entityType]) {
|
|
209
|
-
mTargetEntities[oEntitySet.entityType] = preparationHelper.getTargetEntityForQuickView(oMetaModel, oEntitySet);
|
|
239
|
+
mTargetEntities[oEntitySet.entityType] = preparationHelper.getTargetEntityForQuickView(oMetaModel, oEntitySet);
|
|
210
240
|
}
|
|
211
241
|
}
|
|
212
242
|
|
|
@@ -214,7 +244,7 @@ sap.ui.define([
|
|
|
214
244
|
|
|
215
245
|
/**
|
|
216
246
|
* Returns the persistencyKeyState for a smart control (table/chart) which represents the action which should be taken WRT its persistencyKey property. From
|
|
217
|
-
* UI5 v1.109, variant management is enabled (by default) and thus, to avoid the issue of having multiple duplicate implicit variants created by SVM (named as
|
|
247
|
+
* UI5 v1.109, variant management is enabled (by default) and thus, to avoid the issue of having multiple duplicate implicit variants created by SVM (named as
|
|
218
248
|
* Personalization), persistencyKey has to be changed in certain scenarios.
|
|
219
249
|
* New: New persistencyKey required.
|
|
220
250
|
* Retain: No change required i.e., it will continue to be the id of the smarttable.
|
|
@@ -233,6 +263,75 @@ sap.ui.define([
|
|
|
233
263
|
}
|
|
234
264
|
}
|
|
235
265
|
|
|
266
|
+
/**
|
|
267
|
+
* Retrieve LineItem qualifier for black table.
|
|
268
|
+
* For LineItem - get qualifier from LineItem annotation
|
|
269
|
+
* For PresentationVariant - get LineItem from Visualizations
|
|
270
|
+
* @param {*} oSettings block settings
|
|
271
|
+
* @param {*} sEntitySet current block entity set
|
|
272
|
+
* @returns {string} LineItem qualifier for the table
|
|
273
|
+
*/
|
|
274
|
+
function fnGetLineItemQualifier(oSettings, sEntitySet) {
|
|
275
|
+
if (!oSettings.annotations.Facet.annotation.Target
|
|
276
|
+
|| !oSettings.annotations.Facet.annotation.Target.AnnotationPath) {
|
|
277
|
+
return "";
|
|
278
|
+
}
|
|
279
|
+
var sLineItem = "";
|
|
280
|
+
if (oSettings.annotations.Facet.annotation.Target.AnnotationPath.indexOf('com.sap.vocabularies.UI.v1.LineItem') >= 0) {
|
|
281
|
+
sLineItem = oSettings.annotations.Facet.annotation.Target.AnnotationPath;
|
|
282
|
+
} else if (oSettings.annotations.Facet.annotation.Target.AnnotationPath.indexOf('com.sap.vocabularies.UI.v1.PresentationVariant') >= 0) {
|
|
283
|
+
var sTargetAnnotationTerm = oSettings.annotations.Facet.annotation.Target.AnnotationPath.split("@")[1],
|
|
284
|
+
oEntitySet = oMetaModel.getODataEntitySet(sEntitySet),
|
|
285
|
+
oEntityType = oMetaModel.getODataEntityType(oEntitySet.entityType);
|
|
286
|
+
if (!oEntityType[sTargetAnnotationTerm]
|
|
287
|
+
|| !oEntityType[sTargetAnnotationTerm].Visualizations
|
|
288
|
+
|| !oEntityType[sTargetAnnotationTerm].Visualizations.length
|
|
289
|
+
|| !oEntityType[sTargetAnnotationTerm].Visualizations[0]
|
|
290
|
+
|| !oEntityType[sTargetAnnotationTerm].Visualizations[0].AnnotationPath
|
|
291
|
+
|| oEntityType[sTargetAnnotationTerm].Visualizations[0].AnnotationPath.indexOf('com.sap.vocabularies.UI.v1.LineItem') < 0) {
|
|
292
|
+
return "";
|
|
293
|
+
}
|
|
294
|
+
sLineItem = oEntityType[sTargetAnnotationTerm].Visualizations[0].AnnotationPath;
|
|
295
|
+
}
|
|
296
|
+
if (!sLineItem) {
|
|
297
|
+
return "";
|
|
298
|
+
}
|
|
299
|
+
var aLineItemParts = sLineItem.split("#");
|
|
300
|
+
if (aLineItemParts.length !== 2) {
|
|
301
|
+
return "";
|
|
302
|
+
}
|
|
303
|
+
return aLineItemParts[1];
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
/**
|
|
307
|
+
* Retrieve sort order information for specific table
|
|
308
|
+
* @param {*} oSettings block settings
|
|
309
|
+
* @param {*} sEntitySet current block entity set
|
|
310
|
+
* @returns {string} sort order information from com.sap.vocabularies.UI.v1.PresentationVariant
|
|
311
|
+
*/
|
|
312
|
+
function fnGetLineItemSortOrder(oSettings, sEntitySet) {
|
|
313
|
+
if (!oSettings.annotations.Facet.annotation.Target
|
|
314
|
+
|| !oSettings.annotations.Facet.annotation.Target.AnnotationPath) {
|
|
315
|
+
return "";
|
|
316
|
+
}
|
|
317
|
+
// Default PresentationVariant to use to get sorting information
|
|
318
|
+
var sPresentationVariant = "com.sap.vocabularies.UI.v1.PresentationVariant";
|
|
319
|
+
if (oSettings.annotations.Facet.annotation.Target.AnnotationPath.indexOf('com.sap.vocabularies.UI.v1.PresentationVariant') >= 0) {
|
|
320
|
+
// Override default variant with value from facet
|
|
321
|
+
sPresentationVariant = oSettings.annotations.Facet.annotation.Target.AnnotationPath.split("@")[1];
|
|
322
|
+
}
|
|
323
|
+
var oEntitySet = oMetaModel.getODataEntitySet(sEntitySet),
|
|
324
|
+
oEntityType = oMetaModel.getODataEntityType(oEntitySet.entityType);
|
|
325
|
+
if (!oEntityType[sPresentationVariant]
|
|
326
|
+
|| !oEntityType[sPresentationVariant].SortOrder
|
|
327
|
+
|| !oEntityType[sPresentationVariant].SortOrder.length
|
|
328
|
+
) {
|
|
329
|
+
// PresentationVariant is missing in EntityType or there is no sorting order information
|
|
330
|
+
return "";
|
|
331
|
+
}
|
|
332
|
+
return AnnotationHelper.getSortOrder(oEntityType[sPresentationVariant].SortOrder);
|
|
333
|
+
}
|
|
334
|
+
|
|
236
335
|
function fnGetNormalizedTableSettings(oSettings) {
|
|
237
336
|
function fnGetTableLevelStandardActions() {
|
|
238
337
|
/* Collection of standard actions available on OP at table level. Maps the logical action name to an object containing the relevant properties i.e.
|
|
@@ -247,14 +346,14 @@ sap.ui.define([
|
|
|
247
346
|
If a custom action is defined with a valid 'logicalAction', then there could be two cases:
|
|
248
347
|
|
|
249
348
|
Case 1: Custom action has an ID
|
|
250
|
-
In this case, the corresponding standard button does not get created and instead an extension button
|
|
349
|
+
In this case, the corresponding standard button does not get created and instead an extension button
|
|
251
350
|
gets created, which takes over some standard functionality, especially the keyboard shortcut and the following properties:
|
|
252
351
|
enabled, text, importance, callbackName (if not defined in the manifest)
|
|
253
352
|
|
|
254
353
|
Case 2: Custom action does not have an ID
|
|
255
|
-
Here, the corresponding standard button gets created and takes over everything defined explicitly in the manifest.
|
|
256
|
-
|
|
257
|
-
In both the cases, isStandardAction is set to false.
|
|
354
|
+
Here, the corresponding standard button gets created and takes over everything defined explicitly in the manifest.
|
|
355
|
+
|
|
356
|
+
In both the cases, isStandardAction is set to false.
|
|
258
357
|
TODO: isStandardAction is only used to set different types of CustomData and OverflowToolbarLayoutData in the respective fragments.
|
|
259
358
|
However, additional CustomData should not harm, and regarding OverflowToolbarLayoutData, importance should always be the default
|
|
260
359
|
(if not defined otherwise) and so, it should be removed and the places where these CustomData are being consumed should be refactored (if required). */
|
|
@@ -281,11 +380,11 @@ sap.ui.define([
|
|
|
281
380
|
}
|
|
282
381
|
};
|
|
283
382
|
}
|
|
284
|
-
|
|
383
|
+
|
|
285
384
|
// for ObjectPage, unfortunately an additional settings allTableMultiSelect had been introduced, that just has the same meaning as setting
|
|
286
385
|
// multiSelect on component level, but needs to be supported for compatibility
|
|
287
386
|
oSettings.multiSelect = oSettings.multiSelect || oSettings.allTableMultiSelect;
|
|
288
|
-
|
|
387
|
+
|
|
289
388
|
// tolerance if reference facet points to a not existent navigation property: assume no navigation, i.e. use entityset of page
|
|
290
389
|
var sTargetMetaModelPath = AHModel.gotoEntitySet(oMetaModel.getContext(oSettings.metaModelPath + "/Target"));
|
|
291
390
|
var sEntitySet = sTargetMetaModelPath && oMetaModel.getObject(sTargetMetaModelPath).name || sLeadingEntitySet;
|
|
@@ -295,7 +394,7 @@ sap.ui.define([
|
|
|
295
394
|
var fnGetSearchFieldId = function() {
|
|
296
395
|
return oSettings.additionalData.facetId + "::Table::Toolbar::SearchField";
|
|
297
396
|
};
|
|
298
|
-
|
|
397
|
+
|
|
299
398
|
var oResult = preparationHelper.getNormalizedTableSettings(oMetaModel, oSettings, oDevice, sEntitySet, oExtensionActions, oSettings.targetAnnotation, fnGetSearchFieldId);
|
|
300
399
|
// By default, variant management is enabled but corresponding manifest settings (if defined) would also be respected
|
|
301
400
|
oResult.variantManagement = !(oSettings.tableSettings && oSettings.tableSettings.variantManagement) || oSettings.tableSettings.variantManagement;
|
|
@@ -315,7 +414,7 @@ sap.ui.define([
|
|
|
315
414
|
staticChecksHelper.checkErrorforCreateWithDialog(oMetaModel.getODataEntityType(oEntitySet.entityType), oResult);
|
|
316
415
|
oResult.createWithParameterDialog.id = StableIdHelper.getStableId({ type: 'ObjectPageAction', subType: 'CreateWithDialog', sFacet: oSettings.additionalData.facetId });
|
|
317
416
|
}
|
|
318
|
-
|
|
417
|
+
|
|
319
418
|
// set quickview Target Entity
|
|
320
419
|
fnSetTargetEntity(oEntitySet);
|
|
321
420
|
|
|
@@ -327,6 +426,8 @@ sap.ui.define([
|
|
|
327
426
|
oResult.vShowPasteButton = fnGetPasteButtonVisibility(oEntitySet);
|
|
328
427
|
oResult.commandExecution = fnGetTableLevelStandardActions();
|
|
329
428
|
oResult.persistencyKeyState = fnGetPersistencyKeyState(oSettings.tableSettings);
|
|
429
|
+
oResult.lineItemQualifier = fnGetLineItemQualifier(oSettings, sEntitySet);
|
|
430
|
+
oResult.lineItemSortOrder = fnGetLineItemSortOrder(oSettings, sEntitySet);
|
|
330
431
|
|
|
331
432
|
return oResult;
|
|
332
433
|
}
|
|
@@ -356,7 +457,7 @@ sap.ui.define([
|
|
|
356
457
|
if (bAnyBooleanTrue) {
|
|
357
458
|
return "{ui>/editable}";
|
|
358
459
|
}
|
|
359
|
-
|
|
460
|
+
|
|
360
461
|
// Now the remaining cases are either
|
|
361
462
|
// 1. Both are path expressions or
|
|
362
463
|
// 2. One path expression and one boolean value "false"
|
|
@@ -374,23 +475,23 @@ sap.ui.define([
|
|
|
374
475
|
}
|
|
375
476
|
|
|
376
477
|
/**
|
|
377
|
-
* Checks the navigation restriction on the parent entity set or current entity set
|
|
478
|
+
* Checks the navigation restriction on the parent entity set or current entity set
|
|
378
479
|
* and returns the boolean value or path for the restriction
|
|
379
|
-
*
|
|
480
|
+
*
|
|
380
481
|
* 1. If NavigationRestriction is available on parent entity set
|
|
381
482
|
* a. Restricted by boolean value - returns the boolean value
|
|
382
483
|
* b. Restricted by path - Checks the data type of path and returns it
|
|
383
|
-
*
|
|
484
|
+
*
|
|
384
485
|
* 2. If Restriction is available on table's entity set
|
|
385
486
|
* a. Restricted by boolean value - returns the boolean value
|
|
386
487
|
* b. Restricted by path - ignores it
|
|
387
488
|
* Important: Reason for ignoring the path. As path value refers to the individual records on the table, it can't control the whole table's paste functionality
|
|
388
|
-
*
|
|
489
|
+
*
|
|
389
490
|
* 3. If no restriction available, returns true
|
|
390
|
-
*
|
|
491
|
+
*
|
|
391
492
|
* @param {object} oEntitySet Table's entity set info
|
|
392
493
|
* @param {string} sRestrictionType "Insertable" or "Updatable"
|
|
393
|
-
* @returns {boolean|string} Boolean value or path for the restriction
|
|
494
|
+
* @returns {boolean|string} Boolean value or path for the restriction
|
|
394
495
|
*/
|
|
395
496
|
function fnGetRestrictionForPaste (oEntitySet, sRestrictionType) {
|
|
396
497
|
var mAnnotation = {
|
|
@@ -425,9 +526,9 @@ sap.ui.define([
|
|
|
425
526
|
// If no annotation found, return true
|
|
426
527
|
return true;
|
|
427
528
|
}
|
|
428
|
-
|
|
529
|
+
|
|
429
530
|
// used in the process of determining the visibility of export to excel and paste button depending on certain restrictions/conditions.
|
|
430
|
-
function fnGetTableToolbarButtonVisibility(oSettings, oEntitySet, sTableType) {
|
|
531
|
+
function fnGetTableToolbarButtonVisibility(oSettings, oEntitySet, sTableType) {
|
|
431
532
|
var oInsertableAnnotation, sEntityType, oSectionInsertRestriction;
|
|
432
533
|
var sSemantics = oMetaModel.getODataEntityType(oEntitySet.entityType) && oMetaModel.getODataEntityType(oEntitySet.entityType)["sap:semantics"];
|
|
433
534
|
if (sTableType === 'TreeTable' || (sTableType === 'AnalyticalTable' && sSemantics === "aggregate")) {
|
|
@@ -448,21 +549,21 @@ sap.ui.define([
|
|
|
448
549
|
if (!oInsertableAnnotation) {
|
|
449
550
|
return true;
|
|
450
551
|
}
|
|
451
|
-
|
|
552
|
+
|
|
452
553
|
// bValidAnnotation is true, if annotation has either Bool or Path property(path must resolve to boolean). bValidAnnotation is false if both Bool & Path exists or both does not exists or Path doesn't resolve to boolean.
|
|
453
554
|
var bValidAnnotation = oInsertableAnnotation.Bool ? !oInsertableAnnotation.Path : !!(oInsertableAnnotation.Path && AnnotationHelper._isPropertyPathBoolean(oMetaModel, sEntityType, oInsertableAnnotation.Path));
|
|
454
|
-
|
|
555
|
+
|
|
455
556
|
// if invalid annotation log error in the console
|
|
456
557
|
if (!bValidAnnotation) {
|
|
457
558
|
oLogger.error("Service Broken: Restrictions annotations for entity type " + oEntitySet.entityType + " for section Insertable are invalid.");
|
|
458
559
|
}
|
|
459
|
-
|
|
560
|
+
|
|
460
561
|
if (oInsertableAnnotation.Bool === "false") {
|
|
461
562
|
return false;
|
|
462
563
|
}
|
|
463
564
|
return bValidAnnotation;
|
|
464
565
|
}
|
|
465
|
-
|
|
566
|
+
|
|
466
567
|
function fnGetNormalizedChartSettings(oSettings) {
|
|
467
568
|
return {
|
|
468
569
|
// By default, variant management is enabled but corresponding manifest settings (if defined) would also be respected
|
|
@@ -471,15 +572,15 @@ sap.ui.define([
|
|
|
471
572
|
persistencyKeyState: fnGetPersistencyKeyState(oSettings.chartSettings)
|
|
472
573
|
};
|
|
473
574
|
}
|
|
474
|
-
|
|
575
|
+
|
|
475
576
|
function fnIsAction(oDataField){
|
|
476
577
|
return oDataField.RecordType === "com.sap.vocabularies.UI.v1.DataFieldForAction" || oDataField.RecordType === "com.sap.vocabularies.UI.v1.DataFieldForIntentBasedNavigation";
|
|
477
578
|
}
|
|
478
|
-
|
|
579
|
+
|
|
479
580
|
function fnNegate(fnTest){
|
|
480
581
|
// expects a function returning a boolean and negates the result - useful for array functions like find or filter, if test function returning the opposite exists
|
|
481
582
|
// -> can be used like array.find(fnNegate.bind(this, fnTest)) to find the first entry, where fnTest returns false. "this" is not needed here, but passed to fnTest
|
|
482
|
-
|
|
583
|
+
|
|
483
584
|
// call fnTest with the same arguments except the first one. As arguments is not a real array, we cannot call slice directly.
|
|
484
585
|
return !fnTest.apply(this, Array.prototype.slice.apply(arguments, [1]));
|
|
485
586
|
}
|
|
@@ -489,22 +590,22 @@ sap.ui.define([
|
|
|
489
590
|
// and the id framework generates thus avoid breaking the possibility to define the settings either way.
|
|
490
591
|
var oMergedSectionSettings = oOriginalSettings.sections &&
|
|
491
592
|
extend({}, oOriginalSettings.sections[oFacetData.additionalData.facetId], oOriginalSettings.sections[oFacetData.fallbackIdByAnnotationPathForManifest]);
|
|
492
|
-
|
|
593
|
+
|
|
493
594
|
extend(oFacetData, oMergedSectionSettings, oFacetData);
|
|
494
595
|
|
|
495
596
|
// Prio 3: any settings on page level: Maybe only relevant depending on annotation (e.g. tableSettings only relevant for LineItem annotation)
|
|
496
597
|
// With valid target, the Block is of course relevant.
|
|
497
598
|
// In case of broken target (i.e. reference facet pointing to non-existent LineItem or chart annotation), it depends on whether the navigation path exists, and qualifies for a table/chart
|
|
498
|
-
// (that means: last segment has multiplicity *, and all segments before have multiplicity 0..1 or 1). If this is given, we create a SmartTable or SmartChart. As the target is broken, this would
|
|
599
|
+
// (that means: last segment has multiplicity *, and all segments before have multiplicity 0..1 or 1). If this is given, we create a SmartTable or SmartChart. As the target is broken, this would
|
|
499
600
|
// of course not show anything meaningful, but this could be healed by use of extensions (at least in case of SmartTable by column extensions).
|
|
500
601
|
// Todo:
|
|
501
602
|
// - check, whether this is really also relevant for smartChart
|
|
502
|
-
// - check, whether this also relevant for other types (contacts?)
|
|
603
|
+
// - check, whether this also relevant for other types (contacts?)
|
|
503
604
|
if (oFacetData.targetAnnotation || ((oFacetData.additionalData.type === "SmartTable" || oFacetData.additionalData.type === "SmartChart") && AHModel.isMultiple(oMetaModel.getContext(oFacetData.metaModelPath + "/Target")))){
|
|
504
|
-
var oSettings = deepExtend({}, oOriginalSettings, oFacetData);
|
|
605
|
+
var oSettings = deepExtend({}, oOriginalSettings, oFacetData);
|
|
505
606
|
// specific analysis for anything defined in the annotation a reference facet is referring to
|
|
506
607
|
// only needed on block level - on sections and subSections level, targetAnnotation is not defined
|
|
507
|
-
|
|
608
|
+
|
|
508
609
|
switch (oFacetData.additionalData.type) {
|
|
509
610
|
case "SmartTable":
|
|
510
611
|
oFacetData.tableSettings = fnGetNormalizedTableSettings(oSettings);
|
|
@@ -524,7 +625,7 @@ sap.ui.define([
|
|
|
524
625
|
}
|
|
525
626
|
}
|
|
526
627
|
}
|
|
527
|
-
|
|
628
|
+
|
|
528
629
|
function getExtensionSectionAndSubsection(sExtensionPointNamePrefix, oFacetViewExtension) {
|
|
529
630
|
var oStableIdTypesAndSubTypeForFacetExtensionSectionsAndSubSections = {
|
|
530
631
|
BeforeFacet: {
|
|
@@ -572,19 +673,19 @@ sap.ui.define([
|
|
|
572
673
|
}
|
|
573
674
|
}
|
|
574
675
|
};
|
|
575
|
-
|
|
676
|
+
|
|
576
677
|
var oStableIdParameterDefinition = oStableIdTypesAndSubTypeForFacetExtensionSectionsAndSubSections[sExtensionPointNamePrefix][oFacetViewExtension.sKey ? "withKey" : "withoutKey"];
|
|
577
|
-
|
|
678
|
+
|
|
578
679
|
var oStableIdParameter = extend({}, oStableIdParameterDefinition.section);
|
|
579
680
|
oStableIdParameter.sEntitySet = oFacetViewExtension.sEntitySet;
|
|
580
681
|
oStableIdParameter.sFacet = oFacetViewExtension.sFacetId;
|
|
581
682
|
// in case key is explicitly defined by application, use that one - otherwise use key derived from extension point name (4th part of split by |)
|
|
582
683
|
oStableIdParameter.sFacetExtensionKey = oFacetViewExtension.oExtensionDefinition.key || oFacetViewExtension.sKey;
|
|
583
684
|
var sSectionId = StableIdHelper.getStableId(oStableIdParameter);
|
|
584
|
-
|
|
685
|
+
|
|
585
686
|
oStableIdParameter.type = oStableIdParameterDefinition.subSection.type;
|
|
586
687
|
oStableIdParameter.subType = oStableIdParameterDefinition.subSection.subType;
|
|
587
|
-
|
|
688
|
+
|
|
588
689
|
return {
|
|
589
690
|
id: sSectionId,
|
|
590
691
|
additionalData: {
|
|
@@ -593,7 +694,7 @@ sap.ui.define([
|
|
|
593
694
|
extensionPointName: oFacetViewExtension.sExtensionPointName,
|
|
594
695
|
extensionPointNamePrefix: oFacetViewExtension.sExtensionPointNamePrefix,
|
|
595
696
|
subSections: [getExtensionSubsection(oFacetViewExtension, oStableIdParameter)]
|
|
596
|
-
};
|
|
697
|
+
};
|
|
597
698
|
}
|
|
598
699
|
|
|
599
700
|
/**
|
|
@@ -604,13 +705,13 @@ sap.ui.define([
|
|
|
604
705
|
var oStableIdSubTypeForSubSectionFacetExtension = {
|
|
605
706
|
ReplaceSubSection: "ReplaceSubSectionExtensionSubSection"
|
|
606
707
|
};
|
|
607
|
-
oStableIdParameter = oStableIdParameter || {
|
|
708
|
+
oStableIdParameter = oStableIdParameter || {
|
|
608
709
|
type: "ObjectPageSection",
|
|
609
710
|
subType: oStableIdSubTypeForSubSectionFacetExtension[oFacetViewExtension.sExtensionPointNamePrefix],
|
|
610
711
|
sEntitySet: oFacetViewExtension.sEntitySet,
|
|
611
712
|
sFacet: oFacetViewExtension.sFacetId
|
|
612
713
|
};
|
|
613
|
-
|
|
714
|
+
|
|
614
715
|
return {
|
|
615
716
|
id: StableIdHelper.getStableId(oStableIdParameter),
|
|
616
717
|
additionalData: {
|
|
@@ -620,9 +721,9 @@ sap.ui.define([
|
|
|
620
721
|
extensionPointName: oFacetViewExtension.sExtensionPointName,
|
|
621
722
|
extensionPointNamePrefix: oFacetViewExtension.sExtensionPointNamePrefix,
|
|
622
723
|
blocks: []
|
|
623
|
-
};
|
|
724
|
+
};
|
|
624
725
|
}
|
|
625
|
-
|
|
726
|
+
|
|
626
727
|
var aViewExtensions;
|
|
627
728
|
function fnGetViewExtensions(){
|
|
628
729
|
if (!aViewExtensions) {
|
|
@@ -655,11 +756,11 @@ sap.ui.define([
|
|
|
655
756
|
if (sHeaderOrSection === "Header") {
|
|
656
757
|
return oControllerExtensions && oControllerExtensions.Header && oControllerExtensions.Header.Actions || [];
|
|
657
758
|
}
|
|
658
|
-
}
|
|
659
|
-
|
|
759
|
+
}
|
|
760
|
+
|
|
660
761
|
function fnAddSectionsAndSubsectionsFromExtensions(aSectionsFromAnnotations){
|
|
661
762
|
var aViewExtensions = fnGetViewExtensions();
|
|
662
|
-
|
|
763
|
+
|
|
663
764
|
var aResultSections = [];
|
|
664
765
|
aSectionsFromAnnotations.forEach(function (oSectionData) {
|
|
665
766
|
var aBeforeFacetExtensions = aViewExtensions.filter(function(oViewExtension){
|
|
@@ -694,10 +795,10 @@ sap.ui.define([
|
|
|
694
795
|
|
|
695
796
|
return aResultSections;
|
|
696
797
|
}
|
|
697
|
-
|
|
798
|
+
|
|
698
799
|
function fnAddSmartFormExtensions(oBlockData){
|
|
699
800
|
var aViewExtensions = fnGetViewExtensions();
|
|
700
|
-
|
|
801
|
+
|
|
701
802
|
var oSmartFormExtension = aViewExtensions.find(function(oViewExtension){
|
|
702
803
|
return oViewExtension.sFacetId === oBlockData.additionalData.facetId && oViewExtension.sExtensionPointNamePrefix === "SmartFormExtension";
|
|
703
804
|
});
|
|
@@ -708,14 +809,14 @@ sap.ui.define([
|
|
|
708
809
|
// If annotation term is not FieldGroup or Identification, but target exists, it could either be a different type (then SmartFormExtension would be ignored in xml)
|
|
709
810
|
// or sth. completely unknown (not allowed from vocabulary (e.g. UI.Facets) or at least not implemented by us.
|
|
710
811
|
// In that case, we would create a SmartForm just to enable the SmartFormExtension.
|
|
711
|
-
// If however the target is an array (like UI.Facets - this is actually an existing example from an app!) this would lead to trying us to create SmartFields per entry
|
|
812
|
+
// If however the target is an array (like UI.Facets - this is actually an existing example from an app!) this would lead to trying us to create SmartFields per entry
|
|
712
813
|
// - if the entries do not fit, that would break (if multiple entries have no value property, we would create duplicate (broken) ids)
|
|
713
814
|
// This could be again avoided if also a replaceFacet extension exists for this facet (like in the app using UI.Facets here) - then the SmartForm (including extension)
|
|
714
|
-
// would be ignored anyway, we just should make sure not to filter the block completely (as replaceFacet is still evaluated in xml)
|
|
715
|
-
oBlockData.additionalData.type = oBlockData.additionalData.type || "SmartForm";
|
|
815
|
+
// would be ignored anyway, we just should make sure not to filter the block completely (as replaceFacet is still evaluated in xml)
|
|
816
|
+
oBlockData.additionalData.type = oBlockData.additionalData.type || "SmartForm";
|
|
716
817
|
}
|
|
717
818
|
}
|
|
718
|
-
|
|
819
|
+
|
|
719
820
|
function fnNormalizeBlock(oBlockData){
|
|
720
821
|
// determine type of Block
|
|
721
822
|
// oBlockData.annotations.Facet.annotation definitely is an object, as build by us in fnGetSections
|
|
@@ -728,8 +829,8 @@ sap.ui.define([
|
|
|
728
829
|
// additional possible (no occurrence known and not taken care of so far):
|
|
729
830
|
// - AnnotationPath not being a string (but an object)
|
|
730
831
|
var sTargetAnnotationTerm = oBlockData.annotations.Facet.annotation.Target && oBlockData.annotations.Facet.annotation.Target.AnnotationPath && oBlockData.annotations.Facet.annotation.Target.AnnotationPath.split("@")[1];
|
|
731
|
-
sTargetAnnotationTerm = sTargetAnnotationTerm && sTargetAnnotationTerm.split("#")[0];
|
|
732
|
-
|
|
832
|
+
sTargetAnnotationTerm = sTargetAnnotationTerm && sTargetAnnotationTerm.split("#")[0];
|
|
833
|
+
|
|
733
834
|
switch (sTargetAnnotationTerm){
|
|
734
835
|
case "com.sap.vocabularies.UI.v1.FieldGroup":
|
|
735
836
|
case "com.sap.vocabularies.UI.v1.Identification":
|
|
@@ -738,6 +839,13 @@ sap.ui.define([
|
|
|
738
839
|
case "com.sap.vocabularies.UI.v1.LineItem":
|
|
739
840
|
oBlockData.additionalData.type = "SmartTable";
|
|
740
841
|
break;
|
|
842
|
+
case "com.sap.vocabularies.UI.v1.PresentationVariant":
|
|
843
|
+
if (oBlockData.temporaryData.presentationVariantHasLineItem) {
|
|
844
|
+
// PresentationVariant have valid LineItem in it. Set block type to SmartTable
|
|
845
|
+
// It will trigger all necessary code for block configuration
|
|
846
|
+
oBlockData.additionalData.type = "SmartTable";
|
|
847
|
+
}
|
|
848
|
+
break;
|
|
741
849
|
case "com.sap.vocabularies.UI.v1.Chart":
|
|
742
850
|
oBlockData.additionalData.type = "SmartChart";
|
|
743
851
|
break;
|
|
@@ -748,18 +856,18 @@ sap.ui.define([
|
|
|
748
856
|
oBlockData.additionalData.type = "Contact";
|
|
749
857
|
break;
|
|
750
858
|
default:
|
|
751
|
-
// todo:
|
|
859
|
+
// todo:
|
|
752
860
|
// - check other possible annotations, e.g.
|
|
753
861
|
// case "com.sap.vocabularies.UI.v1.DataPoint":
|
|
754
862
|
// - check how to correctly react on unknown (or maybe wrong spelled) annotations in target - could they (like non-existent ones) be used
|
|
755
863
|
// as anchor for extensions? (Assumption: yes, for SmartFormExtension - but maybe also depending on (existent) navigation property for columns?)
|
|
756
|
-
//oBlockData.additionalData.type = "SmartForm";
|
|
864
|
+
//oBlockData.additionalData.type = "SmartForm";
|
|
757
865
|
}
|
|
758
|
-
|
|
866
|
+
|
|
759
867
|
fnNormalizeSectionSettings(oBlockData);
|
|
760
868
|
fnAddSmartFormExtensions(oBlockData);
|
|
761
869
|
}
|
|
762
|
-
|
|
870
|
+
|
|
763
871
|
function fnIsBlockRelevant(oBlockData){
|
|
764
872
|
if (oBlockData.annotations.Facet.annotation.RecordType !== "com.sap.vocabularies.UI.v1.ReferenceFacet"){
|
|
765
873
|
// no reference facet
|
|
@@ -811,13 +919,13 @@ sap.ui.define([
|
|
|
811
919
|
});
|
|
812
920
|
}
|
|
813
921
|
|
|
814
|
-
/* Returns the passed DataField (DataFieldForAction/DataFieldForIntentBasedNavigation which belongs to a sub-section) details required
|
|
922
|
+
/* Returns the passed DataField (DataFieldForAction/DataFieldForIntentBasedNavigation which belongs to a sub-section) details required
|
|
815
923
|
to put in the corresponding sub-section template settings */
|
|
816
924
|
function fnGetDataFieldDetails(oDataField, sMetaModelPathContentPrefix, nIndex, oOpSettings, sActionId) {
|
|
817
925
|
var oActionDataFieldDetails = {};
|
|
818
926
|
var sPressHandler = "._templateEventHandlers.";
|
|
819
927
|
// calling AHModel.format is needed, as action could be defined as string or path
|
|
820
|
-
// as AHModel.format is defined to require interface context, we need to provide the context (not just the value). This works for formatters with requiresIContext = true and only 1 additional parameter.
|
|
928
|
+
// as AHModel.format is defined to require interface context, we need to provide the context (not just the value). This works for formatters with requiresIContext = true and only 1 additional parameter.
|
|
821
929
|
var sDataFieldAction = AHModel.format(oMetaModel.getContext(sMetaModelPathContentPrefix + nIndex + "/Action"));
|
|
822
930
|
switch (oDataField.RecordType) {
|
|
823
931
|
case "com.sap.vocabularies.UI.v1.DataFieldForAction":
|
|
@@ -885,18 +993,18 @@ sap.ui.define([
|
|
|
885
993
|
oSubSectionData.blocks.forEach(fnNormalizeBlock);
|
|
886
994
|
|
|
887
995
|
// Check whether SideContent is maintained for the SubSection in manifest
|
|
888
|
-
var sSideContentExtensionName = AHSideContent.getSideContentExtensionPoint(sLeadingEntitySet,
|
|
996
|
+
var sSideContentExtensionName = AHSideContent.getSideContentExtensionPoint(sLeadingEntitySet,
|
|
889
997
|
oSubSectionData.additionalData.facetId, oComponentUtils.getViewExtensions());
|
|
890
998
|
if (sSideContentExtensionName) {
|
|
891
999
|
oSubSectionData.sideContentSettings = {
|
|
892
|
-
id: StableIdHelper.getStableId({
|
|
1000
|
+
id: StableIdHelper.getStableId({
|
|
893
1001
|
type: "ObjectPageSection",
|
|
894
1002
|
subType: "DynamicSideContent",
|
|
895
1003
|
sFacet: oSubSectionData.additionalData.facetId
|
|
896
1004
|
})
|
|
897
1005
|
};
|
|
898
1006
|
}
|
|
899
|
-
|
|
1007
|
+
|
|
900
1008
|
// add actions to subsection
|
|
901
1009
|
oSubSectionData.actions = [];
|
|
902
1010
|
var oOpSettings = oComponentUtils.getSettings();
|
|
@@ -922,7 +1030,7 @@ sap.ui.define([
|
|
|
922
1030
|
oSubSectionData.actions.push(oFormAction);
|
|
923
1031
|
});
|
|
924
1032
|
}
|
|
925
|
-
|
|
1033
|
+
|
|
926
1034
|
if (oBlock.additionalData.type === "SmartTable" && oBlock.tableSettings) {
|
|
927
1035
|
var oExtensionsTableActions = fnGetExtensionAction(oBlock.additionalData.facetId, "Section");
|
|
928
1036
|
if (oExtensionsTableActions) {
|
|
@@ -959,7 +1067,7 @@ sap.ui.define([
|
|
|
959
1067
|
|
|
960
1068
|
var sMetaModelPathTarget = AHModel.resolvePath(oMetaModel.getContext(oBlock.metaModelPath + "/Target"));
|
|
961
1069
|
// FieldGroup has a Property "Data" containing the content, while Identification consist only of the content - so metaModelPath looks slightly different
|
|
962
|
-
// beginning part can be build here, last segment (position in array) can only be added inside the loop
|
|
1070
|
+
// beginning part can be build here, last segment (position in array) can only be added inside the loop
|
|
963
1071
|
var sMetaModelPathContentPrefix = sMetaModelPathTarget + (oBlock.targetAnnotation.Data ? "/Data/" : "/" );
|
|
964
1072
|
oBlock.temporaryData.content.forEach(function(oDataField, iIndex){
|
|
965
1073
|
if (!oDataField || !oDataField.Action || (oDataField.RecordType !== "com.sap.vocabularies.UI.v1.DataFieldForAction" && oDataField.RecordType !== "com.sap.vocabularies.UI.v1.DataFieldForIntentBasedNavigation")){
|
|
@@ -991,17 +1099,17 @@ sap.ui.define([
|
|
|
991
1099
|
});
|
|
992
1100
|
});
|
|
993
1101
|
});
|
|
994
|
-
|
|
1102
|
+
|
|
995
1103
|
// remove superfluous blocks
|
|
996
1104
|
oSubSectionData.blocks = oSubSectionData.blocks.filter(fnIsBlockRelevant);
|
|
997
|
-
|
|
1105
|
+
|
|
998
1106
|
// restore behaviour from 1.84 and before: only separate SmartForms is 3 level hierarchy and at least 1 reference Facet pointing to sth. not feasible for SmartForm (lineItem or chart)
|
|
999
1107
|
// otherwise, create only one SmartForm containing groups per referenceFacet
|
|
1000
1108
|
if (oSubSectionData.temporaryData.potentiallySeparateForms && !oSubSectionData.blocks.every(fnPointsToSmartForm)){
|
|
1001
1109
|
// keep separated SmartForms, distribute properties on needed level
|
|
1002
1110
|
oSubSectionData.blocks = oSubSectionData.blocks.map(function(oBlockData){
|
|
1003
1111
|
if (fnPointsToSmartForm(oBlockData)){
|
|
1004
|
-
// move everything one level down (to group)
|
|
1112
|
+
// move everything one level down (to group)
|
|
1005
1113
|
return {
|
|
1006
1114
|
additionalData: {
|
|
1007
1115
|
type: oBlockData.additionalData.type,
|
|
@@ -1039,10 +1147,10 @@ sap.ui.define([
|
|
|
1039
1147
|
return oBlockData.annotations.Facet.annotation["com.sap.vocabularies.UI.v1.PartOfPreview"].Bool === "true";
|
|
1040
1148
|
}
|
|
1041
1149
|
});
|
|
1042
|
-
|
|
1043
|
-
|
|
1150
|
+
|
|
1151
|
+
|
|
1044
1152
|
} else {
|
|
1045
|
-
// aggregate all blocks pointing to FieldGroup or similar to one, but keep others
|
|
1153
|
+
// aggregate all blocks pointing to FieldGroup or similar to one, but keep others
|
|
1046
1154
|
var oSmartFormData = {
|
|
1047
1155
|
additionalData: {
|
|
1048
1156
|
type: "SmartForm",
|
|
@@ -1082,14 +1190,14 @@ sap.ui.define([
|
|
|
1082
1190
|
})
|
|
1083
1191
|
}
|
|
1084
1192
|
};
|
|
1085
|
-
|
|
1193
|
+
|
|
1086
1194
|
oSubSectionData.moreBlocks = oSubSectionData.blocks.filter(function(oBlockData){
|
|
1087
1195
|
return !fnPointsToSmartForm(oBlockData) && oBlockData.annotations.Facet.annotation["com.sap.vocabularies.UI.v1.PartOfPreview"].Bool === "false";
|
|
1088
1196
|
});
|
|
1089
1197
|
oSubSectionData.blocks = oSubSectionData.blocks.filter(function(oBlockData){
|
|
1090
1198
|
return !fnPointsToSmartForm(oBlockData) && oBlockData.annotations.Facet.annotation["com.sap.vocabularies.UI.v1.PartOfPreview"].Bool === "true";
|
|
1091
1199
|
});
|
|
1092
|
-
|
|
1200
|
+
|
|
1093
1201
|
// add SmartForm as first entry
|
|
1094
1202
|
// clarify: add SmartForm even when no content? (1.84: in 2 level hierarchy yes, in 3 level hierarchy no)
|
|
1095
1203
|
// if yes: also for facet-extensions? Not really meaningful there...
|
|
@@ -1103,12 +1211,12 @@ sap.ui.define([
|
|
|
1103
1211
|
|
|
1104
1212
|
/*
|
|
1105
1213
|
Store the RenderingBehavior which currently support enabling of View Lazy Loading. No configuration would
|
|
1106
|
-
mean View Lazy Loading is disabled
|
|
1214
|
+
mean View Lazy Loading is disabled
|
|
1107
1215
|
*/
|
|
1108
1216
|
oSubSectionData.additionalData.useViewLazyLoading = oComponentUtils.isRenderingWaitingForViewportEntered();
|
|
1109
1217
|
/*
|
|
1110
1218
|
Set the LazyLoading behavior for SubSection object
|
|
1111
|
-
TODO: Avoid recalculation of the same & assign it as custom data
|
|
1219
|
+
TODO: Avoid recalculation of the same & assign it as custom data
|
|
1112
1220
|
*/
|
|
1113
1221
|
fnSetLoadingStrategy(oSectionData, oSubSectionData);
|
|
1114
1222
|
}
|
|
@@ -1128,7 +1236,7 @@ sap.ui.define([
|
|
|
1128
1236
|
if (oViewExtension) {
|
|
1129
1237
|
// SubSection has extension view defined. LoadingStrategy needs to be determined
|
|
1130
1238
|
// from the extension data
|
|
1131
|
-
var oExtensionGenericInfo = oViewExtension.oExtensionDefinition
|
|
1239
|
+
var oExtensionGenericInfo = oViewExtension.oExtensionDefinition
|
|
1132
1240
|
&& oViewExtension.oExtensionDefinition["sap.ui.generic.app"];
|
|
1133
1241
|
|
|
1134
1242
|
if (oExtensionGenericInfo && oExtensionGenericInfo.enableLazyLoading) {
|
|
@@ -1140,7 +1248,7 @@ sap.ui.define([
|
|
|
1140
1248
|
return;
|
|
1141
1249
|
}
|
|
1142
1250
|
}
|
|
1143
|
-
|
|
1251
|
+
|
|
1144
1252
|
// SubSection is an annotated section. Check whether a loading strategy is configured
|
|
1145
1253
|
// else return the default loading strategy (LazyLoading).
|
|
1146
1254
|
if (oSectionData) {
|
|
@@ -1160,57 +1268,57 @@ sap.ui.define([
|
|
|
1160
1268
|
oSubSectionData.loadingStrategy = "lazyLoading";
|
|
1161
1269
|
}
|
|
1162
1270
|
}
|
|
1163
|
-
|
|
1271
|
+
|
|
1164
1272
|
function fnIsSubSectionRelevant(){
|
|
1165
1273
|
return true;
|
|
1166
1274
|
}
|
|
1167
|
-
|
|
1275
|
+
|
|
1168
1276
|
function fnNormalizeSection(oSectionData){
|
|
1169
1277
|
fnNormalizeSectionSettings(oSectionData);
|
|
1170
1278
|
oSectionData.subSections.forEach(fnNormalizeSubSection.bind(null, oSectionData));
|
|
1171
1279
|
oSectionData.subSections = oSectionData.subSections.filter(fnIsSubSectionRelevant);
|
|
1172
1280
|
}
|
|
1173
|
-
|
|
1281
|
+
|
|
1174
1282
|
function fnIsSectionRelevant(){
|
|
1175
1283
|
return true;
|
|
1176
1284
|
}
|
|
1177
|
-
|
|
1178
|
-
/* This method returns an array describing relevant information for (nearly) all the sections to be created on the OP. The order is the order in which we create the
|
|
1285
|
+
|
|
1286
|
+
/* This method returns an array describing relevant information for (nearly) all the sections to be created on the OP. The order is the order in which we create the
|
|
1179
1287
|
* sections, but be aware that UI adaptation could change the visible order in the final UI.
|
|
1180
|
-
*
|
|
1288
|
+
*
|
|
1181
1289
|
* Exception: currently, in case of editable header one special section is created in section fragment, that is not reflected in this array.
|
|
1182
|
-
*
|
|
1290
|
+
*
|
|
1183
1291
|
* Ideal structure: Ideally, we expect a deep nested structure. It does not need to reflect the full control tree, but can build an abstraction, i.e. controls added with
|
|
1184
1292
|
* hard coded properties (like grid in facet fragment) can be left out. On each level, data related to one control should be described by the following common properties:
|
|
1185
|
-
* id: the local stable id for that control. Can be used to lookup the entry in the structure (e.g. in an event handler of that control), or to find the control using
|
|
1293
|
+
* id: the local stable id for that control. Can be used to lookup the entry in the structure (e.g. in an event handler of that control), or to find the control using
|
|
1186
1294
|
* byId when iterating through this structure
|
|
1187
1295
|
* metaModelPath: Path in the metamodel pointing to the annotation responsible for creating the control. Can be used with helper getMetaModelBinding to get a reference to
|
|
1188
1296
|
* the annotation. Remark: There is no clear 1:1 relationship between annotations and controls. However, original implementation was based on iterating through
|
|
1189
|
-
* annotations, thus there's always one most specific annotation. This path should point to that annotation to allow stepwise transformation of fragments. Once no
|
|
1190
|
-
* direct evaluation of annotations is done within the fragments, but everything is prepared into this structure, metaModelPath would not be needed anymore.
|
|
1191
|
-
* controlName: Name of the control to be put. Esp. useful in aggregations, where we put different controls in different situations (e.g. aggregation blocks of
|
|
1192
|
-
* SubSections).
|
|
1297
|
+
* annotations, thus there's always one most specific annotation. This path should point to that annotation to allow stepwise transformation of fragments. Once no
|
|
1298
|
+
* direct evaluation of annotations is done within the fragments, but everything is prepared into this structure, metaModelPath would not be needed anymore.
|
|
1299
|
+
* controlName: Name of the control to be put. Esp. useful in aggregations, where we put different controls in different situations (e.g. aggregation blocks of
|
|
1300
|
+
* SubSections).
|
|
1193
1301
|
* controlProperties: Map of fully prepared properties to be set to this control. (Key = PropertyName, value can be a fixed value or a binding string to be evaluated at
|
|
1194
1302
|
* runtime)
|
|
1195
1303
|
* aggregations: Map of those aggregations of the control used by us (i.e. we put controls to in our fragments). Key should be the name of the corresponding aggregation,
|
|
1196
|
-
* value should be an (array of) object(s) of the same structure. (In most cases, the relevant aggregation are of cardinality 0..n - in case of cardinality 0..1,
|
|
1304
|
+
* value should be an (array of) object(s) of the same structure. (In most cases, the relevant aggregation are of cardinality 0..n - in case of cardinality 0..1,
|
|
1197
1305
|
* value could just be an object of the given structure.
|
|
1198
1306
|
* additionalData: Any further data to be provided in relation to that control. Structure to be defined case by case. Can be used in two ways:
|
|
1199
1307
|
* - during template processing: In case of partial pre-analysis. Should not be needed, once analysis is completely transferred. Typical example could be tableSettings
|
|
1200
1308
|
* or facetId (to be used to generate ids for aggregated controls)
|
|
1201
1309
|
* - to replace customData so far filled during template processing to be used at runtime.
|
|
1202
|
-
*
|
|
1310
|
+
*
|
|
1203
1311
|
* Unfortunately, what is described above is currently not reality - currently the structure looks like following:
|
|
1204
1312
|
* Properties of elements in this array:
|
|
1205
1313
|
* metaModelPath: Path in the metamodel pointing to the facet annotation being for this section. Can be used with helper getMetaModelBinding to get a reference to
|
|
1206
1314
|
* the annotation
|
|
1207
1315
|
* id: local stable Id of the section control to be created. Currently only used in ExtensionFacetLayout.fragment.
|
|
1208
|
-
* Ideally, id should always be provided, and then also be used in ControllerImplementation to lookup entry in this structure from given control or vice versa.
|
|
1316
|
+
* Ideally, id should always be provided, and then also be used in ControllerImplementation to lookup entry in this structure from given control or vice versa.
|
|
1209
1317
|
* extensionPointName
|
|
1210
|
-
* facetIdAsObject: Object with same structure as built be StableIdHelper.preparePathForStableId, i.e. with only one property id for easier transition from pure templating based approach
|
|
1318
|
+
* facetIdAsObject: Object with same structure as built be StableIdHelper.preparePathForStableId, i.e. with only one property id for easier transition from pure templating based approach
|
|
1211
1319
|
* id: facetId (see below)
|
|
1212
1320
|
* additionalData
|
|
1213
|
-
* facetId: Id created for the facet either defined in facet annotation or created out of target annotation path, used as parameter for controls put on this section
|
|
1321
|
+
* facetId: Id created for the facet either defined in facet annotation or created out of target annotation path, used as parameter for controls put on this section
|
|
1214
1322
|
* annotations
|
|
1215
1323
|
* Facet
|
|
1216
1324
|
* subSections: an array describing relevant information for all the subSections in the current section. Properties of elements:
|
|
@@ -1228,12 +1336,12 @@ sap.ui.define([
|
|
|
1228
1336
|
* tableSettings
|
|
1229
1337
|
* chartSettings
|
|
1230
1338
|
* controlProperties: Should contain all those properties of the control we put into the block, that are already fully prepared, i.e. in the view we should just see an element binding {block>controlProperties/<PropertyName>}
|
|
1231
|
-
* Currently only used for the id of SmartForm.
|
|
1339
|
+
* Currently only used for the id of SmartForm.
|
|
1232
1340
|
* id
|
|
1233
1341
|
* aggregations
|
|
1234
1342
|
* groups: an array describing relevant information for all the groups in the current block (if its type is SmartForm). Properties of elements:
|
|
1235
1343
|
* additionalData
|
|
1236
|
-
* type: Type of the block to be created. Currently possible types are SmartForm, SmartTable, SmartChart, Address, Contact.
|
|
1344
|
+
* type: Type of the block to be created. Currently possible types are SmartForm, SmartTable, SmartChart, Address, Contact.
|
|
1237
1345
|
* moreBlocks: an array describing relevant information for the blocks not being part of preview. Elements are structured like the one in blocks
|
|
1238
1346
|
* actions: an array describing relevant information for all the actions for the current subSection. Properties of elements:
|
|
1239
1347
|
* command
|
|
@@ -1245,9 +1353,9 @@ sap.ui.define([
|
|
|
1245
1353
|
* semanticObject
|
|
1246
1354
|
* text
|
|
1247
1355
|
* extensionPointNamePrefix
|
|
1248
|
-
*
|
|
1356
|
+
*
|
|
1249
1357
|
*/
|
|
1250
|
-
|
|
1358
|
+
|
|
1251
1359
|
function fnGetSections(){
|
|
1252
1360
|
var sEntityTypePath = oMetaModel.getMetaContext("/" + sLeadingEntitySet).getPath();
|
|
1253
1361
|
var aSectionsFromAnnotations = fnGetSectionsFromAnnotations(sEntityTypePath + "/com.sap.vocabularies.UI.v1.Facets", false);
|
|
@@ -1281,13 +1389,13 @@ sap.ui.define([
|
|
|
1281
1389
|
if (oDataField.Value && oDataField.Value.Path) {
|
|
1282
1390
|
var sDataFieldValuePath = oDataField.Value.Path;
|
|
1283
1391
|
var oAssociation;
|
|
1284
|
-
|
|
1392
|
+
|
|
1285
1393
|
if (sDataFieldValuePath.indexOf('/') > -1) {
|
|
1286
1394
|
var sNavigationProperty = sDataFieldValuePath.split("/")[0];
|
|
1287
1395
|
oAssociation = oMetaModel.getODataAssociationEnd(oEntityType, sNavigationProperty);
|
|
1288
|
-
oEntityType = oMetaModel.getODataEntityType(oAssociation && oAssociation.type) || oEntityType;
|
|
1396
|
+
oEntityType = oMetaModel.getODataEntityType(oAssociation && oAssociation.type) || oEntityType;
|
|
1289
1397
|
return sNavigationProperty;
|
|
1290
|
-
}
|
|
1398
|
+
}
|
|
1291
1399
|
return;
|
|
1292
1400
|
}
|
|
1293
1401
|
}
|
|
@@ -1307,10 +1415,10 @@ sap.ui.define([
|
|
|
1307
1415
|
var oAssociation = oMetaModel.getODataAssociationEnd(oEntityType, sNavigationProperty);
|
|
1308
1416
|
oEntityType = oMetaModel.getODataEntityType(oAssociation && oAssociation.type);
|
|
1309
1417
|
}
|
|
1310
|
-
return oEntityType && oEntityType.hasStream === "true";
|
|
1311
|
-
}
|
|
1312
|
-
}
|
|
1313
|
-
|
|
1418
|
+
return oEntityType && oEntityType.hasStream === "true";
|
|
1419
|
+
}
|
|
1420
|
+
}
|
|
1421
|
+
|
|
1314
1422
|
}
|
|
1315
1423
|
return false;
|
|
1316
1424
|
}
|
|
@@ -1328,21 +1436,21 @@ sap.ui.define([
|
|
|
1328
1436
|
press => triggers the action defined in the command execution
|
|
1329
1437
|
isStandardAction => represents whether the action is a standard action or overridden by the custom action,
|
|
1330
1438
|
determining => represents whether action is determining i.e., displayed in the footer
|
|
1331
|
-
|
|
1439
|
+
|
|
1332
1440
|
If a custom action is defined with a valid 'logicalAction', then there could be two cases:
|
|
1333
1441
|
|
|
1334
1442
|
Case 1: Custom action has an ID
|
|
1335
|
-
In this case, the corresponding standard button does not get created and instead an extension button
|
|
1443
|
+
In this case, the corresponding standard button does not get created and instead an extension button
|
|
1336
1444
|
gets created, which takes over some standard functionality, especially the keyboard shortcut and the following properties:
|
|
1337
1445
|
visible, text, importance, callbackName (if not defined in the manifest)
|
|
1338
1446
|
|
|
1339
1447
|
Case 2: Custom action does not have an ID
|
|
1340
|
-
Here, the corresponding standard button gets created and takes over everything defined explicitly in the manifest.
|
|
1341
|
-
|
|
1448
|
+
Here, the corresponding standard button gets created and takes over everything defined explicitly in the manifest.
|
|
1449
|
+
|
|
1342
1450
|
In both the cases, isStandardAction is set to false.
|
|
1343
1451
|
TODO: isStandardAction is only used to set different types of CustomData and OverflowToolbarLayoutData in the respective fragments.
|
|
1344
1452
|
However, additional CustomData should not harm, and regarding OverflowToolbarLayoutData, importance should always be the default
|
|
1345
|
-
(if not defined otherwise) and so, it should be removed and the places where these CustomData are being consumed should be refactored (if required).
|
|
1453
|
+
(if not defined otherwise) and so, it should be removed and the places where these CustomData are being consumed should be refactored (if required).
|
|
1346
1454
|
*/
|
|
1347
1455
|
var oStandardActions = {
|
|
1348
1456
|
Delete: {
|
|
@@ -1395,7 +1503,7 @@ sap.ui.define([
|
|
|
1395
1503
|
}
|
|
1396
1504
|
};
|
|
1397
1505
|
|
|
1398
|
-
// For mobile and tablet devices, a menu button containing Save and Validate button is rendered instead of the below standard Save button. Logic WRT visibility of
|
|
1506
|
+
// For mobile and tablet devices, a menu button containing Save and Validate button is rendered instead of the below standard Save button. Logic WRT visibility of
|
|
1399
1507
|
// said menu button is present in the footer fragment.
|
|
1400
1508
|
if (oDevice.system.desktop || !oComponentUtils.isDraftEnabled()) {
|
|
1401
1509
|
oStandardActions.Save = {
|