@sapui5/sap.fe.core 1.141.2 → 1.143.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 (217) 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 +78 -23
  4. package/src/sap/fe/core/ActionRuntime.ts +91 -35
  5. package/src/sap/fe/core/AppComponent.js +76 -6
  6. package/src/sap/fe/core/AppComponent.ts +91 -8
  7. package/src/sap/fe/core/AppStateHandler.js +7 -7
  8. package/src/sap/fe/core/AppStateHandler.ts +9 -8
  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 -11
  14. package/src/sap/fe/core/ExtensionAPI.ts +3 -16
  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 +12 -1
  18. package/src/sap/fe/core/TemplateComponent.ts +16 -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 +5 -3
  26. package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockTemplatingBase.ts +5 -2
  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 -44
  30. package/src/sap/fe/core/controllerextensions/CollaborativeDraft.ts +92 -59
  31. package/src/sap/fe/core/controllerextensions/EditFlow.js +74 -48
  32. package/src/sap/fe/core/controllerextensions/EditFlow.ts +87 -50
  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 +10 -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 +4 -4
  48. package/src/sap/fe/core/controllerextensions/Routing.ts +3 -6
  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 +49 -21
  58. package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.ts +64 -24
  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 +6 -7
  64. package/src/sap/fe/core/controllerextensions/editFlow/operations/ODataOperation.ts +5 -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/OperationMessage.js +2 -1
  68. package/src/sap/fe/core/controllerextensions/editFlow/operations/OperationMessage.ts +1 -0
  69. package/src/sap/fe/core/controllerextensions/editFlow/operations/OperationParameters.js +2 -1
  70. package/src/sap/fe/core/controllerextensions/editFlow/operations/OperationParameters.ts +1 -0
  71. package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.js +21 -15
  72. package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.ts +18 -15
  73. package/src/sap/fe/core/controllerextensions/routing/RouterProxy.js +7 -6
  74. package/src/sap/fe/core/controllerextensions/routing/RouterProxy.ts +8 -5
  75. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DraftDataLossDialog.js +9 -4
  76. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DraftDataLossDialog.tsx +10 -4
  77. package/src/sap/fe/core/controls/Recommendations/ConfirmRecommendationDialog.js +3 -2
  78. package/src/sap/fe/core/controls/Recommendations/ConfirmRecommendationDialog.tsx +2 -1
  79. package/src/sap/fe/core/converters/ManifestSettings.js +7 -1
  80. package/src/sap/fe/core/converters/ManifestSettings.ts +37 -0
  81. package/src/sap/fe/core/converters/ManifestWrapper.js +29 -9
  82. package/src/sap/fe/core/converters/ManifestWrapper.ts +29 -11
  83. package/src/sap/fe/core/converters/MetaModelConverter.js +1 -1
  84. package/src/sap/fe/core/converters/MetaModelConverter.ts +1 -1
  85. package/src/sap/fe/core/converters/annotations/DataField.js +46 -19
  86. package/src/sap/fe/core/converters/annotations/DataField.ts +93 -19
  87. package/src/sap/fe/core/converters/common/AnnotationConverter.js +118 -39
  88. package/src/sap/fe/core/converters/controls/Common/Action.js +58 -21
  89. package/src/sap/fe/core/converters/controls/Common/Action.ts +72 -22
  90. package/src/sap/fe/core/converters/controls/Common/Chart.js +13 -3
  91. package/src/sap/fe/core/converters/controls/Common/Chart.ts +20 -4
  92. package/src/sap/fe/core/converters/controls/Common/Form.js +18 -3
  93. package/src/sap/fe/core/converters/controls/Common/Form.ts +23 -1
  94. package/src/sap/fe/core/converters/controls/Common/Table.js +87 -22
  95. package/src/sap/fe/core/converters/controls/Common/Table.ts +112 -21
  96. package/src/sap/fe/core/converters/controls/Common/filter/FilterRestrictions.js +243 -0
  97. package/src/sap/fe/core/converters/controls/Common/filter/FilterRestrictions.ts +309 -0
  98. package/src/sap/fe/core/converters/controls/Common/table/Columns.js +142 -58
  99. package/src/sap/fe/core/converters/controls/Common/table/Columns.ts +174 -79
  100. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.js +7 -16
  101. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.ts +6 -17
  102. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.js +16 -5
  103. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.ts +16 -5
  104. package/src/sap/fe/core/converters/helpers/Aggregation.js +12 -2
  105. package/src/sap/fe/core/converters/helpers/Aggregation.ts +11 -1
  106. package/src/sap/fe/core/converters/helpers/DataFieldHelper.js +27 -3
  107. package/src/sap/fe/core/converters/helpers/DataFieldHelper.ts +28 -1
  108. package/src/sap/fe/core/converters/helpers/ID.js +3 -1
  109. package/src/sap/fe/core/converters/helpers/ID.ts +1 -0
  110. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.js +10 -5
  111. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.ts +13 -1
  112. package/src/sap/fe/core/converters/templates/ListReportConverter.js +11 -3
  113. package/src/sap/fe/core/converters/templates/ListReportConverter.ts +12 -4
  114. package/src/sap/fe/core/converters/templates/ObjectPageConverter.js +19 -8
  115. package/src/sap/fe/core/converters/templates/ObjectPageConverter.ts +18 -7
  116. package/src/sap/fe/core/designtime/AnnotationBasedChanges.js +8 -3
  117. package/src/sap/fe/core/designtime/AnnotationBasedChanges.ts +7 -2
  118. package/src/sap/fe/core/flexibility/AppComponent.flexibility.js +55 -0
  119. package/src/sap/fe/core/flexibility/AppComponent.flexibility.ts +65 -0
  120. package/src/sap/fe/core/flexibility/XMLTools.js +71 -0
  121. package/src/sap/fe/core/flexibility/XMLTools.ts +61 -0
  122. package/src/sap/fe/core/fpm/manifest.json +2 -2
  123. package/src/sap/fe/core/helpers/AppStartupHelper.js +79 -25
  124. package/src/sap/fe/core/helpers/AppStartupHelper.ts +92 -32
  125. package/src/sap/fe/core/helpers/DeleteHelper.js +13 -13
  126. package/src/sap/fe/core/helpers/DeleteHelper.ts +17 -15
  127. package/src/sap/fe/core/helpers/ManifestHelper.js +6 -3
  128. package/src/sap/fe/core/helpers/ManifestHelper.ts +3 -0
  129. package/src/sap/fe/core/helpers/MetaModelFunction.js +12 -3
  130. package/src/sap/fe/core/helpers/MetaModelFunction.ts +11 -3
  131. package/src/sap/fe/core/helpers/ModelHelper.js +47 -11
  132. package/src/sap/fe/core/helpers/ModelHelper.ts +62 -15
  133. package/src/sap/fe/core/helpers/PasteHelper.js +6 -2
  134. package/src/sap/fe/core/helpers/PasteHelper.ts +5 -7
  135. package/src/sap/fe/core/helpers/TypeGuards.js +12 -2
  136. package/src/sap/fe/core/helpers/TypeGuards.ts +10 -1
  137. package/src/sap/fe/core/helpers/WebSocket.js +6 -7
  138. package/src/sap/fe/core/helpers/WebSocket.ts +10 -6
  139. package/src/sap/fe/core/library.js +33 -3
  140. package/src/sap/fe/core/library.ts +31 -1
  141. package/src/sap/fe/core/messagebundle.properties +8 -1
  142. package/src/sap/fe/core/messagebundle_ar.properties +8 -1
  143. package/src/sap/fe/core/messagebundle_bg.properties +10 -3
  144. package/src/sap/fe/core/messagebundle_ca.properties +7 -0
  145. package/src/sap/fe/core/messagebundle_cnr.properties +7 -0
  146. package/src/sap/fe/core/messagebundle_cs.properties +7 -0
  147. package/src/sap/fe/core/messagebundle_cy.properties +8 -1
  148. package/src/sap/fe/core/messagebundle_da.properties +7 -0
  149. package/src/sap/fe/core/messagebundle_de.properties +7 -0
  150. package/src/sap/fe/core/messagebundle_el.properties +7 -0
  151. package/src/sap/fe/core/messagebundle_en.properties +8 -1
  152. package/src/sap/fe/core/messagebundle_en_GB.properties +7 -0
  153. package/src/sap/fe/core/messagebundle_en_US_saprigi.properties +8 -1
  154. package/src/sap/fe/core/messagebundle_es.properties +8 -1
  155. package/src/sap/fe/core/messagebundle_es_MX.properties +7 -0
  156. package/src/sap/fe/core/messagebundle_et.properties +7 -0
  157. package/src/sap/fe/core/messagebundle_fi.properties +7 -0
  158. package/src/sap/fe/core/messagebundle_fr.properties +16 -9
  159. package/src/sap/fe/core/messagebundle_fr_CA.properties +7 -0
  160. package/src/sap/fe/core/messagebundle_hi.properties +8 -1
  161. package/src/sap/fe/core/messagebundle_hr.properties +7 -0
  162. package/src/sap/fe/core/messagebundle_hu.properties +7 -0
  163. package/src/sap/fe/core/messagebundle_id.properties +7 -0
  164. package/src/sap/fe/core/messagebundle_it.properties +7 -0
  165. package/src/sap/fe/core/messagebundle_iw.properties +7 -0
  166. package/src/sap/fe/core/messagebundle_ja.properties +8 -1
  167. package/src/sap/fe/core/messagebundle_kk.properties +7 -0
  168. package/src/sap/fe/core/messagebundle_ko.properties +7 -0
  169. package/src/sap/fe/core/messagebundle_lt.properties +7 -0
  170. package/src/sap/fe/core/messagebundle_lv.properties +7 -0
  171. package/src/sap/fe/core/messagebundle_mk.properties +7 -0
  172. package/src/sap/fe/core/messagebundle_ms.properties +7 -0
  173. package/src/sap/fe/core/messagebundle_nl.properties +7 -0
  174. package/src/sap/fe/core/messagebundle_no.properties +9 -2
  175. package/src/sap/fe/core/messagebundle_pl.properties +7 -0
  176. package/src/sap/fe/core/messagebundle_pt.properties +7 -0
  177. package/src/sap/fe/core/messagebundle_pt_PT.properties +7 -0
  178. package/src/sap/fe/core/messagebundle_ro.properties +7 -0
  179. package/src/sap/fe/core/messagebundle_ru.properties +7 -0
  180. package/src/sap/fe/core/messagebundle_sh.properties +7 -0
  181. package/src/sap/fe/core/messagebundle_sk.properties +7 -0
  182. package/src/sap/fe/core/messagebundle_sl.properties +7 -0
  183. package/src/sap/fe/core/messagebundle_sr.properties +7 -0
  184. package/src/sap/fe/core/messagebundle_sv.properties +7 -0
  185. package/src/sap/fe/core/messagebundle_th.properties +7 -0
  186. package/src/sap/fe/core/messagebundle_tr.properties +7 -0
  187. package/src/sap/fe/core/messagebundle_uk.properties +7 -0
  188. package/src/sap/fe/core/messagebundle_vi.properties +7 -0
  189. package/src/sap/fe/core/messagebundle_zh_CN.properties +8 -1
  190. package/src/sap/fe/core/messagebundle_zh_TW.properties +7 -0
  191. package/src/sap/fe/core/rootView/Fcl.controller.js +21 -7
  192. package/src/sap/fe/core/rootView/Fcl.controller.ts +22 -5
  193. package/src/sap/fe/core/rootView/NavContainer.controller.js +1 -1
  194. package/src/sap/fe/core/rootView/NavContainer.controller.ts +2 -1
  195. package/src/sap/fe/core/rootView/RootViewBaseController.js +96 -88
  196. package/src/sap/fe/core/rootView/RootViewBaseController.ts +106 -96
  197. package/src/sap/fe/core/services/CollaborativeToolsServiceFactory.js +1 -1
  198. package/src/sap/fe/core/services/CollaborativeToolsServiceFactory.ts +9 -9
  199. package/src/sap/fe/core/services/EnvironmentServiceFactory.js +14 -10
  200. package/src/sap/fe/core/services/EnvironmentServiceFactory.ts +15 -10
  201. package/src/sap/fe/core/services/RoutingServiceFactory.js +9 -4
  202. package/src/sap/fe/core/services/RoutingServiceFactory.ts +13 -6
  203. package/src/sap/fe/core/services/SideEffectsServiceFactory.js +9 -7
  204. package/src/sap/fe/core/services/SideEffectsServiceFactory.ts +13 -8
  205. package/src/sap/fe/core/services/TemplatedViewServiceFactory.js +57 -5
  206. package/src/sap/fe/core/services/TemplatedViewServiceFactory.ts +69 -10
  207. package/src/sap/fe/core/services/collaborativeDraftServiceFactory.js +33 -15
  208. package/src/sap/fe/core/services/collaborativeDraftServiceFactory.ts +31 -11
  209. package/src/sap/fe/core/templating/DisplayModeFormatter.js +4 -5
  210. package/src/sap/fe/core/templating/DisplayModeFormatter.ts +4 -6
  211. package/src/sap/fe/core/templating/UIFormatters.js +17 -2
  212. package/src/sap/fe/core/templating/UIFormatters.ts +25 -1
  213. package/src/sap/fe/core/types/sap.fe.core-auto-ext.d.js +10 -0
  214. package/src/sap/fe/core/types/sap.fe.core-auto-ext.d.ts +369 -0
  215. package/src/sap/fe/core/types/sap.fe.core-manual-ext.d.js +9 -0
  216. package/src/sap/fe/core/types/sap.fe.core-manual-ext.d.ts +49 -0
  217. 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,30 +16,21 @@ 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.
29
- * @ui5-experimental-since 1.141.0
30
29
  * @since 1.141.0
31
30
  * @public
32
31
  */
33
32
  @defineUI5Class("sap.fe.core.controllerextensions.CollaborativeDraft")
34
33
  export default class CollaborativeDraft extends BaseControllerExtension {
35
- private base!: PageController;
36
-
37
34
  private lastFocusId: string | undefined;
38
35
 
39
36
  private lastFocusFieldGroups: string | undefined;
@@ -251,9 +248,9 @@ export default class CollaborativeDraft extends BaseControllerExtension {
251
248
  return internalModel?.getProperty("/collaborativeDraftRootPath");
252
249
  }
253
250
 
254
- private getDraftUserListPromise(): Promise<DraftAdminUser[]> | undefined {
251
+ private getDraftShareActionOperationAvailablePromise(): Promise<boolean> | undefined {
255
252
  const internalModel = this.getView().getModel("internal");
256
- return internalModel?.getProperty("/collaborativeDraftUserListPromise");
253
+ return internalModel?.getProperty("/collaborativeDraftShareActionOperationAvailablePromise");
257
254
  }
258
255
 
259
256
  private isInitialShare(): boolean {
@@ -273,30 +270,10 @@ export default class CollaborativeDraft extends BaseControllerExtension {
273
270
  * @param draftRootContext The context for the draft root
274
271
  * @param groupId The groupId to request the list of users invited in the draft
275
272
  */
276
- private setDraftRoot(draftRootContext: Context, groupId: string): void {
273
+ public setDraftRoot(draftRootContext: Context, groupId: string): void {
277
274
  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);
275
+ const shareActionOperationAvailablePromise: Promise<boolean | undefined> = this.getShareActionOperationAvailable(draftRootContext);
276
+ internalModel?.setProperty("/collaborativeDraftShareActionOperationAvailablePromise", shareActionOperationAvailablePromise);
300
277
  internalModel?.setProperty("/collaborativeDraftRootPath", draftRootContext.getPath());
301
278
  }
302
279
 
@@ -306,7 +283,7 @@ export default class CollaborativeDraft extends BaseControllerExtension {
306
283
  */
307
284
  private cleanDraftRoot(): void {
308
285
  const internalModel = this.getView().getModel("internal") as JSONModel;
309
- internalModel?.setProperty("/collaborativeDraftUserListPromise", undefined);
286
+ internalModel?.setProperty("/collaborativeDraftShareActionOperationAvailablePromise", undefined);
310
287
  internalModel?.setProperty("/collaborativeDraftRootPath", undefined);
311
288
  }
312
289
 
@@ -322,7 +299,7 @@ export default class CollaborativeDraft extends BaseControllerExtension {
322
299
  const uiModel = this.getView().getModel("ui") as JSONModel;
323
300
  if (isActiveEntity) {
324
301
  // We're not in a draft -> disconnect if we were connected before
325
- uiModel.setProperty("/hasCollaborationAuthorization", undefined);
302
+ uiModel.setProperty("/showCollaborationStrip", undefined);
326
303
  this.disconnect();
327
304
  return false;
328
305
  }
@@ -346,16 +323,14 @@ export default class CollaborativeDraft extends BaseControllerExtension {
346
323
  );
347
324
  }
348
325
 
349
- const usersInvited = await this.getDraftUserListPromise();
350
326
  if (uiModel.getProperty("/hasCollaborationAuthorization") !== undefined) {
351
327
  return uiModel.getProperty("/hasCollaborationAuthorization"); // Already checked, all good
352
328
  }
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);
329
+ const isShareActionOperationAvailable = await this.getDraftShareActionOperationAvailablePromise();
330
+ uiModel.setProperty("/hasCollaborationAuthorization", isShareActionOperationAvailable);
331
+ uiModel.setProperty("/showCollaborationStrip", !isShareActionOperationAvailable);
357
332
 
358
- if (hasMe) {
333
+ if (isShareActionOperationAvailable) {
359
334
  this.connect(draftRootContext).catch((error) => {
360
335
  Log.error("Error when connecting to the collaboration draft " + error);
361
336
  });
@@ -363,13 +338,66 @@ export default class CollaborativeDraft extends BaseControllerExtension {
363
338
  // Disconnect the websocket but keep the properties in the internal model (so don't call this.disconnect)
364
339
  this.getCollaborativeDraftService().disconnect(this.getView() as FEView);
365
340
  }
366
- return hasMe;
341
+ return !!isShareActionOperationAvailable;
367
342
  } catch (err) {
368
343
  Log.error("Error while activating the collaborative draft " + err);
369
344
  return false;
370
345
  }
371
346
  }
372
347
 
348
+ getShareActionOperationAvailableBindingExpression(
349
+ draftRootContext: Context,
350
+ getODataCacheValue?: boolean
351
+ ): BindingToolkitExpression<boolean> | boolean | undefined {
352
+ const metaModel = draftRootContext.getModel()?.getMetaModel();
353
+ const entitySet = metaModel?.getMetaPath(draftRootContext.getPath());
354
+ const metaContext = metaModel?.getMetaContext(draftRootContext.getPath());
355
+ const objectPath = metaContext && getInvolvedDataModelObjects(metaContext);
356
+ const shareActionName = metaModel?.getObject(`${entitySet}@com.sap.vocabularies.Common.v1.DraftRoot/ShareAction`);
357
+ const action = objectPath?.convertedTypes.actions.find((action) => {
358
+ return action.fullyQualifiedName.startsWith(shareActionName);
359
+ });
360
+ const bindingParameterFullName = action?.isBound ? action.parameters[0]?.fullyQualifiedName : undefined;
361
+ const bindingExpression = getExpressionFromAnnotation(
362
+ action?.annotations?.Core?.OperationAvailable as unknown as AnnotationTerm<PropertyAnnotationValue<EdmBoolean>>,
363
+ [],
364
+ undefined,
365
+ (path: string) => bindingContextPathVisitor(path, objectPath?.convertedTypes, bindingParameterFullName)
366
+ );
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
  }
@@ -415,7 +448,6 @@ export default class CollaborativeDraft extends BaseControllerExtension {
415
448
  * @param propertyName The name of the property
416
449
  * @param isLocked True if the property is locked, false if it is unlocked
417
450
  * @public
418
- * @ui5-experimental-since 1.141.0
419
451
  * @since 1.141.0
420
452
  */
421
453
  sendLockChange(context: Context, propertyName: string, isLocked: boolean): void {
@@ -425,11 +457,10 @@ export default class CollaborativeDraft extends BaseControllerExtension {
425
457
  /**
426
458
  * Sends a notification to other users that property values have been changed by the current user.
427
459
  *
428
- * This notification must be sent after the changes have been sent successfully to the back-end.
460
+ * This notification must be sent after the changes have been sent successfully to the back end.
429
461
  * @param context The context for the properties
430
462
  * @param propertyNames The property name or the array of property names
431
463
  * @public
432
- * @ui5-experimental-since 1.141.0
433
464
  * @since 1.141.0
434
465
  */
435
466
  sendPropertyValuesChange(context: Context, propertyNames: string | string[]): void {
@@ -442,23 +473,25 @@ export default class CollaborativeDraft extends BaseControllerExtension {
442
473
  /**
443
474
  * Sends a notification to other users that new contexts have been created by the current user.
444
475
  *
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
476
+ * This notification must be sent after the new contexts have been created successfully in the back end.
477
+ * @param contextsOrBinding The array of newly created contexts, or the binding where the contexts were created
447
478
  * @public
448
- * @ui5-experimental-since 1.141.0
449
479
  * @since 1.141.0
450
480
  */
451
- sendContextsCreated(contexts: Context[]): void {
452
- this.send({ action: Activity.Create, content: contexts.map((context) => context.getPath()) });
481
+ sendContextsCreated(contextsOrBinding: Context[] | ODataListBinding): void {
482
+ if (Array.isArray(contextsOrBinding)) {
483
+ this.send({ action: Activity.Create, content: contextsOrBinding.map((context) => context.getPath()) });
484
+ } else {
485
+ this.send({ action: Activity.Create, content: contextsOrBinding.getResolvedPath() ?? contextsOrBinding.getPath() });
486
+ }
453
487
  }
454
488
 
455
489
  /**
456
490
  * Sends a notification to other users that contexts have been deleted by the current user.
457
491
  *
458
- * This notification must be sent after the contexts have been deleted successfully in the back-end.
492
+ * This notification must be sent after the contexts have been deleted successfully in the back end.
459
493
  * @param contexts The array of deleted contexts
460
494
  * @public
461
- * @ui5-experimental-since 1.141.0
462
495
  * @since 1.141.0
463
496
  */
464
497
  sendContextsDeleted(contexts: Context[]): void {