@sapui5/sap.suite.ui.generic.template 1.120.28 → 1.120.29

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 (72) 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 +1 -1
  4. package/src/sap/suite/ui/generic/template/AnalyticalListPage/i18n/i18n_ar.properties +1 -1
  5. package/src/sap/suite/ui/generic/template/AnalyticalListPage/i18n/i18n_bg.properties +1 -1
  6. package/src/sap/suite/ui/generic/template/AnalyticalListPage/i18n/i18n_ca.properties +1 -1
  7. package/src/sap/suite/ui/generic/template/AnalyticalListPage/i18n/i18n_cs.properties +1 -1
  8. package/src/sap/suite/ui/generic/template/AnalyticalListPage/i18n/i18n_cy.properties +1 -1
  9. package/src/sap/suite/ui/generic/template/AnalyticalListPage/i18n/i18n_da.properties +1 -1
  10. package/src/sap/suite/ui/generic/template/AnalyticalListPage/i18n/i18n_de.properties +2 -2
  11. package/src/sap/suite/ui/generic/template/AnalyticalListPage/i18n/i18n_el.properties +1 -1
  12. package/src/sap/suite/ui/generic/template/AnalyticalListPage/i18n/i18n_en.properties +1 -1
  13. package/src/sap/suite/ui/generic/template/AnalyticalListPage/i18n/i18n_en_GB.properties +1 -1
  14. package/src/sap/suite/ui/generic/template/AnalyticalListPage/i18n/i18n_en_US_saprigi.properties +1 -1
  15. package/src/sap/suite/ui/generic/template/AnalyticalListPage/i18n/i18n_es.properties +1 -1
  16. package/src/sap/suite/ui/generic/template/AnalyticalListPage/i18n/i18n_es_MX.properties +1 -1
  17. package/src/sap/suite/ui/generic/template/AnalyticalListPage/i18n/i18n_et.properties +1 -1
  18. package/src/sap/suite/ui/generic/template/AnalyticalListPage/i18n/i18n_fi.properties +1 -1
  19. package/src/sap/suite/ui/generic/template/AnalyticalListPage/i18n/i18n_fr.properties +1 -1
  20. package/src/sap/suite/ui/generic/template/AnalyticalListPage/i18n/i18n_fr_CA.properties +1 -1
  21. package/src/sap/suite/ui/generic/template/AnalyticalListPage/i18n/i18n_hi.properties +1 -1
  22. package/src/sap/suite/ui/generic/template/AnalyticalListPage/i18n/i18n_hr.properties +1 -1
  23. package/src/sap/suite/ui/generic/template/AnalyticalListPage/i18n/i18n_hu.properties +1 -1
  24. package/src/sap/suite/ui/generic/template/AnalyticalListPage/i18n/i18n_id.properties +1 -1
  25. package/src/sap/suite/ui/generic/template/AnalyticalListPage/i18n/i18n_it.properties +1 -1
  26. package/src/sap/suite/ui/generic/template/AnalyticalListPage/i18n/i18n_iw.properties +1 -1
  27. package/src/sap/suite/ui/generic/template/AnalyticalListPage/i18n/i18n_ja.properties +1 -1
  28. package/src/sap/suite/ui/generic/template/AnalyticalListPage/i18n/i18n_kk.properties +1 -1
  29. package/src/sap/suite/ui/generic/template/AnalyticalListPage/i18n/i18n_ko.properties +1 -1
  30. package/src/sap/suite/ui/generic/template/AnalyticalListPage/i18n/i18n_lv.properties +1 -1
  31. package/src/sap/suite/ui/generic/template/AnalyticalListPage/i18n/i18n_mk.properties +1 -1
  32. package/src/sap/suite/ui/generic/template/AnalyticalListPage/i18n/i18n_ms.properties +1 -1
  33. package/src/sap/suite/ui/generic/template/AnalyticalListPage/i18n/i18n_nl.properties +1 -1
  34. package/src/sap/suite/ui/generic/template/AnalyticalListPage/i18n/i18n_no.properties +3 -3
  35. package/src/sap/suite/ui/generic/template/AnalyticalListPage/i18n/i18n_pl.properties +1 -1
  36. package/src/sap/suite/ui/generic/template/AnalyticalListPage/i18n/i18n_pt.properties +1 -1
  37. package/src/sap/suite/ui/generic/template/AnalyticalListPage/i18n/i18n_pt_PT.properties +1 -1
  38. package/src/sap/suite/ui/generic/template/AnalyticalListPage/i18n/i18n_ro.properties +1 -1
  39. package/src/sap/suite/ui/generic/template/AnalyticalListPage/i18n/i18n_ru.properties +1 -1
  40. package/src/sap/suite/ui/generic/template/AnalyticalListPage/i18n/i18n_sk.properties +1 -1
  41. package/src/sap/suite/ui/generic/template/AnalyticalListPage/i18n/i18n_sv.properties +1 -1
  42. package/src/sap/suite/ui/generic/template/AnalyticalListPage/i18n/i18n_th.properties +1 -1
  43. package/src/sap/suite/ui/generic/template/AnalyticalListPage/i18n/i18n_tr.properties +1 -1
  44. package/src/sap/suite/ui/generic/template/AnalyticalListPage/i18n/i18n_uk.properties +1 -1
  45. package/src/sap/suite/ui/generic/template/AnalyticalListPage/i18n/i18n_vi.properties +1 -1
  46. package/src/sap/suite/ui/generic/template/AnalyticalListPage/i18n/i18n_zh_CN.properties +1 -1
  47. package/src/sap/suite/ui/generic/template/AnalyticalListPage/i18n/i18n_zh_TW.properties +1 -1
  48. package/src/sap/suite/ui/generic/template/AnalyticalListPage/manifest.json +1 -1
  49. package/src/sap/suite/ui/generic/template/Canvas/manifest.json +1 -1
  50. package/src/sap/suite/ui/generic/template/ListReport/i18n/i18n_id.properties +1 -1
  51. package/src/sap/suite/ui/generic/template/ListReport/i18n/i18n_ja.properties +6 -6
  52. package/src/sap/suite/ui/generic/template/ListReport/i18n/i18n_mk.properties +2 -2
  53. package/src/sap/suite/ui/generic/template/ListReport/manifest.json +1 -1
  54. package/src/sap/suite/ui/generic/template/ObjectPage/controller/ControllerImplementation.js +83 -80
  55. package/src/sap/suite/ui/generic/template/ObjectPage/controller/SectionTitleHandler.js +51 -0
  56. package/src/sap/suite/ui/generic/template/ObjectPage/i18n/i18n.properties +1 -1
  57. package/src/sap/suite/ui/generic/template/ObjectPage/i18n/i18n_da.properties +1 -1
  58. package/src/sap/suite/ui/generic/template/ObjectPage/i18n/i18n_de.properties +1 -1
  59. package/src/sap/suite/ui/generic/template/ObjectPage/i18n/i18n_en_US_saprigi.properties +1 -1
  60. package/src/sap/suite/ui/generic/template/ObjectPage/i18n/i18n_ru.properties +2 -2
  61. package/src/sap/suite/ui/generic/template/ObjectPage/manifest.json +1 -1
  62. package/src/sap/suite/ui/generic/template/ObjectPage/view/Details.view.xml +1 -1
  63. package/src/sap/suite/ui/generic/template/QuickCreate/i18n/i18n_de.properties +1 -1
  64. package/src/sap/suite/ui/generic/template/QuickCreate/manifest.json +1 -1
  65. package/src/sap/suite/ui/generic/template/QuickView/manifest.json +1 -1
  66. package/src/sap/suite/ui/generic/template/lib/AppComponent.js +1 -1
  67. package/src/sap/suite/ui/generic/template/lib/MessageButtonHelper.js +1 -0
  68. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_ja.properties +1 -1
  69. package/src/sap/suite/ui/generic/template/lib/navigation/NavigationController.js +1 -1
  70. package/src/sap/suite/ui/generic/template/library.js +1 -1
  71. package/src/sap/suite/ui/generic/template/manifestMerger/ChangePageConfiguration.js +66 -17
  72. package/src/sap/suite/ui/generic/template/manifestMerger/MergerUtil.js +5 -4
@@ -10,6 +10,7 @@ sap.ui.define([
10
10
  "sap/suite/ui/generic/template/detailTemplates/detailUtils",
11
11
  "sap/suite/ui/generic/template/ObjectPage/controller/MessageSortingHandler",
12
12
  "sap/suite/ui/generic/template/ObjectPage/controller/MessageStripHelper",
13
+ "sap/suite/ui/generic/template/ObjectPage/controller/SectionTitleHandler",
13
14
  "sap/suite/ui/generic/template/ObjectPage/controller/SideContentHandler",
14
15
  "sap/suite/ui/generic/template/ObjectPage/extensionAPI/ExtensionAPI",
15
16
  "sap/m/Table",
@@ -34,10 +35,10 @@ sap.ui.define([
34
35
  "sap/suite/ui/generic/template/ObjectPage/controller/inlineCreationRows/InlineCreationRowsHelper",
35
36
  "sap/suite/ui/generic/template/ObjectPage/controller/RelatedAppsHandler",
36
37
  "sap/ui/core/Lib"
37
- ], function (ControllerExtension, MessageBox, Filter, Sorter, ManagedObjectModel, SelectionVariant, controlHelper,
38
- testableHelper, detailUtils, MessageSortingHandler, MessageStripHelper, SideContentHandler, ExtensionAPI,
38
+ ], function (ControllerExtension, MessageBox, Filter, Sorter, ManagedObjectModel, SelectionVariant, controlHelper,
39
+ testableHelper, detailUtils, MessageSortingHandler, MessageStripHelper, SectionTitleHandler, SideContentHandler, ExtensionAPI,
39
40
  ResponsiveTable, ShareUtils, FeLogger, MultipleViewsHandler, MessageUtils, KeyCodes, merge, FilterProcessor,
40
- StableIdHelper, extend, UriParameters, isEmptyObject, Focusable, FeError,
41
+ StableIdHelper, extend, UriParameters, isEmptyObject, Focusable, FeError,
41
42
  CreateWithDialogHandler, Device, whitespaceReplacer, deepExtend, CtxMenuHandler, InlineCreationRowsHelper, RelatedAppsHandler, Lib
42
43
  ) {
43
44
  "use strict";
@@ -101,12 +102,12 @@ sap.ui.define([
101
102
  // any asynchronous actions triggered by applying the state are not considered - promise is resolved as soon, as synchronous
102
103
  // processing is completed
103
104
  var fnInitialStateAppliedResolve = null; // resolve function for oStateAppliedAfterBindPromise
104
-
105
+
105
106
  var mTablesWithSelectionChangeDuringDraftEdit = Object.create(null); // initialized in draft edit; collects the ids of all tables that have a selection change during the edit session
106
107
 
107
108
  // This represents the global state of object page which affects the data loading of sub-sections.
108
109
  // There are different states, for which data loading of a sub-sections might be waiting for,
109
- // We use this variable to keep track whether those things have completed or not.
110
+ // We use this variable to keep track whether those things have completed or not.
110
111
  // This state is reset in every rebind cycle (by method resetWaitForState) and set appropriately (by method setWaitForState) whenever some events happen like, header data available, stateApplied, layoutFinished.
111
112
  // Currently structure of this state looks like
112
113
  // oWaitForState = {
@@ -130,7 +131,7 @@ sap.ui.define([
130
131
 
131
132
  // Map would contain the SubSections which has come to ViewPort once for the current ObjectPage context
132
133
  // and the onSubSectionEnteredExtension is called. When the OP context is changed in the beforeRebind method
133
- // the Map will be reset the states
134
+ // the Map will be reset the states
134
135
  var mSubSectionsInitState = Object.create(null);
135
136
  var mSubSectionTitle = Object.create(null);
136
137
 
@@ -160,7 +161,7 @@ sap.ui.define([
160
161
  oTemplateUtils.oServices.oViewDependencyHelper.setAllPagesDirty([oComponent.getId()]);
161
162
  oTemplateUtils.oServices.oViewDependencyHelper.unbindChildren(oComponent);
162
163
  // Draft activation is a kind of cross navigation -> invalidate paginator info
163
-
164
+
164
165
  var bNavToListOnSave = oComponent.getNavToListOnSave();
165
166
  var sEditFlow = oTemplateUtils.oServices.oApplication.getEditFlowOfRoot();
166
167
  if (sEditFlow === "direct" && bEditNextObject) {
@@ -168,7 +169,7 @@ sap.ui.define([
168
169
  } else if (sEditFlow === "direct" && bNavToListOnSave !== false ) {
169
170
  oTemplateUtils.oServices.oApplication.invalidatePaginatorInfo();
170
171
  oTemplateUtils.oServices.oApplication.navigateAfterActivation(false);
171
-
172
+
172
173
  } else {
173
174
  oTemplateUtils.oServices.oApplication.invalidatePaginatorInfo();
174
175
  var oActiveContext = !bNavToListOnSave && oResponse.context;
@@ -188,7 +189,7 @@ sap.ui.define([
188
189
  };
189
190
  oTemplateUtils.oComponentUtils.fire(oController, "AfterActivate", oEvent);
190
191
  }
191
-
192
+
192
193
  // Contains the common code when returning to display mode via save or cancel in a non-draft scenario
193
194
  function fnReturnToDisplayNonDraft(){
194
195
  if (mTablesWithSelectionChangeDuringDraftEdit){ // will not be fulfilled in the create case
@@ -198,7 +199,7 @@ sap.ui.define([
198
199
  mTablesWithSelectionChangeDuringDraftEdit = Object.create(null);
199
200
  }
200
201
  }
201
-
202
+
202
203
  function onValidateDraft(oEvent) {
203
204
  var oSourceElement = oEvent.getSource();
204
205
  oTemplateUtils.oServices.oApplication.addSideEffectPromise(new Promise(function (fnResolve, fnReject) {
@@ -351,9 +352,9 @@ sap.ui.define([
351
352
  fnImpl = onActivateImpl.bind(null, true);
352
353
  sButtonId = sBtnId;
353
354
  } else {
354
- fnImpl = onActivateImpl.bind(null, false);
355
+ fnImpl = onActivateImpl.bind(null, false);
355
356
  var oSourceElement = vSaveCase.getSource();
356
- sButtonId = controlHelper.isMenuButton(oSourceElement) ?
357
+ sButtonId = controlHelper.isMenuButton(oSourceElement) ?
357
358
  StableIdHelper.getStableId({
358
359
  type: "ObjectPageAction",
359
360
  subType: "ActivateMenu"}) :
@@ -402,8 +403,8 @@ sap.ui.define([
402
403
  * where x is the condition provided by the user
403
404
 
404
405
  * Handling of the filter condition during create:
405
- * checking the value of dispaly Mode , iDisplayMode = 4 for create
406
- * if it is a create the filter condition evaluates to the user filter x
406
+ * checking the value of dispaly Mode , iDisplayMode = 4 for create
407
+ * if it is a create the filter condition evaluates to the user filter x
407
408
  */
408
409
  var oUserFilter = FilterProcessor.groupFilters(oBindingParams.filters);
409
410
  var oTemplatePrivateModel = oTemplateUtils.oComponentUtils.getTemplatePrivateModel();
@@ -575,7 +576,7 @@ sap.ui.define([
575
576
  currentUrl: sCurrentUrl,
576
577
  appId: oAppManifest.id,
577
578
  bEnableCollaborationShareAsCard: (oOwnerComponent.getAppComponent().getObjectPageHeaderType() === "Dynamic" &&
578
- oTemplatePrivateModel.getProperty("/objectPage/displayMode") < 2) &&
579
+ oTemplatePrivateModel.getProperty("/objectPage/displayMode") < 2) &&
579
580
  oOwnerComponent.getAppComponent().getCollaborationSettings().isShareAsCardEnabled !== false &&
580
581
  !isSubObjectPage
581
582
 
@@ -587,7 +588,7 @@ sap.ui.define([
587
588
  };
588
589
  ShareUtils.openSharePopup(oTemplateUtils.oCommonUtils, oButton, oFragmentController, oController);
589
590
  }
590
-
591
+
591
592
  var fnDeleteConfirmationOnDelete;
592
593
 
593
594
  function getObjectPageDeleteDialog() {
@@ -790,7 +791,7 @@ sap.ui.define([
790
791
  function onDelete() {
791
792
  oTemplateUtils.oCommonUtils.executeIfControlReady(onDeleteImpl, "delete");
792
793
  }
793
-
794
+
794
795
  function isObjectPageScrolledToTop(){
795
796
  var aObjectPageSections = oObjectPage.getSections() || [];
796
797
  var oFirstVisibleSection = aObjectPageSections.find(function(oSection){
@@ -841,9 +842,9 @@ sap.ui.define([
841
842
  });
842
843
  }
843
844
  var oBusyHelper = oTemplateUtils.oServices.oApplication.getBusyHelper();
844
- oBusyHelper.setBusy(Promise.allSettled(aWaitForSmartFieldsPromise)); // setting the app busy will trigger the setting of focus finally
845
+ oBusyHelper.setBusy(Promise.allSettled(aWaitForSmartFieldsPromise)); // setting the app busy will trigger the setting of focus finally
845
846
  }
846
- oTemplateUtils.oServices.oApplication.setNextFocus(fnFocusForEdit.bind(null, bMoveToTop));
847
+ oTemplateUtils.oServices.oApplication.setNextFocus(fnFocusForEdit.bind(null, bMoveToTop));
847
848
  }
848
849
 
849
850
  var fnExpiredLockDialog; // declare function already here, to avoid usage before declaration
@@ -988,7 +989,7 @@ sap.ui.define([
988
989
  var iSuccessfullyDeletedCount = 0;
989
990
  var iFailedToDeleteCount;
990
991
  var oEntity = oController.getView().getModel().getObject(aContexts[0].getPath());
991
-
992
+
992
993
  var oDeletePromise = oTemplateUtils.oServices.oCRUDManager.deleteEntities({
993
994
  pathes: aDeleteContextPaths,
994
995
  suppressRefreshAllComponents: true,
@@ -1003,7 +1004,7 @@ sap.ui.define([
1003
1004
  iFailedToDeleteCount = aFailedPath.length;
1004
1005
  }
1005
1006
  iSuccessfullyDeletedCount = aDeleteContextPaths.length - iFailedToDeleteCount;
1006
-
1007
+
1007
1008
  var sMessage = "";
1008
1009
  if (iSuccessfullyDeletedCount > 0) {
1009
1010
  var oInnerTable = oSmartTable.getTable();
@@ -1096,8 +1097,8 @@ sap.ui.define([
1096
1097
  return;
1097
1098
  }
1098
1099
 
1099
- // For draft synchronization process, we do not wait until deletion operation is confirmed by the user because if we do, there may be a scenario wherein
1100
- // the user confirms the deletion just when the activation of the transient context(s) has started but not yet completed. In that case, since transient
1100
+ // For draft synchronization process, we do not wait until deletion operation is confirmed by the user because if we do, there may be a scenario wherein
1101
+ // the user confirms the deletion just when the activation of the transient context(s) has started but not yet completed. In that case, since transient
1101
1102
  // context(s) is not yet converted to draft context, it gets deleted from the UI but the rows would have been created in the backend and is also shown
1102
1103
  // in the table when table is refreshed. That's why draft synchronization is done at an early point of time which prevents the above mentioned
1103
1104
  // complicated situation.
@@ -1115,19 +1116,19 @@ sap.ui.define([
1115
1116
  aNonDeletableContexts.push(oContext);
1116
1117
  }
1117
1118
  });
1118
-
1119
+
1119
1120
  var oDialogParameter = {};
1120
1121
  oDialogParameter.undeletableCount = 0;
1121
1122
  oDialogParameter.tableMode = sTableMode;
1122
1123
  if (aContexts.length > 1) {
1123
1124
  oDialogParameter.title = oTemplateUtils.oCommonUtils.getText("ST_GENERIC_DELETE_TITLE_WITH_COUNT", [aContexts.length]);
1124
1125
  oDialogParameter.text = oTemplateUtils.oCommonUtils.getContextText("DELETE_SELECTED_ITEMS", oSmartTable.getId());
1125
-
1126
+
1126
1127
  } else {
1127
1128
  oDialogParameter.title = oTemplateUtils.oCommonUtils.getText("ST_GENERIC_DELETE_TITLE");
1128
1129
  oDialogParameter.text = oTemplateUtils.oCommonEventHandlers.getSelectedItemContextForDeleteMessage(oSmartTable, aContexts[0], true);
1129
1130
  }
1130
-
1131
+
1131
1132
  if (aNonDeletableContexts.length > 0) {
1132
1133
  oDialogParameter.undeletableText = oTemplateUtils.oCommonUtils.getContextText("DELETE_UNDELETABLE_ITEMS", oSmartTable.getId(), null,
1133
1134
  [aNonDeletableContexts.length, aContexts.length]);
@@ -1137,7 +1138,7 @@ sap.ui.define([
1137
1138
  oDialogParameter.text = oTemplateUtils.oCommonUtils.getText("DELETE_UNDELETABLE_ITEM");
1138
1139
  }
1139
1140
  }
1140
-
1141
+
1141
1142
  var oBeforeLineItemDeleteProperties = {
1142
1143
  sUiElementId: sUiElementId,
1143
1144
  aContexts: aContexts
@@ -1445,7 +1446,7 @@ sap.ui.define([
1445
1446
  var oSelectedSectionInfo = fnGetSelectedSectionInfo(oEvent);
1446
1447
  fnSectionChanged(oSelectedSectionInfo.sNewSectionId, oSelectedSectionInfo.sNewSubSectionId);
1447
1448
  }
1448
-
1449
+
1449
1450
  function fnFocusOnFirstActionButton(){
1450
1451
  setTimeout(function(){
1451
1452
  var oObjectHeader = oObjectPage.getHeaderTitle();
@@ -1455,11 +1456,11 @@ sap.ui.define([
1455
1456
  return oAction.getVisible() && oAction.getEnabled && oAction.getEnabled();
1456
1457
  });
1457
1458
  if (oActionButton){
1458
- controlHelper.focusControl(oActionButton.getId());
1459
+ controlHelper.focusControl(oActionButton.getId());
1459
1460
  }
1460
1461
  }, 0);
1461
1462
  }
1462
-
1463
+
1463
1464
  // Returns a Promise that resolves to the control the focus should be set to when entering edit mode
1464
1465
  // bFocusAtTop determines whether the search should start at the first subsection of the page or at the currently selected subsection.
1465
1466
  // Note that this call also moves the selected section and subsection to the identified control.
@@ -1482,7 +1483,7 @@ sap.ui.define([
1482
1483
  if (sSelectedSection === oControl.getId()){
1483
1484
  sSelectedSection = null;
1484
1485
  }
1485
- if (sSelectedSection){ // sSelectedSection was not yet processed, but we want to get only sections that come after that
1486
+ if (sSelectedSection){ // sSelectedSection was not yet processed, but we want to get only sections that come after that
1486
1487
  return false;
1487
1488
  }
1488
1489
  oSelectedSection = oControl;
@@ -1495,7 +1496,7 @@ sap.ui.define([
1495
1496
  if (sSelectedSubSection){ // sSelectedSubSection was not yet processed, but we want to get only subsections that come after that
1496
1497
  return false;
1497
1498
  }
1498
- // Scroll to the given subsection and make sure that controls and bindings for this subsection are initialized (necessary because of lazy loading)
1499
+ // Scroll to the given subsection and make sure that controls and bindings for this subsection are initialized (necessary because of lazy loading)
1499
1500
  fnSubSectionEntered(oControl);
1500
1501
  oObjectPage.setSelectedSection(oSelectedSection);
1501
1502
  oSelectedSection.setSelectedSubSection(oControl);
@@ -1503,7 +1504,7 @@ sap.ui.define([
1503
1504
  }
1504
1505
  if (controlHelper.isSmartField(oControl)){ // check whether the SmartField is the correct target for focussing
1505
1506
  return controlHelper.getSmartFieldIsFocussableForInputPromise(oControl).then(function(bIsFocussable){
1506
- return bIsFocussable && oControl; // If the SmartField has turned out to be focussable take it. Otherwise no need to investigate the subtree below it.
1507
+ return bIsFocussable && oControl; // If the SmartField has turned out to be focussable take it. Otherwise no need to investigate the subtree below it.
1507
1508
  });
1508
1509
  }
1509
1510
  if (controlHelper.isSmartTable(oControl)){
@@ -1527,7 +1528,7 @@ sap.ui.define([
1527
1528
  }
1528
1529
  return false;
1529
1530
  });
1530
-
1531
+
1531
1532
  }
1532
1533
  return null;
1533
1534
  });
@@ -1545,10 +1546,10 @@ sap.ui.define([
1545
1546
  return oTargetControl;
1546
1547
  }); // Normalize the return value such that it always is a Promise
1547
1548
  }
1548
-
1549
+
1549
1550
  function fnFocusForEdit(bFocusAtTop) {
1550
1551
  setTimeout(function () {
1551
- // check if extension is found
1552
+ // check if extension is found
1552
1553
  var bhasExtensionFound = oController.hasOwnProperty("focusOnEditExtension");
1553
1554
  var oFocusControl;
1554
1555
  if (bhasExtensionFound) {
@@ -1561,7 +1562,7 @@ sap.ui.define([
1561
1562
  if (oFocusControl && oFocusControl.focus && oFocusControl.getDomRef()) {
1562
1563
  //set the focus on the control passed by application
1563
1564
  if (controlHelper.isSmartField(oFocusControl)) {
1564
- // check whether the SmartField is the correct target for focussing
1565
+ // check whether the SmartField is the correct target for focussing
1565
1566
  controlHelper.getSmartFieldIsFocussableForInputPromise(oFocusControl).then(function (bIsFocusable) {
1566
1567
  if (bIsFocusable) {
1567
1568
  controlHelper.focusUI5Control(oFocusControl);
@@ -1571,7 +1572,7 @@ sap.ui.define([
1571
1572
  }
1572
1573
  });
1573
1574
  } else {
1574
- //if the passed control is not a smart field, check and set the focus on
1575
+ //if the passed control is not a smart field, check and set the focus on
1575
1576
  controlHelper.focusUI5Control(oFocusControl);
1576
1577
  }
1577
1578
  } else {
@@ -1669,12 +1670,12 @@ sap.ui.define([
1669
1670
  subType: "CreateWithDialog",
1670
1671
  sFacet: sFacetId
1671
1672
  });
1672
-
1673
+
1673
1674
  var oCreationDialog = sIdForCreateWithDialog && oController.byId(sIdForCreateWithDialog);
1674
1675
  var oSmartTable = oTemplateUtils.oCommonUtils.getOwnerControl(oCreateButton, true);
1675
1676
  var sSmartTableCreationMode = fnGetSmartTableCreationMode(oSmartTable);
1676
1677
  var bIsInlineCreationRowsEnabled = ["creationRows", "creationRowsHiddenInEditMode"].includes(sSmartTableCreationMode);
1677
-
1678
+
1678
1679
  if (oCreationDialog) {
1679
1680
  oCreateWithDialogHandler.createWithDialog(oCreationDialog, oCreateButton);
1680
1681
  } else if (bIsInlineCreationRowsEnabled) {
@@ -1698,7 +1699,7 @@ sap.ui.define([
1698
1699
  oLogger.info("Filtering message " + oMessage.getMessage() + " (id: " + oMessage.getId() + ") for table " + oTable.getId() + " returns " + bRet);
1699
1700
  return bRet;
1700
1701
  }
1701
-
1702
+
1702
1703
  function fnDataStateClose(oEvent){
1703
1704
  oState.oMessageStripHelper.onClose(oEvent);
1704
1705
  }
@@ -1716,7 +1717,7 @@ sap.ui.define([
1716
1717
  }
1717
1718
  });
1718
1719
  }
1719
-
1720
+
1720
1721
  function onDataReceivedForTable(oControl) {
1721
1722
  setNoDataTextIfRequired(oControl);
1722
1723
  }
@@ -1767,7 +1768,7 @@ sap.ui.define([
1767
1768
  bHasFiltersOrSearches = oSearchField && oSearchField.getValue().trim();
1768
1769
  }
1769
1770
  sTextId = bHasFiltersOrSearches ? "NOITEMS_SMARTTABLE_WITH_FILTER" : "NOITEMS_SMARTTABLE";
1770
- }
1771
+ }
1771
1772
  var sNoDataText = oTemplateUtils.oCommonUtils.getContextText(sTextId, sSmartTableId);
1772
1773
  oSmartTable.setNoData(sNoDataText);
1773
1774
  }
@@ -1777,7 +1778,7 @@ sap.ui.define([
1777
1778
  oViewProxy.refreshFacets = function (mRefreshInfos) {
1778
1779
  var fnRefreshSubSection = function (oSubSection) {
1779
1780
  var oSubSectionInfoObject = oTemplateUtils.oInfoObjectHandler.getControlInformation(oSubSection.getId());
1780
- if (oSubSectionInfoObject) { // In case editableHeaderContent is enabled in manifest, There will be a HeaderFacet in edit mode for SubSectionInfo is not created. This just needs to be skipped
1781
+ if (oSubSectionInfoObject) { // In case editableHeaderContent is enabled in manifest, There will be a HeaderFacet in edit mode for SubSectionInfo is not created. This just needs to be skipped
1781
1782
  oSubSectionInfoObject.refresh(mRefreshInfos, false);
1782
1783
  }
1783
1784
  };
@@ -1893,11 +1894,11 @@ sap.ui.define([
1893
1894
  // This method is part of the infrastructure that ensures that data loading is triggered for all subsections it is needed for.
1894
1895
  // This method is called when a state change happens that may must trigger data-loading for additional sub-sections.
1895
1896
  // This is: If either a property of oWaitForState is set to true or bWaitForViewPort is set to false.
1896
- // The method will ensure data loading for all affected sub-sections in an asynchronous way.
1897
+ // The method will ensure data loading for all affected sub-sections in an asynchronous way.
1897
1898
  function fnHandleStateChangeForAllSubSections() {
1898
1899
  // Check the info objects for all relevant sub-sections.
1899
1900
  // If bWaitForViewPort is true (normal case) only sub-sections are relevant which do not wait for the section to have entered the view-port.
1900
- // Otherwise all sub-sections are relevant.
1901
+ // Otherwise all sub-sections are relevant.
1901
1902
  var sCategory = bWaitForViewPort ? "subSectionNotWaitingForViewPort" : "subSection";
1902
1903
  var oView = oController.getView();
1903
1904
  oTemplateUtils.oInfoObjectHandler.executeForAllInformationObjects(sCategory, function (oSubSectionInfoObj) {
@@ -1979,8 +1980,9 @@ sap.ui.define([
1979
1980
  }
1980
1981
  }
1981
1982
  }
1983
+ oState.oSectionTitleHandler.manageAccessability(oSubSection);
1982
1984
  }
1983
-
1985
+
1984
1986
  if (oSubSectionInfoObj) { // In case of EditableHeaderFacet Sections & SubSection is created at runtime and there is info object handling
1985
1987
  oMultipleViewsHandler.subSectionEntered(oSubSectionInfoObj); // Assigning the SubSection control MultipleViewsHandler. In case not relevant method simply returns
1986
1988
  // The loading strategy of a sub-section might depend on the content of oWaitForState (together with the strategy) and whether or not the sub-section is currently in view-port.
@@ -2157,7 +2159,7 @@ sap.ui.define([
2157
2159
  }
2158
2160
  resolveStateApplied();
2159
2161
  };
2160
-
2162
+
2161
2163
  oViewProxy.prepareForControlNavigation = function(sTargetControlId){
2162
2164
  var bUseIconTabBar = oObjectPage.getUseIconTabBar();
2163
2165
  if (!bUseIconTabBar) {
@@ -2169,23 +2171,23 @@ sap.ui.define([
2169
2171
  if (bFound){
2170
2172
  return oAncestor.getId();
2171
2173
  }
2172
- sTargetSubSectionId = oAncestor.getId();
2174
+ sTargetSubSectionId = oAncestor.getId();
2173
2175
  });
2174
2176
  var sSelectedSectionId = sTargetSectionId && oObjectPage.getSelectedSection();
2175
2177
  if (sTargetSectionId !== sSelectedSectionId) {
2176
2178
  oObjectPage.setSelectedSection(sTargetSectionId);
2177
2179
  fnSectionChanged(sTargetSectionId, sTargetSubSectionId);
2178
- }
2180
+ }
2179
2181
  };
2180
-
2182
+
2181
2183
  // This function implements the method prepareForMessageHandling as described in class sap.suite.ui.generic.template.lib.TemplateAssembler.
2182
2184
  // (Nearly) the same functionality is also provided for the message popover (see MessageButtonHost, below)
2183
2185
  // However, in this case we have an additional challenge: The content of the popover may change while it is open.
2184
2186
  // Therefore, an additional function is provided for the function getPrepareMessageDisplayPromise which is added to the message button host:
2185
- // If oItemBinding is provided, then the returned Promise resolves to an object which has a single property getSubtitle.
2187
+ // If oItemBinding is provided, then the returned Promise resolves to an object which has a single property getSubtitle.
2186
2188
  // This is a function(sMsgId, sFallback) which returns the subtitle for the message with the given id. This is partially redundant with the content of
2187
2189
  // property mMessageToSubtitle of oHelperModel. However, the value returned by this function may be updated while the popover is open.
2188
- // In order to give the popover the chance to react on such changes property heartBeat of oHelperModel will be modified in such cases.
2190
+ // In order to give the popover the chance to react on such changes property heartBeat of oHelperModel will be modified in such cases.
2189
2191
  function fnPrepareForMessageHandling(aMessages, oItemBinding, oHelperModel, sBindingPath){
2190
2192
  var bNeedsPreparation = aMessages.some(function(oMessage){ // check whether there is at least one message which cannot be positioned on a not-table currently
2191
2193
  var sId = oTemplateUtils.oCommonUtils.getPositionableControlId(oMessage.controlIds, true);
@@ -2222,7 +2224,7 @@ sap.ui.define([
2222
2224
  if (isEmptyObject(aHiddenColumnInfo.columnKeyToHiddenPath)) {
2223
2225
  return;
2224
2226
  }
2225
-
2227
+
2226
2228
  var aHiddenColumns = aHiddenColumnInfo.staticHiddenColumns.slice(); // start with a copy of the list of statically hidden columns
2227
2229
  // Now add the dynamically hidden columns if applicable
2228
2230
  var fnOnChange = bFirstTimeForContext && fnExecuteDynamicColumnHide.bind(null, false, oSmartTableInfoObject);
@@ -2299,7 +2301,7 @@ sap.ui.define([
2299
2301
  oTemplateUtils.oInfoObjectHandler.initializeSubSectionInfoObject(oSubSectionSettings);
2300
2302
  }
2301
2303
  }
2302
-
2304
+
2303
2305
  function onSelectionChange(oEvent){
2304
2306
  var oEventSource = oEvent.getSource();
2305
2307
  oTemplateUtils.oCommonUtils.setEnabledToolbarButtons(oEventSource);
@@ -2335,7 +2337,7 @@ sap.ui.define([
2335
2337
  });
2336
2338
  // reset Wait for state
2337
2339
  resetWaitForState();
2338
-
2340
+
2339
2341
  // Initialize the information objects for SubSections & child aggregations
2340
2342
  fnInitializeSubSections();
2341
2343
 
@@ -2353,16 +2355,16 @@ sap.ui.define([
2353
2355
  var oMessageButtonHost = { // Functionality required by the message popover
2354
2356
  controller: oController,
2355
2357
  getPrepareMessageDisplayPromise: fnPrepareForMessageHandling
2356
- };
2358
+ };
2357
2359
  oBase.onInit(null, oMessageButtonHost);
2358
2360
  fnEnsureTitleTransfer();
2359
2361
  oTemplateUtils.oCommonUtils.executeGlobalSideEffect();
2360
-
2362
+
2361
2363
  oViewProxy.beforeRebind = function (oWaitForPromise) {
2362
2364
  // Reset the mSubSectionInitState map as the binding context is changed
2363
2365
  mSubSectionsInitState = Object.create(null);
2364
2366
 
2365
-
2367
+
2366
2368
  resetWaitForState();
2367
2369
  oWaitForPromise.then(function () {
2368
2370
  setWaitForState("bRebindCompleted");
@@ -2376,7 +2378,7 @@ sap.ui.define([
2376
2378
  }
2377
2379
  oTemplateUtils.oInfoObjectHandler.executeForAllInformationObjects("subSection", function (oInfoObject) {
2378
2380
  // Need to access the SubSection early and could not use the general mechanism of
2379
- // oInfoObject.getControlAsync as this is resolved only after SubSection enters
2381
+ // oInfoObject.getControlAsync as this is resolved only after SubSection enters
2380
2382
  // viewport. As the View Lazy Loading could be applied only to children of subsection, subsection
2381
2383
  // control should be rendered on view initialization
2382
2384
  var oSubSection = oController.byId(oInfoObject.getId());
@@ -2386,12 +2388,12 @@ sap.ui.define([
2386
2388
  }
2387
2389
  });
2388
2390
  };
2389
-
2391
+
2390
2392
  oViewProxy.afterRebind = function () {
2391
2393
  oLogger.info("Call of _triggerVisibleSubSectionsEvents (afterRebind)");
2392
2394
  oObjectPage._triggerVisibleSubSectionsEvents();
2393
2395
  };
2394
-
2396
+
2395
2397
  // This is the fallback implementation. Note that certain scenarios are already covered in-place (Edit, Save, Cancel)
2396
2398
  oViewProxy.setFocus = function(oBeforeData, oAdditionalData){
2397
2399
  var aActiveComponentsBefore = oBeforeData.activeComponents;
@@ -2413,12 +2415,12 @@ sap.ui.define([
2413
2415
  var oUiModel = oObjectPage.getModel("ui");
2414
2416
  var bEditable = oUiModel.getProperty("/editable");
2415
2417
  if (bEditable){
2416
- fnFocusForEdit(true);
2418
+ fnFocusForEdit(true);
2417
2419
  } else {
2418
2420
  fnFocusOnFirstActionButton();
2419
2421
  }
2420
2422
  };
2421
-
2423
+
2422
2424
  oObjectPage.attachEvent("subSectionEnteredViewPort", function (oEvent) {
2423
2425
  var oSubSection = oEvent.getParameter("subSection");
2424
2426
  oLogger.info("Viewport entered ", "Subsection: " + oSubSection.getId());
@@ -2429,9 +2431,10 @@ sap.ui.define([
2429
2431
  oState.oCreateWithDialogHandler = oCreateWithDialogHandler;
2430
2432
  oMultipleViewsHandler = new MultipleViewsHandler(oController, oTemplateUtils, oTemplateUtils.oComponentUtils.stateChanged);
2431
2433
  oState.oMultipleViewsHandler = oMultipleViewsHandler;
2432
-
2434
+
2433
2435
  oState.oMessageStripHelper = new MessageStripHelper(oMultipleViewsHandler, oController, oTemplateUtils, oBase.state.messageButtonHelper);
2434
2436
  oState.oInlineCreationRowsHelper = new InlineCreationRowsHelper(oObjectPage, oTemplateUtils, fnGetSmartTableCreationMode, oController, oState.oMessageStripHelper);
2437
+ oState.oSectionTitleHandler = new SectionTitleHandler(oTemplateUtils);
2435
2438
 
2436
2439
  var oTemplatePrivateModel = oTemplateUtils.oComponentUtils.getTemplatePrivateModel();
2437
2440
  oTemplatePrivateModel.setProperty("/objectPage/aPasteAttachedTables", []);
@@ -2442,7 +2445,7 @@ sap.ui.define([
2442
2445
  var oStreamData = oTemplateUtils.oCommonUtils.getStreamData(aStreamEnabledAssociatedEntities[i], oEvent.context);
2443
2446
  oTemplateUtils.oCommonUtils.setStreamData(oStreamData, aStreamEnabledAssociatedEntities[i]);
2444
2447
  }
2445
- }
2448
+ }
2446
2449
  var oStreamDataSelf = oTemplateUtils.oCommonUtils.getStreamData(null, oEvent.context);
2447
2450
  oTemplateUtils.oCommonUtils.setStreamData(oStreamDataSelf);
2448
2451
  oTemplateUtils.oComponentUtils.hidePlaceholder();
@@ -2478,13 +2481,13 @@ sap.ui.define([
2478
2481
  }, true);
2479
2482
  });
2480
2483
  },
2481
-
2484
+
2482
2485
  addEntry: fnAddEntry,
2483
-
2486
+
2484
2487
  onCancelCreateWithPopUpDialog: function () {
2485
2488
  oCreateWithDialogHandler.onCancelPopUpDialog();
2486
2489
  },
2487
-
2490
+
2488
2491
  onSaveCreateWithPopUpDialog: function (oEvent) {
2489
2492
  oCreateWithDialogHandler.onSavePopUpDialog(oEvent);
2490
2493
  },
@@ -2517,10 +2520,10 @@ sap.ui.define([
2517
2520
  },
2518
2521
 
2519
2522
  onSelectionChange: onSelectionChange,
2520
-
2523
+
2521
2524
  checkUpdateFinished: function (oEvent) {
2522
- // in case of the table get refreshed through table filter or sort
2523
- // onDataReceived may not be called
2525
+ // in case of the table get refreshed through table filter or sort
2526
+ // onDataReceived may not be called
2524
2527
  oTemplateUtils.oCommonUtils.setEnabledToolbarButtons(oEvent.getSource());
2525
2528
  },
2526
2529
  // selectionChange for MultiSelectionPlugin
@@ -2544,7 +2547,7 @@ sap.ui.define([
2544
2547
  fnDetachPasteHandlers();
2545
2548
  if (!bIsDraftEnabled) {
2546
2549
  fnReturnToDisplayNonDraft();
2547
- }
2550
+ }
2548
2551
  if (bIsEditFlowDirect){
2549
2552
  oViewProxy.navigateUp();
2550
2553
  }
@@ -2682,7 +2685,7 @@ sap.ui.define([
2682
2685
  // Attach dataReceived event
2683
2686
  oEvent.mParameters.bindingParams.events["dataReceived"] = onDataReceivedForTable.bind(null, oSmartTable);
2684
2687
  oState.oInlineCreationRowsHelper.onBeforeRebindControl(oEvent);
2685
-
2688
+
2686
2689
  // Set data loading text when data is loading
2687
2690
  oSmartTable.setNoData(oTemplateUtils.oCommonUtils.getText("WAITING_SMARTTABLE"));
2688
2691
  var oBindingParams = adjustAndProvideBindingParamsForSmartTableOrChart(oEvent);
@@ -2770,7 +2773,7 @@ sap.ui.define([
2770
2773
  sectionChange: fnSectionChangedEvent,
2771
2774
  onSwitchTabs: fnOnSwitchTabs,
2772
2775
  uploadStream: function(oEvent) {
2773
- oTemplateUtils.oCommonEventHandlers.uploadStream(oEvent);
2776
+ oTemplateUtils.oCommonEventHandlers.uploadStream(oEvent);
2774
2777
  },
2775
2778
 
2776
2779
  handleUploadComplete: function(oEvent) {
@@ -2820,7 +2823,7 @@ sap.ui.define([
2820
2823
  var oSmartTable = oEvent.getSource();
2821
2824
  var oTable = oSmartTable.getTable();
2822
2825
  var oInfoObject = oTemplateUtils.oInfoObjectHandler.setInformationWithControl(oSmartTable);
2823
- // TableObserver is required to get the Smart Table's editable property for Smart
2826
+ // TableObserver is required to get the Smart Table's editable property for Smart
2824
2827
  // MultiInput Control
2825
2828
  var oModel = new ManagedObjectModel(oSmartTable);
2826
2829
  oSmartTable.setModel(oModel, "tableobserver");
@@ -2831,11 +2834,11 @@ sap.ui.define([
2831
2834
  // Hide all columns which are statically hidden at initialization of the table
2832
2835
  oSmartTable.deactivateColumns(aHiddenColumnInfo.staticHiddenColumns);
2833
2836
  }
2834
-
2837
+
2835
2838
  oTemplateUtils.oCommonUtils.checkToolbarIntentsSupported(oSmartTable);
2836
2839
  var bIsMTable = controlHelper.isMTable(oTable);
2837
2840
  if (bIsMTable || controlHelper.isUiTable(oTable)) {
2838
- var sTableId = oTable.getId();
2841
+ var sTableId = oTable.getId();
2839
2842
  var fnOnSubSectionVisibilityChanged = function () {
2840
2843
  if (bIsMTable && !mTableThresholdInfo[sTableId]) {
2841
2844
  mTableThresholdInfo[sTableId] = oTable.getGrowingThreshold && oTable.getGrowingThreshold(); // store the default growingthreshold value of the table
@@ -2847,7 +2850,7 @@ sap.ui.define([
2847
2850
  // By the time table is initialized, the subSectionVisibilityChange event may have already been triggered.
2848
2851
  // We ensure that the table occupies whole space whenever applicable by calling this method on table init.
2849
2852
  // Subsequently, this method is called every time the subsection visibility is changed.
2850
- fnOnSubSectionVisibilityChanged();
2853
+ fnOnSubSectionVisibilityChanged();
2851
2854
  }
2852
2855
  if (fnGetSmartTableCreationMode(oSmartTable) === "inline" && !oSmartTable.data("CrossNavigation")) {
2853
2856
  oTable.addEventDelegate({
@@ -2881,7 +2884,7 @@ sap.ui.define([
2881
2884
  }
2882
2885
  });
2883
2886
  }
2884
-
2887
+
2885
2888
  oTemplateUtils.oServices.oPresentationControlHandlerFactory.getPresentationControlHandler(oSmartTable).addCellSelector();
2886
2889
  },
2887
2890
  onBeforeExport: function (oExportEvent) {
@@ -0,0 +1,51 @@
1
+ sap.ui.define([
2
+ "sap/ui/base/Object",
3
+ "sap/base/util/extend",
4
+ "sap/suite/ui/generic/template/genericUtilities/controlHelper"
5
+ ], function(BaseObject, extend, controlHelper) {
6
+ "use strict";
7
+
8
+ function getMethods(oTemplateUtils) {
9
+
10
+ function fnManageAccessability(oFirstSubSection) {
11
+ var oSubSectionInfoObject = oTemplateUtils.oInfoObjectHandler.getControlInformation(oFirstSubSection.getId()),
12
+ oSection = oFirstSubSection.getParent();
13
+ oFirstSubSection.getBlocks().concat(oFirstSubSection.getMoreBlocks())
14
+ .reduce(function(accBlock, currentBlock) {
15
+ if (!currentBlock.getContent || !currentBlock.getContent() || !currentBlock.getContent().length) {
16
+ return accBlock;
17
+ }
18
+ currentBlock.getContent().reduce(function(accContent, currentContent) {
19
+ if (controlHelper.isSmartForm(currentContent)) {
20
+ accContent.push(currentContent); // collect all SubSections SmartForms
21
+ }
22
+ return accContent;
23
+ }, accBlock);
24
+ return accBlock;
25
+ }, [])
26
+ .forEach(function(entry) {
27
+ if (!oSubSectionInfoObject) {
28
+ // Case: header is editable. manifest.json, editableHeaderContent=true
29
+ entry._suggestTitleId(oSection.getId() + "-title"); // set Section title id that will be used for aria
30
+ return;
31
+ }
32
+ if (entry.getGroups().length === 1 && entry.getGroups()[0].getTitle && !entry.getGroups()[0].getTitle()) {
33
+ // Case: Section -> one SubSection -> one SmartForm -> one Group. Title is not displayed in this case
34
+ entry._suggestTitleId(oSection.getId() + "-title"); // set title to SubSection title id that will be used for aria
35
+ return;
36
+ }
37
+ });
38
+ }
39
+
40
+ // public instance methods
41
+ return {
42
+ manageAccessability: fnManageAccessability
43
+ };
44
+ }
45
+
46
+ return BaseObject.extend("sap.suite.ui.generic.template.ObjectPage.controller.SectionTitleHandler", {
47
+ constructor: function(oController, oObjectPage, oTemplateUtils) {
48
+ extend(this, getMethods(oController, oObjectPage, oTemplateUtils));
49
+ }
50
+ });
51
+ });
@@ -131,7 +131,7 @@ NEW_ENTRY_GROUP=New entries
131
131
  EDIT_BUTTON_DESCRIPTION=Edit:
132
132
 
133
133
  # XACT, 30: Screen reader text for a footer region
134
- FOOTER_REGION_LABEL_ARIA=Footer region
134
+ FOOTER_REGION_LABEL_ARIA=Footer
135
135
 
136
136
  #------------template controller reuse texts---------------------
137
137
  #template controller (in TemplateViewController.js) texts are reused in multiple templates
@@ -118,7 +118,7 @@ SUMMARIZE=Lav sammendrag
118
118
 
119
119
  PROGRESS_INDICATOR_DISPLAY_VALUE_UOM_IS_PERCENT={0}%
120
120
 
121
- PROGRESS_INDICATOR_DISPLAY_VALUE_NO_UOM={0} fra {1}
121
+ PROGRESS_INDICATOR_DISPLAY_VALUE_NO_UOM={0} af {1}
122
122
 
123
123
  PROGRESS_INDICATOR_DISPLAY_VALUE_UOM_IS_NOT_PERCENT={0} af {1} {2}
124
124