@openui5/sap.ui.fl 1.139.0 → 1.141.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 (205) hide show
  1. package/.eslint-rules/import-check.js +71 -0
  2. package/THIRDPARTY.txt +2 -2
  3. package/package.json +3 -3
  4. package/src/sap/ui/fl/.library +1 -1
  5. package/src/sap/ui/fl/FakeLrepConnectorLocalStorage.js +1 -1
  6. package/src/sap/ui/fl/FakeLrepConnectorSessionStorage.js +1 -1
  7. package/src/sap/ui/fl/FakeLrepLocalStorage.js +1 -1
  8. package/src/sap/ui/fl/LayerUtils.js +1 -1
  9. package/src/sap/ui/fl/Utils.js +1 -1
  10. package/src/sap/ui/fl/apply/_internal/DelegateMediator.js +13 -3
  11. package/src/sap/ui/fl/apply/_internal/changes/Applier.js +3 -2
  12. package/src/sap/ui/fl/apply/_internal/changes/FlexCustomData.js +1 -1
  13. package/src/sap/ui/fl/apply/_internal/changes/Reverter.js +4 -1
  14. package/src/sap/ui/fl/apply/_internal/changes/Utils.js +1 -1
  15. package/src/sap/ui/fl/apply/_internal/changes/descriptor/Preprocessor.js +2 -2
  16. package/src/sap/ui/fl/apply/_internal/changes/descriptor/Registration.js +1 -1
  17. package/src/sap/ui/fl/apply/_internal/changes/descriptor/RegistrationBuild.js +1 -1
  18. package/src/sap/ui/fl/apply/_internal/changes/descriptor/app/AddAnnotationsToOData.js +1 -1
  19. package/src/sap/ui/fl/apply/_internal/changes/descriptor/app/AddNewDataSource.js +1 -1
  20. package/src/sap/ui/fl/apply/_internal/changes/descriptor/app/AddNewInbound.js +1 -1
  21. package/src/sap/ui/fl/apply/_internal/changes/descriptor/app/AddNewOutbound.js +1 -1
  22. package/src/sap/ui/fl/apply/_internal/changes/descriptor/app/AddTechnicalAttributes.js +1 -1
  23. package/src/sap/ui/fl/apply/_internal/changes/descriptor/app/ChangeDataSource.js +1 -1
  24. package/src/sap/ui/fl/apply/_internal/changes/descriptor/app/ChangeInbound.js +1 -1
  25. package/src/sap/ui/fl/apply/_internal/changes/descriptor/app/ChangeOutbound.js +1 -1
  26. package/src/sap/ui/fl/apply/_internal/changes/descriptor/app/RemoveAllInboundsExceptOne.js +1 -1
  27. package/src/sap/ui/fl/apply/_internal/changes/descriptor/app/SetAch.js +1 -1
  28. package/src/sap/ui/fl/apply/_internal/changes/descriptor/app/SetDescription.js +1 -1
  29. package/src/sap/ui/fl/apply/_internal/changes/descriptor/app/SetTitle.js +1 -1
  30. package/src/sap/ui/fl/apply/_internal/changes/descriptor/fiori/SetAbstract.js +1 -1
  31. package/src/sap/ui/fl/apply/_internal/changes/descriptor/fiori/SetCloudDevAdaptationStatus.js +1 -1
  32. package/src/sap/ui/fl/apply/_internal/changes/descriptor/fiori/SetRegistrationIds.js +1 -1
  33. package/src/sap/ui/fl/apply/_internal/changes/descriptor/ovp/AddNewCard.js +1 -1
  34. package/src/sap/ui/fl/apply/_internal/changes/descriptor/ovp/ChangeCard.js +1 -1
  35. package/src/sap/ui/fl/apply/_internal/changes/descriptor/ovp/DeleteCard.js +1 -1
  36. package/src/sap/ui/fl/apply/_internal/changes/descriptor/ui5/AddComponentUsages.js +1 -1
  37. package/src/sap/ui/fl/apply/_internal/changes/descriptor/ui5/AddLibrary.js +1 -1
  38. package/src/sap/ui/fl/apply/_internal/changes/descriptor/ui5/AddNewModel.js +1 -1
  39. package/src/sap/ui/fl/apply/_internal/changes/descriptor/ui5/AddNewModelEnhanceWith.js +1 -1
  40. package/src/sap/ui/fl/apply/_internal/changes/descriptor/ui5/ChangeModel.js +1 -1
  41. package/src/sap/ui/fl/apply/_internal/changes/descriptor/ui5/SetFlexExtensionPointEnabled.js +1 -1
  42. package/src/sap/ui/fl/apply/_internal/changes/descriptor/ui5/SetMinUI5Version.js +1 -1
  43. package/src/sap/ui/fl/apply/_internal/connectors/ObjectStorageUtils.js +1 -1
  44. package/src/sap/ui/fl/apply/_internal/controlVariants/URLHandler.js +14 -12
  45. package/src/sap/ui/fl/apply/_internal/extensionPoint/Processor.js +2 -2
  46. package/src/sap/ui/fl/apply/_internal/extensionPoint/Registry.js +1 -1
  47. package/src/sap/ui/fl/apply/_internal/flexObjects/AnnotationChange.js +1 -1
  48. package/src/sap/ui/fl/apply/_internal/flexObjects/AppDescriptorChange.js +1 -1
  49. package/src/sap/ui/fl/apply/_internal/flexObjects/CompVariant.js +13 -10
  50. package/src/sap/ui/fl/apply/_internal/flexObjects/ControllerExtensionChange.js +1 -1
  51. package/src/sap/ui/fl/apply/_internal/flexObjects/FlVariant.js +1 -1
  52. package/src/sap/ui/fl/apply/_internal/flexObjects/FlexObject.js +2 -2
  53. package/src/sap/ui/fl/apply/_internal/flexObjects/FlexObjectFactory.js +2 -8
  54. package/src/sap/ui/fl/apply/_internal/flexObjects/UIChange.js +1 -1
  55. package/src/sap/ui/fl/apply/_internal/flexObjects/Variant.js +2 -2
  56. package/src/sap/ui/fl/apply/_internal/flexObjects/VariantChange.js +1 -1
  57. package/src/sap/ui/fl/apply/_internal/flexObjects/VariantManagementChange.js +1 -1
  58. package/src/sap/ui/fl/apply/_internal/flexObjects/getVariantAuthor.js +6 -3
  59. package/src/sap/ui/fl/apply/_internal/flexState/DataSelector.js +5 -5
  60. package/src/sap/ui/fl/apply/_internal/flexState/FlexObjectState.js +12 -26
  61. package/src/sap/ui/fl/apply/_internal/flexState/FlexState.js +68 -229
  62. package/src/sap/ui/fl/apply/_internal/flexState/InitialPrepareFunctions.js +0 -8
  63. package/src/sap/ui/fl/apply/_internal/flexState/UI2Personalization/UI2PersonalizationState.js +1 -1
  64. package/src/sap/ui/fl/apply/_internal/flexState/changes/DependencyHandler.js +1 -1
  65. package/src/sap/ui/fl/apply/_internal/flexState/changes/ExtensionPointState.js +3 -3
  66. package/src/sap/ui/fl/apply/_internal/flexState/changes/UIChangesState.js +1 -1
  67. package/src/sap/ui/fl/apply/_internal/flexState/communication/FLPAboutInfo.js +2 -2
  68. package/src/sap/ui/fl/apply/_internal/flexState/compVariants/CompVariantManagementState.js +287 -10
  69. package/src/sap/ui/fl/apply/_internal/flexState/compVariants/applyChangesOnVariant.js +61 -0
  70. package/src/sap/ui/fl/apply/_internal/flexState/controlVariants/Switcher.js +22 -5
  71. package/src/sap/ui/fl/apply/_internal/flexState/controlVariants/VariantManagementState.js +72 -19
  72. package/src/sap/ui/fl/apply/_internal/init.js +47 -0
  73. package/src/sap/ui/fl/apply/_internal/preprocessors/ComponentLifecycleHooks.js +17 -7
  74. package/src/sap/ui/fl/apply/api/AnnotationChangeHandlerAPI.js +2 -1
  75. package/src/sap/ui/fl/apply/api/ControlVariantApplyAPI.js +190 -53
  76. package/src/sap/ui/fl/apply/api/DelegateMediatorAPI.js +17 -1
  77. package/src/sap/ui/fl/apply/api/ExtensionPointRegistryAPI.js +2 -1
  78. package/src/sap/ui/fl/apply/api/FlexRuntimeInfoAPI.js +6 -5
  79. package/src/sap/ui/fl/apply/api/SmartVariantManagementApplyAPI.js +45 -45
  80. package/src/sap/ui/fl/apply/api/UI2PersonalizationApplyAPI.js +2 -1
  81. package/src/sap/ui/fl/changeHandler/AddIFrame.js +1 -1
  82. package/src/sap/ui/fl/changeHandler/AddXML.js +2 -2
  83. package/src/sap/ui/fl/changeHandler/AddXMLAtExtensionPoint.js +4 -4
  84. package/src/sap/ui/fl/changeHandler/Base.js +3 -2
  85. package/src/sap/ui/fl/changeHandler/BaseAddViaDelegate.js +1 -1
  86. package/src/sap/ui/fl/changeHandler/BaseAddXml.js +21 -9
  87. package/src/sap/ui/fl/changeHandler/BaseRename.js +1 -1
  88. package/src/sap/ui/fl/changeHandler/ChangeAnnotation.js +7 -2
  89. package/src/sap/ui/fl/changeHandler/HideControl.js +1 -1
  90. package/src/sap/ui/fl/changeHandler/MoveControls.js +1 -1
  91. package/src/sap/ui/fl/changeHandler/MoveElements.js +1 -1
  92. package/src/sap/ui/fl/changeHandler/PropertyBindingChange.js +1 -1
  93. package/src/sap/ui/fl/changeHandler/PropertyChange.js +1 -1
  94. package/src/sap/ui/fl/changeHandler/StashControl.js +1 -1
  95. package/src/sap/ui/fl/changeHandler/UnhideControl.js +1 -1
  96. package/src/sap/ui/fl/changeHandler/UnstashControl.js +1 -1
  97. package/src/sap/ui/fl/changeHandler/UpdateIFrame.js +1 -1
  98. package/src/sap/ui/fl/changeHandler/common/createIFrame.js +1 -4
  99. package/src/sap/ui/fl/descriptorRelated/api/DescriptorChange.js +3 -3
  100. package/src/sap/ui/fl/descriptorRelated/api/DescriptorChangeFactory.js +3 -3
  101. package/src/sap/ui/fl/descriptorRelated/api/DescriptorInlineChangeFactory.js +1 -1
  102. package/src/sap/ui/fl/descriptorRelated/api/DescriptorVariantFactory.js +1 -1
  103. package/src/sap/ui/fl/designtime/variants/VariantManagement.designtime.js +14 -12
  104. package/src/sap/ui/fl/initial/_internal/FlexConfiguration.js +1 -1
  105. package/src/sap/ui/fl/initial/_internal/Loader.js +372 -0
  106. package/src/sap/ui/fl/{apply/_internal/flexState → initial/_internal}/ManifestUtils.js +1 -1
  107. package/src/sap/ui/fl/initial/_internal/Settings.js +1 -1
  108. package/src/sap/ui/fl/initial/_internal/Storage.js +1 -1
  109. package/src/sap/ui/fl/initial/_internal/StorageFeaturesMerger.js +1 -1
  110. package/src/sap/ui/fl/initial/_internal/StorageUtils.js +67 -9
  111. package/src/sap/ui/fl/initial/_internal/changeHandlers/ChangeHandlerRegistration.js +1 -1
  112. package/src/sap/ui/fl/initial/_internal/changeHandlers/ChangeHandlerStorage.js +12 -5
  113. package/src/sap/ui/fl/initial/_internal/connectors/Utils.js +1 -1
  114. package/src/sap/ui/fl/{apply → initial}/_internal/preprocessors/ControllerExtension.js +16 -5
  115. package/src/sap/ui/fl/{apply → initial}/_internal/preprocessors/RegistrationDelegator.js +9 -40
  116. package/src/sap/ui/fl/{apply → initial}/_internal/preprocessors/XmlPreprocessor.js +29 -21
  117. package/src/sap/ui/fl/initial/_internal/storageResultDisassemble.js +1 -1
  118. package/src/sap/ui/fl/initial/api/InitialFlexAPI.js +1 -1
  119. package/src/sap/ui/fl/interfaces/BaseLoadConnector.js +1 -1
  120. package/src/sap/ui/fl/interfaces/Delegate.js +1 -1
  121. package/src/sap/ui/fl/library.js +44 -44
  122. package/src/sap/ui/fl/messagebundle_vi.properties +1 -1
  123. package/src/sap/ui/fl/support/_internal/extractChangeDependencies.js +1 -1
  124. package/src/sap/ui/fl/support/_internal/getAllUIChanges.js +2 -2
  125. package/src/sap/ui/fl/support/_internal/getChangeDependencies.js +1 -1
  126. package/src/sap/ui/fl/support/_internal/getFlexObjectInfos.js +2 -2
  127. package/src/sap/ui/fl/support/_internal/getFlexSettings.js +1 -1
  128. package/src/sap/ui/fl/support/api/SupportAPI.js +1 -1
  129. package/src/sap/ui/fl/support/apps/contentbrowser/controller/ContentDetails.controller.js +1 -1
  130. package/src/sap/ui/fl/support/apps/contentbrowser/controller/ContentDetailsEdit.controller.js +1 -1
  131. package/src/sap/ui/fl/support/apps/contentbrowser/controller/LayerContentMaster.controller.js +1 -1
  132. package/src/sap/ui/fl/support/apps/contentbrowser/controller/Layers.controller.js +1 -1
  133. package/src/sap/ui/fl/support/apps/contentbrowser/lrepConnector/LRepConnector.js +1 -1
  134. package/src/sap/ui/fl/support/apps/contentbrowser/utils/DataUtils.js +1 -1
  135. package/src/sap/ui/fl/support/apps/contentbrowser/utils/ErrorUtils.js +1 -1
  136. package/src/sap/ui/fl/transport/TransportSelection.js +1 -1
  137. package/src/sap/ui/fl/util/IFrame.js +5 -4
  138. package/src/sap/ui/fl/util/ManagedObjectModel.js +1 -1
  139. package/src/sap/ui/fl/variants/VariantManagement.js +88 -36
  140. package/src/sap/ui/fl/variants/VariantManager.js +81 -21
  141. package/src/sap/ui/fl/variants/VariantModel.js +38 -189
  142. package/src/sap/ui/fl/write/_internal/SaveAs.js +1 -1
  143. package/src/sap/ui/fl/write/_internal/Storage.js +14 -1
  144. package/src/sap/ui/fl/write/_internal/Versions.js +9 -5
  145. package/src/sap/ui/fl/write/_internal/appVariant/AppVariant.js +10 -1
  146. package/src/sap/ui/fl/write/_internal/appVariant/AppVariantFactory.js +6 -1
  147. package/src/sap/ui/fl/write/_internal/appVariant/AppVariantInlineChange.js +1 -1
  148. package/src/sap/ui/fl/write/_internal/appVariant/AppVariantInlineChangeFactory.js +1 -1
  149. package/src/sap/ui/fl/write/_internal/condenser/Condenser.js +1 -1
  150. package/src/sap/ui/fl/write/_internal/condenser/UIReconstruction.js +1 -1
  151. package/src/sap/ui/fl/write/_internal/connectors/BackendConnector.js +1 -1
  152. package/src/sap/ui/fl/write/_internal/connectors/BtpServiceConnector.js +27 -2
  153. package/src/sap/ui/fl/write/_internal/connectors/KeyUserConnector.js +1 -1
  154. package/src/sap/ui/fl/write/_internal/connectors/LrepConnector.js +4 -1
  155. package/src/sap/ui/fl/write/_internal/connectors/NeoLrepConnector.js +1 -1
  156. package/src/sap/ui/fl/write/_internal/connectors/ObjectPathConnector.js +1 -1
  157. package/src/sap/ui/fl/write/_internal/connectors/PersonalizationConnector.js +1 -1
  158. package/src/sap/ui/fl/write/_internal/connectors/Utils.js +1 -1
  159. package/src/sap/ui/fl/write/_internal/extensionPoint/Processor.js +1 -1
  160. package/src/sap/ui/fl/write/_internal/fieldExtensibility/ABAPAccess.js +1 -1
  161. package/src/sap/ui/fl/write/_internal/fieldExtensibility/ABAPExtensibilityVariant.js +1 -1
  162. package/src/sap/ui/fl/write/_internal/fieldExtensibility/ABAPExtensibilityVariantFactory.js +1 -1
  163. package/src/sap/ui/fl/write/_internal/fieldExtensibility/MultiTenantABAPExtensibilityVariant.js +1 -1
  164. package/src/sap/ui/fl/write/_internal/fieldExtensibility/ServiceValidation.js +1 -1
  165. package/src/sap/ui/fl/write/_internal/fieldExtensibility/SingleTenantABAPExtensibilityVariant.js +1 -1
  166. package/src/sap/ui/fl/write/_internal/fieldExtensibility/UriParser.js +1 -1
  167. package/src/sap/ui/fl/write/_internal/fieldExtensibility/Utils.js +1 -1
  168. package/src/sap/ui/fl/write/_internal/fieldExtensibility/cap/CAPAccess.js +1 -1
  169. package/src/sap/ui/fl/write/_internal/fieldExtensibility/cap/dialog/CustomFieldCAPDialog.js +1 -1
  170. package/src/sap/ui/fl/write/_internal/fieldExtensibility/cap/editor/propertyEditor/booleanEditor/BooleanEditor.js +1 -1
  171. package/src/sap/ui/fl/write/_internal/fieldExtensibility/cap/editor/propertyEditor/rangeEditor/RangeEditor.js +1 -1
  172. package/src/sap/ui/fl/write/_internal/fieldExtensibility/cap/editor/propertyEditor/timeEditor/TimeEditor.js +1 -1
  173. package/src/sap/ui/fl/write/_internal/flexState/FlexObjectManager.js +40 -71
  174. package/src/sap/ui/fl/write/_internal/flexState/UI2Personalization/UI2PersonalizationState.js +3 -3
  175. package/src/sap/ui/fl/write/_internal/flexState/changes/UIChangeManager.js +1 -1
  176. package/src/sap/ui/fl/write/_internal/flexState/compVariants/{CompVariantState.js → CompVariantManager.js} +176 -309
  177. package/src/sap/ui/fl/write/_internal/init.js +27 -0
  178. package/src/sap/ui/fl/write/_internal/transport/TransportSelection.js +2 -2
  179. package/src/sap/ui/fl/write/_internal/transport/Transports.js +1 -1
  180. package/src/sap/ui/fl/write/api/Adaptations.js +1 -1
  181. package/src/sap/ui/fl/write/api/AppVariantWriteAPI.js +4 -2
  182. package/src/sap/ui/fl/write/api/BusinessNetworkAPI.js +60 -26
  183. package/src/sap/ui/fl/write/api/ChangesWriteAPI.js +4 -3
  184. package/src/sap/ui/fl/write/api/ContextBasedAdaptationsAPI.js +19 -23
  185. package/src/sap/ui/fl/write/api/ContextSharingAPI.js +3 -2
  186. package/src/sap/ui/fl/write/api/ControlPersonalizationWriteAPI.js +2 -1
  187. package/src/sap/ui/fl/write/api/FeaturesAPI.js +2 -1
  188. package/src/sap/ui/fl/write/api/FieldExtensibility.js +3 -2
  189. package/src/sap/ui/fl/write/api/LocalResetAPI.js +3 -2
  190. package/src/sap/ui/fl/write/api/PersistenceWriteAPI.js +23 -20
  191. package/src/sap/ui/fl/write/api/ReloadInfoAPI.js +10 -7
  192. package/src/sap/ui/fl/write/api/SACIntegrationUpdateVariant.js +8 -7
  193. package/src/sap/ui/fl/write/api/SmartBusinessWriteAPI.js +3 -2
  194. package/src/sap/ui/fl/write/api/SmartVariantManagementWriteAPI.js +26 -22
  195. package/src/sap/ui/fl/write/api/TranslationAPI.js +3 -2
  196. package/src/sap/ui/fl/write/api/UI2PersonalizationWriteAPI.js +4 -3
  197. package/src/sap/ui/fl/write/api/VersionsAPI.js +4 -3
  198. package/src/sap/ui/fl/write/api/connectors/FileListBaseConnector.js +3 -2
  199. package/src/sap/ui/fl/write/api/connectors/ObjectStorageConnector.js +4 -2
  200. package/src/sap/ui/fl/write/connectors/BaseConnector.js +13 -0
  201. package/ui5.yaml +0 -1
  202. package/src/sap/ui/fl/apply/_internal/flexState/Loader.js +0 -208
  203. package/src/sap/ui/fl/apply/_internal/flexState/compVariants/CompVariantMerger.js +0 -233
  204. package/src/sap/ui/fl/apply/_internal/flexState/compVariants/prepareCompVariantsMap.js +0 -118
  205. package/src/sap/ui/fl/util/resolveBinding.js +0 -79
@@ -5,13 +5,21 @@
5
5
  */
6
6
 
7
7
  sap.ui.define([
8
+ "sap/base/Log",
8
9
  "sap/ui/fl/apply/_internal/flexState/FlexState",
9
10
  "sap/ui/fl/apply/_internal/flexState/DataSelector",
10
- "sap/ui/fl/apply/_internal/flexObjects/CompVariant"
11
+ "sap/ui/fl/apply/_internal/flexState/compVariants/applyChangesOnVariant",
12
+ "sap/ui/fl/apply/_internal/flexObjects/CompVariant",
13
+ "sap/ui/fl/apply/_internal/flexObjects/FlexObjectFactory",
14
+ "sap/ui/fl/apply/_internal/flexObjects/States"
11
15
  ], function(
16
+ Log,
12
17
  FlexState,
13
18
  DataSelector,
14
- CompVariant
19
+ applyChangesOnVariant,
20
+ CompVariant,
21
+ FlexObjectFactory,
22
+ States
15
23
  ) {
16
24
  "use strict";
17
25
 
@@ -20,7 +28,7 @@ sap.ui.define([
20
28
  *
21
29
  * @namespace sap.ui.fl.apply._internal.flexState.compVariants.CompVariantManagementState
22
30
  * @since 1.129
23
- * @version 1.139.0
31
+ * @version 1.141.0
24
32
  * @private
25
33
  * @ui5-restricted
26
34
  */
@@ -28,6 +36,14 @@ sap.ui.define([
28
36
 
29
37
  const sUpdatableChangeNameSpace = "sap.ui.fl.apply._internal.flexObjects.UpdatableChange";
30
38
 
39
+ const aCompVariantChangeTypes = [
40
+ "addFavorite",
41
+ "defaultVariant",
42
+ "removeFavorite",
43
+ "standardVariant",
44
+ "updateVariant"
45
+ ];
46
+
31
47
  const isSetDefaultChange = (oFlexObject) => {
32
48
  return oFlexObject?.isA(sUpdatableChangeNameSpace)
33
49
  && oFlexObject.getFileType() === "change"
@@ -40,16 +56,166 @@ sap.ui.define([
40
56
  parentDataSelector: FlexState.getFlexObjectsDataSelector(),
41
57
  executeFunction(aFlexObjects, mPropertyBag) {
42
58
  return aFlexObjects.filter((oFlexObject) =>
43
- isSetDefaultChange(oFlexObject)
44
- && String(oFlexObject.getSelector()?.persistencyKey) === mPropertyBag.persistencyKey
59
+ (oFlexObject.getState() !== States.LifecycleState.DELETED || mPropertyBag.includeDeleted)
60
+ && isSetDefaultChange(oFlexObject)
61
+ && oFlexObject.getSelector().persistencyKey === mPropertyBag.persistencyKey
45
62
  );
46
63
  },
47
64
  checkInvalidation(mParameters, oUpdateInfo) {
65
+ const oFlexObject = oUpdateInfo.updatedObject;
66
+ const bRelevantPersistencyKey = oFlexObject?.getSelector?.().persistencyKey === mParameters.persistencyKey;
48
67
  const bRelevantType = ["addFlexObject", "removeFlexObject"].includes(oUpdateInfo.type);
49
- return bRelevantType && isSetDefaultChange(oUpdateInfo.updatedObject);
68
+ return bRelevantPersistencyKey && bRelevantType && isSetDefaultChange(oUpdateInfo.updatedObject);
69
+ }
70
+ });
71
+
72
+ const oCompEntitiesDataSelector = new DataSelector({
73
+ id: "compEntitiesData",
74
+ parentDataSelector: FlexState.getFlexObjectsDataSelector(),
75
+ executeFunction(aFlexObjects) {
76
+ return aFlexObjects.filter((oFlexObject) => oFlexObject.getFileType() === "variant" ||
77
+ (
78
+ oFlexObject.getFileType() === "change"
79
+ && aCompVariantChangeTypes.includes(oFlexObject.getChangeType())
80
+ )
81
+ );
82
+ },
83
+ checkInvalidation(mParameters, oUpdateInfo) {
84
+ const oFlexObject = oUpdateInfo.updatedObject;
85
+ const aRelevantUpdateTypes = ["addFlexObject", "updateFlexObject", "removeFlexObject"];
86
+ const bIsRelevantUpdateType = aRelevantUpdateTypes.includes(oUpdateInfo.type);
87
+ const bIsChangeWithRelevantChangeType = oFlexObject.getFileType() === "change" &&
88
+ aCompVariantChangeTypes.includes(oFlexObject.getChangeType());
89
+ const bIsVariantFileType = oUpdateInfo.updatedObject?.getFileType?.() === "variant";
90
+ return bIsRelevantUpdateType && (bIsVariantFileType || bIsChangeWithRelevantChangeType);
91
+ }
92
+ });
93
+
94
+ const oVariantsDataSelector = new DataSelector({
95
+ id: "compVariantData",
96
+ parameterKey: "persistencyKey",
97
+ parentDataSelector: oCompEntitiesDataSelector,
98
+ executeFunction(aFlexObjects, mPropertyBag) {
99
+ const aVariants = aFlexObjects.filter((oFlexObject) =>
100
+ oFlexObject.getFileType() === "variant"
101
+ && oFlexObject.getPersistencyKey() === mPropertyBag.persistencyKey
102
+ && (oFlexObject.getState() !== States.LifecycleState.DELETED || mPropertyBag.includeDeleted)
103
+ );
104
+
105
+ return CompVariantManagementState.applyChangesOnVariants(mPropertyBag.reference, mPropertyBag.persistencyKey, aVariants);
106
+ },
107
+ checkInvalidation(mParameters, oUpdateInfo) {
108
+ const oFlexObject = oUpdateInfo.updatedObject;
109
+ const aRelevantUpdateTypes = ["addFlexObject", "updateFlexObject", "removeFlexObject"];
110
+ const bIsRelevantUpdateType = aRelevantUpdateTypes.includes(oUpdateInfo.type);
111
+ const bIsChangeWithRelevantChangeType = oFlexObject.getFileType() === "change" &&
112
+ aCompVariantChangeTypes.includes(oFlexObject.getChangeType());
113
+ const bIsVariantFileType = oUpdateInfo.updatedObject?.getFileType?.() === "variant";
114
+ return bIsRelevantUpdateType && (bIsVariantFileType || bIsChangeWithRelevantChangeType);
50
115
  }
51
116
  });
52
117
 
118
+ // comp entities may hold the persistency key within the persistencyKey property (variant) or within the selector (changes)
119
+ const oCompEntitiesByPersistencyKeyDataSelector = new DataSelector({
120
+ id: "compEntitiesByPersistencyKey",
121
+ parameterKey: "persistencyKey",
122
+ parentDataSelector: oCompEntitiesDataSelector,
123
+ executeFunction(aFlexObjects, mPropertyBag) {
124
+ return aFlexObjects.filter((oFlexObject) =>
125
+ (oFlexObject.getPersistencyKey?.() || oFlexObject.getSelector?.().persistencyKey) === mPropertyBag.persistencyKey
126
+ );
127
+ },
128
+ checkInvalidation(mParameters, oUpdateInfo) {
129
+ const oFlexObject = oUpdateInfo.updatedObject;
130
+ return (oFlexObject?.getPersistencyKey?.() || oFlexObject.getSelector?.().persistencyKey) === mParameters.persistencyKey;
131
+ }
132
+ });
133
+
134
+ const oChangesByVariantIdsDataSelector = new DataSelector({
135
+ id: "getChangesByVariantIds",
136
+ parentDataSelector: oCompEntitiesByPersistencyKeyDataSelector,
137
+ executeFunction(aFlexObjects) {
138
+ const mChanges = {};
139
+ const aVariantIds = aFlexObjects
140
+ .filter((oFlexObject) => oFlexObject.getFileType() === "variant")
141
+ .map((oVariant) => oVariant.getVariantId());
142
+
143
+ aFlexObjects.filter((oFlexObject) => oFlexObject.getFileType() === "change" && oFlexObject.getChangeType() !== "defaultVariant")
144
+ .forEach(function(oChange) {
145
+ const sVariantId = escapeSpecialIdCharacters(oChange.getSelector().variantId || oChange.getContent().key);
146
+ if (aVariantIds.includes(sVariantId)) {
147
+ mChanges[sVariantId] ||= [];
148
+ mChanges[sVariantId].push(oChange);
149
+ } else if (oChange.getChangeType() === "standardVariant") {
150
+ mChanges[CompVariant.STANDARD_VARIANT_ID] ||= [];
151
+ mChanges[CompVariant.STANDARD_VARIANT_ID].push(oChange);
152
+ }
153
+ });
154
+
155
+ return mChanges;
156
+ }
157
+ });
158
+
159
+ function createVariant(mPropertyBag) {
160
+ const oVariantInput = mPropertyBag.variantInput || {};
161
+ const oVariantData = {
162
+ fileName: oVariantInput.fileName,
163
+ fileType: "variant",
164
+ variantId: oVariantInput.id || CompVariant.STANDARD_VARIANT_ID,
165
+ persisted: oVariantInput.persisted,
166
+ reference: mPropertyBag.reference,
167
+ favorite: oVariantInput.favorite,
168
+ executeOnSelection: oVariantInput.executeOnSelection,
169
+ adaptationId: oVariantInput.adaptationId,
170
+ content: oVariantInput.content || {},
171
+ texts: {
172
+ variantName: {
173
+ value: oVariantInput.name || ""
174
+ }
175
+ },
176
+ selector: {
177
+ persistencyKey: mPropertyBag.persistencyKey
178
+ }
179
+ };
180
+
181
+ return FlexObjectFactory.createCompVariant(oVariantData);
182
+ }
183
+
184
+ function escapeSpecialIdCharacters(sId) {
185
+ return sId?.replace("#", "_HASHTAG_");
186
+ }
187
+
188
+ CompVariantManagementState.applyChangesOnVariants = function(sReference, sPersistencyKey, aVariants) {
189
+ const mChangesByVariantId = oChangesByVariantIdsDataSelector.get({
190
+ reference: sReference,
191
+ persistencyKey: sPersistencyKey
192
+ });
193
+ aVariants.forEach((oVariant) => {
194
+ const aChangesOnVariant = mChangesByVariantId[oVariant.getVariantId()] || [];
195
+ if (aChangesOnVariant.length > 0) {
196
+ applyChangesOnVariant(oVariant, aChangesOnVariant);
197
+ oCompEntitiesDataSelector.checkUpdate(
198
+ { reference: sReference },
199
+ [{ type: "updateFlexObject", updatedObject: oVariant }]
200
+ );
201
+ }
202
+ });
203
+
204
+ return aVariants;
205
+ };
206
+
207
+ /**
208
+ * Access to the variant management comp entities selector.
209
+ *
210
+ * @returns {object} The data selector for the variants and their changes
211
+ *
212
+ * @private
213
+ * @ui5-restricted sap.ui.fl.qunit
214
+ */
215
+ CompVariantManagementState.getCompEntitiesDataSelector = function() {
216
+ return oCompEntitiesDataSelector;
217
+ };
218
+
53
219
  /**
54
220
  * Access to the variant management set default selector.
55
221
  *
@@ -67,7 +233,7 @@ sap.ui.define([
67
233
  *
68
234
  * @param {object} mPropertyBag Object with the necessary properties
69
235
  * @param {string} mPropertyBag.persistencyKey - Persistency key of the variant management
70
- * @param {string} mPropertyBag.reference - Component reference
236
+ * @param {string} mPropertyBag.reference - Flexibility reference of the app
71
237
  * @param {sap.ui.fl.apply._internal.flexObjects.CompVariant[]} mPropertyBag.variants - Array of variants which exist for the given variant management
72
238
  *
73
239
  * @returns {string | undefined} ID of the default variant
@@ -82,17 +248,95 @@ sap.ui.define([
82
248
 
83
249
  mPropertyBag.persistencyKey = String(mPropertyBag.persistencyKey);
84
250
  const aDefaultChanges = [...oSetDefaultDataSelector.get(mPropertyBag)].reverse();
85
- const aDefaultVariantIds = aDefaultChanges.map((oChange) => oChange.getContent().defaultVariantName);
251
+ const aDefaultVariantIds = aDefaultChanges
252
+ .map((oChange) => oChange.getContent().defaultVariantName)
253
+ .map((sId) => escapeSpecialIdCharacters(sId));
86
254
 
87
255
  return aDefaultVariantIds.find((sDefaultVariantId) => aVariantIds.includes(sDefaultVariantId)) || "";
88
256
  };
89
257
 
90
258
  /**
91
- * Returns the 'defaultVariant' changes for a given variant management
259
+ * Returns all variants saved in the FlexState.
260
+ *
261
+ * @param {object} mPropertyBag - Object with the necessary properties
262
+ * @param {string} mPropertyBag.reference - Flex reference of the current app
263
+ * @param {string} mPropertyBag.persistencyKey - Persistency key of the variant management
264
+ * @param {object} mPropertyBag.standardVariant - The standard variant passed by the control
265
+ * @param {string} mPropertyBag.componentId - The ID of the application component
266
+ * @param {boolean} [mPropertyBag.includeDeleted=false] - Flag if also deleted variants should be returned
267
+ *
268
+ * @returns {sap.ui.fl.apply._internal.flexObjects.CompVariant[]} Array of variants
269
+ */
270
+ CompVariantManagementState.assembleVariantList = function(mPropertyBag) {
271
+ let oStandardVariant = oVariantsDataSelector.get(mPropertyBag).findLast((oVariant) => oVariant.getStandardVariant());
272
+
273
+ if (!oStandardVariant) {
274
+ oStandardVariant = createVariant({
275
+ reference: mPropertyBag.reference,
276
+ persistencyKey: mPropertyBag.persistencyKey,
277
+ variantInput: mPropertyBag.standardVariant,
278
+ standardVariant: true
279
+ });
280
+ FlexState.addRuntimeSteadyObject(mPropertyBag.reference, mPropertyBag.componentId, oStandardVariant);
281
+ }
282
+
283
+ return oVariantsDataSelector.get(mPropertyBag).filter((oVariant) => oVariant.getVisible());
284
+ };
285
+
286
+ /**
287
+ * Returns a variant saved in the flex state.
92
288
  *
93
289
  * @param {object} mPropertyBag Object with the necessary properties
290
+ * @param {string} mPropertyBag.reference - Flex reference of the current app
94
291
  * @param {string} mPropertyBag.persistencyKey - Persistency key of the variant management
95
- * @param {string} mPropertyBag.reference - Component reference
292
+ * @param {string} mPropertyBag.id - ID of the variant
293
+ * @param {string} mPropertyBag.componentId - The ID of the application component
294
+ *
295
+ * @returns {sap.ui.fl.apply._internal.flexObjects.CompVariant | undefined} Variant or undefined if the variant cannot be found
296
+ */
297
+ CompVariantManagementState.getVariant = function(mPropertyBag) {
298
+ return oVariantsDataSelector.get(mPropertyBag).find((oVariant) => oVariant.getVariantId() === mPropertyBag.id);
299
+ };
300
+
301
+ /**
302
+ * Returns all changes for a given variant saved in the FlexState.
303
+ *
304
+ * @param {sap.ui.fl.apply._internal.flexObjects.CompVariant} oVariant - Variant for which the changes should be retrieved
305
+ *
306
+ * @returns {sap.ui.fl.apply._internal.flexObjects.UIChange[]} List of changes for the variant
307
+ */
308
+ CompVariantManagementState.getVariantChanges = function(oVariant) {
309
+ const sReference = oVariant.getFlexObjectMetadata().reference;
310
+ const sVariantId = oVariant.getVariantId();
311
+ const sPersistencyKey = oVariant.getPersistencyKey();
312
+ return oChangesByVariantIdsDataSelector.get({
313
+ reference: sReference,
314
+ persistencyKey: sPersistencyKey
315
+ })?.[sVariantId] || [];
316
+ };
317
+
318
+ CompVariantManagementState.addExternalVariants = function(mPropertyBag) {
319
+ try {
320
+ mPropertyBag.variants?.map((oVariant) => {
321
+ oVariant.reference = mPropertyBag.reference;
322
+ oVariant.fileName = escapeSpecialIdCharacters(oVariant.id); // external oData Variants may have an invalid ID for ManagedObjects
323
+ oVariant.selector = {persistencyKey: mPropertyBag.persistencyKey};
324
+ oVariant.texts = {variantName: {value: oVariant.name}};
325
+ return oVariant;
326
+ })
327
+ .map((oVariant) => FlexObjectFactory.createFromFileContent(oVariant, CompVariant, true))
328
+ .forEach((oFlexObject) => FlexState.addRuntimeSteadyObject(mPropertyBag.reference, mPropertyBag.componentId, oFlexObject));
329
+ } catch (oError) {
330
+ Log.error(`External comp variant could not be added: ${oError.message}`);
331
+ }
332
+ };
333
+
334
+ /**
335
+ * Returns the 'defaultVariant' changes for a given variant management
336
+ *
337
+ * @param {object} mPropertyBag - Object with the necessary properties
338
+ * @param {string} mPropertyBag.persistencyKey - Persistency key of the variant management
339
+ * @param {string} mPropertyBag.reference - Flexibility reference of the app
96
340
  *
97
341
  * @returns {sap.ui.fl.apply._internal.flexObjects.UpdatableChange[]} 'defaultVariant' changes of the variant management
98
342
  *
@@ -104,5 +348,38 @@ sap.ui.define([
104
348
  return oSetDefaultDataSelector.get(mPropertyBag);
105
349
  };
106
350
 
351
+ /**
352
+ * Returns the all sap.ui.comp related entities for a given reference
353
+ *
354
+ * @param {object} mPropertyBag Object with the necessary properties
355
+ * @param {string} mPropertyBag.reference - Flexibility reference of the app
356
+ *
357
+ * @returns {sap.ui.fl.apply._internal.flexObjects.FlexObject[]} - All comp variants for a given reference
358
+ *
359
+ * @since 1.140
360
+ * @private
361
+ * @ui5-restricted sap.ui.fl
362
+ */
363
+ CompVariantManagementState.getCompEntities = (mPropertyBag) => {
364
+ return oCompEntitiesDataSelector.get(mPropertyBag);
365
+ };
366
+
367
+ /**
368
+ * Returns the all sap.ui.comp related entities for a given reference and persistency key
369
+ *
370
+ * @param {object} mPropertyBag Object with the necessary properties
371
+ * @param {string} mPropertyBag.reference - Flexibility reference of the app
372
+ * @param {string} mPropertyBag.persistencyKey - Persistency key of the variant management
373
+ *
374
+ * @returns {sap.ui.fl.apply._internal.flexObjects.FlexObject[]} - all sap.ui.comp related entities for a given reference
375
+ *
376
+ * @since 1.140
377
+ * @private
378
+ * @ui5-restricted sap.ui.fl
379
+ */
380
+ CompVariantManagementState.getCompEntitiesByPersistencyKey = (mPropertyBag) => {
381
+ return oCompEntitiesByPersistencyKeyDataSelector.get(mPropertyBag);
382
+ };
383
+
107
384
  return CompVariantManagementState;
108
385
  });
@@ -0,0 +1,61 @@
1
+ /*!
2
+ * OpenUI5
3
+ * (c) Copyright 2025 SAP SE or an SAP affiliate company.
4
+ * Licensed under the Apache License, Version 2.0 - see LICENSE.txt.
5
+ */
6
+
7
+ sap.ui.define([
8
+ "sap/base/Log"
9
+ ], function(
10
+ Log
11
+ ) {
12
+ "use strict";
13
+
14
+ var mChangeHandlers = {
15
+ addFavorite(oVariant) {
16
+ oVariant.setFavorite(true);
17
+ },
18
+ removeFavorite(oVariant) {
19
+ oVariant.setFavorite(false);
20
+ },
21
+ updateVariant(oVariant, oChange) {
22
+ var oChangeContent = oChange.getContent();
23
+ if (oChangeContent.executeOnSelection !== undefined) {
24
+ oVariant.setExecuteOnSelection(oChangeContent.executeOnSelection);
25
+ }
26
+ if (oChangeContent.favorite !== undefined) {
27
+ oVariant.setFavorite(oChangeContent.favorite);
28
+ }
29
+ if (oChangeContent.contexts) {
30
+ oVariant.setContexts(oChangeContent.contexts);
31
+ }
32
+ if (oChangeContent.visible !== undefined) {
33
+ oVariant.setVisible(oChangeContent.visible);
34
+ }
35
+
36
+ if (oChangeContent.variantContent) {
37
+ oVariant.setContent(oChangeContent.variantContent, /* bSkipStateChange = */ true);
38
+ }
39
+ var sVariantName = oChange.getText("variantName");
40
+ if (sVariantName) {
41
+ oVariant.setName(sVariantName, /* bSkipStateChange = */ true);
42
+ }
43
+ },
44
+ standardVariant(oVariant, oChange) {
45
+ // legacy change on standard variants
46
+ oVariant.setExecuteOnSelection(oChange.getContent().executeOnSelect);
47
+ }
48
+ };
49
+
50
+ function logNoChangeHandler(oVariant, oChange) {
51
+ Log.error(`No change handler for change with the ID '${oChange.getId()}' and type '${oChange.getChangeType()}' defined.
52
+ The variant '${oVariant.getId()}'was not modified'`);
53
+ }
54
+
55
+ return (oVariant, aChanges = []) => {
56
+ aChanges.forEach(function(oChange) {
57
+ var oChangeHandler = mChangeHandlers[oChange.getChangeType()] || logNoChangeHandler;
58
+ oChangeHandler(oVariant, oChange);
59
+ });
60
+ };
61
+ });
@@ -8,12 +8,16 @@ sap.ui.define([
8
8
  "sap/base/util/restricted/_pick",
9
9
  "sap/ui/fl/apply/_internal/changes/Applier",
10
10
  "sap/ui/fl/apply/_internal/changes/Reverter",
11
- "sap/ui/fl/apply/_internal/flexState/controlVariants/VariantManagementState"
11
+ "sap/ui/fl/apply/_internal/flexState/changes/DependencyHandler",
12
+ "sap/ui/fl/apply/_internal/flexState/controlVariants/VariantManagementState",
13
+ "sap/ui/fl/apply/_internal/flexState/FlexObjectState"
12
14
  ], function(
13
15
  _pick,
14
16
  Applier,
15
17
  Reverter,
16
- VariantManagementState
18
+ DependencyHandler,
19
+ VariantManagementState,
20
+ FlexObjectState
17
21
  ) {
18
22
  "use strict";
19
23
 
@@ -75,7 +79,7 @@ sap.ui.define([
75
79
  *
76
80
  * @namespace sap.ui.fl.apply._internal.flexState.controlVariants.Switcher
77
81
  * @since 1.74
78
- * @version 1.139.0
82
+ * @version 1.141.0
79
83
  * @private
80
84
  * @ui5-restricted
81
85
  */
@@ -97,8 +101,21 @@ sap.ui.define([
97
101
  async switchVariant(mPropertyBag) {
98
102
  var mChangesToBeSwitched = getControlChangesForVariantSwitch(mPropertyBag);
99
103
 
100
- await Reverter.revertMultipleChanges(mChangesToBeSwitched.changesToBeReverted, mPropertyBag);
101
- await Applier.applyMultipleChanges(mChangesToBeSwitched.changesToBeApplied, mPropertyBag);
104
+ const oLiveDependencyMap = FlexObjectState.getLiveDependencyMap(mPropertyBag.reference);
105
+
106
+ // Early setting the changes as queued for revert/apply prevents potential timing issues
107
+ // when e.g. evaluating the App State after the switch
108
+ mChangesToBeSwitched.changesToBeReverted.forEach((oChange) => oChange.setQueuedForRevert());
109
+ mChangesToBeSwitched.changesToBeApplied.forEach((oChange) => {
110
+ if (!oChange.isApplyProcessFinished()) {
111
+ oChange.setQueuedForApply();
112
+ // Add change to the dependency map in advance so that any dependent changes are aware of the change
113
+ DependencyHandler.addRuntimeChangeToMap(oChange, mPropertyBag.appComponent, oLiveDependencyMap);
114
+ }
115
+ });
116
+
117
+ await Reverter.revertMultipleChanges(mChangesToBeSwitched.changesToBeReverted, {...mPropertyBag, skipSetQueued: true});
118
+ await Applier.applyMultipleChanges(mChangesToBeSwitched.changesToBeApplied, {...mPropertyBag, skipSetQueued: true});
102
119
  VariantManagementState.setCurrentVariant(mPropertyBag);
103
120
  }
104
121
 
@@ -14,7 +14,6 @@ sap.ui.define([
14
14
  "sap/ui/fl/apply/_internal/flexState/DataSelector",
15
15
  "sap/ui/fl/apply/_internal/flexState/FlexState",
16
16
  "sap/ui/fl/changeHandler/condenser/Classification",
17
- "sap/ui/fl/initial/_internal/Storage",
18
17
  "sap/ui/fl/LayerUtils"
19
18
  ], function(
20
19
  _omit,
@@ -26,7 +25,6 @@ sap.ui.define([
26
25
  DataSelector,
27
26
  FlexState,
28
27
  Classification,
29
- Storage,
30
28
  LayerUtils
31
29
  ) {
32
30
  "use strict";
@@ -55,7 +53,7 @@ sap.ui.define([
55
53
  *
56
54
  * @namespace sap.ui.fl.apply._internal.flexState.controlVariants.VariantManagementState
57
55
  * @since 1.74
58
- * @version 1.139.0
56
+ * @version 1.141.0
59
57
  * @private
60
58
  * @ui5-restricted
61
59
  */
@@ -235,9 +233,9 @@ sap.ui.define([
235
233
  return oGroupedFlexObjects;
236
234
  }
237
235
 
238
- function createVariantsMap(aFlexObjects) {
236
+ function createVariantsMap(aFlexObjects, mPropertyBag) {
239
237
  const oGroupedFlexObjects = groupFlexObjects(aFlexObjects);
240
- const sReference = aFlexObjects[0]?.getFlexObjectMetadata().reference;
238
+ const sReference = mPropertyBag.reference;
241
239
 
242
240
  const oVariantManagementsMap = {};
243
241
  oGroupedFlexObjects.variants.forEach((oVariantInstance) => {
@@ -346,8 +344,8 @@ sap.ui.define([
346
344
  return true;
347
345
  }
348
346
 
349
- const aRelevantFlexObjectTypes = ["addFlexObject", "updateFlexObject", "removeFlexObject"];
350
- const bRelevantType = aRelevantFlexObjectTypes.includes(oUpdateInfo.type);
347
+ const aRelevantFlexObjectUpdateTypes = ["addFlexObject", "updateFlexObject", "removeFlexObject"];
348
+ const bRelevantType = aRelevantFlexObjectUpdateTypes.includes(oUpdateInfo.type);
351
349
  const aRelevantVariantFileTypes = ["ctrl_variant", "ctrl_variant_change", "ctrl_variant_management_change"];
352
350
  const bRelevantVariantType = aRelevantVariantFileTypes.includes(oUpdateInfo.updatedObject?.getFileType?.());
353
351
  const bHasVariantReference = oUpdateInfo.updatedObject?.getVariantReference?.();
@@ -495,14 +493,10 @@ sap.ui.define([
495
493
  * @param {string} mPropertyBag.variantReference - Variant reference to be loaded
496
494
  */
497
495
  VariantManagementState.loadVariant = async function(mPropertyBag) {
498
- const oStorageResponse = await Storage.loadFlVariant({
496
+ await FlexState.lazyLoadFlVariant({
499
497
  variantReference: mPropertyBag.variantReference,
500
498
  reference: mPropertyBag.reference
501
499
  });
502
- FlexState.updateWithDataProvided({
503
- reference: mPropertyBag.reference,
504
- newData: oStorageResponse
505
- });
506
500
  };
507
501
 
508
502
  /**
@@ -576,20 +570,43 @@ sap.ui.define([
576
570
  });
577
571
  };
578
572
 
573
+ VariantManagementState.updateVariant = function(mPropertyBag) {
574
+ oVariantManagementMapDataSelector.checkUpdate(
575
+ { reference: mPropertyBag.reference },
576
+ [{ type: "updateFlexObject", updatedObject: mPropertyBag.variant }]
577
+ );
578
+ };
579
+
579
580
  /**
580
581
  * Returns the current variant reference for a given variant management reference.
581
582
  *
582
583
  * @param {object} mPropertyBag - Object with the necessary properties
583
584
  * @param {string} mPropertyBag.vmReference - Variant management reference
584
585
  * @param {string} mPropertyBag.reference - Component reference
585
- * @returns {string} Reference of the current variant
586
+ * @returns {string | undefined} Reference of the current variant or undefined if VM does not exist
586
587
  */
587
588
  VariantManagementState.getCurrentVariantReference = function(mPropertyBag) {
588
589
  var oVariantManagementSection = oVariantManagementsDataSelector.get({
589
590
  variantManagementReference: mPropertyBag.vmReference,
590
591
  reference: mPropertyBag.reference
591
592
  });
592
- return oVariantManagementSection.currentVariant;
593
+ return oVariantManagementSection?.currentVariant;
594
+ };
595
+
596
+ /**
597
+ * Returns the default variant reference for a given variant management reference.
598
+ *
599
+ * @param {object} mPropertyBag - Object with the necessary properties
600
+ * @param {string} mPropertyBag.vmReference - Variant management reference
601
+ * @param {string} mPropertyBag.reference - Component reference
602
+ * @returns {string | undefined} Reference of the default variant or undefined if VM does not exist
603
+ */
604
+ VariantManagementState.getDefaultVariantReference = function(mPropertyBag) {
605
+ const oVariantManagement = oVariantManagementsDataSelector.get({
606
+ variantManagementReference: mPropertyBag.vmReference,
607
+ reference: mPropertyBag.reference
608
+ });
609
+ return oVariantManagement?.defaultVariant;
593
610
  };
594
611
 
595
612
  /**
@@ -625,6 +642,24 @@ sap.ui.define([
625
642
  return Object.keys(oVariantsMap);
626
643
  };
627
644
 
645
+ /**
646
+ * Returns the variant management reference for a given variant reference.
647
+ *
648
+ * @param {string} sReference - Flex reference of the current app
649
+ * @param {string} sVariantReference - Variant reference to search for
650
+ * @returns {string | undefined} Variant management reference if found, otherwise undefined
651
+ */
652
+ VariantManagementState.getVariantManagementReferenceForVariant = function(sReference, sVariantReference) {
653
+ const oVariantsMap = oVariantManagementMapDataSelector.get({
654
+ reference: sReference
655
+ });
656
+ return Object.entries(oVariantsMap).find(([, oVM]) => {
657
+ return oVM.variants.some((oVariant) => {
658
+ return oVariant.key === sVariantReference;
659
+ });
660
+ })?.[0];
661
+ };
662
+
628
663
  /**
629
664
  * Returns all variants saved in the FlexState.
630
665
  *
@@ -791,26 +826,44 @@ sap.ui.define([
791
826
  };
792
827
 
793
828
  /**
794
- * Sets the promise for the variant switch for the given reference.
829
+ * Sets the promise for the variant switch for the given flex reference and VM reference.
795
830
  *
796
831
  * @param {string} sReference - Flex reference of the app
797
- * @param {Promise<undefined>} oPromise - Variant Switch Promise
798
832
  * @param {string} sVMReference - Variant Management reference
833
+ * @param {Promise<undefined>} oPromise - Variant Switch Promise
799
834
  */
800
- VariantManagementState.setVariantSwitchPromise = function(sReference, oPromise, sVMReference) {
835
+ VariantManagementState.setVariantSwitchPromise = function(sReference, sVMReference, oPromise) {
801
836
  mVariantSwitchPromises[sReference] ||= {};
802
837
  mVariantSwitchPromises[sReference][sVMReference] = oPromise;
803
838
  };
804
839
 
805
840
  /**
806
- * Gets the promise for the variant switch for the given reference.
841
+ * Waits for the variant switch of a given VM.
807
842
  *
808
843
  * @param {string} sReference - Flex reference of the app
844
+ * @param {string} sVMReference - Variant Management reference
809
845
  * @returns {Promise<undefined>} Variant Switch Promise
810
846
  */
811
- VariantManagementState.waitForVariantSwitch = function(sReference) {
847
+ VariantManagementState.waitForVariantSwitch = function(sReference, sVMReference) {
848
+ return mVariantSwitchPromises[sReference]?.[sVMReference] || Promise.resolve();
849
+ };
850
+
851
+ /**
852
+ * Waits for all variant switches for the given flex reference.
853
+ *
854
+ * @param {string} sReference - Flex reference of the app
855
+ * @returns {Promise<undefined>} Variant Switches Promise
856
+ */
857
+ VariantManagementState.waitForAllVariantSwitches = function(sReference) {
812
858
  return Promise.all(Object.values(mVariantSwitchPromises[sReference] || {}));
813
859
  };
814
860
 
861
+ VariantManagementState.getVariantsForVariantManagement = function(mPropertyBag) {
862
+ const oVariantManagement = oVariantManagementsDataSelector.get({
863
+ variantManagementReference: mPropertyBag.vmReference,
864
+ reference: mPropertyBag.reference
865
+ });
866
+ return oVariantManagement?.variants || [];
867
+ };
815
868
  return VariantManagementState;
816
869
  });