@sapui5/sap.suite.ui.generic.template 1.133.0 → 1.134.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (91) hide show
  1. package/package.json +1 -1
  2. package/src/sap/suite/ui/generic/template/.library +1 -1
  3. package/src/sap/suite/ui/generic/template/AnalyticalListPage/i18n/i18n.properties +7 -7
  4. package/src/sap/suite/ui/generic/template/AnalyticalListPage/manifest.json +1 -1
  5. package/src/sap/suite/ui/generic/template/Canvas/extensionAPI/ExtensionAPI.js +11 -3
  6. package/src/sap/suite/ui/generic/template/Canvas/manifest.json +1 -1
  7. package/src/sap/suite/ui/generic/template/ListReport/extensionAPI/ExtensionAPI.js +11 -9
  8. package/src/sap/suite/ui/generic/template/ListReport/i18n/i18n.properties +3 -3
  9. package/src/sap/suite/ui/generic/template/ListReport/manifest.json +1 -1
  10. package/src/sap/suite/ui/generic/template/ListReport/view/ListReport.view.xml +1 -1
  11. package/src/sap/suite/ui/generic/template/ListReport/view/fragments/SmartFilterBar.fragment.xml +1 -1
  12. package/src/sap/suite/ui/generic/template/ObjectPage/controller/MessageSortingHandler.js +22 -5
  13. package/src/sap/suite/ui/generic/template/ObjectPage/extensionAPI/DraftTransactionController.js +8 -10
  14. package/src/sap/suite/ui/generic/template/ObjectPage/extensionAPI/ExtensionAPI.js +34 -14
  15. package/src/sap/suite/ui/generic/template/ObjectPage/i18n/i18n.properties +22 -4
  16. package/src/sap/suite/ui/generic/template/ObjectPage/manifest.json +1 -1
  17. package/src/sap/suite/ui/generic/template/ObjectPage/templateSpecificPreparationHelper.js +233 -125
  18. package/src/sap/suite/ui/generic/template/ObjectPage/view/fragments/Facet.fragment.xml +32 -27
  19. package/src/sap/suite/ui/generic/template/ObjectPage/view/fragments/SmartTable.fragment.xml +7 -11
  20. package/src/sap/suite/ui/generic/template/QuickCreate/manifest.json +1 -1
  21. package/src/sap/suite/ui/generic/template/QuickView/manifest.json +1 -1
  22. package/src/sap/suite/ui/generic/template/designtime/controls/ObjectPageLayout.designtime.js +29 -12
  23. package/src/sap/suite/ui/generic/template/designtime/controls/SmartTable.designtime.js +29 -28
  24. package/src/sap/suite/ui/generic/template/designtime/floorplans/AnalyticalListPage.designtime.js +3 -1
  25. package/src/sap/suite/ui/generic/template/designtime/floorplans/ListReport.designtime.js +3 -1
  26. package/src/sap/suite/ui/generic/template/designtime/floorplans/ObjectPage.designtime.js +4 -1
  27. package/src/sap/suite/ui/generic/template/detailTemplates/DiscardEditHandler.js +13 -0
  28. package/src/sap/suite/ui/generic/template/fragments/DraftAdminDataPopover.fragment.xml +1 -0
  29. package/src/sap/suite/ui/generic/template/fragments/MessagePopover.fragment.xml +2 -2
  30. package/src/sap/suite/ui/generic/template/fragments/SmartControlContextMenu.fragment.xml +1 -1
  31. package/src/sap/suite/ui/generic/template/genericUtilities/filterHelper.js +3 -1
  32. package/src/sap/suite/ui/generic/template/js/AnnotationHelper.js +65 -8
  33. package/src/sap/suite/ui/generic/template/js/AnnotationHelperStreamSupport.js +1 -1
  34. package/src/sap/suite/ui/generic/template/lib/AppComponent.js +1 -2
  35. package/src/sap/suite/ui/generic/template/lib/Application.js +2 -0
  36. package/src/sap/suite/ui/generic/template/lib/ComponentUtils.js +13 -2
  37. package/src/sap/suite/ui/generic/template/lib/ContextBookkeeping.js +1 -0
  38. package/src/sap/suite/ui/generic/template/lib/ContextMenuHandler.js +124 -2
  39. package/src/sap/suite/ui/generic/template/lib/SideEffectUtil.js +39 -2
  40. package/src/sap/suite/ui/generic/template/lib/i18n/i18n.properties +17 -11
  41. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_ar.properties +2 -0
  42. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_bg.properties +4 -2
  43. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_ca.properties +4 -2
  44. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_cnr.properties +3 -1
  45. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_cs.properties +3 -1
  46. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_cy.properties +2 -0
  47. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_da.properties +3 -1
  48. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_de.properties +4 -2
  49. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_el.properties +4 -2
  50. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_en.properties +4 -2
  51. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_en_GB.properties +4 -2
  52. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_es.properties +4 -2
  53. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_es_MX.properties +2 -0
  54. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_et.properties +4 -2
  55. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_fi.properties +3 -1
  56. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_fr.properties +4 -2
  57. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_fr_CA.properties +4 -2
  58. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_hi.properties +2 -0
  59. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_hr.properties +3 -1
  60. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_hu.properties +6 -4
  61. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_id.properties +3 -1
  62. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_it.properties +4 -2
  63. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_iw.properties +2 -0
  64. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_ja.properties +3 -1
  65. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_kk.properties +3 -1
  66. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_ko.properties +3 -1
  67. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_lt.properties +4 -2
  68. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_lv.properties +4 -2
  69. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_mk.properties +4 -2
  70. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_ms.properties +3 -1
  71. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_nl.properties +5 -3
  72. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_no.properties +4 -2
  73. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_pl.properties +2 -0
  74. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_pt.properties +4 -2
  75. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_pt_PT.properties +4 -2
  76. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_ro.properties +4 -2
  77. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_ru.properties +4 -2
  78. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_sh.properties +3 -1
  79. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_sk.properties +2 -0
  80. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_sl.properties +4 -2
  81. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_sr.properties +3 -1
  82. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_sv.properties +4 -2
  83. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_th.properties +3 -1
  84. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_tr.properties +3 -1
  85. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_uk.properties +4 -2
  86. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_vi.properties +4 -2
  87. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_zh_CN.properties +3 -1
  88. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_zh_TW.properties +4 -2
  89. package/src/sap/suite/ui/generic/template/lib/navigation/NavigationController.js +32 -20
  90. package/src/sap/suite/ui/generic/template/lib/presentationControl/SmartTableHandler.js +4 -5
  91. 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 = {