@sapui5/sap.fe.core 1.93.3 → 1.96.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (182) hide show
  1. package/package.json +2 -2
  2. package/src/sap/fe/core/.library +1 -1
  3. package/src/sap/fe/core/AppComponent.js +9 -40
  4. package/src/sap/fe/core/BusyLocker.js +12 -0
  5. package/src/sap/fe/core/CommonUtils.js +430 -27
  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/TemplateComponent.js +6 -0
  9. package/src/sap/fe/core/TransactionHelper.js +248 -170
  10. package/src/sap/fe/core/actions/draft.js +13 -1
  11. package/src/sap/fe/core/actions/operations.js +165 -45
  12. package/src/sap/fe/core/controllerextensions/EditFlow.js +56 -37
  13. package/src/sap/fe/core/controllerextensions/InternalEditFlow.js +13 -6
  14. package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.js +127 -24
  15. package/src/sap/fe/core/controllerextensions/InternalRouting.js +183 -164
  16. package/src/sap/fe/core/controllerextensions/KPIManagement.js +834 -170
  17. package/src/sap/fe/core/controllerextensions/KPIManagement.ts +890 -189
  18. package/src/sap/fe/core/controllerextensions/PageReady.js +48 -33
  19. package/src/sap/fe/core/controllerextensions/PageReady.ts +49 -14
  20. package/src/sap/fe/core/controllerextensions/Paginator.js +150 -0
  21. package/src/sap/fe/core/controllerextensions/Placeholder.js +133 -270
  22. package/src/sap/fe/core/controllerextensions/Share.js +31 -13
  23. package/src/sap/fe/core/controllerextensions/SideEffects.js +5 -6
  24. package/src/sap/fe/core/controllerextensions/SideEffects.ts +13 -12
  25. package/src/sap/fe/core/controllerextensions/ViewState.js +173 -6
  26. package/src/sap/fe/core/controls/ActionParameterDialog.fragment.xml +39 -34
  27. package/src/sap/fe/core/controls/ActionParameterDialogValueHelp.fragment.xml +35 -0
  28. package/src/sap/fe/core/controls/ActionPartial.fragment.xml +1 -1
  29. package/src/sap/fe/core/controls/CustomQuickViewPage.js +3 -0
  30. package/src/sap/fe/core/controls/MultiValueParameterDelegate.js +45 -0
  31. package/src/sap/fe/core/controls/filterbar/FilterContainer.js +15 -4
  32. package/src/sap/fe/core/controls/filterbar/VisualFilter.js +250 -94
  33. package/src/sap/fe/core/controls/filterbar/VisualFilterContainer.js +129 -135
  34. package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.js +325 -0
  35. package/src/sap/fe/core/converters/ConverterContext.js +19 -5
  36. package/src/sap/fe/core/converters/ConverterContext.ts +13 -3
  37. package/src/sap/fe/core/converters/ManifestSettings.js +1 -1
  38. package/src/sap/fe/core/converters/ManifestSettings.ts +9 -2
  39. package/src/sap/fe/core/converters/ManifestWrapper.js +9 -9
  40. package/src/sap/fe/core/converters/MetaModelConverter.js +858 -871
  41. package/src/sap/fe/core/converters/MetaModelConverter.ts +763 -826
  42. package/src/sap/fe/core/converters/TemplateConverter.js +4 -4
  43. package/src/sap/fe/core/converters/annotations/DataField.js +57 -7
  44. package/src/sap/fe/core/converters/annotations/DataField.ts +52 -2
  45. package/src/sap/fe/core/converters/common/AnnotationConverter.js +80 -46
  46. package/src/sap/fe/core/converters/controls/Common/Action.js +56 -54
  47. package/src/sap/fe/core/converters/controls/Common/Action.ts +48 -36
  48. package/src/sap/fe/core/converters/controls/Common/Chart.js +101 -9
  49. package/src/sap/fe/core/converters/controls/Common/Chart.ts +100 -5
  50. package/src/sap/fe/core/converters/controls/Common/Criticality.js +1 -1
  51. package/src/sap/fe/core/converters/controls/Common/DataVisualization.js +15 -16
  52. package/src/sap/fe/core/converters/controls/Common/DataVisualization.ts +16 -30
  53. package/src/sap/fe/core/converters/controls/Common/Form.js +21 -12
  54. package/src/sap/fe/core/converters/controls/Common/Form.ts +28 -8
  55. package/src/sap/fe/core/converters/controls/Common/KPI.js +287 -109
  56. package/src/sap/fe/core/converters/controls/Common/KPI.ts +314 -139
  57. package/src/sap/fe/core/converters/controls/Common/Table.js +414 -171
  58. package/src/sap/fe/core/converters/controls/Common/Table.ts +412 -130
  59. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.js +487 -0
  60. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.ts +541 -0
  61. package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.js +364 -0
  62. package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.ts +338 -0
  63. package/src/sap/fe/core/converters/controls/ObjectPage/Avatar.js +74 -0
  64. package/src/sap/fe/core/converters/controls/ObjectPage/Avatar.ts +50 -0
  65. package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet.js +11 -11
  66. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.js +47 -35
  67. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.ts +45 -29
  68. package/src/sap/fe/core/converters/helpers/Aggregation.js +31 -32
  69. package/src/sap/fe/core/converters/helpers/Aggregation.ts +26 -27
  70. package/src/sap/fe/core/converters/helpers/BindingHelper.js +27 -2
  71. package/src/sap/fe/core/converters/helpers/BindingHelper.ts +22 -2
  72. package/src/sap/fe/core/converters/helpers/ConfigurableObject.js +1 -1
  73. package/src/sap/fe/core/converters/helpers/ID.js +1 -3
  74. package/src/sap/fe/core/converters/helpers/ID.ts +2 -3
  75. package/src/sap/fe/core/converters/helpers/IssueManager.js +5 -4
  76. package/src/sap/fe/core/converters/helpers/IssueManager.ts +4 -3
  77. package/src/sap/fe/core/converters/helpers/Key.js +3 -3
  78. package/src/sap/fe/core/converters/helpers/SelectionVariantHelper.js +11 -6
  79. package/src/sap/fe/core/converters/helpers/SelectionVariantHelper.ts +9 -5
  80. package/src/sap/fe/core/converters/objectPage/FormMenuActions.js +18 -5
  81. package/src/sap/fe/core/converters/objectPage/FormMenuActions.ts +14 -14
  82. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.js +91 -20
  83. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.ts +77 -5
  84. package/src/sap/fe/core/converters/templates/ListReportConverter.js +76 -714
  85. package/src/sap/fe/core/converters/templates/ListReportConverter.ts +75 -807
  86. package/src/sap/fe/core/converters/templates/ObjectPageConverter.js +106 -17
  87. package/src/sap/fe/core/converters/templates/ObjectPageConverter.ts +121 -16
  88. package/src/sap/fe/core/formatters/CriticalityFormatter.js +1 -1
  89. package/src/sap/fe/core/formatters/FPMFormatter.js +1 -1
  90. package/src/sap/fe/core/formatters/FPMFormatter.ts +8 -3
  91. package/src/sap/fe/core/formatters/KPIFormatter.js +1 -1
  92. package/src/sap/fe/core/formatters/TableFormatter.js +1 -1
  93. package/src/sap/fe/core/formatters/TableFormatterTypes.js +1 -1
  94. package/src/sap/fe/core/formatters/ValueFormatter.js +1 -1
  95. package/src/sap/fe/core/fpm/Component.js +1 -1
  96. package/src/sap/fe/core/helpers/AnnotationEnum.js +3 -3
  97. package/src/sap/fe/core/helpers/BindingExpression.js +6 -6
  98. package/src/sap/fe/core/helpers/ClassSupport.js +4 -4
  99. package/src/sap/fe/core/helpers/ExcelFormatHelper.js +0 -2
  100. package/src/sap/fe/core/helpers/ModelHelper.js +27 -0
  101. package/src/sap/fe/core/helpers/PasteHelper.js +6 -0
  102. package/src/sap/fe/core/helpers/SemanticKeyHelper.js +2 -2
  103. package/src/sap/fe/core/helpers/StableIdHelper.js +1 -1
  104. package/src/sap/fe/core/helpers/StableIdHelper.ts +1 -1
  105. package/src/sap/fe/core/jsx-runtime/jsx.js +2 -2
  106. package/src/sap/fe/core/jsx-runtime/jsxs.js +1 -1
  107. package/src/sap/fe/core/library.js +1 -1
  108. package/src/sap/fe/core/messagebundle.properties +30 -1
  109. package/src/sap/fe/core/messagebundle_ar.properties +43 -1
  110. package/src/sap/fe/core/messagebundle_bg.properties +42 -0
  111. package/src/sap/fe/core/messagebundle_ca.properties +44 -2
  112. package/src/sap/fe/core/messagebundle_cs.properties +42 -0
  113. package/src/sap/fe/core/messagebundle_cy.properties +42 -0
  114. package/src/sap/fe/core/messagebundle_da.properties +43 -1
  115. package/src/sap/fe/core/messagebundle_de.properties +45 -3
  116. package/src/sap/fe/core/messagebundle_el.properties +43 -1
  117. package/src/sap/fe/core/messagebundle_en.properties +42 -0
  118. package/src/sap/fe/core/messagebundle_en_GB.properties +43 -1
  119. package/src/sap/fe/core/messagebundle_en_US_sappsd.properties +43 -1
  120. package/src/sap/fe/core/messagebundle_en_US_saprigi.properties +48 -0
  121. package/src/sap/fe/core/messagebundle_en_US_saptrc.properties +42 -0
  122. package/src/sap/fe/core/messagebundle_es.properties +50 -8
  123. package/src/sap/fe/core/messagebundle_es_MX.properties +45 -3
  124. package/src/sap/fe/core/messagebundle_et.properties +42 -0
  125. package/src/sap/fe/core/messagebundle_fi.properties +42 -0
  126. package/src/sap/fe/core/messagebundle_fr.properties +51 -9
  127. package/src/sap/fe/core/messagebundle_fr_CA.properties +42 -0
  128. package/src/sap/fe/core/messagebundle_hi.properties +43 -1
  129. package/src/sap/fe/core/messagebundle_hr.properties +43 -1
  130. package/src/sap/fe/core/messagebundle_hu.properties +42 -0
  131. package/src/sap/fe/core/messagebundle_id.properties +43 -1
  132. package/src/sap/fe/core/messagebundle_it.properties +43 -1
  133. package/src/sap/fe/core/messagebundle_iw.properties +44 -2
  134. package/src/sap/fe/core/messagebundle_ja.properties +43 -1
  135. package/src/sap/fe/core/messagebundle_kk.properties +43 -1
  136. package/src/sap/fe/core/messagebundle_ko.properties +43 -1
  137. package/src/sap/fe/core/messagebundle_lt.properties +43 -1
  138. package/src/sap/fe/core/messagebundle_lv.properties +43 -1
  139. package/src/sap/fe/core/messagebundle_ms.properties +43 -1
  140. package/src/sap/fe/core/messagebundle_nl.properties +47 -5
  141. package/src/sap/fe/core/messagebundle_no.properties +44 -2
  142. package/src/sap/fe/core/messagebundle_pl.properties +43 -1
  143. package/src/sap/fe/core/messagebundle_pt.properties +43 -1
  144. package/src/sap/fe/core/messagebundle_pt_PT.properties +43 -1
  145. package/src/sap/fe/core/messagebundle_ro.properties +43 -1
  146. package/src/sap/fe/core/messagebundle_ru.properties +43 -1
  147. package/src/sap/fe/core/messagebundle_sh.properties +43 -1
  148. package/src/sap/fe/core/messagebundle_sk.properties +42 -0
  149. package/src/sap/fe/core/messagebundle_sl.properties +43 -1
  150. package/src/sap/fe/core/messagebundle_sv.properties +43 -1
  151. package/src/sap/fe/core/messagebundle_th.properties +42 -0
  152. package/src/sap/fe/core/messagebundle_tr.properties +42 -0
  153. package/src/sap/fe/core/messagebundle_uk.properties +42 -0
  154. package/src/sap/fe/core/messagebundle_vi.properties +43 -1
  155. package/src/sap/fe/core/messagebundle_zh_CN.properties +43 -1
  156. package/src/sap/fe/core/messagebundle_zh_TW.properties +43 -1
  157. package/src/sap/fe/core/services/AsyncComponentServiceFactory.js +5 -5
  158. package/src/sap/fe/core/services/EnvironmentServiceFactory.js +5 -5
  159. package/src/sap/fe/core/services/RoutingServiceFactory.js +155 -76
  160. package/src/sap/fe/core/services/ShellServicesFactory.js +9 -9
  161. package/src/sap/fe/core/services/SideEffectsServiceFactory.js +11 -12
  162. package/src/sap/fe/core/services/TemplatedViewServiceFactory.js +11 -1
  163. package/src/sap/fe/core/support/AnnotationIssue.support.js +2 -4
  164. package/src/sap/fe/core/support/CollectionFacetMissingID.support.js +2 -4
  165. package/src/sap/fe/core/support/CollectionFacetUnsupportedLevel.support.js +2 -4
  166. package/src/sap/fe/core/support/CommonHelper.js +2 -4
  167. package/src/sap/fe/core/support/Diagnostics.js +1 -1
  168. package/src/sap/fe/core/templating/CriticalityFormatters.js +4 -4
  169. package/src/sap/fe/core/templating/DataFieldFormatters.js +1 -1
  170. package/src/sap/fe/core/templating/DataModelPathHelper.js +54 -6
  171. package/src/sap/fe/core/templating/DataModelPathHelper.ts +54 -4
  172. package/src/sap/fe/core/templating/EntitySetHelper.js +13 -3
  173. package/src/sap/fe/core/templating/EntitySetHelper.ts +4 -0
  174. package/src/sap/fe/core/templating/FieldControlHelper.js +1 -1
  175. package/src/sap/fe/core/templating/FilterHelper.js +23 -5
  176. package/src/sap/fe/core/templating/FilterHelper.ts +15 -1
  177. package/src/sap/fe/core/templating/FilterTemplating.js +1 -1
  178. package/src/sap/fe/core/templating/PropertyFormatters.js +1 -1
  179. package/src/sap/fe/core/templating/PropertyHelper.js +8 -8
  180. package/src/sap/fe/core/templating/UIFormatters.js +72 -4
  181. package/src/sap/fe/core/templating/UIFormatters.ts +98 -3
  182. 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);
@@ -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
  }
@@ -496,7 +502,20 @@ sap.ui.define(
496
502
  oParameterContext =
497
503
  oOperationBinding && oOperationBinding.getParameterContext();
498
504
  for (var i in aActionParameters) {
499
- vParameterValue = oParameterContext.getProperty(aActionParameters[i].$Name);
505
+ if (aActionParameters[i].$isCollection) {
506
+ var aMVFContent = oDialog
507
+ .getModel("mvfview")
508
+ .getProperty("/" + aActionParameters[i].$Name),
509
+ aKeyValues = [];
510
+ for (var j in aMVFContent) {
511
+ aKeyValues.push(aMVFContent[j].Key);
512
+ }
513
+ vParameterValue = aKeyValues;
514
+ } else {
515
+ vParameterValue = oParameterContext.getProperty(
516
+ aActionParameters[i].$Name
517
+ );
518
+ }
500
519
  aActionParameters[i].value = vParameterValue;
501
520
  vParameterValue = undefined;
502
521
  }
@@ -800,6 +819,10 @@ sap.ui.define(
800
819
  path: "/",
801
820
  model: "paramsModel"
802
821
  });
822
+ // empty model to add elements dynamically depending on number of MVF fields defined on the dialog
823
+ var oMVFModel = new JSONModel({});
824
+ oDialog.setModel(oMVFModel, "mvfview");
825
+
803
826
  var sActionPath = sActionName + "(...)";
804
827
  var aContexts = mParameters.aContexts || [];
805
828
  if (!aContexts.length) {
@@ -981,59 +1004,156 @@ sap.ui.define(
981
1004
  Log.error("Error while requesting side effects", oError);
982
1005
  });
983
1006
  }
1007
+ },
1008
+ fnExecuteSingleAction = function(oAction, index, oSideEffect) {
1009
+ var oPromise = new Promise(function(resolve, reject) {
1010
+ var oLocalPromise,
1011
+ aLocalPromise = [];
1012
+ setActionParameterDefaultValue();
1013
+ // For invocation grouping "isolated" need batch group per action call
1014
+ sGroupId = "apiMode" + index;
1015
+ oActionPromise = bGetBoundContext
1016
+ ? oAction.execute(sGroupId).then(function() {
1017
+ return oAction.getBoundContext();
1018
+ })
1019
+ : oAction.execute(sGroupId);
1020
+
1021
+ aActionPromises.push(oActionPromise);
1022
+ aLocalPromise.push(oActionPromise);
1023
+ var oSideEffectsService = oAppComponent.getSideEffectsService();
1024
+ // trigger actions from side effects
1025
+ if (oSideEffect && oSideEffect.triggerActions && oSideEffect.triggerActions.length) {
1026
+ oSideEffect.triggerActions.forEach(function(sTriggerAction) {
1027
+ if (sTriggerAction) {
1028
+ oLocalPromise = oSideEffectsService.executeAction(
1029
+ sTriggerAction,
1030
+ oSideEffect.context,
1031
+ sGroupId
1032
+ );
1033
+ aLocalPromise.push(oLocalPromise);
1034
+ }
1035
+ });
1036
+ }
1037
+ // request side effects for this action
1038
+ // as we move the messages request to POST $select we need to be prepared for an empty array
1039
+ if (oSideEffect && oSideEffect.pathExpressions && oSideEffect.pathExpressions.length > 0) {
1040
+ oLocalPromise = oSideEffectsService.requestSideEffects(
1041
+ oSideEffect.pathExpressions,
1042
+ oSideEffect.context,
1043
+ sGroupId
1044
+ );
1045
+ aLocalPromise.push(oLocalPromise);
1046
+ oLocalPromise
1047
+ .then(function() {
1048
+ if (mParameters.operationAvailableMap && mParameters.internalModelContext) {
1049
+ CommonUtils.setActionEnablement(
1050
+ mParameters.internalModelContext,
1051
+ JSON.parse(mParameters.operationAvailableMap),
1052
+ mParameters.aContexts
1053
+ );
1054
+ }
1055
+ })
1056
+ .catch(function(oError) {
1057
+ Log.error("Error while requesting side effects", oError);
1058
+ });
1059
+ }
1060
+ oModel.submitBatch(sGroupId);
1061
+ Promise.all(aLocalPromise)
1062
+ .then(function() {
1063
+ return resolve();
1064
+ })
1065
+ .catch(function() {
1066
+ return resolve();
1067
+ });
1068
+ });
1069
+ return oPromise;
984
1070
  };
985
1071
 
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
1072
+ function fnExecuteSequentially(aContexts) {
1073
+ // One action and its side effects are completed before the next action is executed
1074
+ (fnOnSubmitted || function noop() {})(aActionPromises);
1075
+ function processOneAction(context, i) {
1076
+ oAction = oModel.bindContext(sActionName + "(...)", context, mBindingParameters);
1077
+ return fnExecuteSingleAction(oAction, i, {
1078
+ context: context,
1079
+ pathExpressions: mParameters.additionalSideEffect && mParameters.additionalSideEffect.pathExpressions,
1080
+ triggerActions: mParameters.additionalSideEffect && mParameters.additionalSideEffect.triggerActions
1081
+ });
1082
+ }
1083
+
1084
+ var oActionAndSideEffectPromise = Promise.resolve(undefined);
1085
+ var j = 0;
1086
+ aContexts.forEach(function(context) {
1087
+ var id = ++j;
1088
+ oActionAndSideEffectPromise = oActionAndSideEffectPromise.then(function() {
1089
+ return processOneAction(context, id);
1090
+ });
992
1091
  });
1092
+ oActionAndSideEffectPromise
1093
+ .then(function() {
1094
+ fnHandleResults();
1095
+ })
1096
+ .catch();
993
1097
  }
994
1098
 
995
- // trigger onSubmitted "event"
996
- (fnOnSubmitted || jQuery.noop)(aActionPromises);
1099
+ if (mParameters.bObjectPage && !bGrouped) {
1100
+ // For invocation grouping "isolated" called from ObjectPage, ensure that each action and matching side effects
1101
+ // are processed before the next set is submitted. Workaround until JSON batch is available.
1102
+ fnExecuteSequentially(aContexts);
1103
+ } else {
1104
+ for (i = 0; i < aContexts.length; i++) {
1105
+ oAction = oModel.bindContext(sActionName + "(...)", aContexts[i], mBindingParameters);
1106
+ fnExecuteAction(oAction, aContexts.length <= 1 ? null : i, {
1107
+ context: aContexts[i],
1108
+ pathExpressions: mParameters.additionalSideEffect && mParameters.additionalSideEffect.pathExpressions,
1109
+ triggerActions: mParameters.additionalSideEffect && mParameters.additionalSideEffect.triggerActions
1110
+ });
1111
+ }
1112
+ (fnOnSubmitted || function noop() {})(aActionPromises);
1113
+ fnHandleResults();
1114
+ }
997
1115
 
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);
1116
+ function fnHandleResults() {
1117
+ Promise.all(aActionPromises.map(fnDifferentiate))
1118
+ .then(function(results) {
1119
+ var aRejectedItems = [],
1120
+ aResolvedItems = [],
1121
+ iResultCount;
1122
+ for (iResultCount = 0; iResultCount < results.length; iResultCount++) {
1123
+ if (results[iResultCount].status === "rejected") {
1124
+ aRejectedItems.push(results[iResultCount].response);
1125
+ }
1126
+ if (results[iResultCount].status === "resolved") {
1127
+ if (bIsCreateAction && bActionParametersExist) {
1128
+ //only used for NewAction
1129
+ results[iResultCount].bConsiderDocumentModified = true;
1130
+ aResolvedItems.push(results[iResultCount]);
1131
+ } else {
1132
+ aResolvedItems.push(results[iResultCount].response);
1133
+ }
1134
+ }
1135
+ }
1136
+ if (!results || (results && results.length === 0)) {
1137
+ reject(true);
1006
1138
  }
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]);
1139
+ if (aRejectedItems.length === 0) {
1140
+ if (bReturnAsArray) {
1141
+ resolve(aResolvedItems);
1012
1142
  } else {
1013
- aResolvedItems.push(results[iResultCount].response);
1143
+ // context is given directly without an array so also no array is expected
1144
+ resolve(aResolvedItems[0]);
1014
1145
  }
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
1146
  } else {
1024
- // context is given directly without an array so also no array is expected
1025
- resolve(aResolvedItems[0]);
1147
+ reject({
1148
+ resolvedItems: aResolvedItems,
1149
+ rejectedItems: aRejectedItems
1150
+ });
1026
1151
  }
1027
- } else {
1028
- reject({
1029
- resolvedItems: aResolvedItems,
1030
- rejectedItems: aRejectedItems
1031
- });
1032
- }
1033
- })
1034
- .catch(reject);
1152
+ })
1153
+ .catch(reject);
1154
+ }
1035
1155
  }).finally(function() {
1036
- (fnOnResponse || jQuery.noop)();
1156
+ (fnOnResponse || function noop() {})();
1037
1157
  });
1038
1158
  } else {
1039
1159
  var oActionPromise;
@@ -1042,9 +1162,9 @@ sap.ui.define(
1042
1162
  oActionPromise = oAction.execute("actionImport");
1043
1163
  oModel.submitBatch("actionImport");
1044
1164
  // trigger onSubmitted "event"
1045
- (fnOnSubmitted || jQuery.noop)(oActionPromise);
1165
+ (fnOnSubmitted || function noop() {})(oActionPromise);
1046
1166
  return oActionPromise.finally(function() {
1047
- (fnOnResponse || jQuery.noop)();
1167
+ (fnOnResponse || function noop() {})();
1048
1168
  });
1049
1169
  }
1050
1170
  }
@@ -66,6 +66,7 @@ sap.ui.define(
66
66
  saveDocument: { "public": true, "final": true },
67
67
  cancelDocument: { "public": true, "final": true },
68
68
  deleteDocument: { "public": true, "final": true },
69
+ deleteMultipleDocuments: { "public": true, "final": true },
69
70
  applyDocument: { "public": true, "final": true },
70
71
  invokeAction: { "public": true, "final": true },
71
72
  securedExecution: { "public": true, "final": true },
@@ -125,6 +126,13 @@ sap.ui.define(
125
126
  });
126
127
  },
127
128
 
129
+ deleteMultipleDocuments: function(aContexts, mParameters) {
130
+ return this.base
131
+ .getView()
132
+ .getController()
133
+ ._editFlow.deleteMultipleDocuments(aContexts, mParameters);
134
+ },
135
+
128
136
  /**
129
137
  * Updates the draft status and displays the error messages if there are errors during an update.
130
138
  *
@@ -161,13 +169,14 @@ sap.ui.define(
161
169
  sEntitySetName = oMetaModel.getMetaContext(oBindingContext.getPath()).getObject("@sapui.name"),
162
170
  aSemanticKeys = SemanticKeyHelper.getSemanticKeys(oMetaModel, sEntitySetName);
163
171
  if (aSemanticKeys && aSemanticKeys.length) {
164
- var oCurrentSematicMapping = that.base
172
+ var oCurrentSemanticMapping = that.base
165
173
  .getAppComponent()
166
174
  .getRoutingService()
167
175
  .getLastSemanticMapping(),
168
- sCurrentSematicPath = oCurrentSematicMapping && oCurrentSematicMapping.semanticPath;
169
- var sChangedPath = SemanticKeyHelper.getSemanticPath(oBindingContext);
170
- if (sCurrentSematicPath !== sChangedPath) {
176
+ sCurrentSemanticPath = oCurrentSemanticMapping && oCurrentSemanticMapping.semanticPath,
177
+ sChangedPath = SemanticKeyHelper.getSemanticPath(oBindingContext, true);
178
+
179
+ if (sCurrentSemanticPath !== sChangedPath) {
171
180
  return that._handleNewContext(oBindingContext, true, undefined, true).then(function() {
172
181
  that._setDraftStatus(DraftStatus.Saved);
173
182
  });
@@ -236,8 +245,10 @@ sap.ui.define(
236
245
  // Create by navigating to an external target
237
246
  // TODO: Call appropriate function (currently using the same as for outbound chevron nav, and without any context - 3rd param)
238
247
  return this._syncTask().then(function() {
239
- var oController = that.getView().getController();
240
- oController.handlers.onChevronPressNavigateOutBound(oController, mParameters.outbound, undefined);
248
+ var oController = that.getView().getController(),
249
+ sCreatePath = CommonUtils.getAbsoluteMetaPathForListBinding(that.getView(), vListBinding);
250
+
251
+ oController.handlers.onChevronPressNavigateOutBound(oController, mParameters.outbound, undefined, sCreatePath);
241
252
  });
242
253
  }
243
254
 
@@ -714,7 +725,7 @@ sap.ui.define(
714
725
  toggleDraftActive: function(oContext) {
715
726
  var oContextData = oContext.getObject();
716
727
  var that = this;
717
- var bEditable, sEditMode, bUseSemanticKey;
728
+ var bEditable;
718
729
  var bIsDraft = oContext && this._getProgrammingModel(oContext) === ProgrammingModel.Draft;
719
730
  var oToggleContext = oContext
720
731
  .getModel()
@@ -735,28 +746,22 @@ sap.ui.define(
735
746
  if (!oContextData.IsActiveEntity && oContextData.HasActiveEntity) {
736
747
  //start Point: edit draft
737
748
  bEditable = false;
738
- sEditMode = EditMode.Display;
739
- bUseSemanticKey = false;
740
749
  } else if (oContextData.IsActiveEntity && oContextData.HasDraftEntity) {
741
750
  // start point active document
742
751
  bEditable = true;
743
- sEditMode = EditMode.Editable;
744
- bUseSemanticKey = true;
745
752
  }
746
753
  oToggleContext
747
754
  .requestCanonicalPath()
748
755
  .then(function(sCanonicalPath) {
749
- if (oToggleContext.getPath() !== sCanonicalPath) {
750
- sCanonicalPath = bUseSemanticKey ? SemanticKeyHelper.getSemanticPath(oContext) : sCanonicalPath;
751
- oToggleContext = oToggleContext
752
- .getModel()
753
- .bindContext(sCanonicalPath)
754
- .getBoundContext();
755
- }
756
- return oToggleContext;
756
+ // We use the canonical path for the navigation instead of the semantic path, as the
757
+ // semantic key values may have changed between the draft and the active version (BCP 2170216142)
758
+ return oToggleContext
759
+ .getModel()
760
+ .bindContext(sCanonicalPath)
761
+ .getBoundContext();
757
762
  })
758
763
  .then(function(oToggleContext) {
759
- that._setEditMode(sEditMode, false); //switch to edit mode only if a draft is available
764
+ that._setEditMode(bEditable ? EditMode.Editable : EditMode.Display, false); //switch to edit mode only if a draft is available
760
765
  that._handleNewContext(oToggleContext, bEditable, true, true);
761
766
  })
762
767
  .catch(function(err) {
@@ -887,9 +892,7 @@ sap.ui.define(
887
892
  applyDocument: function(oContext) {
888
893
  var that = this,
889
894
  oLockObject = this._getGlobalUIModel();
890
-
891
895
  BusyLocker.lock(oLockObject);
892
-
893
896
  return (
894
897
  this._submitOpenChanges(oContext)
895
898
  // check if there are any validation/parse errors
@@ -900,7 +903,9 @@ sap.ui.define(
900
903
  return true;
901
904
  })
902
905
  .finally(function() {
903
- BusyLocker.unlock(oLockObject);
906
+ if (BusyLocker.isLocked(oLockObject)) {
907
+ BusyLocker.unlock(oLockObject);
908
+ }
904
909
  })
905
910
  );
906
911
  },
@@ -1034,6 +1039,8 @@ sap.ui.define(
1034
1039
  } else {
1035
1040
  mParameters.bGetBoundContext = true;
1036
1041
  }
1042
+ // Need to know that the action is called from ObjectPage for changeSet Isolated workaround
1043
+ mParameters.bObjectPage = oView.getViewData().converterType === "ObjectPage";
1037
1044
  return this._syncTask()
1038
1045
  .then(
1039
1046
  transactionHelper.callAction.bind(
@@ -1178,11 +1185,14 @@ sap.ui.define(
1178
1185
  */
1179
1186
  handlePatchSent: function(oEvent) {
1180
1187
  var that = this;
1188
+ this.mPatchPromises = this.mPatchPromises ? this.mPatchPromises : {};
1189
+ // do this for every unique object (eg: every table) so that each associated promise is fulfilled at the end
1181
1190
  var oPatchPromise = new Promise(function(resolve, reject) {
1182
- that.resolvePatchPromise = resolve;
1183
- that.rejectPatchPromise = reject;
1191
+ that.mPatchPromises[oEvent.getSource()] = {
1192
+ resolvePatchPromise: resolve,
1193
+ rejectPatchPromise: reject
1194
+ };
1184
1195
  });
1185
-
1186
1196
  this.updateDocument(oEvent.getSource(), oPatchPromise);
1187
1197
  },
1188
1198
 
@@ -1194,10 +1204,11 @@ sap.ui.define(
1194
1204
  handlePatchCompleted: function(oEvent) {
1195
1205
  var bSuccess = oEvent.getParameter("success");
1196
1206
  if (bSuccess) {
1197
- this.resolvePatchPromise();
1207
+ this.mPatchPromises[oEvent.getSource()].resolvePatchPromise();
1198
1208
  } else {
1199
- this.rejectPatchPromise();
1209
+ this.mPatchPromises[oEvent.getSource()].rejectPatchPromise();
1200
1210
  }
1211
+ delete this.mPatchPromises[oEvent.getSource()];
1201
1212
  },
1202
1213
 
1203
1214
  //////////////////////////////////////
@@ -1335,15 +1346,22 @@ sap.ui.define(
1335
1346
  },
1336
1347
 
1337
1348
  _submitOpenChanges: function(oContext) {
1338
- var oModel = oContext.getModel();
1339
-
1349
+ var oModel = oContext.getModel(),
1350
+ oLockObject = this._getGlobalUIModel();
1340
1351
  //Currently we are using only 1 updateGroupId, hence submitting the batch directly here
1341
- return oModel.submitBatch("$auto").then(function() {
1342
- if (oModel.hasPendingChanges("$auto")) {
1343
- // the submit was not successful
1344
- return Promise.reject("submit of open changes failed");
1345
- }
1346
- });
1352
+ return oModel
1353
+ .submitBatch("$auto")
1354
+ .then(function() {
1355
+ if (oModel.hasPendingChanges("$auto")) {
1356
+ // the submit was not successful
1357
+ return Promise.reject("submit of open changes failed");
1358
+ }
1359
+ })
1360
+ .finally(function() {
1361
+ if (BusyLocker.isLocked(oLockObject)) {
1362
+ BusyLocker.unlock(oLockObject);
1363
+ }
1364
+ });
1347
1365
  },
1348
1366
 
1349
1367
  _handleStickyOn: function(oContext) {
@@ -1491,7 +1509,8 @@ sap.ui.define(
1491
1509
  editable: bEditable,
1492
1510
  bPersistOPScroll: true,
1493
1511
  bRecreateContext: bRecreateContext,
1494
- bDraftNavigation: bDraftNavigation
1512
+ bDraftNavigation: bDraftNavigation,
1513
+ showPlaceholder: false
1495
1514
  });
1496
1515
  },
1497
1516
 
@@ -67,7 +67,7 @@ sap.ui.define(
67
67
  // to be overridden
68
68
  },
69
69
 
70
- createMultipleDocuments: function(oListBinding, aData, bCreateAtEnd) {
70
+ createMultipleDocuments: function(oListBinding, aData, bCreateAtEnd, bFromCopyPaste) {
71
71
  var that = this,
72
72
  transactionHelper = this.getTransactionHelper(),
73
73
  oLockObject = this.getGlobalUIModel(),
@@ -101,12 +101,18 @@ sap.ui.define(
101
101
  // Remove navigation properties as we don't support deep create
102
102
  for (var sPropertyPath in mPropertyValues) {
103
103
  var oProperty = oMetaModel.getObject(sMetaPath + "/" + sPropertyPath);
104
- if (oProperty && oProperty.$kind !== "NavigationProperty") {
104
+ if (oProperty && oProperty.$kind !== "NavigationProperty" && mPropertyValues[sPropertyPath]) {
105
105
  mParameters.data[sPropertyPath] = mPropertyValues[sPropertyPath];
106
106
  }
107
107
  }
108
108
 
109
- return transactionHelper.createDocument(oListBinding, mParameters, oResourceBundle, that.getMessageHandler());
109
+ return transactionHelper.createDocument(
110
+ oListBinding,
111
+ mParameters,
112
+ oResourceBundle,
113
+ that.getMessageHandler(),
114
+ bFromCopyPaste
115
+ );
110
116
  });
111
117
 
112
118
  return Promise.all(aCreationPromises);
@@ -338,9 +344,10 @@ sap.ui.define(
338
344
 
339
345
  // TODO: this setting and removing of contexts shouldn't be in the transaction helper at all
340
346
  // for the time being I kept it and provide the internal model context to not break something
341
- mParameters.internalModelContext = mParameters.id
342
- ? this.getView()
343
- .byId(mParameters.id)
347
+ mParameters.internalModelContext = mParameters.controlId
348
+ ? sap.ui
349
+ .getCore()
350
+ .byId(mParameters.controlId)
344
351
  .getBindingContext("internal")
345
352
  : null;
346
353