@sapui5/sap.fe.core 1.93.3 → 1.97.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 (193) hide show
  1. package/package.json +6 -6
  2. package/src/sap/fe/core/.library +1 -1
  3. package/src/sap/fe/core/AppComponent.js +8 -40
  4. package/src/sap/fe/core/BusyLocker.js +12 -0
  5. package/src/sap/fe/core/CommonUtils.js +224 -48
  6. package/src/sap/fe/core/ExtensionAPI.js +1 -1
  7. package/src/sap/fe/core/PageController.js +13 -2
  8. package/src/sap/fe/core/RouterProxy.js +52 -64
  9. package/src/sap/fe/core/TemplateComponent.js +8 -2
  10. package/src/sap/fe/core/TransactionHelper.js +210 -180
  11. package/src/sap/fe/core/actions/draft.js +13 -1
  12. package/src/sap/fe/core/actions/messageHandling.js +80 -4
  13. package/src/sap/fe/core/actions/operations.js +207 -68
  14. package/src/sap/fe/core/controllerextensions/EditFlow.js +82 -55
  15. package/src/sap/fe/core/controllerextensions/InternalEditFlow.js +13 -6
  16. package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.js +132 -23
  17. package/src/sap/fe/core/controllerextensions/InternalRouting.js +203 -214
  18. package/src/sap/fe/core/controllerextensions/KPIManagement.js +834 -170
  19. package/src/sap/fe/core/controllerextensions/KPIManagement.ts +890 -189
  20. package/src/sap/fe/core/controllerextensions/MessageHandler.js +222 -102
  21. package/src/sap/fe/core/controllerextensions/PageReady.js +48 -33
  22. package/src/sap/fe/core/controllerextensions/PageReady.ts +49 -14
  23. package/src/sap/fe/core/controllerextensions/Paginator.js +150 -0
  24. package/src/sap/fe/core/controllerextensions/Placeholder.js +133 -270
  25. package/src/sap/fe/core/controllerextensions/Share.js +12 -9
  26. package/src/sap/fe/core/controllerextensions/SideEffects.js +5 -6
  27. package/src/sap/fe/core/controllerextensions/SideEffects.ts +13 -12
  28. package/src/sap/fe/core/controllerextensions/ViewState.js +202 -8
  29. package/src/sap/fe/core/controls/ActionParameterDialog.fragment.xml +39 -34
  30. package/src/sap/fe/core/controls/ActionParameterDialogValueHelp.fragment.xml +35 -0
  31. package/src/sap/fe/core/controls/ActionPartial.fragment.xml +1 -1
  32. package/src/sap/fe/core/controls/CustomQuickViewPage.js +109 -108
  33. package/src/sap/fe/core/controls/MultiValueParameterDelegate.js +45 -0
  34. package/src/sap/fe/core/controls/filterbar/FilterContainer.js +15 -4
  35. package/src/sap/fe/core/controls/filterbar/VisualFilter.js +250 -94
  36. package/src/sap/fe/core/controls/filterbar/VisualFilterContainer.js +129 -135
  37. package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.js +325 -0
  38. package/src/sap/fe/core/controls/filterbar.d.js +8 -0
  39. package/src/sap/fe/core/controls/filterbar.d.ts +0 -0
  40. package/src/sap/fe/core/converters/ConverterContext.js +19 -5
  41. package/src/sap/fe/core/converters/ConverterContext.ts +13 -3
  42. package/src/sap/fe/core/converters/ManifestSettings.js +2 -1
  43. package/src/sap/fe/core/converters/ManifestSettings.ts +13 -3
  44. package/src/sap/fe/core/converters/ManifestWrapper.js +9 -9
  45. package/src/sap/fe/core/converters/MetaModelConverter.js +867 -871
  46. package/src/sap/fe/core/converters/MetaModelConverter.ts +772 -827
  47. package/src/sap/fe/core/converters/TemplateConverter.js +4 -4
  48. package/src/sap/fe/core/converters/annotations/DataField.js +57 -7
  49. package/src/sap/fe/core/converters/annotations/DataField.ts +52 -2
  50. package/src/sap/fe/core/converters/common/AnnotationConverter.js +146 -85
  51. package/src/sap/fe/core/converters/controls/Common/Action.js +61 -56
  52. package/src/sap/fe/core/converters/controls/Common/Action.ts +54 -39
  53. package/src/sap/fe/core/converters/controls/Common/Chart.js +101 -9
  54. package/src/sap/fe/core/converters/controls/Common/Chart.ts +100 -5
  55. package/src/sap/fe/core/converters/controls/Common/Criticality.js +1 -1
  56. package/src/sap/fe/core/converters/controls/Common/DataVisualization.js +15 -16
  57. package/src/sap/fe/core/converters/controls/Common/DataVisualization.ts +16 -30
  58. package/src/sap/fe/core/converters/controls/Common/Form.js +77 -29
  59. package/src/sap/fe/core/converters/controls/Common/Form.ts +79 -21
  60. package/src/sap/fe/core/converters/controls/Common/KPI.js +287 -109
  61. package/src/sap/fe/core/converters/controls/Common/KPI.ts +314 -139
  62. package/src/sap/fe/core/converters/controls/Common/Table.js +521 -166
  63. package/src/sap/fe/core/converters/controls/Common/Table.ts +519 -115
  64. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.js +487 -0
  65. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.ts +541 -0
  66. package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.js +364 -0
  67. package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.ts +338 -0
  68. package/src/sap/fe/core/converters/controls/ObjectPage/Avatar.js +74 -0
  69. package/src/sap/fe/core/converters/controls/ObjectPage/Avatar.ts +50 -0
  70. package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet.js +11 -11
  71. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.js +47 -35
  72. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.ts +45 -29
  73. package/src/sap/fe/core/converters/helpers/Aggregation.js +31 -32
  74. package/src/sap/fe/core/converters/helpers/Aggregation.ts +26 -27
  75. package/src/sap/fe/core/converters/helpers/BindingHelper.js +27 -2
  76. package/src/sap/fe/core/converters/helpers/BindingHelper.ts +22 -2
  77. package/src/sap/fe/core/converters/helpers/ConfigurableObject.js +1 -1
  78. package/src/sap/fe/core/converters/helpers/ID.js +9 -3
  79. package/src/sap/fe/core/converters/helpers/ID.ts +6 -3
  80. package/src/sap/fe/core/converters/helpers/IssueManager.js +5 -4
  81. package/src/sap/fe/core/converters/helpers/IssueManager.ts +4 -3
  82. package/src/sap/fe/core/converters/helpers/Key.js +3 -3
  83. package/src/sap/fe/core/converters/helpers/SelectionVariantHelper.js +11 -6
  84. package/src/sap/fe/core/converters/helpers/SelectionVariantHelper.ts +9 -5
  85. package/src/sap/fe/core/converters/objectPage/FormMenuActions.js +18 -5
  86. package/src/sap/fe/core/converters/objectPage/FormMenuActions.ts +14 -14
  87. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.js +91 -20
  88. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.ts +77 -5
  89. package/src/sap/fe/core/converters/templates/ListReportConverter.js +87 -714
  90. package/src/sap/fe/core/converters/templates/ListReportConverter.ts +85 -812
  91. package/src/sap/fe/core/converters/templates/ObjectPageConverter.js +106 -17
  92. package/src/sap/fe/core/converters/templates/ObjectPageConverter.ts +121 -16
  93. package/src/sap/fe/core/designtime/AppComponent.designtime.js +2 -1
  94. package/src/sap/fe/core/formatters/CriticalityFormatter.js +1 -1
  95. package/src/sap/fe/core/formatters/FPMFormatter.js +1 -1
  96. package/src/sap/fe/core/formatters/FPMFormatter.ts +8 -3
  97. package/src/sap/fe/core/formatters/KPIFormatter.js +1 -1
  98. package/src/sap/fe/core/formatters/TableFormatter.js +27 -4
  99. package/src/sap/fe/core/formatters/TableFormatter.ts +20 -3
  100. package/src/sap/fe/core/formatters/TableFormatterTypes.js +1 -1
  101. package/src/sap/fe/core/formatters/ValueFormatter.js +1 -1
  102. package/src/sap/fe/core/fpm/Component.js +1 -1
  103. package/src/sap/fe/core/helpers/AnnotationEnum.js +3 -3
  104. package/src/sap/fe/core/helpers/BindingExpression.js +6 -6
  105. package/src/sap/fe/core/helpers/ClassSupport.js +4 -4
  106. package/src/sap/fe/core/helpers/ExcelFormatHelper.js +0 -2
  107. package/src/sap/fe/core/helpers/KeepAliveHelper.js +211 -0
  108. package/src/sap/fe/core/helpers/KeepAliveHelper.ts +202 -0
  109. package/src/sap/fe/core/helpers/KeepAliveRefreshTypes.js +32 -0
  110. package/src/sap/fe/core/helpers/KeepAliveRefreshTypes.ts +36 -0
  111. package/src/sap/fe/core/helpers/ModelHelper.js +78 -0
  112. package/src/sap/fe/core/helpers/PasteHelper.js +6 -0
  113. package/src/sap/fe/core/helpers/SemanticKeyHelper.js +2 -2
  114. package/src/sap/fe/core/helpers/StableIdHelper.js +1 -1
  115. package/src/sap/fe/core/helpers/StableIdHelper.ts +1 -1
  116. package/src/sap/fe/core/jsx-runtime/jsx.js +2 -2
  117. package/src/sap/fe/core/jsx-runtime/jsxs.js +1 -1
  118. package/src/sap/fe/core/library.js +1 -1
  119. package/src/sap/fe/core/messagebundle.properties +45 -2
  120. package/src/sap/fe/core/messagebundle_ar.properties +53 -1
  121. package/src/sap/fe/core/messagebundle_bg.properties +52 -0
  122. package/src/sap/fe/core/messagebundle_ca.properties +54 -2
  123. package/src/sap/fe/core/messagebundle_cs.properties +52 -0
  124. package/src/sap/fe/core/messagebundle_cy.properties +52 -0
  125. package/src/sap/fe/core/messagebundle_da.properties +53 -1
  126. package/src/sap/fe/core/messagebundle_de.properties +55 -3
  127. package/src/sap/fe/core/messagebundle_el.properties +53 -1
  128. package/src/sap/fe/core/messagebundle_en.properties +52 -0
  129. package/src/sap/fe/core/messagebundle_en_GB.properties +53 -1
  130. package/src/sap/fe/core/messagebundle_en_US_sappsd.properties +49 -1
  131. package/src/sap/fe/core/messagebundle_en_US_saprigi.properties +53 -1
  132. package/src/sap/fe/core/messagebundle_en_US_saptrc.properties +53 -1
  133. package/src/sap/fe/core/messagebundle_es.properties +60 -8
  134. package/src/sap/fe/core/messagebundle_es_MX.properties +55 -3
  135. package/src/sap/fe/core/messagebundle_et.properties +52 -0
  136. package/src/sap/fe/core/messagebundle_fi.properties +52 -0
  137. package/src/sap/fe/core/messagebundle_fr.properties +61 -9
  138. package/src/sap/fe/core/messagebundle_fr_CA.properties +52 -0
  139. package/src/sap/fe/core/messagebundle_hi.properties +53 -1
  140. package/src/sap/fe/core/messagebundle_hr.properties +53 -1
  141. package/src/sap/fe/core/messagebundle_hu.properties +52 -0
  142. package/src/sap/fe/core/messagebundle_id.properties +54 -2
  143. package/src/sap/fe/core/messagebundle_it.properties +53 -1
  144. package/src/sap/fe/core/messagebundle_iw.properties +54 -2
  145. package/src/sap/fe/core/messagebundle_ja.properties +62 -10
  146. package/src/sap/fe/core/messagebundle_kk.properties +53 -1
  147. package/src/sap/fe/core/messagebundle_ko.properties +53 -1
  148. package/src/sap/fe/core/messagebundle_lt.properties +53 -1
  149. package/src/sap/fe/core/messagebundle_lv.properties +53 -1
  150. package/src/sap/fe/core/messagebundle_ms.properties +53 -1
  151. package/src/sap/fe/core/messagebundle_nl.properties +57 -5
  152. package/src/sap/fe/core/messagebundle_no.properties +54 -2
  153. package/src/sap/fe/core/messagebundle_pl.properties +53 -1
  154. package/src/sap/fe/core/messagebundle_pt.properties +54 -2
  155. package/src/sap/fe/core/messagebundle_pt_PT.properties +53 -1
  156. package/src/sap/fe/core/messagebundle_ro.properties +53 -1
  157. package/src/sap/fe/core/messagebundle_ru.properties +53 -1
  158. package/src/sap/fe/core/messagebundle_sh.properties +53 -1
  159. package/src/sap/fe/core/messagebundle_sk.properties +52 -0
  160. package/src/sap/fe/core/messagebundle_sl.properties +53 -1
  161. package/src/sap/fe/core/messagebundle_sv.properties +53 -1
  162. package/src/sap/fe/core/messagebundle_th.properties +52 -0
  163. package/src/sap/fe/core/messagebundle_tr.properties +52 -0
  164. package/src/sap/fe/core/messagebundle_uk.properties +52 -0
  165. package/src/sap/fe/core/messagebundle_vi.properties +53 -1
  166. package/src/sap/fe/core/messagebundle_zh_CN.properties +53 -1
  167. package/src/sap/fe/core/messagebundle_zh_TW.properties +53 -1
  168. package/src/sap/fe/core/services/AsyncComponentServiceFactory.js +5 -5
  169. package/src/sap/fe/core/services/EnvironmentServiceFactory.js +5 -5
  170. package/src/sap/fe/core/services/RoutingServiceFactory.js +154 -78
  171. package/src/sap/fe/core/services/ShellServicesFactory.js +9 -9
  172. package/src/sap/fe/core/services/SideEffectsServiceFactory.js +11 -12
  173. package/src/sap/fe/core/services/TemplatedViewServiceFactory.js +12 -2
  174. package/src/sap/fe/core/support/AnnotationIssue.support.js +2 -4
  175. package/src/sap/fe/core/support/CollectionFacetMissingID.support.js +2 -4
  176. package/src/sap/fe/core/support/CollectionFacetUnsupportedLevel.support.js +2 -4
  177. package/src/sap/fe/core/support/CommonHelper.js +2 -4
  178. package/src/sap/fe/core/support/Diagnostics.js +1 -1
  179. package/src/sap/fe/core/templating/CriticalityFormatters.js +4 -4
  180. package/src/sap/fe/core/templating/DataFieldFormatters.js +1 -1
  181. package/src/sap/fe/core/templating/DataModelPathHelper.js +54 -6
  182. package/src/sap/fe/core/templating/DataModelPathHelper.ts +54 -4
  183. package/src/sap/fe/core/templating/EntitySetHelper.js +86 -3
  184. package/src/sap/fe/core/templating/EntitySetHelper.ts +44 -0
  185. package/src/sap/fe/core/templating/FieldControlHelper.js +1 -1
  186. package/src/sap/fe/core/templating/FilterHelper.js +23 -5
  187. package/src/sap/fe/core/templating/FilterHelper.ts +15 -1
  188. package/src/sap/fe/core/templating/FilterTemplating.js +1 -1
  189. package/src/sap/fe/core/templating/PropertyFormatters.js +1 -1
  190. package/src/sap/fe/core/templating/PropertyHelper.js +8 -8
  191. package/src/sap/fe/core/templating/UIFormatters.js +72 -4
  192. package/src/sap/fe/core/templating/UIFormatters.ts +98 -3
  193. package/src/sap/fe/core/type/Email.js +1 -1
@@ -545,7 +545,19 @@ sap.ui.define(
545
545
 
546
546
  if (bIsActiveEntity || (!bIsActiveEntity && !sDiscardAction)) {
547
547
  //Use Delete in case of active entity and no discard action available for draft
548
- return oContext.delete();
548
+ if (oContext.hasPendingChanges()) {
549
+ oContext
550
+ .getBinding()
551
+ .resetChanges()
552
+ .then(function() {
553
+ return oContext.delete();
554
+ })
555
+ .catch(function(error) {
556
+ return Promise.reject(error);
557
+ });
558
+ } else {
559
+ return oContext.delete();
560
+ }
549
561
  } else {
550
562
  //Use Discard Post Action if it is a draft entity and discard action exists
551
563
  return executeDraftDiscardAction(oContext);
@@ -16,9 +16,23 @@ sap.ui.define(
16
16
  "sap/ui/model/FilterOperator",
17
17
  "sap/ui/core/message/Message",
18
18
  "sap/ui/core/IconPool",
19
- "sap/ui/model/json/JSONModel"
19
+ "sap/ui/model/json/JSONModel",
20
+ "sap/ui/core/format/DateFormat"
20
21
  ],
21
- function(MessageToast, MessageItem, MessageView, Button, Dialog, CoreLib, Filter, FilterOperator, Message, IconPool, JSONModel) {
22
+ function(
23
+ MessageToast,
24
+ MessageItem,
25
+ MessageView,
26
+ Button,
27
+ Dialog,
28
+ CoreLib,
29
+ Filter,
30
+ FilterOperator,
31
+ Message,
32
+ IconPool,
33
+ JSONModel,
34
+ DateFormat
35
+ ) {
22
36
  "use strict";
23
37
  var MessageType = CoreLib.MessageType;
24
38
  var that = this;
@@ -129,12 +143,63 @@ sap.ui.define(
129
143
  });
130
144
  return bMessagesModified;
131
145
  }
146
+
132
147
  // Dialog close Handling
133
148
  function dialogCloseHandler() {
134
149
  that.oDialog.close();
135
150
  that.oBackButton.setVisible(false);
136
151
  removeUnboundTransitionMessages();
137
152
  }
153
+
154
+ function getRetryAfterMessage(oMessage, bMessageDialog) {
155
+ var dNow = new Date();
156
+ var oTechnicalDetails = oMessage.getTechnicalDetails(),
157
+ oResourceBundle = sap.ui.getCore().getLibraryResourceBundle("sap.fe.core"),
158
+ sRetryAfterMessage;
159
+ if (oTechnicalDetails && oTechnicalDetails.httpStatus === 503 && oTechnicalDetails.retryAfter) {
160
+ var dRetryAfter = oTechnicalDetails.retryAfter;
161
+ var sRetryAfterMessage;
162
+ var oDateFormat;
163
+ if (dNow.getFullYear() !== dRetryAfter.getFullYear()) {
164
+ //different years
165
+ oDateFormat = DateFormat.getDateTimeInstance({
166
+ pattern: "MMMM dd, yyyy 'at' hh:mm a"
167
+ });
168
+ sRetryAfterMessage = oResourceBundle.getText(
169
+ "C_MESSAGE_HANDLING_SAPFE_503_ERROR_YEAR",
170
+ oDateFormat.format(dRetryAfter)
171
+ );
172
+ } else if (dNow.getFullYear() == dRetryAfter.getFullYear()) {
173
+ //same year
174
+ if (bMessageDialog) {
175
+ //less than 2 min
176
+ sRetryAfterMessage =
177
+ oResourceBundle.getText("C_MESSAGE_HANDLING_SAPFE_503_TITLE") +
178
+ " " +
179
+ oResourceBundle.getText("C_MESSAGE_HANDLING_SAPFE_503_DESC");
180
+ } else if (dNow.getMonth() !== dRetryAfter.getMonth() || dNow.getDate() !== dRetryAfter.getDate()) {
181
+ oDateFormat = sap.ui.core.format.DateFormat.getDateTimeInstance({
182
+ pattern: "MMMM dd 'at' hh:mm a"
183
+ }); //different months or different days of same month
184
+ sRetryAfterMessage = oResourceBundle.getText("C_MESSAGE_HANDLING_SAPFE_503_ERROR", oDateFormat.format(dRetryAfter));
185
+ } else {
186
+ //same day
187
+ oDateFormat = sap.ui.core.format.DateFormat.getDateTimeInstance({
188
+ pattern: "hh:mm a"
189
+ });
190
+ sRetryAfterMessage = oResourceBundle.getText(
191
+ "C_MESSAGE_HANDLING_SAPFE_503_ERROR_DAY",
192
+ oDateFormat.format(dRetryAfter)
193
+ );
194
+ }
195
+ }
196
+ }
197
+
198
+ if (oTechnicalDetails && oTechnicalDetails.httpStatus === 503 && !oTechnicalDetails.retryAfter) {
199
+ sRetryAfterMessage = oResourceBundle.getText("C_MESSAGE_HANDLING_SAPFE_503_ERROR_NO_RETRY_AFTER");
200
+ }
201
+ return sRetryAfterMessage;
202
+ }
138
203
  /**
139
204
  * Shows all unbound (including technical) messages and removes the ones which are transient.
140
205
  *
@@ -227,7 +292,12 @@ sap.ui.define(
227
292
  // So we create new json model to use for the message dialog view.
228
293
  var aMessages = [];
229
294
  aCurrentContexts.forEach(function(oContext) {
230
- aMessages.push(oContext.getObject());
295
+ var oMessage = oContext.getObject(),
296
+ sRetryAfterMessage = getRetryAfterMessage(oMessage, true);
297
+ if (sRetryAfterMessage) {
298
+ oMessage.setMessage(sRetryAfterMessage + " " + oMessage.getMessage());
299
+ }
300
+ aMessages.push(oMessage);
231
301
  });
232
302
  oMessageDialogModel.setData(aMessages);
233
303
  }
@@ -403,6 +473,11 @@ sap.ui.define(
403
473
  }
404
474
  }
405
475
 
476
+ for (var i = 0; i < aTransitionMessages.length; i++) {
477
+ if (aTransitionMessages[i].code === "503") {
478
+ aTransitionMessages[i].message = "\n" + aTransitionMessages[i].message;
479
+ }
480
+ }
406
481
  return aTransitionMessages;
407
482
  }
408
483
 
@@ -431,7 +506,8 @@ sap.ui.define(
431
506
  showUnboundMessages: showUnboundMessages,
432
507
  removeUnboundTransitionMessages: removeUnboundTransitionMessages,
433
508
  removeBoundTransitionMessages: removeBoundTransitionMessages,
434
- modifyETagMessagesOnly: fnModifyETagMessagesOnly
509
+ modifyETagMessagesOnly: fnModifyETagMessagesOnly,
510
+ getRetryAfterMessage: getRetryAfterMessage
435
511
  };
436
512
  return messageHandling;
437
513
  }
@@ -152,6 +152,9 @@ sap.ui.define(
152
152
  * @private
153
153
  */
154
154
  function callFunctionImport(sFunctionName, oModel) {
155
+ if (!sFunctionName) {
156
+ return Promise.resolve();
157
+ }
155
158
  var oMetaModel = oModel.getMetaModel(),
156
159
  sFunctionPath = oModel.bindContext("/" + sFunctionName).getPath(),
157
160
  oFunctionImport = oMetaModel.createBindingContext(
@@ -258,6 +261,7 @@ sap.ui.define(
258
261
  mActionExecutionParameters.bReturnAsArray = mParameters.bReturnAsArray;
259
262
  mActionExecutionParameters.internalModelContext = mParameters.internalModelContext;
260
263
  mActionExecutionParameters.operationAvailableMap = mParameters.operationAvailableMap;
264
+ mActionExecutionParameters.bObjectPage = mParameters.bObjectPage;
261
265
  }
262
266
  if (bIsCreateAction) {
263
267
  mActionExecutionParameters.bIsCreateAction = bIsCreateAction;
@@ -371,7 +375,9 @@ sap.ui.define(
371
375
  return oField.getRequired() && oField.getValueState() !== "Error";
372
376
  })
373
377
  .map(function(oFormElement) {
374
- var value = oFormElement.getFields()[0].getValue();
378
+ var value = oFormElement.getFields()[0].isA("sap.ui.mdc.MultiValueField")
379
+ ? oFormElement.getFields()[0].getItems()
380
+ : oFormElement.getFields()[0].getValue();
375
381
  if (value === undefined || value === null || value === "") {
376
382
  return oFormElement.getLabel().getText();
377
383
  }
@@ -383,6 +389,38 @@ sap.ui.define(
383
389
  return aResults;
384
390
  });
385
391
  },
392
+ _validateMessages = function(aActionParameters, aFieldInvalid, bClearTarget) {
393
+ var oMessageManager = sap.ui.getCore().getMessageManager();
394
+ var aMessages = oMessageManager.getMessageModel().getData();
395
+
396
+ aFieldInvalid = [];
397
+
398
+ aActionParameters.forEach(function(oActionParameters) {
399
+ var sParameter = oActionParameters.$Name;
400
+ aMessages.forEach(function(oMessage) {
401
+ var sParam = sParameter.replace("-inner", "");
402
+ if (
403
+ oMessage.controlIds.length > 0 &&
404
+ (oMessage.getControlId().includes("APD_::" + sParameter) ||
405
+ (oMessage.getControlId().includes("APD_::" + sParameter + "inner") &&
406
+ aFieldInvalid.indexOf("APD_::" + sParam) < 0))
407
+ ) {
408
+ if (bClearTarget) {
409
+ oMessageManager.removeMessages(oMessage);
410
+ } else {
411
+ aFieldInvalid.push("APD_::" + sParam);
412
+ }
413
+ }
414
+ // Handle messages related to input with invalid token
415
+ if (oMessage.target.includes("APD_::" + sParameter)) {
416
+ aFieldInvalid.push("APD_::" + sParam);
417
+ oMessage.target = bClearTarget ? "" : oMessage.target;
418
+ oMessageManager.removeMessages(oMessage);
419
+ }
420
+ });
421
+ });
422
+ return aFieldInvalid;
423
+ },
386
424
  oController = {
387
425
  handleChange: function(oEvent) {
388
426
  messageHandler.removeTransitionMessages();
@@ -394,6 +432,7 @@ sap.ui.define(
394
432
  return oField.getValue();
395
433
  });
396
434
  }
435
+ _validateMessages(aActionParameters, aFieldInvalid);
397
436
  }
398
437
  };
399
438
 
@@ -457,29 +496,11 @@ sap.ui.define(
457
496
  });
458
497
  return;
459
498
  }
460
- var aMessages = sap.ui
461
- .getCore()
462
- .getMessageManager()
463
- .getMessageModel()
464
- .getData();
465
499
 
466
- aFieldInvalid = [];
467
- aActionParameters.forEach(function(oActionParameters) {
468
- var sParameter = oActionParameters.$Name;
469
- aMessages.forEach(function(oMessage) {
470
- var sParam = sParameter.replace("-inner", "");
471
- if (
472
- oMessage.controlIds.length > 0 &&
473
- (oMessage.getControlId().includes("APD_::" + sParameter) ||
474
- (oMessage.getControlId().includes("APD_::" + sParameter + "inner") &&
475
- aFieldInvalid.indexOf("APD_::" + sParam) < 0))
476
- ) {
477
- aFieldInvalid.push("APD_::" + sParam);
478
- }
479
- });
480
- });
500
+ aFieldInvalid = _validateMessages(aActionParameters, aFieldInvalid);
501
+
481
502
  if (aFieldInvalid.length > 0) {
482
- return;
503
+ return messageHandling.showUnboundMessages();
483
504
  }
484
505
  BusyLocker.lock(oDialog);
485
506
  return Promise.all(
@@ -496,7 +517,20 @@ sap.ui.define(
496
517
  oParameterContext =
497
518
  oOperationBinding && oOperationBinding.getParameterContext();
498
519
  for (var i in aActionParameters) {
499
- vParameterValue = oParameterContext.getProperty(aActionParameters[i].$Name);
520
+ if (aActionParameters[i].$isCollection) {
521
+ var aMVFContent = oDialog
522
+ .getModel("mvfview")
523
+ .getProperty("/" + aActionParameters[i].$Name),
524
+ aKeyValues = [];
525
+ for (var j in aMVFContent) {
526
+ aKeyValues.push(aMVFContent[j].Key);
527
+ }
528
+ vParameterValue = aKeyValues;
529
+ } else {
530
+ vParameterValue = oParameterContext.getProperty(
531
+ aActionParameters[i].$Name
532
+ );
533
+ }
500
534
  aActionParameters[i].value = vParameterValue;
501
535
  vParameterValue = undefined;
502
536
  }
@@ -516,10 +550,13 @@ sap.ui.define(
516
550
  oResourceBundle
517
551
  );
518
552
 
519
- messageHandler.showMessageDialog({
553
+ messageHandler.showMessages({
520
554
  bHasEtagMessage: bHasEtagMessage,
521
555
  context: mParameters.aContexts[0],
522
- isActionParameterDialogOpen: true
556
+ isActionParameterDialogOpen: true,
557
+ messagePageNavigationCallback: function() {
558
+ oDialog.close();
559
+ }
523
560
  });
524
561
  if (oDialog && bHasEtagMessage) {
525
562
  oDialog.close(); //close the action parameter dialog after refresh of the context after etag mismatch
@@ -537,6 +574,7 @@ sap.ui.define(
537
574
  endButton: {
538
575
  text: CommonUtils.getTranslatedText("C_COMMON_ACTION_PARAMETER_DIALOG_CANCEL", oResourceBundle),
539
576
  press: function() {
577
+ _validateMessages(aActionParameters, aFieldInvalid, true);
540
578
  oDialog.close();
541
579
  messageHandler.removeTransitionMessages();
542
580
  reject(Constants.CancelActionDialog);
@@ -800,6 +838,10 @@ sap.ui.define(
800
838
  path: "/",
801
839
  model: "paramsModel"
802
840
  });
841
+ // empty model to add elements dynamically depending on number of MVF fields defined on the dialog
842
+ var oMVFModel = new JSONModel({});
843
+ oDialog.setModel(oMVFModel, "mvfview");
844
+
803
845
  var sActionPath = sActionName + "(...)";
804
846
  var aContexts = mParameters.aContexts || [];
805
847
  if (!aContexts.length) {
@@ -981,59 +1023,156 @@ sap.ui.define(
981
1023
  Log.error("Error while requesting side effects", oError);
982
1024
  });
983
1025
  }
1026
+ },
1027
+ fnExecuteSingleAction = function(oAction, index, oSideEffect) {
1028
+ var oPromise = new Promise(function(resolve, reject) {
1029
+ var oLocalPromise,
1030
+ aLocalPromise = [];
1031
+ setActionParameterDefaultValue();
1032
+ // For invocation grouping "isolated" need batch group per action call
1033
+ sGroupId = "apiMode" + index;
1034
+ oActionPromise = bGetBoundContext
1035
+ ? oAction.execute(sGroupId).then(function() {
1036
+ return oAction.getBoundContext();
1037
+ })
1038
+ : oAction.execute(sGroupId);
1039
+
1040
+ aActionPromises.push(oActionPromise);
1041
+ aLocalPromise.push(oActionPromise);
1042
+ var oSideEffectsService = oAppComponent.getSideEffectsService();
1043
+ // trigger actions from side effects
1044
+ if (oSideEffect && oSideEffect.triggerActions && oSideEffect.triggerActions.length) {
1045
+ oSideEffect.triggerActions.forEach(function(sTriggerAction) {
1046
+ if (sTriggerAction) {
1047
+ oLocalPromise = oSideEffectsService.executeAction(
1048
+ sTriggerAction,
1049
+ oSideEffect.context,
1050
+ sGroupId
1051
+ );
1052
+ aLocalPromise.push(oLocalPromise);
1053
+ }
1054
+ });
1055
+ }
1056
+ // request side effects for this action
1057
+ // as we move the messages request to POST $select we need to be prepared for an empty array
1058
+ if (oSideEffect && oSideEffect.pathExpressions && oSideEffect.pathExpressions.length > 0) {
1059
+ oLocalPromise = oSideEffectsService.requestSideEffects(
1060
+ oSideEffect.pathExpressions,
1061
+ oSideEffect.context,
1062
+ sGroupId
1063
+ );
1064
+ aLocalPromise.push(oLocalPromise);
1065
+ oLocalPromise
1066
+ .then(function() {
1067
+ if (mParameters.operationAvailableMap && mParameters.internalModelContext) {
1068
+ CommonUtils.setActionEnablement(
1069
+ mParameters.internalModelContext,
1070
+ JSON.parse(mParameters.operationAvailableMap),
1071
+ mParameters.aContexts
1072
+ );
1073
+ }
1074
+ })
1075
+ .catch(function(oError) {
1076
+ Log.error("Error while requesting side effects", oError);
1077
+ });
1078
+ }
1079
+ oModel.submitBatch(sGroupId);
1080
+ Promise.all(aLocalPromise)
1081
+ .then(function() {
1082
+ return resolve();
1083
+ })
1084
+ .catch(function() {
1085
+ return resolve();
1086
+ });
1087
+ });
1088
+ return oPromise;
984
1089
  };
985
1090
 
986
- for (i = 0; i < aContexts.length; i++) {
987
- oAction = oModel.bindContext(sActionName + "(...)", aContexts[i], mBindingParameters);
988
- fnExecuteAction(oAction, aContexts.length <= 1 ? null : i, {
989
- context: aContexts[i],
990
- pathExpressions: mParameters.additionalSideEffect && mParameters.additionalSideEffect.pathExpressions,
991
- triggerActions: mParameters.additionalSideEffect && mParameters.additionalSideEffect.triggerActions
1091
+ function fnExecuteSequentially(aContexts) {
1092
+ // One action and its side effects are completed before the next action is executed
1093
+ (fnOnSubmitted || function noop() {})(aActionPromises);
1094
+ function processOneAction(context, i) {
1095
+ oAction = oModel.bindContext(sActionName + "(...)", context, mBindingParameters);
1096
+ return fnExecuteSingleAction(oAction, i, {
1097
+ context: context,
1098
+ pathExpressions: mParameters.additionalSideEffect && mParameters.additionalSideEffect.pathExpressions,
1099
+ triggerActions: mParameters.additionalSideEffect && mParameters.additionalSideEffect.triggerActions
1100
+ });
1101
+ }
1102
+
1103
+ var oActionAndSideEffectPromise = Promise.resolve(undefined);
1104
+ var j = 0;
1105
+ aContexts.forEach(function(context) {
1106
+ var id = ++j;
1107
+ oActionAndSideEffectPromise = oActionAndSideEffectPromise.then(function() {
1108
+ return processOneAction(context, id);
1109
+ });
992
1110
  });
1111
+ oActionAndSideEffectPromise
1112
+ .then(function() {
1113
+ fnHandleResults();
1114
+ })
1115
+ .catch();
993
1116
  }
994
1117
 
995
- // trigger onSubmitted "event"
996
- (fnOnSubmitted || jQuery.noop)(aActionPromises);
1118
+ if (mParameters.bObjectPage && !bGrouped) {
1119
+ // For invocation grouping "isolated" called from ObjectPage, ensure that each action and matching side effects
1120
+ // are processed before the next set is submitted. Workaround until JSON batch is available.
1121
+ fnExecuteSequentially(aContexts);
1122
+ } else {
1123
+ for (i = 0; i < aContexts.length; i++) {
1124
+ oAction = oModel.bindContext(sActionName + "(...)", aContexts[i], mBindingParameters);
1125
+ fnExecuteAction(oAction, aContexts.length <= 1 ? null : i, {
1126
+ context: aContexts[i],
1127
+ pathExpressions: mParameters.additionalSideEffect && mParameters.additionalSideEffect.pathExpressions,
1128
+ triggerActions: mParameters.additionalSideEffect && mParameters.additionalSideEffect.triggerActions
1129
+ });
1130
+ }
1131
+ (fnOnSubmitted || function noop() {})(aActionPromises);
1132
+ fnHandleResults();
1133
+ }
997
1134
 
998
- Promise.all(aActionPromises.map(fnDifferentiate))
999
- .then(function(results) {
1000
- var aRejectedItems = [],
1001
- aResolvedItems = [],
1002
- iResultCount;
1003
- for (iResultCount = 0; iResultCount < results.length; iResultCount++) {
1004
- if (results[iResultCount].status === "rejected") {
1005
- aRejectedItems.push(results[iResultCount].response);
1135
+ function fnHandleResults() {
1136
+ Promise.all(aActionPromises.map(fnDifferentiate))
1137
+ .then(function(results) {
1138
+ var aRejectedItems = [],
1139
+ aResolvedItems = [],
1140
+ iResultCount;
1141
+ for (iResultCount = 0; iResultCount < results.length; iResultCount++) {
1142
+ if (results[iResultCount].status === "rejected") {
1143
+ aRejectedItems.push(results[iResultCount].response);
1144
+ }
1145
+ if (results[iResultCount].status === "resolved") {
1146
+ if (bIsCreateAction && bActionParametersExist) {
1147
+ //only used for NewAction
1148
+ results[iResultCount].bConsiderDocumentModified = true;
1149
+ aResolvedItems.push(results[iResultCount]);
1150
+ } else {
1151
+ aResolvedItems.push(results[iResultCount].response);
1152
+ }
1153
+ }
1154
+ }
1155
+ if (!results || (results && results.length === 0)) {
1156
+ reject(true);
1006
1157
  }
1007
- if (results[iResultCount].status === "resolved") {
1008
- if (bIsCreateAction && bActionParametersExist) {
1009
- //only used for NewAction
1010
- results[iResultCount].bConsiderDocumentModified = true;
1011
- aResolvedItems.push(results[iResultCount]);
1158
+ if (aRejectedItems.length === 0) {
1159
+ if (bReturnAsArray) {
1160
+ resolve(aResolvedItems);
1012
1161
  } else {
1013
- aResolvedItems.push(results[iResultCount].response);
1162
+ // context is given directly without an array so also no array is expected
1163
+ resolve(aResolvedItems[0]);
1014
1164
  }
1015
- }
1016
- }
1017
- if (!results || (results && results.length === 0)) {
1018
- reject(true);
1019
- }
1020
- if (aRejectedItems.length === 0) {
1021
- if (bReturnAsArray) {
1022
- resolve(aResolvedItems);
1023
1165
  } else {
1024
- // context is given directly without an array so also no array is expected
1025
- resolve(aResolvedItems[0]);
1166
+ reject({
1167
+ resolvedItems: aResolvedItems,
1168
+ rejectedItems: aRejectedItems
1169
+ });
1026
1170
  }
1027
- } else {
1028
- reject({
1029
- resolvedItems: aResolvedItems,
1030
- rejectedItems: aRejectedItems
1031
- });
1032
- }
1033
- })
1034
- .catch(reject);
1171
+ })
1172
+ .catch(reject);
1173
+ }
1035
1174
  }).finally(function() {
1036
- (fnOnResponse || jQuery.noop)();
1175
+ (fnOnResponse || function noop() {})();
1037
1176
  });
1038
1177
  } else {
1039
1178
  var oActionPromise;
@@ -1042,9 +1181,9 @@ sap.ui.define(
1042
1181
  oActionPromise = oAction.execute("actionImport");
1043
1182
  oModel.submitBatch("actionImport");
1044
1183
  // trigger onSubmitted "event"
1045
- (fnOnSubmitted || jQuery.noop)(oActionPromise);
1184
+ (fnOnSubmitted || function noop() {})(oActionPromise);
1046
1185
  return oActionPromise.finally(function() {
1047
- (fnOnResponse || jQuery.noop)();
1186
+ (fnOnResponse || function noop() {})();
1048
1187
  });
1049
1188
  }
1050
1189
  }