@sapui5/sap.fe.core 1.141.2 → 1.142.1

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 (207) hide show
  1. package/package.json +1 -1
  2. package/src/sap/fe/core/.library +4 -1
  3. package/src/sap/fe/core/ActionRuntime.js +48 -23
  4. package/src/sap/fe/core/ActionRuntime.ts +61 -35
  5. package/src/sap/fe/core/AppComponent.js +76 -6
  6. package/src/sap/fe/core/AppComponent.ts +94 -8
  7. package/src/sap/fe/core/AppStateHandler.js +9 -8
  8. package/src/sap/fe/core/AppStateHandler.ts +13 -9
  9. package/src/sap/fe/core/BaseController.js +8 -5
  10. package/src/sap/fe/core/BaseController.ts +6 -1
  11. package/src/sap/fe/core/CommonUtils.js +4 -123
  12. package/src/sap/fe/core/CommonUtils.ts +3 -172
  13. package/src/sap/fe/core/ExtensionAPI.js +3 -10
  14. package/src/sap/fe/core/ExtensionAPI.ts +2 -14
  15. package/src/sap/fe/core/PageController.js +64 -43
  16. package/src/sap/fe/core/PageController.ts +62 -47
  17. package/src/sap/fe/core/TemplateComponent.js +20 -1
  18. package/src/sap/fe/core/TemplateComponent.ts +24 -2
  19. package/src/sap/fe/core/buildingBlocks/BuildingBlock.js +37 -24
  20. package/src/sap/fe/core/buildingBlocks/BuildingBlock.ts +47 -31
  21. package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockSupport.js +1 -1
  22. package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockSupport.ts +4 -0
  23. package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockTemplateProcessor.js +4 -1
  24. package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockTemplateProcessor.ts +3 -0
  25. package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockTemplatingBase.js +4 -1
  26. package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockTemplatingBase.ts +4 -0
  27. package/src/sap/fe/core/controllerextensions/BaseControllerExtension.js +7 -5
  28. package/src/sap/fe/core/controllerextensions/BaseControllerExtension.ts +22 -2
  29. package/src/sap/fe/core/controllerextensions/CollaborativeDraft.js +82 -39
  30. package/src/sap/fe/core/controllerextensions/CollaborativeDraft.ts +91 -54
  31. package/src/sap/fe/core/controllerextensions/EditFlow.js +25 -3
  32. package/src/sap/fe/core/controllerextensions/EditFlow.ts +27 -3
  33. package/src/sap/fe/core/controllerextensions/InlineEditFlow.js +9 -7
  34. package/src/sap/fe/core/controllerextensions/InlineEditFlow.ts +17 -5
  35. package/src/sap/fe/core/controllerextensions/InternalRouting.js +37 -18
  36. package/src/sap/fe/core/controllerextensions/InternalRouting.ts +49 -17
  37. package/src/sap/fe/core/controllerextensions/KPIManagement.js +30 -15
  38. package/src/sap/fe/core/controllerextensions/KPIManagement.ts +32 -14
  39. package/src/sap/fe/core/controllerextensions/MessageHandler.js +9 -10
  40. package/src/sap/fe/core/controllerextensions/MessageHandler.ts +8 -9
  41. package/src/sap/fe/core/controllerextensions/Paginator.js +2 -2
  42. package/src/sap/fe/core/controllerextensions/Paginator.ts +1 -1
  43. package/src/sap/fe/core/controllerextensions/Placeholder.js +10 -2
  44. package/src/sap/fe/core/controllerextensions/Placeholder.ts +5 -1
  45. package/src/sap/fe/core/controllerextensions/Recommendations.js +3 -3
  46. package/src/sap/fe/core/controllerextensions/Recommendations.ts +2 -2
  47. package/src/sap/fe/core/controllerextensions/Routing.js +9 -5
  48. package/src/sap/fe/core/controllerextensions/Routing.ts +7 -7
  49. package/src/sap/fe/core/controllerextensions/Share.js +5 -5
  50. package/src/sap/fe/core/controllerextensions/Share.ts +4 -4
  51. package/src/sap/fe/core/controllerextensions/SideEffects.js +1 -1
  52. package/src/sap/fe/core/controllerextensions/SideEffects.ts +17 -2
  53. package/src/sap/fe/core/controllerextensions/collaboration/ActivityBase.js +2 -2
  54. package/src/sap/fe/core/controllerextensions/collaboration/ActivityBase.ts +1 -1
  55. package/src/sap/fe/core/controllerextensions/editFlow/NotApplicableContextDialog.js +3 -3
  56. package/src/sap/fe/core/controllerextensions/editFlow/NotApplicableContextDialog.tsx +3 -2
  57. package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.js +33 -11
  58. package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.ts +45 -14
  59. package/src/sap/fe/core/controllerextensions/editFlow/draft.js +37 -3
  60. package/src/sap/fe/core/controllerextensions/editFlow/draft.ts +41 -8
  61. package/src/sap/fe/core/controllerextensions/editFlow/draftDataLossPopup.js +10 -4
  62. package/src/sap/fe/core/controllerextensions/editFlow/draftDataLossPopup.ts +6 -1
  63. package/src/sap/fe/core/controllerextensions/editFlow/operations/ODataOperation.js +7 -7
  64. package/src/sap/fe/core/controllerextensions/editFlow/operations/ODataOperation.ts +6 -5
  65. package/src/sap/fe/core/controllerextensions/editFlow/operations/ODataStrictHandling.js +2 -2
  66. package/src/sap/fe/core/controllerextensions/editFlow/operations/ODataStrictHandling.ts +1 -1
  67. package/src/sap/fe/core/controllerextensions/editFlow/operations/OperationParameters.js +2 -1
  68. package/src/sap/fe/core/controllerextensions/editFlow/operations/OperationParameters.ts +1 -0
  69. package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.js +10 -6
  70. package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.ts +6 -5
  71. package/src/sap/fe/core/controllerextensions/routing/RouterProxy.js +11 -9
  72. package/src/sap/fe/core/controllerextensions/routing/RouterProxy.ts +22 -9
  73. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DraftDataLossDialog.js +9 -4
  74. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DraftDataLossDialog.tsx +10 -4
  75. package/src/sap/fe/core/controls/Recommendations/ConfirmRecommendationDialog.js +31 -2
  76. package/src/sap/fe/core/controls/Recommendations/ConfirmRecommendationDialog.tsx +34 -1
  77. package/src/sap/fe/core/converters/ManifestSettings.js +7 -1
  78. package/src/sap/fe/core/converters/ManifestSettings.ts +37 -0
  79. package/src/sap/fe/core/converters/ManifestWrapper.js +29 -9
  80. package/src/sap/fe/core/converters/ManifestWrapper.ts +29 -11
  81. package/src/sap/fe/core/converters/annotations/DataField.js +46 -19
  82. package/src/sap/fe/core/converters/annotations/DataField.ts +93 -19
  83. package/src/sap/fe/core/converters/common/AnnotationConverter.js +88 -35
  84. package/src/sap/fe/core/converters/controls/Common/Action.js +57 -20
  85. package/src/sap/fe/core/converters/controls/Common/Action.ts +71 -21
  86. package/src/sap/fe/core/converters/controls/Common/Chart.js +13 -3
  87. package/src/sap/fe/core/converters/controls/Common/Chart.ts +20 -4
  88. package/src/sap/fe/core/converters/controls/Common/Form.js +18 -3
  89. package/src/sap/fe/core/converters/controls/Common/Form.ts +23 -1
  90. package/src/sap/fe/core/converters/controls/Common/Table.js +89 -57
  91. package/src/sap/fe/core/converters/controls/Common/Table.ts +110 -56
  92. package/src/sap/fe/core/converters/controls/Common/filter/FilterRestrictions.js +243 -0
  93. package/src/sap/fe/core/converters/controls/Common/filter/FilterRestrictions.ts +309 -0
  94. package/src/sap/fe/core/converters/controls/Common/table/Columns.js +142 -58
  95. package/src/sap/fe/core/converters/controls/Common/table/Columns.ts +172 -78
  96. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.js +12 -18
  97. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.ts +13 -27
  98. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.js +7 -16
  99. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.ts +6 -17
  100. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.js +16 -5
  101. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.ts +16 -5
  102. package/src/sap/fe/core/converters/helpers/Aggregation.js +12 -2
  103. package/src/sap/fe/core/converters/helpers/Aggregation.ts +11 -1
  104. package/src/sap/fe/core/converters/helpers/DataFieldHelper.js +27 -3
  105. package/src/sap/fe/core/converters/helpers/DataFieldHelper.ts +28 -1
  106. package/src/sap/fe/core/converters/helpers/ID.js +3 -1
  107. package/src/sap/fe/core/converters/helpers/ID.ts +1 -0
  108. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.js +5 -2
  109. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.ts +7 -1
  110. package/src/sap/fe/core/converters/templates/ListReportConverter.js +11 -3
  111. package/src/sap/fe/core/converters/templates/ListReportConverter.ts +12 -4
  112. package/src/sap/fe/core/converters/templates/ObjectPageConverter.js +19 -8
  113. package/src/sap/fe/core/converters/templates/ObjectPageConverter.ts +18 -7
  114. package/src/sap/fe/core/designtime/AnnotationBasedChanges.js +8 -3
  115. package/src/sap/fe/core/designtime/AnnotationBasedChanges.ts +7 -2
  116. package/src/sap/fe/core/formatters/FPMFormatter.js +2 -2
  117. package/src/sap/fe/core/formatters/FPMFormatter.ts +1 -1
  118. package/src/sap/fe/core/fpm/Component.js +8 -1
  119. package/src/sap/fe/core/fpm/Component.ts +8 -0
  120. package/src/sap/fe/core/fpm/manifest.json +1 -1
  121. package/src/sap/fe/core/helpers/AppStartupHelper.js +79 -25
  122. package/src/sap/fe/core/helpers/AppStartupHelper.ts +91 -32
  123. package/src/sap/fe/core/helpers/ManifestHelper.js +6 -3
  124. package/src/sap/fe/core/helpers/ManifestHelper.ts +3 -0
  125. package/src/sap/fe/core/helpers/MetaModelFunction.js +12 -3
  126. package/src/sap/fe/core/helpers/MetaModelFunction.ts +11 -3
  127. package/src/sap/fe/core/helpers/ModelHelper.js +48 -9
  128. package/src/sap/fe/core/helpers/ModelHelper.ts +55 -10
  129. package/src/sap/fe/core/helpers/TypeGuards.js +12 -2
  130. package/src/sap/fe/core/helpers/TypeGuards.ts +10 -1
  131. package/src/sap/fe/core/helpers/WebSocket.js +6 -7
  132. package/src/sap/fe/core/helpers/WebSocket.ts +10 -6
  133. package/src/sap/fe/core/library.js +30 -3
  134. package/src/sap/fe/core/library.ts +28 -1
  135. package/src/sap/fe/core/messagebundle.properties +8 -1
  136. package/src/sap/fe/core/messagebundle_ar.properties +7 -0
  137. package/src/sap/fe/core/messagebundle_bg.properties +10 -3
  138. package/src/sap/fe/core/messagebundle_ca.properties +7 -0
  139. package/src/sap/fe/core/messagebundle_cnr.properties +7 -0
  140. package/src/sap/fe/core/messagebundle_cs.properties +7 -0
  141. package/src/sap/fe/core/messagebundle_cy.properties +8 -1
  142. package/src/sap/fe/core/messagebundle_da.properties +7 -0
  143. package/src/sap/fe/core/messagebundle_de.properties +7 -0
  144. package/src/sap/fe/core/messagebundle_el.properties +7 -0
  145. package/src/sap/fe/core/messagebundle_en.properties +8 -1
  146. package/src/sap/fe/core/messagebundle_en_GB.properties +7 -0
  147. package/src/sap/fe/core/messagebundle_en_US_saprigi.properties +5 -0
  148. package/src/sap/fe/core/messagebundle_es.properties +8 -1
  149. package/src/sap/fe/core/messagebundle_es_MX.properties +7 -0
  150. package/src/sap/fe/core/messagebundle_et.properties +7 -0
  151. package/src/sap/fe/core/messagebundle_fi.properties +7 -0
  152. package/src/sap/fe/core/messagebundle_fr.properties +16 -9
  153. package/src/sap/fe/core/messagebundle_fr_CA.properties +7 -0
  154. package/src/sap/fe/core/messagebundle_hi.properties +8 -1
  155. package/src/sap/fe/core/messagebundle_hr.properties +7 -0
  156. package/src/sap/fe/core/messagebundle_hu.properties +7 -0
  157. package/src/sap/fe/core/messagebundle_id.properties +7 -0
  158. package/src/sap/fe/core/messagebundle_it.properties +7 -0
  159. package/src/sap/fe/core/messagebundle_iw.properties +7 -0
  160. package/src/sap/fe/core/messagebundle_ja.properties +8 -1
  161. package/src/sap/fe/core/messagebundle_kk.properties +7 -0
  162. package/src/sap/fe/core/messagebundle_ko.properties +7 -0
  163. package/src/sap/fe/core/messagebundle_lt.properties +7 -0
  164. package/src/sap/fe/core/messagebundle_lv.properties +7 -0
  165. package/src/sap/fe/core/messagebundle_mk.properties +7 -0
  166. package/src/sap/fe/core/messagebundle_ms.properties +7 -0
  167. package/src/sap/fe/core/messagebundle_nl.properties +7 -0
  168. package/src/sap/fe/core/messagebundle_no.properties +7 -0
  169. package/src/sap/fe/core/messagebundle_pl.properties +7 -0
  170. package/src/sap/fe/core/messagebundle_pt.properties +7 -0
  171. package/src/sap/fe/core/messagebundle_pt_PT.properties +7 -0
  172. package/src/sap/fe/core/messagebundle_ro.properties +7 -0
  173. package/src/sap/fe/core/messagebundle_ru.properties +7 -0
  174. package/src/sap/fe/core/messagebundle_sh.properties +7 -0
  175. package/src/sap/fe/core/messagebundle_sk.properties +7 -0
  176. package/src/sap/fe/core/messagebundle_sl.properties +7 -0
  177. package/src/sap/fe/core/messagebundle_sr.properties +7 -0
  178. package/src/sap/fe/core/messagebundle_sv.properties +7 -0
  179. package/src/sap/fe/core/messagebundle_th.properties +7 -0
  180. package/src/sap/fe/core/messagebundle_tr.properties +7 -0
  181. package/src/sap/fe/core/messagebundle_uk.properties +7 -0
  182. package/src/sap/fe/core/messagebundle_vi.properties +7 -0
  183. package/src/sap/fe/core/messagebundle_zh_CN.properties +8 -1
  184. package/src/sap/fe/core/messagebundle_zh_TW.properties +7 -0
  185. package/src/sap/fe/core/rootView/Fcl.controller.js +21 -7
  186. package/src/sap/fe/core/rootView/Fcl.controller.ts +28 -6
  187. package/src/sap/fe/core/rootView/RootViewBaseController.js +96 -88
  188. package/src/sap/fe/core/rootView/RootViewBaseController.ts +106 -96
  189. package/src/sap/fe/core/services/EnvironmentServiceFactory.js +14 -10
  190. package/src/sap/fe/core/services/EnvironmentServiceFactory.ts +15 -10
  191. package/src/sap/fe/core/services/RoutingServiceFactory.js +16 -7
  192. package/src/sap/fe/core/services/RoutingServiceFactory.ts +23 -10
  193. package/src/sap/fe/core/services/SideEffectsServiceFactory.js +9 -7
  194. package/src/sap/fe/core/services/SideEffectsServiceFactory.ts +13 -8
  195. package/src/sap/fe/core/services/TemplatedViewServiceFactory.js +62 -6
  196. package/src/sap/fe/core/services/TemplatedViewServiceFactory.ts +74 -11
  197. package/src/sap/fe/core/services/collaborativeDraftServiceFactory.js +33 -15
  198. package/src/sap/fe/core/services/collaborativeDraftServiceFactory.ts +31 -11
  199. package/src/sap/fe/core/templating/DisplayModeFormatter.js +4 -5
  200. package/src/sap/fe/core/templating/DisplayModeFormatter.ts +4 -6
  201. package/src/sap/fe/core/templating/UIFormatters.js +17 -2
  202. package/src/sap/fe/core/templating/UIFormatters.ts +25 -1
  203. package/src/sap/fe/core/types/sap.fe.core-auto-ext.d.js +10 -0
  204. package/src/sap/fe/core/types/sap.fe.core-auto-ext.d.ts +369 -0
  205. package/src/sap/fe/core/types/sap.fe.core-manual-ext.d.js +9 -0
  206. package/src/sap/fe/core/types/sap.fe.core-manual-ext.d.ts +49 -0
  207. package/ui5.yaml +2 -0
@@ -1,5 +1,11 @@
1
+ import type { AnnotationTerm, PropertyAnnotationValue } from "@sap-ux/vocabularies-types";
2
+ import type { Boolean as EdmBoolean } from "@sap-ux/vocabularies-types/Edm";
1
3
  import Log from "sap/base/Log";
4
+ import type { BindingToolkitExpression } from "sap/fe/base/BindingToolkit";
5
+ import { compileExpression, getExpressionFromAnnotation, isPathInModelExpression } from "sap/fe/base/BindingToolkit";
2
6
  import { defineUI5Class } from "sap/fe/base/ClassSupport";
7
+ import { getInvolvedDataModelObjects } from "sap/fe/core/converters/MetaModelConverter";
8
+ import { bindingContextPathVisitor } from "sap/fe/core/helpers/BindingHelper";
3
9
  import type Field from "sap/fe/macros/Field";
4
10
  import type FieldWrapper from "sap/fe/macros/controls/FieldWrapper";
5
11
  import type Tokenizer from "sap/m/Tokenizer";
@@ -10,19 +16,13 @@ import Element from "sap/ui/core/Element";
10
16
  import type MultiValueField from "sap/ui/mdc/MultiValueField";
11
17
  import type JSONModel from "sap/ui/model/json/JSONModel";
12
18
  import type Context from "sap/ui/model/odata/v4/Context";
19
+ import type ODataListBinding from "sap/ui/model/odata/v4/ODataListBinding";
13
20
  import type { FEView } from "../BaseController";
14
21
  import CommonUtils from "../CommonUtils";
15
- import type PageController from "../PageController";
16
22
  import type { CollaborativeDraftService } from "../services/collaborativeDraftServiceFactory";
17
23
  import { FieldEditMode } from "../templating/UIFormatters";
18
24
  import BaseControllerExtension from "./BaseControllerExtension";
19
- import { Activity, CollaborationFieldGroupPrefix, CollaborationUtils, addSelf, shareObject } from "./collaboration/CollaborationCommon";
20
-
21
- type DraftAdminUser = {
22
- DraftEntityType: string;
23
- DraftUUID: string;
24
- UserID: string;
25
- };
25
+ import { Activity, CollaborationFieldGroupPrefix, addSelf, shareObject } from "./collaboration/CollaborationCommon";
26
26
 
27
27
  /**
28
28
  * A controller extension to handle collaborative draft scenarios.
@@ -32,8 +32,6 @@ type DraftAdminUser = {
32
32
  */
33
33
  @defineUI5Class("sap.fe.core.controllerextensions.CollaborativeDraft")
34
34
  export default class CollaborativeDraft extends BaseControllerExtension {
35
- private base!: PageController;
36
-
37
35
  private lastFocusId: string | undefined;
38
36
 
39
37
  private lastFocusFieldGroups: string | undefined;
@@ -251,9 +249,9 @@ export default class CollaborativeDraft extends BaseControllerExtension {
251
249
  return internalModel?.getProperty("/collaborativeDraftRootPath");
252
250
  }
253
251
 
254
- private getDraftUserListPromise(): Promise<DraftAdminUser[]> | undefined {
252
+ private getDraftShareActionOperationAvailablePromise(): Promise<boolean> | undefined {
255
253
  const internalModel = this.getView().getModel("internal");
256
- return internalModel?.getProperty("/collaborativeDraftUserListPromise");
254
+ return internalModel?.getProperty("/collaborativeDraftShareActionOperationAvailablePromise");
257
255
  }
258
256
 
259
257
  private isInitialShare(): boolean {
@@ -273,30 +271,10 @@ export default class CollaborativeDraft extends BaseControllerExtension {
273
271
  * @param draftRootContext The context for the draft root
274
272
  * @param groupId The groupId to request the list of users invited in the draft
275
273
  */
276
- private setDraftRoot(draftRootContext: Context, groupId: string): void {
274
+ public setDraftRoot(draftRootContext: Context, groupId: string): void {
277
275
  const internalModel = this.getView().getModel("internal") as JSONModel;
278
- let userListPromise: Promise<DraftAdminUser[]>;
279
- if (draftRootContext.getObject("DraftAdministrativeData/DraftAdministrativeUser") === undefined) {
280
- userListPromise = new Promise((resolve) => {
281
- const draftAdminUsers = draftRootContext
282
- .getModel()
283
- .bindList("DraftAdministrativeData/DraftAdministrativeUser", draftRootContext);
284
- draftAdminUsers
285
- .requestContexts()
286
- .then((e: Context[]) => {
287
- return resolve(e.map((c: Context) => c.getObject()));
288
- })
289
- .catch((e: Error) => {
290
- Log.error("Error while loading the DraftAdministrativeUser " + e);
291
- });
292
- });
293
- } else {
294
- userListPromise = draftRootContext
295
- .requestSideEffects(["DraftAdministrativeData/DraftAdministrativeUser"], groupId)
296
- .then(async () => draftRootContext.requestObject("DraftAdministrativeData/DraftAdministrativeUser"));
297
- }
298
-
299
- internalModel?.setProperty("/collaborativeDraftUserListPromise", userListPromise);
276
+ const shareActionOperationAvailablePromise: Promise<boolean | undefined> = this.getShareActionOperationAvailable(draftRootContext);
277
+ internalModel?.setProperty("/collaborativeDraftShareActionOperationAvailablePromise", shareActionOperationAvailablePromise);
300
278
  internalModel?.setProperty("/collaborativeDraftRootPath", draftRootContext.getPath());
301
279
  }
302
280
 
@@ -306,7 +284,7 @@ export default class CollaborativeDraft extends BaseControllerExtension {
306
284
  */
307
285
  private cleanDraftRoot(): void {
308
286
  const internalModel = this.getView().getModel("internal") as JSONModel;
309
- internalModel?.setProperty("/collaborativeDraftUserListPromise", undefined);
287
+ internalModel?.setProperty("/collaborativeDraftShareActionOperationAvailablePromise", undefined);
310
288
  internalModel?.setProperty("/collaborativeDraftRootPath", undefined);
311
289
  }
312
290
 
@@ -322,7 +300,7 @@ export default class CollaborativeDraft extends BaseControllerExtension {
322
300
  const uiModel = this.getView().getModel("ui") as JSONModel;
323
301
  if (isActiveEntity) {
324
302
  // We're not in a draft -> disconnect if we were connected before
325
- uiModel.setProperty("/hasCollaborationAuthorization", undefined);
303
+ uiModel.setProperty("/showCollaborationStrip", undefined);
326
304
  this.disconnect();
327
305
  return false;
328
306
  }
@@ -346,16 +324,14 @@ export default class CollaborativeDraft extends BaseControllerExtension {
346
324
  );
347
325
  }
348
326
 
349
- const usersInvited = await this.getDraftUserListPromise();
350
327
  if (uiModel.getProperty("/hasCollaborationAuthorization") !== undefined) {
351
328
  return uiModel.getProperty("/hasCollaborationAuthorization"); // Already checked, all good
352
329
  }
353
- const me = CollaborationUtils.getMe(this.base.getAppComponent());
354
- const hasMe = usersInvited?.some((singleUser) => singleUser.UserID === me.id) ?? false;
355
- uiModel.setProperty("/hasCollaborationAuthorization", hasMe);
356
- uiModel.setProperty("/showCollaborationStrip", !hasMe);
330
+ const isShareActionOperationAvailable = await this.getDraftShareActionOperationAvailablePromise();
331
+ uiModel.setProperty("/hasCollaborationAuthorization", isShareActionOperationAvailable);
332
+ uiModel.setProperty("/showCollaborationStrip", !isShareActionOperationAvailable);
357
333
 
358
- if (hasMe) {
334
+ if (isShareActionOperationAvailable) {
359
335
  this.connect(draftRootContext).catch((error) => {
360
336
  Log.error("Error when connecting to the collaboration draft " + error);
361
337
  });
@@ -363,13 +339,65 @@ export default class CollaborativeDraft extends BaseControllerExtension {
363
339
  // Disconnect the websocket but keep the properties in the internal model (so don't call this.disconnect)
364
340
  this.getCollaborativeDraftService().disconnect(this.getView() as FEView);
365
341
  }
366
- return hasMe;
342
+ return !!isShareActionOperationAvailable;
367
343
  } catch (err) {
368
344
  Log.error("Error while activating the collaborative draft " + err);
369
345
  return false;
370
346
  }
371
347
  }
372
348
 
349
+ getShareActionOperationAvailableBindingExpression(
350
+ draftRootContext: Context,
351
+ getODataCacheValue?: boolean
352
+ ): BindingToolkitExpression<boolean> | boolean | undefined {
353
+ const metaModel = draftRootContext.getModel()?.getMetaModel();
354
+ const entitySet = metaModel?.getMetaPath(draftRootContext.getPath());
355
+ const metaContext = metaModel?.getMetaContext(draftRootContext.getPath());
356
+ const objectPath = metaContext && getInvolvedDataModelObjects(metaContext);
357
+ const shareActionName = metaModel?.getObject(`${entitySet}@com.sap.vocabularies.Common.v1.DraftRoot/ShareAction`);
358
+ const action = objectPath?.convertedTypes.actions.find((action) => {
359
+ return action.fullyQualifiedName.startsWith(shareActionName);
360
+ });
361
+ const bindingParameterFullName = action?.isBound ? action.parameters[0]?.fullyQualifiedName : undefined;
362
+ const bindingExpression = getExpressionFromAnnotation(
363
+ action?.annotations?.Core?.OperationAvailable as unknown as AnnotationTerm<PropertyAnnotationValue<EdmBoolean>>,
364
+ [],
365
+ undefined,
366
+ (path: string) => bindingContextPathVisitor(path, objectPath?.convertedTypes, bindingParameterFullName)
367
+ );
368
+ if (getODataCacheValue) {
369
+ if (isPathInModelExpression(bindingExpression)) {
370
+ const currentContextWithCache = draftRootContext.getObject();
371
+ if (currentContextWithCache) {
372
+ if (Object.keys(currentContextWithCache).includes(bindingExpression.path)) {
373
+ return currentContextWithCache[bindingExpression.path];
374
+ }
375
+ }
376
+ return undefined;
377
+ }
378
+ } else {
379
+ return bindingExpression;
380
+ }
381
+ }
382
+
383
+ async getShareActionOperationAvailable(draftRootContext: Context): Promise<boolean | undefined> {
384
+ const model = draftRootContext.getModel();
385
+ const contextPath = draftRootContext.getPath();
386
+ const bindingExpression = this.getShareActionOperationAvailableBindingExpression(draftRootContext);
387
+ const shareActionOperationAvailableExpression = compileExpression(bindingExpression);
388
+ if (shareActionOperationAvailableExpression === "undefined") {
389
+ return true;
390
+ }
391
+ if (isPathInModelExpression(bindingExpression)) {
392
+ return model
393
+ .bindContext(`${contextPath}`, undefined, { $$groupId: draftRootContext.getGroupId(), $select: [bindingExpression.path] })
394
+ .getBoundContext()
395
+ .requestProperty(bindingExpression.path);
396
+ } else {
397
+ return undefined;
398
+ }
399
+ }
400
+
373
401
  /**
374
402
  * Adds the current user in the draft root context.
375
403
  * @param pageContext The page context (not necessarily a draft root)
@@ -398,12 +426,17 @@ export default class CollaborativeDraft extends BaseControllerExtension {
398
426
  return; // share was already called before, we don't need to call the Share action again
399
427
  }
400
428
 
401
- const sharePromise = this.isInitialShare()
402
- ? shareObject(draftRootContext, undefined, draftRootContext.getGroupId())
403
- : addSelf(draftRootContext);
429
+ const performShare = async (): Promise<Context | void> =>
430
+ this.isInitialShare() ? shareObject(draftRootContext, undefined, draftRootContext.getGroupId()) : addSelf(draftRootContext);
431
+
404
432
  this.setInitialShare(false); // Reset the initial share flag, so that we don't call the initial Share action again
405
433
  this.setDraftRoot(draftRootContext, draftRootContext.getGroupId());
406
- await sharePromise;
434
+
435
+ const cachedAvailability = this.getShareActionOperationAvailableBindingExpression(draftRootContext, true);
436
+ // Perform share unless availability is explicitly false
437
+ if (cachedAvailability === undefined || cachedAvailability === true) {
438
+ await performShare();
439
+ }
407
440
  } catch (err) {
408
441
  Log.error("Error while adding current user in the collaborative draft " + err);
409
442
  }
@@ -425,7 +458,7 @@ export default class CollaborativeDraft extends BaseControllerExtension {
425
458
  /**
426
459
  * Sends a notification to other users that property values have been changed by the current user.
427
460
  *
428
- * This notification must be sent after the changes have been sent successfully to the back-end.
461
+ * This notification must be sent after the changes have been sent successfully to the back end.
429
462
  * @param context The context for the properties
430
463
  * @param propertyNames The property name or the array of property names
431
464
  * @public
@@ -442,20 +475,24 @@ export default class CollaborativeDraft extends BaseControllerExtension {
442
475
  /**
443
476
  * Sends a notification to other users that new contexts have been created by the current user.
444
477
  *
445
- * This notification must be sent after the new contexts have been created successfully in the back-end.
446
- * @param contexts The array of newly created contexts
478
+ * This notification must be sent after the new contexts have been created successfully in the back end.
479
+ * @param contextsOrBinding The array of newly created contexts, or the binding where the contexts were created
447
480
  * @public
448
481
  * @ui5-experimental-since 1.141.0
449
482
  * @since 1.141.0
450
483
  */
451
- sendContextsCreated(contexts: Context[]): void {
452
- this.send({ action: Activity.Create, content: contexts.map((context) => context.getPath()) });
484
+ sendContextsCreated(contextsOrBinding: Context[] | ODataListBinding): void {
485
+ if (Array.isArray(contextsOrBinding)) {
486
+ this.send({ action: Activity.Create, content: contextsOrBinding.map((context) => context.getPath()) });
487
+ } else {
488
+ this.send({ action: Activity.Create, content: contextsOrBinding.getResolvedPath() ?? contextsOrBinding.getPath() });
489
+ }
453
490
  }
454
491
 
455
492
  /**
456
493
  * Sends a notification to other users that contexts have been deleted by the current user.
457
494
  *
458
- * This notification must be sent after the contexts have been deleted successfully in the back-end.
495
+ * This notification must be sent after the contexts have been deleted successfully in the back end.
459
496
  * @param contexts The array of deleted contexts
460
497
  * @public
461
498
  * @ui5-experimental-since 1.141.0