@sapui5/sap.fe.core 1.136.2 → 1.138.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 (90) hide show
  1. package/package.json +1 -1
  2. package/src/sap/fe/core/.library +1 -1
  3. package/src/sap/fe/core/ActionRuntime.js +76 -28
  4. package/src/sap/fe/core/ActionRuntime.ts +106 -30
  5. package/src/sap/fe/core/AppComponent.js +11 -1
  6. package/src/sap/fe/core/AppComponent.ts +10 -0
  7. package/src/sap/fe/core/CommonUtils.js +15 -3
  8. package/src/sap/fe/core/CommonUtils.ts +13 -2
  9. package/src/sap/fe/core/PageController.controller.js +10 -0
  10. package/src/sap/fe/core/PageController.controller.ts +3 -0
  11. package/src/sap/fe/core/buildingBlocks/TraceInfo.js +3 -4
  12. package/src/sap/fe/core/buildingBlocks/TraceInfo.ts +2 -2
  13. package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockTemplateProcessor.js +3 -3
  14. package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockTemplateProcessor.ts +2 -2
  15. package/src/sap/fe/core/controllerextensions/EditFlow.js +42 -36
  16. package/src/sap/fe/core/controllerextensions/EditFlow.ts +53 -44
  17. package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.js +2 -1
  18. package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.ts +2 -1
  19. package/src/sap/fe/core/controllerextensions/InternalRouting.js +2 -15
  20. package/src/sap/fe/core/controllerextensions/InternalRouting.ts +1 -14
  21. package/src/sap/fe/core/controllerextensions/Paginator.js +20 -5
  22. package/src/sap/fe/core/controllerextensions/Paginator.ts +19 -0
  23. package/src/sap/fe/core/controllerextensions/editFlow/NotApplicableContextDialog.js +4 -2
  24. package/src/sap/fe/core/controllerextensions/editFlow/NotApplicableContextDialog.tsx +7 -2
  25. package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.js +155 -129
  26. package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.ts +200 -175
  27. package/src/sap/fe/core/controllerextensions/editFlow/draft.js +11 -14
  28. package/src/sap/fe/core/controllerextensions/editFlow/draft.ts +11 -31
  29. package/src/sap/fe/core/controllerextensions/editFlow/operations/ODataOperation.js +35 -3
  30. package/src/sap/fe/core/controllerextensions/editFlow/operations/ODataOperation.ts +46 -10
  31. package/src/sap/fe/core/controllerextensions/editFlow/operations/ODataStrictHandling.js +16 -1
  32. package/src/sap/fe/core/controllerextensions/editFlow/operations/ODataStrictHandling.ts +17 -2
  33. package/src/sap/fe/core/controllerextensions/editFlow/operations/Operation.js +88 -1
  34. package/src/sap/fe/core/controllerextensions/editFlow/operations/Operation.ts +106 -7
  35. package/src/sap/fe/core/controllerextensions/editFlow/operations/OperationMessage.js +16 -1
  36. package/src/sap/fe/core/controllerextensions/editFlow/operations/OperationMessage.ts +15 -0
  37. package/src/sap/fe/core/controllerextensions/editFlow/operations/OperationParameters.js +25 -1
  38. package/src/sap/fe/core/controllerextensions/editFlow/operations/OperationParameters.ts +24 -0
  39. package/src/sap/fe/core/controllerextensions/editFlow/sticky.js +3 -5
  40. package/src/sap/fe/core/controllerextensions/editFlow/sticky.ts +2 -10
  41. package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.js +8 -15
  42. package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.ts +7 -19
  43. package/src/sap/fe/core/controllerextensions/routing/RouterProxy.js +7 -4
  44. package/src/sap/fe/core/controllerextensions/routing/RouterProxy.ts +7 -3
  45. package/src/sap/fe/core/controls/DataWatcher.js +2 -2
  46. package/src/sap/fe/core/controls/DataWatcher.tsx +1 -1
  47. package/src/sap/fe/core/controls/Recommendations/ConfirmRecommendationDialog.js +11 -6
  48. package/src/sap/fe/core/controls/Recommendations/ConfirmRecommendationDialog.tsx +13 -9
  49. package/src/sap/fe/core/converters/ManifestSettings.js +1 -1
  50. package/src/sap/fe/core/converters/ManifestSettings.ts +4 -0
  51. package/src/sap/fe/core/converters/MetaModelConverter.js +3 -2
  52. package/src/sap/fe/core/converters/MetaModelConverter.ts +12 -4
  53. package/src/sap/fe/core/converters/controls/Common/Action.js +53 -21
  54. package/src/sap/fe/core/converters/controls/Common/Action.ts +53 -24
  55. package/src/sap/fe/core/converters/controls/Common/Chart.js +4 -1
  56. package/src/sap/fe/core/converters/controls/Common/Chart.ts +2 -1
  57. package/src/sap/fe/core/converters/controls/Common/Table.js +33 -12
  58. package/src/sap/fe/core/converters/controls/Common/Table.ts +37 -10
  59. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.js +2 -2
  60. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.ts +2 -1
  61. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.js +6 -11
  62. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.ts +10 -17
  63. package/src/sap/fe/core/converters/templates/ObjectPageConverter.js +3 -28
  64. package/src/sap/fe/core/converters/templates/ObjectPageConverter.ts +1 -26
  65. package/src/sap/fe/core/fpm/manifest.json +1 -1
  66. package/src/sap/fe/core/helpers/FPMHelper.js +2 -2
  67. package/src/sap/fe/core/helpers/FPMHelper.ts +1 -1
  68. package/src/sap/fe/core/helpers/ModelHelper.js +8 -56
  69. package/src/sap/fe/core/helpers/ModelHelper.ts +11 -57
  70. package/src/sap/fe/core/helpers/PasteHelper.js +2 -2
  71. package/src/sap/fe/core/helpers/PasteHelper.ts +1 -1
  72. package/src/sap/fe/core/library.js +33 -4
  73. package/src/sap/fe/core/library.ts +33 -2
  74. package/src/sap/fe/core/messagebundle.properties +18 -2
  75. package/src/sap/fe/core/messagebundle_el.properties +2 -2
  76. package/src/sap/fe/core/rootView/Fcl.controller.js +3 -8
  77. package/src/sap/fe/core/rootView/Fcl.controller.ts +7 -14
  78. package/src/sap/fe/core/rootView/RootViewBaseController.js +6 -6
  79. package/src/sap/fe/core/rootView/RootViewBaseController.ts +5 -5
  80. package/src/sap/fe/core/services/RoutingServiceFactory.js +3 -3
  81. package/src/sap/fe/core/services/RoutingServiceFactory.ts +2 -2
  82. package/src/sap/fe/core/services/SideEffectsServiceFactory.js +4 -1
  83. package/src/sap/fe/core/services/SideEffectsServiceFactory.ts +3 -0
  84. package/src/sap/fe/core/templating/UIFormatters.js +3 -3
  85. package/src/sap/fe/core/templating/UIFormatters.ts +1 -2
  86. package/src/sap/fe/core/controllerextensions/editFlow/operations/facade.js +0 -81
  87. package/src/sap/fe/core/controllerextensions/editFlow/operations/facade.ts +0 -126
  88. package/src/sap/fe/core/controllerextensions/editFlow/operations.js +0 -10
  89. package/src/sap/fe/core/controllerextensions/editFlow/operations.ts +0 -2
  90. package/src/sap/fe/core/designtime/messagebundle_en_US_saprigi.properties +0 -7
@@ -263,34 +263,25 @@ class EditFlow extends BaseControllerExtension {
263
263
  /**
264
264
  * Requests the side effects required after deleting an object.
265
265
  * @param listBinding The list binding the deleted object belongs to
266
- * @param parentContext The context of the parent object of the deleted object
266
+ * @param parentContext The context of parent object of the deleted object
267
267
  */
268
- private requestSideEffectsOnDelete(listBinding: ODataListBinding, parentContext: Context | undefined): void {
269
- if (parentContext && this.requestSideEffectsForNavigationProperty(listBinding, parentContext)) {
270
- const stateMessagesPath = ModelHelper.getMessagesPath(listBinding.getModel().getMetaModel(), parentContext.getPath());
271
- // In case of a TreeTable, we need to refresh state messages for the ObjectPage, as some of these messages might be attached
272
- // to children of a deleted row which may not have been loaded yet, and therefore the model wouldn't clean up these messages
273
- if (stateMessagesPath && this.getTransactionHelper().isListBindingHierarchical(listBinding)) {
274
- this.getAppComponent().getSideEffectsService().requestSideEffects([stateMessagesPath], parentContext);
275
- }
268
+ private requestSideEffectsOnDelete(listBinding: ODataListBinding | undefined, parentContext: Context | undefined): void {
269
+ if (!listBinding || !parentContext || CommonUtils.hasTransientContext(listBinding)) {
270
+ // if there are transient contexts, we must avoid requesting side effects
271
+ // this is avoid a potential list refresh, there could be a side effect that refreshes the list binding
272
+ // if list binding is refreshed, transient contexts might be lost
273
+ return;
276
274
  }
277
- }
278
275
 
279
- requestSideEffectsForNavigationProperty(listBinding: ODataListBinding, parentContext: Context | null | undefined): boolean {
280
- if (parentContext) {
281
- const listBindingRelativePath = ModelHelper.getRelativeMetaPathForListBinding(parentContext, listBinding);
282
- if (!CommonUtils.hasTransientContext(listBinding) && listBindingRelativePath) {
283
- // if there are transient contexts, we must avoid requesting side effects
284
- // this is avoid a potential list refresh, there could be a side effect that refreshes the list binding
285
- // if list binding is refreshed, transient contexts might be lost
286
- this.getAppComponent()
287
- .getSideEffectsService()
288
- .requestSideEffectsForNavigationProperty(listBindingRelativePath, parentContext);
276
+ const sideEffectService = this.getAppComponent().getSideEffectsService();
277
+ sideEffectService.requestSideEffectsForNavigationProperty(listBinding.getPath(), parentContext);
289
278
 
290
- return true;
291
- }
279
+ const stateMessagesPath = ModelHelper.getMessagesPath(listBinding.getModel().getMetaModel(), parentContext.getPath());
280
+ // In case of a TreeTable, we need to refresh state messages for the ObjectPage, as some of these messages might be attached
281
+ // to children of a deleted row which may not have been loaded yet, and therefore the model wouldn't clean up these messages
282
+ if (stateMessagesPath && this.getTransactionHelper().isListBindingHierarchical(listBinding)) {
283
+ sideEffectService.requestSideEffects([stateMessagesPath], parentContext);
292
284
  }
293
- return false;
294
285
  }
295
286
 
296
287
  /**
@@ -337,11 +328,15 @@ class EditFlow extends BaseControllerExtension {
337
328
  BusyLocker.lock(lockObject);
338
329
 
339
330
  try {
331
+ const deleted = await this.deleteDocumentTransaction(contextsToDelete, parameters);
332
+ if (!deleted) {
333
+ // The delete was cancelled
334
+ return;
335
+ }
336
+
340
337
  if (this.getProgrammingModel(parameters?.selectedContexts?.[0] ?? contextsToDelete[0]) === ProgrammingModel.Sticky) {
341
338
  this.setDocumentModified(true);
342
339
  }
343
- await this.deleteDocumentTransaction(contextsToDelete, parameters);
344
-
345
340
  let result;
346
341
 
347
342
  // Multiple object deletion is triggered from a list
@@ -534,7 +529,6 @@ class EditFlow extends BaseControllerExtension {
534
529
  ): Promise<void> {
535
530
  let oDataListBinding!: ODataListBinding;
536
531
  let parentContext: ODataV4Context | undefined;
537
-
538
532
  const dataModel = this.getView().getModel();
539
533
  let selectedProperties: string | undefined;
540
534
  if (dataModel && ModelHelper.isCollaborationDraftSupported(dataModel.getMetaModel())) {
@@ -1062,12 +1056,14 @@ class EditFlow extends BaseControllerExtension {
1062
1056
 
1063
1057
  await Promise.all([creation, this.syncTask(creation)]);
1064
1058
  if (savedDocumentContext && parameters.skipSideEffects !== true) {
1065
- this.requestSideEffectsForNavigationProperty(listBinding, savedDocumentContext);
1059
+ this.getAppComponent()
1060
+ .getSideEffectsService()
1061
+ .requestSideEffectsForNavigationProperty(listBinding.getPath(), savedDocumentContext);
1066
1062
  }
1067
1063
  }
1068
1064
 
1069
1065
  /**
1070
- * Creates a deferred document.
1066
+ * Creates a deffered document.
1071
1067
  * @param listBinding ODataListBinding where the document has to be created
1072
1068
  * @param parentContext Optional parent context when creating a node in TreeTable
1073
1069
  * @param data
@@ -1225,14 +1221,18 @@ class EditFlow extends BaseControllerExtension {
1225
1221
  */
1226
1222
  handleSideEffects = async (listBinding: ODataListBinding, creationPromise: Promise<Context>): Promise<void> => {
1227
1223
  try {
1228
- const viewBindingContext = this.getView().getBindingContext() as Context;
1224
+ const viewBindingContext = this.getView().getBindingContext();
1229
1225
  const newContext = await creationPromise;
1230
1226
  // transient contexts are reliably removed once oNewContext.created() is resolved
1231
1227
  await newContext.created();
1232
1228
  // if there are transient contexts, we must avoid requesting side effects
1233
1229
  // this is avoid a potential list refresh, there could be a side effect that refreshes the list binding
1234
1230
  // if list binding is refreshed, transient contexts might be lost
1235
- this.requestSideEffectsForNavigationProperty(listBinding, viewBindingContext);
1231
+ if (!CommonUtils.hasTransientContext(listBinding) && viewBindingContext) {
1232
+ this.getAppComponent()
1233
+ .getSideEffectsService()
1234
+ .requestSideEffectsForNavigationProperty(listBinding.getPath(), viewBindingContext as Context);
1235
+ }
1236
1236
  } catch (error: unknown) {
1237
1237
  Log.error("Error while creating the document", error as string);
1238
1238
  }
@@ -1460,11 +1460,15 @@ class EditFlow extends BaseControllerExtension {
1460
1460
  const activeContexts = createdContexts.filter((newContext) => !newContext.isInactive());
1461
1461
  await Promise.all(activeContexts.map(async (newContext) => newContext.created()));
1462
1462
 
1463
+ const viewBindingContext = this.getView().getBindingContext();
1464
+
1463
1465
  // if there are transient contexts, we must avoid requesting side effects
1464
1466
  // this is avoid a potential list refresh, there could be a side effect that refreshes the list binding
1465
1467
  // if list binding is refreshed, transient contexts might be lost
1466
- if (requestSideEffects) {
1467
- this.requestSideEffectsForNavigationProperty(listBinding, this.base.getView().getBindingContext());
1468
+ if (requestSideEffects && !CommonUtils.hasTransientContext(targetListBinding)) {
1469
+ this.getAppComponent()
1470
+ .getSideEffectsService()
1471
+ .requestSideEffectsForNavigationProperty(targetListBinding.getPath(), viewBindingContext as Context);
1468
1472
  }
1469
1473
 
1470
1474
  if (this.base.collaborativeDraft.isConnected() && activeContexts.length > 0) {
@@ -1609,7 +1613,7 @@ class EditFlow extends BaseControllerExtension {
1609
1613
  * The override execution is: {@link sap.ui.core.mvc.OverrideExecution.After}.
1610
1614
  * @param _mParameters Object containing the parameters passed to onAfterSave
1611
1615
  * @param _mParameters.context The context we obtained after saving
1612
- * @returns A promise to be returned by the overridden method.
1616
+ * @returns A promise to be returned by the overridden method. If rejected, any further processing by the framework is stopped.
1613
1617
  * @public
1614
1618
  * @since 1.116.0
1615
1619
  */
@@ -1628,7 +1632,7 @@ class EditFlow extends BaseControllerExtension {
1628
1632
  * The override execution is: {@link sap.ui.core.mvc.OverrideExecution.After}.
1629
1633
  * @param _mParameters Object containing the parameters passed to onAfterCreate
1630
1634
  * @param _mParameters.context The newly created context
1631
- * @returns A promise to be returned by the overridden method.
1635
+ * @returns A promise to be returned by the overridden method. If rejected, any further processing by the framework is stopped.
1632
1636
  * @public
1633
1637
  * @since 1.116.0
1634
1638
  */
@@ -1647,7 +1651,7 @@ class EditFlow extends BaseControllerExtension {
1647
1651
  * The override execution is: {@link sap.ui.core.mvc.OverrideExecution.After}.
1648
1652
  * @param _mParameters Object containing the parameters passed to onAfterEdit
1649
1653
  * @param _mParameters.context Page context that is going to be edited.
1650
- * @returns A promise to be returned by the overridden method.
1654
+ * @returns A promise to be returned by the overridden method. If rejected, any further processing by the framework is stopped.
1651
1655
  * @public
1652
1656
  * @since 1.116.0
1653
1657
  */
@@ -1666,7 +1670,7 @@ class EditFlow extends BaseControllerExtension {
1666
1670
  * The override execution is: {@link sap.ui.core.mvc.OverrideExecution.After}.
1667
1671
  * @param _mParameters Object containing the parameters passed to onAfterDiscard
1668
1672
  * @param _mParameters.context The context obtained after discarding the object, or undefined if we discarded a new object
1669
- * @returns A promise to be returned by the overridden method.
1673
+ * @returns A promise to be returned by the overridden method. If rejected, any further processing by the framework is stopped.
1670
1674
  * @public
1671
1675
  * @since 1.116.0
1672
1676
  */
@@ -1685,7 +1689,7 @@ class EditFlow extends BaseControllerExtension {
1685
1689
  * The override execution is: {@link sap.ui.core.mvc.OverrideExecution.After}.
1686
1690
  * @param _mParameters Object containing the parameters passed to onAfterDelete
1687
1691
  * @param _mParameters.contexts An array of contexts that are going to be deleted
1688
- * @returns A promise to be returned by the overridden method.
1692
+ * @returns A promise to be returned by the overridden method. If rejected, any further processing by the framework is stopped.
1689
1693
  * @public
1690
1694
  * @since 1.116.0
1691
1695
  */
@@ -2143,12 +2147,16 @@ class EditFlow extends BaseControllerExtension {
2143
2147
  };
2144
2148
  }
2145
2149
 
2150
+ const deleted = await this.deleteDocumentTransaction(oContext, mParameters);
2151
+ if (!deleted) {
2152
+ // The delete was canceled by the user
2153
+ return;
2154
+ }
2155
+
2146
2156
  if (this.getProgrammingModel(oContext) === ProgrammingModel.Sticky) {
2147
2157
  this.setDocumentModified(true);
2148
2158
  }
2149
2159
 
2150
- await this.deleteDocumentTransaction(oContext, mParameters);
2151
-
2152
2160
  // Single objet deletion is triggered from an OP header button (not from a list)
2153
2161
  // --> Mark UI dirty and navigate back to dismiss the OP
2154
2162
  if (!this._isFclEnabled()) {
@@ -2727,15 +2735,15 @@ class EditFlow extends BaseControllerExtension {
2727
2735
  let forceDisplayMode = false;
2728
2736
  const isActiveEntity = await context.requestObject("IsActiveEntity");
2729
2737
 
2730
- if (isCollaborationDraftSupported && isActiveEntity === false) {
2738
+ if (isCollaborationDraftSupported) {
2731
2739
  forceDisplayMode = !(await this.base.collaborativeDraft.activateCollaboration(context, isActiveEntity));
2732
2740
  } else {
2733
2741
  globalModel.setProperty("/hasCollaborationAuthorization", undefined);
2734
2742
  }
2735
2743
  this.fetchCollaborativeDraftUsersPromise = undefined;
2736
-
2737
2744
  if (isActiveEntity === false && !forceDisplayMode) {
2738
- // in case the document is draft set it in edit mode
2745
+ // in case the document is draft, set it in edit mode
2746
+ // unless we don't have the authorization for a collaborative user
2739
2747
  this.setEditMode(EditMode.Editable);
2740
2748
  const hasActiveEntity = await context.requestObject("HasActiveEntity");
2741
2749
  this.setEditMode(undefined, !hasActiveEntity);
@@ -2784,6 +2792,7 @@ class EditFlow extends BaseControllerExtension {
2784
2792
  * @param parameters.lockedContexts
2785
2793
  * @param parameters.draftsWithDeletableActive
2786
2794
  * @param parameters.draftsWithNonDeletableActive
2795
+ * @returns Promise resolves once the deletion is completed
2787
2796
  */
2788
2797
  private async deleteDocumentTransaction(
2789
2798
  contexts: Context | Context[],
@@ -2804,7 +2813,7 @@ class EditFlow extends BaseControllerExtension {
2804
2813
  draftsWithDeletableActive?: DraftSiblingPair[];
2805
2814
  draftsWithNonDeletableActive?: Context[];
2806
2815
  }
2807
- ): Promise<void> {
2816
+ ): Promise<boolean> {
2808
2817
  if (parameters.selectedContexts) {
2809
2818
  // as selected contexts may include inactive context we need to compute this parameter again to ensure delete helper works properly
2810
2819
  parameters.numberOfSelectedContexts = parameters.selectedContexts.length;
@@ -2824,7 +2833,7 @@ class EditFlow extends BaseControllerExtension {
2824
2833
  }
2825
2834
 
2826
2835
  await this.syncTask();
2827
- await transactionHelper.deleteDocument(contexts, parameters, this.getAppComponent(), resourceModel, this.getMessageHandler());
2836
+ return transactionHelper.deleteDocument(contexts, parameters, this.getAppComponent(), resourceModel, this.getMessageHandler());
2828
2837
  }
2829
2838
 
2830
2839
  _getResourceModel(): ResourceModel {