@sapui5/sap.suite.ui.generic.template 1.139.0 → 1.141.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (149) 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/controller/ControllerImplementation.js +7 -9
  4. package/src/sap/suite/ui/generic/template/AnalyticalListPage/extensionAPI/ExtensionAPI.js +4 -1
  5. package/src/sap/suite/ui/generic/template/AnalyticalListPage/i18n/i18n_ar.properties +0 -2
  6. package/src/sap/suite/ui/generic/template/AnalyticalListPage/i18n/i18n_bg.properties +0 -2
  7. package/src/sap/suite/ui/generic/template/AnalyticalListPage/i18n/i18n_ca.properties +0 -2
  8. package/src/sap/suite/ui/generic/template/AnalyticalListPage/i18n/i18n_cnr.properties +0 -2
  9. package/src/sap/suite/ui/generic/template/AnalyticalListPage/i18n/i18n_cs.properties +0 -2
  10. package/src/sap/suite/ui/generic/template/AnalyticalListPage/i18n/i18n_cy.properties +0 -2
  11. package/src/sap/suite/ui/generic/template/AnalyticalListPage/i18n/i18n_da.properties +0 -2
  12. package/src/sap/suite/ui/generic/template/AnalyticalListPage/i18n/i18n_de.properties +0 -2
  13. package/src/sap/suite/ui/generic/template/AnalyticalListPage/i18n/i18n_el.properties +0 -2
  14. package/src/sap/suite/ui/generic/template/AnalyticalListPage/i18n/i18n_en.properties +0 -2
  15. package/src/sap/suite/ui/generic/template/AnalyticalListPage/i18n/i18n_en_GB.properties +0 -2
  16. package/src/sap/suite/ui/generic/template/AnalyticalListPage/i18n/i18n_en_US_saprigi.properties +0 -2
  17. package/src/sap/suite/ui/generic/template/AnalyticalListPage/i18n/i18n_es.properties +0 -2
  18. package/src/sap/suite/ui/generic/template/AnalyticalListPage/i18n/i18n_es_MX.properties +0 -2
  19. package/src/sap/suite/ui/generic/template/AnalyticalListPage/i18n/i18n_et.properties +0 -2
  20. package/src/sap/suite/ui/generic/template/AnalyticalListPage/i18n/i18n_fi.properties +0 -2
  21. package/src/sap/suite/ui/generic/template/AnalyticalListPage/i18n/i18n_fr.properties +0 -2
  22. package/src/sap/suite/ui/generic/template/AnalyticalListPage/i18n/i18n_fr_CA.properties +0 -2
  23. package/src/sap/suite/ui/generic/template/AnalyticalListPage/i18n/i18n_hi.properties +0 -2
  24. package/src/sap/suite/ui/generic/template/AnalyticalListPage/i18n/i18n_hr.properties +0 -2
  25. package/src/sap/suite/ui/generic/template/AnalyticalListPage/i18n/i18n_hu.properties +0 -2
  26. package/src/sap/suite/ui/generic/template/AnalyticalListPage/i18n/i18n_id.properties +0 -2
  27. package/src/sap/suite/ui/generic/template/AnalyticalListPage/i18n/i18n_it.properties +0 -2
  28. package/src/sap/suite/ui/generic/template/AnalyticalListPage/i18n/i18n_iw.properties +0 -2
  29. package/src/sap/suite/ui/generic/template/AnalyticalListPage/i18n/i18n_ja.properties +0 -2
  30. package/src/sap/suite/ui/generic/template/AnalyticalListPage/i18n/i18n_kk.properties +0 -2
  31. package/src/sap/suite/ui/generic/template/AnalyticalListPage/i18n/i18n_ko.properties +0 -2
  32. package/src/sap/suite/ui/generic/template/AnalyticalListPage/i18n/i18n_lt.properties +0 -2
  33. package/src/sap/suite/ui/generic/template/AnalyticalListPage/i18n/i18n_lv.properties +0 -2
  34. package/src/sap/suite/ui/generic/template/AnalyticalListPage/i18n/i18n_mk.properties +0 -2
  35. package/src/sap/suite/ui/generic/template/AnalyticalListPage/i18n/i18n_ms.properties +0 -2
  36. package/src/sap/suite/ui/generic/template/AnalyticalListPage/i18n/i18n_nl.properties +0 -2
  37. package/src/sap/suite/ui/generic/template/AnalyticalListPage/i18n/i18n_no.properties +0 -2
  38. package/src/sap/suite/ui/generic/template/AnalyticalListPage/i18n/i18n_pl.properties +0 -2
  39. package/src/sap/suite/ui/generic/template/AnalyticalListPage/i18n/i18n_pt.properties +0 -2
  40. package/src/sap/suite/ui/generic/template/AnalyticalListPage/i18n/i18n_pt_PT.properties +0 -2
  41. package/src/sap/suite/ui/generic/template/AnalyticalListPage/i18n/i18n_ro.properties +0 -2
  42. package/src/sap/suite/ui/generic/template/AnalyticalListPage/i18n/i18n_ru.properties +0 -2
  43. package/src/sap/suite/ui/generic/template/AnalyticalListPage/i18n/i18n_sh.properties +0 -2
  44. package/src/sap/suite/ui/generic/template/AnalyticalListPage/i18n/i18n_sk.properties +0 -2
  45. package/src/sap/suite/ui/generic/template/AnalyticalListPage/i18n/i18n_sl.properties +0 -2
  46. package/src/sap/suite/ui/generic/template/AnalyticalListPage/i18n/i18n_sr.properties +0 -2
  47. package/src/sap/suite/ui/generic/template/AnalyticalListPage/i18n/i18n_sv.properties +0 -2
  48. package/src/sap/suite/ui/generic/template/AnalyticalListPage/i18n/i18n_th.properties +0 -2
  49. package/src/sap/suite/ui/generic/template/AnalyticalListPage/i18n/i18n_tr.properties +0 -2
  50. package/src/sap/suite/ui/generic/template/AnalyticalListPage/i18n/i18n_uk.properties +0 -2
  51. package/src/sap/suite/ui/generic/template/AnalyticalListPage/i18n/i18n_vi.properties +0 -2
  52. package/src/sap/suite/ui/generic/template/AnalyticalListPage/i18n/i18n_zh_CN.properties +0 -2
  53. package/src/sap/suite/ui/generic/template/AnalyticalListPage/i18n/i18n_zh_TW.properties +0 -2
  54. package/src/sap/suite/ui/generic/template/AnalyticalListPage/manifest.json +1 -1
  55. package/src/sap/suite/ui/generic/template/Canvas/extensionAPI/ExtensionAPI.js +4 -1
  56. package/src/sap/suite/ui/generic/template/Canvas/manifest.json +1 -1
  57. package/src/sap/suite/ui/generic/template/ListReport/controller/IappStateHandler.js +34 -33
  58. package/src/sap/suite/ui/generic/template/ListReport/extensionAPI/ExtensionAPI.js +4 -1
  59. package/src/sap/suite/ui/generic/template/ListReport/manifest.json +1 -1
  60. package/src/sap/suite/ui/generic/template/ListReport/view/fragments/SmartTable.fragment.xml +1 -0
  61. package/src/sap/suite/ui/generic/template/ObjectPage/annotationHelpers/AnnotationHelperActionButtons.js +49 -5
  62. package/src/sap/suite/ui/generic/template/ObjectPage/annotationHelpers/AnnotationHelperActionButtons.qunit.js +27 -0
  63. package/src/sap/suite/ui/generic/template/ObjectPage/controller/ControllerImplementation.js +65 -23
  64. package/src/sap/suite/ui/generic/template/ObjectPage/controller/RelatedAppsHandler.js +3 -1
  65. package/src/sap/suite/ui/generic/template/ObjectPage/controller/SectionTitleHandler.js +17 -13
  66. package/src/sap/suite/ui/generic/template/ObjectPage/controllerFrameworkExtensions.js +285 -270
  67. package/src/sap/suite/ui/generic/template/ObjectPage/extensionAPI/ExtensionAPI.js +4 -1
  68. package/src/sap/suite/ui/generic/template/ObjectPage/manifest.json +1 -1
  69. package/src/sap/suite/ui/generic/template/ObjectPage/view/Details.view.xml +2 -3
  70. package/src/sap/suite/ui/generic/template/ObjectPage/view/fragments/Actions.fragment.xml +18 -2
  71. package/src/sap/suite/ui/generic/template/ObjectPage/view/fragments/CRUDActionButtons.fragment.xml +31 -24
  72. package/src/sap/suite/ui/generic/template/ObjectPage/view/fragments/SmartForm.fragment.xml +1 -0
  73. package/src/sap/suite/ui/generic/template/ObjectPage/view/fragments/SmartTable.fragment.xml +1 -0
  74. package/src/sap/suite/ui/generic/template/QuickCreate/manifest.json +1 -1
  75. package/src/sap/suite/ui/generic/template/QuickView/manifest.json +1 -1
  76. package/src/sap/suite/ui/generic/template/designtime/controls/DynamicPage.designtime.js +2 -2
  77. package/src/sap/suite/ui/generic/template/designtime/controls/ObjectPageLayout.designtime.js +2 -2
  78. package/src/sap/suite/ui/generic/template/designtime/controls/SmartFilterBar.designtime.js +2 -2
  79. package/src/sap/suite/ui/generic/template/designtime/controls/SmartTable.designtime.js +2 -2
  80. package/src/sap/suite/ui/generic/template/designtime/utils/designtimeUtils.js +6 -1
  81. package/src/sap/suite/ui/generic/template/fragments/AINotice.fragment.xml +24 -0
  82. package/src/sap/suite/ui/generic/template/fragments/ToolbarButton.fragment.xml +1 -0
  83. package/src/sap/suite/ui/generic/template/genericUtilities/polyFill.js +6 -7
  84. package/src/sap/suite/ui/generic/template/js/AnnotationHelper.js +120 -0
  85. package/src/sap/suite/ui/generic/template/lib/AppComponent.js +3 -2
  86. package/src/sap/suite/ui/generic/template/lib/CRUDManager.js +97 -14
  87. package/src/sap/suite/ui/generic/template/lib/CommonEventHandlers.js +4 -2
  88. package/src/sap/suite/ui/generic/template/lib/CommonUtils.js +23 -14
  89. package/src/sap/suite/ui/generic/template/lib/ai/EasyFill/EasyFillHandler.js +407 -0
  90. package/src/sap/suite/ui/generic/template/lib/ai/EasyFill/fragments/EasyFillDialog.fragment.xml +82 -0
  91. package/src/sap/suite/ui/generic/template/lib/ai/EasyFill/fragments/EasyFillNonUpdatableSmartForm.fragment.xml +18 -0
  92. package/src/sap/suite/ui/generic/template/lib/ai/EasyFill/fragments/EasyFillUpdatebleSmartForm.fragment.xml +15 -0
  93. package/src/sap/suite/ui/generic/template/lib/ai/EasyFilterBarHandler.js +40 -5
  94. package/src/sap/suite/ui/generic/template/lib/ai/FioriAIHandler.js +2 -1
  95. package/src/sap/suite/ui/generic/template/lib/i18n/i18n.properties +72 -0
  96. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_ar.properties +48 -0
  97. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_bg.properties +48 -0
  98. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_ca.properties +48 -0
  99. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_cnr.properties +48 -0
  100. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_cs.properties +48 -0
  101. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_cy.properties +48 -0
  102. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_da.properties +48 -0
  103. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_de.properties +48 -0
  104. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_el.properties +48 -0
  105. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_en.properties +48 -0
  106. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_en_GB.properties +48 -0
  107. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_en_US_saprigi.properties +48 -0
  108. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_es.properties +48 -0
  109. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_es_MX.properties +48 -0
  110. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_et.properties +48 -0
  111. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_fi.properties +48 -0
  112. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_fr.properties +48 -0
  113. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_fr_CA.properties +48 -0
  114. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_hi.properties +48 -0
  115. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_hr.properties +48 -0
  116. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_hu.properties +48 -0
  117. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_id.properties +51 -3
  118. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_it.properties +48 -0
  119. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_iw.properties +48 -0
  120. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_ja.properties +48 -0
  121. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_kk.properties +48 -0
  122. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_ko.properties +49 -1
  123. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_lt.properties +48 -0
  124. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_lv.properties +48 -0
  125. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_mk.properties +48 -0
  126. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_ms.properties +48 -0
  127. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_nl.properties +48 -0
  128. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_no.properties +48 -0
  129. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_pl.properties +48 -0
  130. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_pt.properties +48 -0
  131. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_pt_PT.properties +48 -0
  132. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_ro.properties +48 -0
  133. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_ru.properties +48 -0
  134. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_sh.properties +48 -0
  135. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_sk.properties +48 -0
  136. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_sl.properties +48 -0
  137. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_sr.properties +48 -0
  138. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_sv.properties +48 -0
  139. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_th.properties +48 -0
  140. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_tr.properties +48 -0
  141. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_uk.properties +48 -0
  142. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_vi.properties +48 -0
  143. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_zh_CN.properties +48 -0
  144. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_zh_TW.properties +48 -0
  145. package/src/sap/suite/ui/generic/template/lib/navigation/NavigationController.js +1 -1
  146. package/src/sap/suite/ui/generic/template/lib/presentationControl/SmartTableHandler.js +1 -1
  147. package/src/sap/suite/ui/generic/template/library.js +1 -1
  148. package/src/sap/suite/ui/generic/template/listTemplates/controller/SmartChartController.js +5 -3
  149. package/src/sap/suite/ui/generic/template/themes/base/ObjectPage.less +51 -0
@@ -84,12 +84,12 @@ sap.ui.define([
84
84
  var aPageVariantControlStateWrappers = []; // controls handled from page variant management if used: smartTable, searchfield, partly multiple views
85
85
 
86
86
  // SmartTable state: Table Settings and (in case of control level variant management) selected variant and whether it's dirty
87
- // In case of multipleViews with multiple tables (mode "multi"), each tab has an own table or chart, which has an own state, so multipleViewsHandler has to take care of
87
+ // In case of multipleViews with multiple tables (mode "multi"), each tab has an own table or chart, which has an own state, so multipleViewsHandler has to take care of
88
88
  // storing/restoring their states (in its part of the appState stored in genericData.tableTabData)
89
- // In this case, mutliViewsHandler exchanges oState.oPresentationControlHandler (setting it always to the current visible one), so don't rely on that to get the wrapper.
89
+ // In this case, mutliViewsHandler exchanges oState.oPresentationControlHandler (setting it always to the current visible one), so don't rely on that to get the wrapper.
90
90
  // Using the id (without providing optional parameter sQuickVariantKey) returns the smartTable only in single table case.
91
91
  var oSmartTable = oController.byId(StableIdHelper.getStableId({type: "ListReportTable", subType: "SmartTable"}));
92
- if (oSmartTable){ // in multipleViews case (with multiple tables) currently multipleViews handler handles complete state information
92
+ if (oSmartTable){ // in multipleViews case (with multiple tables) currently multipleViews handler handles complete state information
93
93
  aControlStateWrappers.push(oTemplateUtils.oCommonUtils.getControlStateWrapper(oSmartTable));
94
94
  }
95
95
 
@@ -128,7 +128,7 @@ sap.ui.define([
128
128
 
129
129
  // List of handlers to react on (app or adaptation) extension state changes. Only one entry expected (handler in SFB wrapper). Currently, extensions are only possible in
130
130
  // SFB - if extensions at other places are needed, the similar handler might differ depending on whether page variant management is used.
131
- var aExtensionStateChangeHandlers = [];
131
+ var aExtensionStateChangeHandlers = [];
132
132
  function customAppStateChange() {
133
133
  aExtensionStateChangeHandlers.forEach(function(fnHandler) {
134
134
  fnHandler();
@@ -239,7 +239,7 @@ sap.ui.define([
239
239
 
240
240
 
241
241
  // Wrapper to control whether data is loaded
242
-
242
+
243
243
  function fnGetDataLoadedWrapper(){
244
244
  // Wrapper to control whether data is expected to be loaded - controls the state, but does not trigger loading data on restore!
245
245
  var oTemplatePrivateModel = oTemplateUtils.oComponentUtils.getTemplatePrivateModel();
@@ -247,15 +247,15 @@ sap.ui.define([
247
247
  // - startup with iAppState: anyway setState will be called
248
248
  // - other startup cases: applyInitialLoadBehavior calls setState explicitly
249
249
  // - navigation
250
-
250
+
251
251
  function fnSetState(bState){
252
252
  oTemplatePrivateModel.setProperty("/generic/bDataAreShownInTable", bState);
253
253
  }
254
-
254
+
255
255
  function fnGetState(){
256
256
  return oTemplatePrivateModel.getProperty("/generic/bDataAreShownInTable");
257
257
  }
258
-
258
+
259
259
  function fnSetDataShown(bDataShown, fnHandler){
260
260
  if (bDataShown === fnGetState()){
261
261
  return;
@@ -263,7 +263,7 @@ sap.ui.define([
263
263
  fnSetState(bDataShown);
264
264
  fnHandler();
265
265
  }
266
-
266
+
267
267
  return {
268
268
  getLocalId: function(){
269
269
  return "$dataLoaded";
@@ -271,7 +271,7 @@ sap.ui.define([
271
271
  setState: fnSetState,
272
272
  getState: fnGetState,
273
273
  attachStateChanged: function(fnHandler){
274
- // changing from data not loaded to data loaded:
274
+ // changing from data not loaded to data loaded:
275
275
  // - when SFB triggers search
276
276
  oState.oSmartFilterbar.attachSearch(fnSetDataShown.bind(null, true, fnHandler));
277
277
 
@@ -286,7 +286,7 @@ sap.ui.define([
286
286
  }
287
287
  };
288
288
  }
289
-
289
+
290
290
  var oDataLoadedWrapper = fnGetDataLoadedWrapper();
291
291
  aControlStateWrappers.push(oDataLoadedWrapper);
292
292
  // oDataLoadedWrapper.attachStateChanged(changeIappState);
@@ -396,7 +396,7 @@ sap.ui.define([
396
396
  if (Device.system.phone) {
397
397
  collapseHeader();
398
398
  }
399
- // Ideally, oDataLoadedWrapper should ensure to keep its state correct. However, currently we have no means to attach to the command - i.e. oDataLoadedWrapper only
399
+ // Ideally, oDataLoadedWrapper should ensure to keep its state correct. However, currently we have no means to attach to the command - i.e. oDataLoadedWrapper only
400
400
  // attaches to SFB's search event, which is only triggered when user presses the go button. When keyboard shortcut is used instead, this handler would be called (as it
401
401
  // is attached to the command), but SFB's search event would not be triggered. As workaround, we additionally set data loaded state to true here and inform explicitly
402
402
  // the the state has changed.
@@ -440,7 +440,7 @@ sap.ui.define([
440
440
  }
441
441
  }
442
442
  }
443
-
443
+
444
444
  /*
445
445
  This method is called when an LR app is the target of an external navigation and the XAppState data contains a presentationVariant.
446
446
  The sorting from this presentationVariant is then applied to the table.
@@ -460,13 +460,13 @@ sap.ui.define([
460
460
  fnAdaptOtherControlsToAppState(oAppData.controlStates);
461
461
  if (areDataShownInTable()){
462
462
  // fnAdaptOtherControlsToAppState only (synchronously) sets the state including the information whether data should be loaded - if this is the case, the actual loading
463
- // (which happens asynchronous of course) still needs to be triggered
463
+ // (which happens asynchronous of course) still needs to be triggered
464
464
  loadData();
465
465
  } else {
466
466
  // hide placeholder already here, if no data is to be loaded - in case data is loaded, it will be hidden in data received event
467
467
  oTemplateUtils.oComponentUtils.hidePlaceholder();
468
- }
469
-
468
+ }
469
+
470
470
  // special case: when restoring an old app state with data loaded, but in the meantime a filter not set in that state has been changed to mandatory, SFB.search would not
471
471
  // trigger a request (but instead only mark that filter) - thus hiding placeholder now to avoid it to stay forever
472
472
  // TODO: refactor: Still in that case our internal data shows data are loaded - ideally, that should not be the case
@@ -603,7 +603,7 @@ sap.ui.define([
603
603
 
604
604
  function fnAdaptToAppStateStartUpWithParameters(oAppData, oURLParameters, sPreferredQuickVariantSelectionKey){
605
605
  handleVariantIdPassedViaURLParams(oURLParameters);
606
-
606
+
607
607
  var oSFBUiState = oState.oSmartFilterbar.getUiState();
608
608
  var oSFBSemanticDates = oSFBUiState.getSemanticDates();
609
609
  //oStartupObject to be passed to the extension where urlParameters and selectedQuickVariantSelectionKey are optional
@@ -766,23 +766,24 @@ sap.ui.define([
766
766
  default:
767
767
  throw new FeError(sClassName, "Invalid navigation type: " + sNavType);
768
768
  }
769
-
769
+
770
770
  // common to all startup cases (except iAppState)
771
771
  if (areDataShownInTable()){
772
772
  // trigger search if needed
773
773
  oState.oSmartFilterbar.search();
774
- // For desktop devices, expand the header for Standard and Custom variants and for tablet and mobile devices,
774
+ // For desktop devices, expand the header for Standard and Custom variants and for tablet and mobile devices,
775
775
  // collapse the header only if search is triggered.
776
776
  if (Device.system.desktop) {
777
777
  oTemplateUtils.oCommonUtils.getControlStateWrapper(oController.byId(StableIdHelper.getStableId({type: "ListReportPage", subType: "DynamicPage"}))).setHeaderState(oController, true);
778
778
  } else {
779
779
  collapseHeader();
780
780
  }
781
- } else {
782
- // if no data are loaded, place holder has to be hidden now - otherwise it will be hidden when data is received
781
+ }
782
+ if (!areDataShownInTable() || Object.keys(oState.oSmartFilterbar.verifySearchAllowed()).length > 0) {
783
+ // if no data are loaded or search is not allowed, place holder has to be hidden now - otherwise it will be hidden when data is received
783
784
  oTemplateUtils.oComponentUtils.hidePlaceholder();
784
785
  }
785
-
786
+
786
787
  // ensure first iAppState is created
787
788
  changeIappState();
788
789
  }
@@ -999,14 +1000,14 @@ sap.ui.define([
999
1000
  }
1000
1001
 
1001
1002
  // provide data load settings including defaulting
1002
- // ideally, this should be implemented in a generic way in template assembler, so that generated getters also return default values for objects if not explicitely set in
1003
+ // ideally, this should be implemented in a generic way in template assembler, so that generated getters also return default values for objects if not explicitely set in
1003
1004
  // manifest (i.e. it should be sufficient to define the default in component - no need to individually implement defaulting!)
1004
1005
  function getDataLoadSettings(){
1005
1006
  // general default
1006
1007
  var oDefaultDataLoadSettings = {loadDataOnAppLaunch: "ifAnyFilterExist"};
1007
1008
 
1008
1009
  // intension is boolean, but unfortunately faulty values are (historically) not treated consistently
1009
- var bEnableAutoBindingMultiViews = oState.oMultipleViewsHandler.getOriginalEnableAutoBinding();
1010
+ var bEnableAutoBindingMultiViews = oState.oMultipleViewsHandler.getOriginalEnableAutoBinding();
1010
1011
 
1011
1012
  // if multiple views settings is not defined (also the case in single views case), general default is taken. Unlike other faulty values, null is treated like undefined
1012
1013
  if (bEnableAutoBindingMultiViews !== undefined && bEnableAutoBindingMultiViews !== null){
@@ -1016,13 +1017,13 @@ sap.ui.define([
1016
1017
 
1017
1018
  var oManifestDataLoadSettings = oController.getOwnerComponent().getDataLoadSettings();
1018
1019
  // (historically) explicit setting empty string (not an allowed value according to definition in component!) is treated like undefined (including adopting multiple views
1019
- // settings. Other not allowed values (any other sting) were ignored, i.e. returning undefined from getInitialLoadBehaviourSettings, thus setting undefined to
1020
- // oSmartVariantManagement.setExecuteOnStandard (which actually only sets the default) and finally using the value returned from
1020
+ // settings. Other not allowed values (any other sting) were ignored, i.e. returning undefined from getInitialLoadBehaviourSettings, thus setting undefined to
1021
+ // oSmartVariantManagement.setExecuteOnStandard (which actually only sets the default) and finally using the value returned from
1021
1022
  // oSmartVariantManagement.getExecuteOnStandard (only different from overall default (false), if user has explicitly set it)
1022
1023
  if (oManifestDataLoadSettings && oManifestDataLoadSettings.loadDataOnAppLaunch === ""){
1023
1024
  oManifestDataLoadSettings.loadDataOnAppLaunch = undefined;
1024
1025
  }
1025
-
1026
+
1026
1027
  // explicit setting has highest priority
1027
1028
  return extend(oDefaultDataLoadSettings, oManifestDataLoadSettings);
1028
1029
  }
@@ -1031,7 +1032,7 @@ sap.ui.define([
1031
1032
  // - sets default value for flag whether standard variant should be execute on select
1032
1033
  // - determines whether we actually should load data
1033
1034
  function applyInitialLoadBehavior(bDataLoadCausedByNavigation){
1034
- // cases definitely determining to load data initially
1035
+ // cases definitely determining to load data initially
1035
1036
  // - worklist
1036
1037
  // - livemode
1037
1038
  // - master detail (i.e. bLoadListAndFirstEntryOnStartup is set)
@@ -1040,17 +1041,17 @@ sap.ui.define([
1040
1041
 
1041
1042
  var sLoadBehaviour = getDataLoadSettings().loadDataOnAppLaunch;
1042
1043
  if (!oSmartVariantManagement || oController.getOwnerComponent().getVariantManagementHidden()){
1043
- // No VM ->
1044
+ // No VM ->
1044
1045
  bShouldDataBeLoaded = bShouldDataBeLoaded || sLoadBehaviour === "always";
1045
1046
  bShouldDataBeLoaded = bShouldDataBeLoaded || (sLoadBehaviour === "ifAnyFilterExist" && oSmartFilterbar.getFiltersWithValues().length > 0);
1046
1047
  // behavior of last patch set would translate to the following - seems not to be correct (in case of setting ifAnyFilterExist but no filters provided)
1047
1048
  // bShouldDataBeLoaded = bShouldDataBeLoaded || sLoadBehaviour !== "never";
1048
1049
  } else {
1049
- // in case of a (visible) SVM, we need to set the default value
1050
- // default value for standard variant
1050
+ // in case of a (visible) SVM, we need to set the default value
1051
+ // default value for standard variant
1051
1052
  // - true if one of the conditions above is fulfilled
1052
- // - or for any manifest setting but "never"
1053
- // (Remark: "ifAnyFilterExist" leads to mark the standard variant true, even if no filter is provided - this looks ok for startup, as the text shown to the user
1053
+ // - or for any manifest setting but "never"
1054
+ // (Remark: "ifAnyFilterExist" leads to mark the standard variant true, even if no filter is provided - this looks ok for startup, as the text shown to the user
1054
1055
  // contains the condition, but if reselecting the standard variant, it will also select without filters!
1055
1056
  // TODO: check, how to solve that inconsistency)
1056
1057
  // - but in both cases not, if a mandatory filter is missing
@@ -95,8 +95,11 @@ sap.ui.define(["sap/ui/base/Object",
95
95
  * @param {map} [mUrlParameters] The URL parameters (name-value pairs) for the function or action. Only needed in special cases.
96
96
  * @param {object} [oSettings] Additional settings
97
97
  * @param {boolean} [oSettings.bInvocationGroupingChangeSet=false] Determines whether the common or unique changeset gets sent in batch
98
+ * @param {string} [oSettings.sLabel=""] Optional label for the Function Import.
99
+ * * This label is only used when action is invoked in strict mode and HTTP 412 (Precondition Failed) handling is required.
100
+ * * If not provided, the Function Import name is used as the default label.
101
+ * @param {boolean} [oSettings.bStrict=false] Optional flag to indicate whether the action should be invoked in strict mode. Defaults to <code>false</code>.
98
102
  * @returns {Promise} A <code>Promise</code> for asynchronous execution of the action, resolving to the same result as the <code>Promise</code>
99
- * returned from {@link sap.ui.generic.app.ApplicationController#invokeActions}
100
103
  * @throws {Error} Throws an error if the OData function import does not exist or the action input parameters are invalid
101
104
  * @public
102
105
  */
@@ -8,7 +8,7 @@
8
8
  "i18n": "i18n/i18n.properties",
9
9
  "applicationVersion": {
10
10
  "__comment": "applicationVersion oder componentversion??",
11
- "version": "1.139.0"
11
+ "version": "1.141.0"
12
12
  },
13
13
  "title": "{{TITLE}}",
14
14
  "description": "{{DESCRIPTION}}",
@@ -51,6 +51,7 @@
51
51
  <core:CustomData key="headerInfo" value="{path: 'header>', formatter: 'AH.buildHeaderInfoCustomData'}"/>
52
52
  <core:CustomData key="dateFormatSettings" value='\{"UTC":true,"style":"medium"\}' />
53
53
  <core:CustomData key="useUTCDateTime" value="true" />
54
+ <core:CustomData key="defaultTextInEditModeSource" value="ValueList" />
54
55
  <template:if test="{parts: [{path: 'entityType>'}, {path: 'tabItem>annotationPath'}], formatter: 'AH.tabItemHasPresentationVariant'}">
55
56
  <template:then>
56
57
  <core:CustomData key="lineItemQualifier"
@@ -105,9 +105,8 @@ sap.ui.define([
105
105
  isEditButtonRequired.requiresIContext = true;
106
106
 
107
107
  // Returns the visibility for the EDIT button on the object page
108
- function getEditActionButtonVisibility(oInterface, mRestrictions, oEntitySet, oAppComponent, oTreeNode, aAncestortreeNodes) {
109
- var sGeneralExpression = "!${ui>/editable}"; // logical condition for the edit button
110
-
108
+ function getEditActionButtonVisibility(oInterface, mRestrictions, oEntitySet, oAppComponent, oTreeNode, aAncestortreeNodes,sEasyFillButton) {
109
+ var sGeneralExpression = (sEasyFillButton === "true") ? "{_templPrivGlobal>/generic/fioriAI/isEasyFillEnabled}" : "!${ui>/editable}"; // logical condition for the edit button
111
110
  //oTreeNode.isDraft is use to show "Hide Draft Values" or "Show Draft Values" button in List Report table toolbar and "Display Saved version/Return to Draft" button in Object page header for a draft application.
112
111
  var sToggleExpression = "";
113
112
  if (oTreeNode.isDraft && oTreeNode.level === 1){ // Exclude the situation that there is already a draft for this user (in this case the CONTINUE_EDITING-button would be shown).
@@ -135,8 +134,52 @@ sap.ui.define([
135
134
  }
136
135
  getEditActionButtonVisibility.requiresIContext = true;
137
136
 
137
+ // Returns the visibility for the EasyFill button
138
+ function getEasyFillButtonVisibility(oInterface, mRestrictions, oEntitySet, oAppComponent, oTreeNode, aAncestortreeNodes) {
139
+ var sGeneralExpression = "{_templPrivGlobal>/generic/fioriAI/isEasyFillEnabled}"; // Ensure whether AI resource has been loaded for the EasyFill functionality
140
+
141
+ //oTreeNode.isDraft is use to show "Hide Draft Values" or "Show Draft Values" button in List Report table toolbar and "Display Saved version/Return to Draft" button in Object page header for a draft application.
142
+ var sFCLExpression = getFCLPathExpression(oAppComponent, oTreeNode, "Edit");
143
+ var sPathExpression = getPathExpression(oInterface, oEntitySet, mRestrictions, "Updatable"); // if there is an updatable path, add it to the condition
144
+ var aParentPath = [], sParentPath = "";
145
+ // for Draft enabled application, check if any parent entity set has update restriction
146
+ if (oTreeNode.isDraft) {
147
+ aAncestortreeNodes.forEach( function (oAncestorNode) {
148
+ if (oAncestorNode.level > 0) {
149
+ var oParentEntitySet = oAncestorNode.entitySetDefinition;
150
+ var mParentUpdateRestriction = oParentEntitySet && oParentEntitySet["Org.OData.Capabilities.V1.UpdateRestrictions"];
151
+ aParentPath.push(getParentPathExpression(oInterface, oParentEntitySet, mParentUpdateRestriction, "Updatable", oAncestorNode));
152
+ }
153
+ });
154
+ sParentPath = fnCombineByAnd.apply(null, aParentPath);
155
+ }
156
+ return fnCombineByAnd(sGeneralExpression, sFCLExpression, sPathExpression, sParentPath);
157
+ }
158
+ getEasyFillButtonVisibility.requiresIContext = true;
159
+
138
160
  // Returns the visibility for the DELETE button on main object page
139
161
  function getDeleteActionButtonVisibility(oInterface, mRestrictions, oEntitySet, oAppComponent, oTreeNode){
162
+ var sNavigationPath = "";
163
+ if (oTreeNode.level > 1) {
164
+ var oModel = oInterface.getInterface(0).getModel();
165
+ var oParentEntitySet = oModel.getODataEntitySet(oTreeNode.parent);
166
+ var oNavigationRestrictions = oParentEntitySet["Org.OData.Capabilities.V1.NavigationRestrictions"];
167
+ if (oNavigationRestrictions && oNavigationRestrictions.RestrictedProperties) {
168
+ var aRestrictedProperties = oNavigationRestrictions.RestrictedProperties;
169
+ for (var i in aRestrictedProperties) {
170
+ var oNavigationProperty = aRestrictedProperties[i];
171
+ var sNavigationPropertyPath = oNavigationProperty.NavigationProperty.NavigationPropertyPath;
172
+ if (sNavigationPropertyPath === oTreeNode.navigationProperty) {
173
+ if (oNavigationProperty?.DeleteRestrictions?.Deletable?.Bool === "false") {
174
+ return false;
175
+ }
176
+ if (oNavigationProperty?.DeleteRestrictions?.Deletable?.Path) {
177
+ sNavigationPath = "${" + oNavigationProperty?.DeleteRestrictions?.Deletable?.Path + "}";
178
+ }
179
+ }
180
+ }
181
+ }
182
+ }
140
183
  var sGeneralExpression; // logical condition for the delete button
141
184
  if (oTreeNode.isDraft){ // on main object page the delete button is shown in display mode on subobject pages in edit mode
142
185
  sGeneralExpression = oTreeNode.level === 1 ? "!${ui>/editable}" : "{ui>/editable}";
@@ -145,7 +188,7 @@ sap.ui.define([
145
188
  }
146
189
  var sFCLExpression = getFCLPathExpression(oAppComponent, oTreeNode, "Delete");
147
190
  var sPathExpression = getPathExpression(oInterface, oEntitySet, mRestrictions, "Deletable"); // if there is a deletable path, add it to the condition
148
- return fnCombineByAnd(sGeneralExpression, sFCLExpression, sPathExpression);
191
+ return fnCombineByAnd(sGeneralExpression, sFCLExpression, sPathExpression, sNavigationPath);
149
192
  }
150
193
  getDeleteActionButtonVisibility.requiresIContext = true;
151
194
 
@@ -204,6 +247,7 @@ sap.ui.define([
204
247
  getActionControlBreakoutVisibility: getActionControlBreakoutVisibility,
205
248
  getCallAction: getCallAction,
206
249
  getDatafieldForActionVisibility: getDatafieldForActionVisibility,
207
- getDraftAdminDataAccess: getDraftAdminDataAccess
250
+ getDraftAdminDataAccess: getDraftAdminDataAccess,
251
+ getEasyFillButtonVisibility
208
252
  };
209
253
  }, /* bExport= */ true);
@@ -0,0 +1,27 @@
1
+ /* QUnit tests for getDeleteActionButtonVisibility */
2
+
3
+ sap.ui.define([
4
+ "sap/suite/ui/generic/template/ObjectPage/annotationHelpers/AnnotationHelperActionButtons"
5
+ ], function(AnnotationHelperActionButtons) {
6
+ "use strict";
7
+
8
+ QUnit.module("getDeleteActionButtonVisibility");
9
+
10
+ QUnit.test("should return true when delete action is visible", function(assert) {
11
+ var oContext = {/* mock context for visible case */};
12
+ var result = AnnotationHelperActionButtons.getDeleteActionButtonVisibility(oContext);
13
+ assert.strictEqual(result, true, "Delete button should be visible");
14
+ });
15
+
16
+ QUnit.test("should return false when delete action is not visible", function(assert) {
17
+ var oContext = {/* mock context for not visible case */};
18
+ var result = AnnotationHelperActionButtons.getDeleteActionButtonVisibility(oContext);
19
+ assert.strictEqual(result, false, "Delete button should not be visible");
20
+ });
21
+
22
+ QUnit.test("should handle edge cases gracefully", function(assert) {
23
+ var oContext = null;
24
+ var result = AnnotationHelperActionButtons.getDeleteActionButtonVisibility(oContext);
25
+ assert.strictEqual(result, false, "Delete button should not be visible for null context");
26
+ });
27
+ });
@@ -35,6 +35,7 @@ sap.ui.define([
35
35
  "sap/suite/ui/generic/template/ObjectPage/controller/PasteHandler",
36
36
  "sap/suite/ui/generic/template/lib/insights/InsightsHandler",
37
37
  "sap/suite/ui/generic/template/lib/cards/DTCardHelper",
38
+ "sap/suite/ui/generic/template/lib/ai/EasyFill/EasyFillHandler",
38
39
  "sap/ui/core/Element"
39
40
  ], function (
40
41
  ControllerExtension,
@@ -73,6 +74,7 @@ sap.ui.define([
73
74
  PasteHandler,
74
75
  InsightsHandler,
75
76
  DTCardHelper,
77
+ EasyFillHandler,
76
78
  Element
77
79
  ) {
78
80
  "use strict";
@@ -794,38 +796,47 @@ sap.ui.define([
794
796
  var oEditPromises = oTemplateUtils.oServices.oCRUDManager.editEntity(bUnconditional);
795
797
  oEditPromises.then(function (oEditAndSiblingInfo) {
796
798
  if (oEditAndSiblingInfo.draftAdministrativeData) {
797
- fnExpiredLockDialog(oEditAndSiblingInfo.draftAdministrativeData.CreatedByUserDescription || oEditAndSiblingInfo.draftAdministrativeData.CreatedByUser);
799
+ fnExpiredLockDialog(oEditAndSiblingInfo.draftAdministrativeData.CreatedByUserDescription || oEditAndSiblingInfo.draftAdministrativeData.CreatedByUser).catch(Function.prototype);
798
800
  } else {
799
801
  fnStartEditing(oEditAndSiblingInfo);
800
802
  }
801
803
  });
804
+ return oEditPromises;
802
805
  }
803
806
 
804
807
  // This method is called when the user wants to edit an entity, for which a non-locking draft of another user exists.
805
808
  // The method asks the user, whether he wants to continue editing anyway. If this is the case editing is triggered.
806
809
  // sCreatedByUser is the name of the user possessing the non-locking draft
807
810
  fnExpiredLockDialog = function (sCreatedByUser) {
808
- var oUnsavedChangesDialog;
809
- oTemplateUtils.oCommonUtils.getDialogFragmentAsync(
810
- "sap.suite.ui.generic.template.ObjectPage.view.fragments.UnsavedChangesDialog", {
811
- onEdit: function () {
812
- oUnsavedChangesDialog.close();
813
- fnEditEntity(true);
814
- },
815
- onCancel: function () {
816
- oUnsavedChangesDialog.close();
817
- }
818
- }, "Dialog").then(function (oFragment) {
819
- oUnsavedChangesDialog = oFragment;
820
- // always access i18n text from the Main Object page level
821
- var oDraftLockTextPromise = oTemplateUtils.oComponentUtils.getMainComponentUtils();
822
- var oBusyHelper = oTemplateUtils.oServices.oApplication.getBusyHelper();
823
- oBusyHelper.setBusy(oDraftLockTextPromise);
824
- oDraftLockTextPromise.then(function (oMainUtils) {
825
- var sDialogContentText = oMainUtils.getText("DRAFT_LOCK_EXPIRED", [sCreatedByUser]);
826
- var oDialogModel = oUnsavedChangesDialog.getModel("Dialog");
827
- oDialogModel.setProperty("/unsavedChangesQuestion", sDialogContentText);
828
- oUnsavedChangesDialog.open();
811
+ return new Promise((resolve,reject)=>{
812
+ var oUnsavedChangesDialog;
813
+ oTemplateUtils.oCommonUtils.getDialogFragmentAsync(
814
+ "sap.suite.ui.generic.template.ObjectPage.view.fragments.UnsavedChangesDialog", {
815
+ onEdit: async function () {
816
+ oUnsavedChangesDialog.close();
817
+ try {
818
+ const oResponse = await fnEditEntity(true);
819
+ resolve(oResponse.context);
820
+ } catch (error) {
821
+ reject(error);
822
+ }
823
+ },
824
+ onCancel: function () {
825
+ oUnsavedChangesDialog.close();
826
+ reject();
827
+ }
828
+ }, "Dialog",undefined,true).then(function (oFragment) {
829
+ oUnsavedChangesDialog = oFragment;
830
+ // always access i18n text from the Main Object page level
831
+ var oDraftLockTextPromise = oTemplateUtils.oComponentUtils.getMainComponentUtils();
832
+ var oBusyHelper = oTemplateUtils.oServices.oApplication.getBusyHelper();
833
+ oBusyHelper.setBusy(oDraftLockTextPromise);
834
+ oDraftLockTextPromise.then(function (oMainUtils) {
835
+ var sDialogContentText = oMainUtils.getText("DRAFT_LOCK_EXPIRED", [sCreatedByUser]);
836
+ var oDialogModel = oUnsavedChangesDialog.getModel("Dialog");
837
+ oDialogModel.setProperty("/unsavedChangesQuestion", sDialogContentText);
838
+ oUnsavedChangesDialog.open();
839
+ });
829
840
  });
830
841
  });
831
842
  };
@@ -1938,6 +1949,7 @@ sap.ui.define([
1938
1949
  oState.oSectionTitleHandler.adjustSubSectionTitle(oSubSection);
1939
1950
  // Add accessible name to the SmartForm in the first subsection if all titles are hidden, because accessible name will not propogate to the form control
1940
1951
  oState.oSectionTitleHandler.addAccessibleName(oSubSection);
1952
+ oState.oSectionTitleHandler.setHeaderSmartFormAriaLabelBy(oSubSection);
1941
1953
  }
1942
1954
  }
1943
1955
 
@@ -2363,7 +2375,7 @@ sap.ui.define([
2363
2375
  oState.oMessageStripHelper = new MessageStripHelper(oMultipleViewsHandler, oController, oTemplateUtils, oBase.state.messageButtonHelper);
2364
2376
  oState.oInlineCreationRowsHelper = new InlineCreationRowsHelper(oObjectPage, oTemplateUtils, fnGetSmartTableCreationMode, oController, oState.oMessageStripHelper);
2365
2377
  oState.oSectionTitleHandler = new SectionTitleHandler(oController, oObjectPage, oTemplateUtils);
2366
-
2378
+ oState.oEasyFillHandler = new EasyFillHandler(oState, oController, oTemplateUtils, oObjectPage);
2367
2379
  var oTemplatePrivateModel = oTemplateUtils.oComponentUtils.getTemplatePrivateModel();
2368
2380
 
2369
2381
 
@@ -2529,6 +2541,9 @@ sap.ui.define([
2529
2541
  onSummarize: function () {
2530
2542
  oTemplateUtils.oServices.oFioriAIHandler.fioriaiLib.summarize.summarize({view: oController.getView()});
2531
2543
  },
2544
+ onEasyFillEdit: function (oEvent) {
2545
+ oState.oEasyFillHandler.onEasyFillButtonClick(oEvent);
2546
+ },
2532
2547
 
2533
2548
  onEdit: function (oEvent) {
2534
2549
  var oEditButton = oController.byId("edit");
@@ -2539,6 +2554,33 @@ sap.ui.define([
2539
2554
  }
2540
2555
  oTemplateUtils.oCommonUtils.executeIfControlReady(fnEditEntity, "edit");
2541
2556
  },
2557
+ onEditByEasyFill: function() {
2558
+ return new Promise((resolve, reject) => {
2559
+ try {
2560
+ oTemplateUtils.oServices.oApplication.performAfterSideEffectExecution(async function () {
2561
+ try {
2562
+ const oEditAndSiblingInfo = await oTemplateUtils.oServices.oCRUDManager.editEntity(false);
2563
+ if (oEditAndSiblingInfo.draftAdministrativeData) {
2564
+ const user = oEditAndSiblingInfo.draftAdministrativeData.CreatedByUserDescription || oEditAndSiblingInfo.draftAdministrativeData.CreatedByUser;
2565
+ try {
2566
+ const oContext = await fnExpiredLockDialog(user);
2567
+ resolve(oContext);
2568
+ } catch (error) {
2569
+ reject(error);
2570
+ }
2571
+ } else {
2572
+ fnStartEditing(oEditAndSiblingInfo);
2573
+ resolve(oEditAndSiblingInfo.context);
2574
+ }
2575
+ } catch (e) {
2576
+ reject(e);
2577
+ }
2578
+ });
2579
+ } catch (e) {
2580
+ reject(e);
2581
+ }
2582
+ });
2583
+ },
2542
2584
  onValidateDraft: onValidateDraft,
2543
2585
  onSave: onSave,
2544
2586
  onSaveAndContinueEdit: onSaveAndContinueEdit,
@@ -100,12 +100,14 @@ sap.ui.define([
100
100
  //Get all semantic object from manifest setting
101
101
  var oSettings = oTemplateUtils.oComponentUtils.getSettings();
102
102
  var oRelatedAppsSettings = oSettings.relatedAppsSettings;
103
+ // Extension to modify the related app settings.
104
+ oRelatedAppsSettings = oController.modifyRelatedAppsSettings(oRelatedAppsSettings, sCurrentSemObj);
103
105
  var bHasRelatedAppSettings = oRelatedAppsSettings && Object.keys(oRelatedAppsSettings).length > 0;
104
106
 
105
107
  if (bHasRelatedAppSettings) {
106
108
  // Iterate through oRelatedAppSettings and add all related apps into the set
107
109
  for (const sKey in oRelatedAppsSettings) {
108
- if (oRelatedAppsSettings.hasOwnProperty(sKey)) {
110
+ if (sKey && oRelatedAppsSettings.hasOwnProperty(sKey)) {
109
111
  const sSemanticObject = oRelatedAppsSettings[sKey].semanticObject;
110
112
  aSemanticObjects.push(sSemanticObject);
111
113
  }
@@ -1,6 +1,6 @@
1
1
  sap.ui.define(["sap/ui/base/Object", "sap/base/util/extend", "sap/suite/ui/generic/template/genericUtilities/controlHelper", "sap/ui/core/library",
2
- "sap/suite/ui/generic/template/genericUtilities/FeLogger"
3
- ], function(BaseObject, extend, controlHelper, SapCoreLibrary, FeLogger) {
2
+ "sap/suite/ui/generic/template/genericUtilities/FeLogger", "sap/ui/core/Element", "sap/ui/core/InvisibleText"
3
+ ], function(BaseObject, extend, controlHelper, SapCoreLibrary, FeLogger, Element, InvisibleText) {
4
4
  "use strict";
5
5
 
6
6
  var STYLE_CLASS_FOR_ADJUSTMENT = "sapUiTableOnObjectPageAdjustmentsForSection";
@@ -174,9 +174,8 @@ sap.ui.define(["sap/ui/base/Object", "sap/base/util/extend", "sap/suite/ui/gener
174
174
  oSmartForm.addAriaLabelledBy(sAnchorBarSectionHeaderId);
175
175
  }
176
176
 
177
- function fnManageAccessability(oFirstSubSection) {
178
- var oSubSectionInfoObject = oTemplateUtils.oInfoObjectHandler.getControlInformation(oFirstSubSection.getId()),
179
- oSection = oFirstSubSection.getParent();
177
+ function fnSetHeaderSmartFormAriaLabelBy(oFirstSubSection) {
178
+ var oSubSectionInfoObject = oTemplateUtils.oInfoObjectHandler.getControlInformation(oFirstSubSection.getId());
180
179
  oFirstSubSection.getBlocks().concat(oFirstSubSection.getMoreBlocks())
181
180
  .reduce(function(accBlock, currentBlock) {
182
181
  if (!currentBlock.getContent || !currentBlock.getContent() || !currentBlock.getContent().length) {
@@ -191,14 +190,19 @@ sap.ui.define(["sap/ui/base/Object", "sap/base/util/extend", "sap/suite/ui/gener
191
190
  return accBlock;
192
191
  }, [])
193
192
  .forEach(function(entry) {
194
- if (!oSubSectionInfoObject) {
193
+ if (!oSubSectionInfoObject || (entry.getGroups().length === 1 && entry.getGroups()[0].getTitle && !entry.getGroups()[0].getTitle())) {
195
194
  // Case: header is editable. manifest.json, editableHeaderContent=true
196
- entry._suggestTitleId(`${oSection.getId()}-title`); // set Section title id that will be used for aria
197
- return;
198
- }
199
- if (entry.getGroups().length === 1 && entry.getGroups()[0].getTitle && !entry.getGroups()[0].getTitle()) {
200
- // Case: Section -> one SubSection -> one SmartForm -> one Group. Title is not displayed in this case
201
- entry._suggestTitleId(`${oFirstSubSection.getId()}-headerTitle`); // set title to SubSection title id that will be used for aria
195
+ var sInvisibleTextID = `${entry.getId()}-ariaLabelBy-InvisibleText`,
196
+ oInvisibleText = Element.getElementById(sInvisibleTextID);
197
+ if (!oInvisibleText) {
198
+ var customData = !entry.getCustomData() ? [] : entry.getCustomData().filter(function(entry) {return entry.getKey() === "smartFormAriaLabel";});
199
+ if (customData.length && customData[0].getValue()) {
200
+ oInvisibleText = new InvisibleText({id : sInvisibleTextID, text: customData[0].getValue()}).toStatic();
201
+ }
202
+ }
203
+ if (oInvisibleText) {
204
+ entry._suggestTitleId(oInvisibleText.getId()); // set Section title id that will be used for aria
205
+ }
202
206
  return;
203
207
  }
204
208
  });
@@ -209,7 +213,7 @@ sap.ui.define(["sap/ui/base/Object", "sap/base/util/extend", "sap/suite/ui/gener
209
213
  setAsTitleOwner: fnSetAsTitleOwner,
210
214
  adjustSubSectionTitle: fnAdjustSubSectionTitle,
211
215
  addAccessibleName: fnAddAccessibleName,
212
- manageAccessability: fnManageAccessability
216
+ setHeaderSmartFormAriaLabelBy: fnSetHeaderSmartFormAriaLabelBy //
213
217
  };
214
218
  }
215
219