@sapui5/sap.suite.ui.generic.template 1.146.0 → 1.147.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 (167) hide show
  1. package/package.json +1 -1
  2. package/src/sap/suite/ui/generic/template/.library +1 -1
  3. package/src/sap/suite/ui/generic/template/AnalyticalListPage/controller/ControllerImplementation.js +3 -3
  4. package/src/sap/suite/ui/generic/template/AnalyticalListPage/controllerFrameworkExtensions.js +15 -2
  5. package/src/sap/suite/ui/generic/template/AnalyticalListPage/i18n/i18n_ar.properties +8 -0
  6. package/src/sap/suite/ui/generic/template/AnalyticalListPage/i18n/i18n_bg.properties +8 -0
  7. package/src/sap/suite/ui/generic/template/AnalyticalListPage/i18n/i18n_ca.properties +8 -0
  8. package/src/sap/suite/ui/generic/template/AnalyticalListPage/i18n/i18n_cnr.properties +8 -0
  9. package/src/sap/suite/ui/generic/template/AnalyticalListPage/i18n/i18n_cs.properties +8 -0
  10. package/src/sap/suite/ui/generic/template/AnalyticalListPage/i18n/i18n_cy.properties +8 -0
  11. package/src/sap/suite/ui/generic/template/AnalyticalListPage/i18n/i18n_da.properties +8 -0
  12. package/src/sap/suite/ui/generic/template/AnalyticalListPage/i18n/i18n_de.properties +8 -0
  13. package/src/sap/suite/ui/generic/template/AnalyticalListPage/i18n/i18n_el.properties +8 -0
  14. package/src/sap/suite/ui/generic/template/AnalyticalListPage/i18n/i18n_en.properties +8 -0
  15. package/src/sap/suite/ui/generic/template/AnalyticalListPage/i18n/i18n_en_GB.properties +8 -0
  16. package/src/sap/suite/ui/generic/template/AnalyticalListPage/i18n/i18n_en_US_saprigi.properties +8 -0
  17. package/src/sap/suite/ui/generic/template/AnalyticalListPage/i18n/i18n_es.properties +8 -0
  18. package/src/sap/suite/ui/generic/template/AnalyticalListPage/i18n/i18n_es_MX.properties +8 -0
  19. package/src/sap/suite/ui/generic/template/AnalyticalListPage/i18n/i18n_et.properties +8 -0
  20. package/src/sap/suite/ui/generic/template/AnalyticalListPage/i18n/i18n_fi.properties +8 -0
  21. package/src/sap/suite/ui/generic/template/AnalyticalListPage/i18n/i18n_fr.properties +8 -0
  22. package/src/sap/suite/ui/generic/template/AnalyticalListPage/i18n/i18n_fr_CA.properties +8 -0
  23. package/src/sap/suite/ui/generic/template/AnalyticalListPage/i18n/i18n_hi.properties +8 -0
  24. package/src/sap/suite/ui/generic/template/AnalyticalListPage/i18n/i18n_hr.properties +8 -0
  25. package/src/sap/suite/ui/generic/template/AnalyticalListPage/i18n/i18n_hu.properties +8 -0
  26. package/src/sap/suite/ui/generic/template/AnalyticalListPage/i18n/i18n_id.properties +8 -0
  27. package/src/sap/suite/ui/generic/template/AnalyticalListPage/i18n/i18n_it.properties +9 -1
  28. package/src/sap/suite/ui/generic/template/AnalyticalListPage/i18n/i18n_iw.properties +8 -0
  29. package/src/sap/suite/ui/generic/template/AnalyticalListPage/i18n/i18n_ja.properties +8 -0
  30. package/src/sap/suite/ui/generic/template/AnalyticalListPage/i18n/i18n_kk.properties +8 -0
  31. package/src/sap/suite/ui/generic/template/AnalyticalListPage/i18n/i18n_ko.properties +8 -0
  32. package/src/sap/suite/ui/generic/template/AnalyticalListPage/i18n/i18n_lt.properties +8 -0
  33. package/src/sap/suite/ui/generic/template/AnalyticalListPage/i18n/i18n_lv.properties +8 -0
  34. package/src/sap/suite/ui/generic/template/AnalyticalListPage/i18n/i18n_mk.properties +8 -0
  35. package/src/sap/suite/ui/generic/template/AnalyticalListPage/i18n/i18n_ms.properties +8 -0
  36. package/src/sap/suite/ui/generic/template/AnalyticalListPage/i18n/i18n_nl.properties +8 -0
  37. package/src/sap/suite/ui/generic/template/AnalyticalListPage/i18n/i18n_no.properties +8 -0
  38. package/src/sap/suite/ui/generic/template/AnalyticalListPage/i18n/i18n_pl.properties +8 -0
  39. package/src/sap/suite/ui/generic/template/AnalyticalListPage/i18n/i18n_pt.properties +8 -0
  40. package/src/sap/suite/ui/generic/template/AnalyticalListPage/i18n/i18n_pt_PT.properties +8 -0
  41. package/src/sap/suite/ui/generic/template/AnalyticalListPage/i18n/i18n_ro.properties +8 -0
  42. package/src/sap/suite/ui/generic/template/AnalyticalListPage/i18n/i18n_ru.properties +8 -0
  43. package/src/sap/suite/ui/generic/template/AnalyticalListPage/i18n/i18n_sh.properties +8 -0
  44. package/src/sap/suite/ui/generic/template/AnalyticalListPage/i18n/i18n_sk.properties +8 -0
  45. package/src/sap/suite/ui/generic/template/AnalyticalListPage/i18n/i18n_sl.properties +8 -0
  46. package/src/sap/suite/ui/generic/template/AnalyticalListPage/i18n/i18n_sr.properties +8 -0
  47. package/src/sap/suite/ui/generic/template/AnalyticalListPage/i18n/i18n_sv.properties +8 -0
  48. package/src/sap/suite/ui/generic/template/AnalyticalListPage/i18n/i18n_th.properties +8 -0
  49. package/src/sap/suite/ui/generic/template/AnalyticalListPage/i18n/i18n_tr.properties +8 -0
  50. package/src/sap/suite/ui/generic/template/AnalyticalListPage/i18n/i18n_uk.properties +8 -0
  51. package/src/sap/suite/ui/generic/template/AnalyticalListPage/i18n/i18n_vi.properties +8 -0
  52. package/src/sap/suite/ui/generic/template/AnalyticalListPage/i18n/i18n_zh_CN.properties +8 -0
  53. package/src/sap/suite/ui/generic/template/AnalyticalListPage/i18n/i18n_zh_TW.properties +8 -0
  54. package/src/sap/suite/ui/generic/template/AnalyticalListPage/manifest.json +1 -1
  55. package/src/sap/suite/ui/generic/template/Canvas/manifest.json +1 -1
  56. package/src/sap/suite/ui/generic/template/ListReport/controller/ControllerImplementation.js +97 -7
  57. package/src/sap/suite/ui/generic/template/ListReport/controller/IappStateHandler.js +19 -8
  58. package/src/sap/suite/ui/generic/template/ListReport/controllerFrameworkExtensions.js +16 -2
  59. package/src/sap/suite/ui/generic/template/ListReport/i18n/i18n_fr.properties +1 -1
  60. package/src/sap/suite/ui/generic/template/ListReport/i18n/i18n_fr_CA.properties +1 -1
  61. package/src/sap/suite/ui/generic/template/ListReport/i18n/i18n_sk.properties +1 -1
  62. package/src/sap/suite/ui/generic/template/ListReport/i18n/i18n_uk.properties +1 -1
  63. package/src/sap/suite/ui/generic/template/ListReport/manifest.json +1 -1
  64. package/src/sap/suite/ui/generic/template/ListReport/view/fragments/DeleteConfirmation.fragment.xml +2 -2
  65. package/src/sap/suite/ui/generic/template/ListReport/view/fragments/SmartChart.fragment.xml +1 -0
  66. package/src/sap/suite/ui/generic/template/ListReport/view/fragments/SmartTable.fragment.xml +3 -2
  67. package/src/sap/suite/ui/generic/template/ObjectPage/controller/ControllerImplementation.js +5 -2
  68. package/src/sap/suite/ui/generic/template/ObjectPage/controllerFrameworkExtensions.js +16 -2
  69. package/src/sap/suite/ui/generic/template/ObjectPage/i18n/i18n_cnr.properties +1 -1
  70. package/src/sap/suite/ui/generic/template/ObjectPage/i18n/i18n_mk.properties +1 -1
  71. package/src/sap/suite/ui/generic/template/ObjectPage/i18n/i18n_sh.properties +1 -1
  72. package/src/sap/suite/ui/generic/template/ObjectPage/i18n/i18n_sl.properties +3 -3
  73. package/src/sap/suite/ui/generic/template/ObjectPage/i18n/i18n_sr.properties +1 -1
  74. package/src/sap/suite/ui/generic/template/ObjectPage/manifest.json +1 -1
  75. package/src/sap/suite/ui/generic/template/ObjectPage/view/fragments/DraftConfirmationPopup.fragment.xml +2 -2
  76. package/src/sap/suite/ui/generic/template/ObjectPage/view/fragments/DraftResumeDialog.fragment.xml +3 -3
  77. package/src/sap/suite/ui/generic/template/ObjectPage/view/fragments/RelatedAppsSheet.fragment.xml +1 -1
  78. package/src/sap/suite/ui/generic/template/ObjectPage/view/fragments/SmartChart.fragment.xml +3 -2
  79. package/src/sap/suite/ui/generic/template/ObjectPage/view/fragments/SmartTable.fragment.xml +3 -2
  80. package/src/sap/suite/ui/generic/template/ObjectPage/view/fragments/SwitchDraftAndActiveObjectPopOver.fragment.xml +1 -1
  81. package/src/sap/suite/ui/generic/template/ObjectPage/view/fragments/TableDeleteConfirmation.fragment.xml +2 -2
  82. package/src/sap/suite/ui/generic/template/ObjectPage/view/fragments/UnsavedChangesDialog.fragment.xml +2 -2
  83. package/src/sap/suite/ui/generic/template/QuickCreate/manifest.json +1 -1
  84. package/src/sap/suite/ui/generic/template/QuickCreate/view/QuickCreate.view.xml +7 -7
  85. package/src/sap/suite/ui/generic/template/QuickView/manifest.json +1 -1
  86. package/src/sap/suite/ui/generic/template/QuickView/view/QuickView.view.xml +6 -6
  87. package/src/sap/suite/ui/generic/template/detailTemplates/detailUtils.js +18 -1
  88. package/src/sap/suite/ui/generic/template/fragments/AINotice.fragment.xml +1 -1
  89. package/src/sap/suite/ui/generic/template/fragments/ActionConfirmation.fragment.xml +3 -3
  90. package/src/sap/suite/ui/generic/template/fragments/ContactDetails.fragment.xml +5 -5
  91. package/src/sap/suite/ui/generic/template/fragments/DataLoss.fragment.xml +2 -2
  92. package/src/sap/suite/ui/generic/template/fragments/DataLossTechnicalError.fragment.xml +3 -3
  93. package/src/sap/suite/ui/generic/template/fragments/DiscardEditPopover.fragment.xml +3 -3
  94. package/src/sap/suite/ui/generic/template/fragments/DraftAdminDataPopover.fragment.xml +1 -1
  95. package/src/sap/suite/ui/generic/template/fragments/MessageDialog.fragment.xml +7 -7
  96. package/src/sap/suite/ui/generic/template/fragments/MessageInfluencingCRUDAction.fragment.xml +7 -7
  97. package/src/sap/suite/ui/generic/template/fragments/MessagePopover.fragment.xml +2 -2
  98. package/src/sap/suite/ui/generic/template/fragments/ShareSheet.fragment.xml +3 -3
  99. package/src/sap/suite/ui/generic/template/genericUtilities/ControlStateWrapperFactory.js +108 -67
  100. package/src/sap/suite/ui/generic/template/genericUtilities/controlStateWrapperFactory/DynamicPageWrapper.js +19 -51
  101. package/src/sap/suite/ui/generic/template/genericUtilities/controlStateWrapperFactory/ObjectPageLayoutWrapper.js +10 -32
  102. package/src/sap/suite/ui/generic/template/genericUtilities/controlStateWrapperFactory/PreliminaryWrapper.js +151 -0
  103. package/src/sap/suite/ui/generic/template/genericUtilities/controlStateWrapperFactory/SearchFieldWrapper.js +8 -30
  104. package/src/sap/suite/ui/generic/template/genericUtilities/controlStateWrapperFactory/SmartFilterBarWrapper.js +68 -174
  105. package/src/sap/suite/ui/generic/template/genericUtilities/controlStateWrapperFactory/SmartTableChartCommon.js +100 -94
  106. package/src/sap/suite/ui/generic/template/genericUtilities/controlStateWrapperFactory/SmartTableWrapper.js +22 -3
  107. package/src/sap/suite/ui/generic/template/genericUtilities/controlStateWrapperFactory/SmartVariantManagementWrapper.js +90 -81
  108. package/src/sap/suite/ui/generic/template/genericUtilities/metadataAnalyser.js +5 -5
  109. package/src/sap/suite/ui/generic/template/lib/AppComponent.js +5 -1
  110. package/src/sap/suite/ui/generic/template/lib/CommonEventHandlers.js +76 -7
  111. package/src/sap/suite/ui/generic/template/lib/ContextMenuHandler.js +27 -21
  112. package/src/sap/suite/ui/generic/template/lib/ai/EasyFill/EasyFillHandler.js +5 -1
  113. package/src/sap/suite/ui/generic/template/lib/ai/EasyFill/fragments/EasyFillDialog.fragment.xml +12 -11
  114. package/src/sap/suite/ui/generic/template/lib/ai/EasyFilterBarHandler.js +9 -5
  115. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_ar.properties +16 -0
  116. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_bg.properties +16 -0
  117. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_ca.properties +16 -0
  118. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_cnr.properties +16 -0
  119. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_cs.properties +16 -0
  120. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_cy.properties +16 -0
  121. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_da.properties +16 -0
  122. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_de.properties +16 -0
  123. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_el.properties +16 -0
  124. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_en.properties +16 -0
  125. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_en_GB.properties +16 -0
  126. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_en_US_saprigi.properties +16 -0
  127. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_es.properties +17 -1
  128. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_es_MX.properties +16 -0
  129. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_et.properties +16 -0
  130. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_fi.properties +18 -2
  131. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_fr.properties +18 -2
  132. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_fr_CA.properties +18 -2
  133. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_hi.properties +16 -0
  134. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_hr.properties +16 -0
  135. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_hu.properties +16 -0
  136. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_id.properties +16 -0
  137. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_it.properties +16 -0
  138. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_iw.properties +16 -0
  139. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_ja.properties +20 -4
  140. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_kk.properties +16 -0
  141. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_ko.properties +16 -0
  142. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_lt.properties +16 -0
  143. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_lv.properties +16 -0
  144. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_mk.properties +17 -1
  145. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_ms.properties +16 -0
  146. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_nl.properties +17 -1
  147. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_no.properties +16 -0
  148. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_pl.properties +16 -0
  149. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_pt.properties +16 -0
  150. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_pt_PT.properties +16 -0
  151. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_ro.properties +16 -0
  152. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_ru.properties +21 -5
  153. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_sh.properties +16 -0
  154. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_sk.properties +16 -0
  155. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_sl.properties +18 -2
  156. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_sr.properties +16 -0
  157. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_sv.properties +16 -0
  158. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_th.properties +16 -0
  159. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_tr.properties +16 -0
  160. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_uk.properties +18 -2
  161. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_vi.properties +16 -0
  162. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_zh_CN.properties +20 -4
  163. package/src/sap/suite/ui/generic/template/lib/i18n/i18n_zh_TW.properties +20 -4
  164. package/src/sap/suite/ui/generic/template/lib/insights/InsightsFECardProvider.js +7 -1
  165. package/src/sap/suite/ui/generic/template/lib/navigation/NavigationController.js +1 -1
  166. package/src/sap/suite/ui/generic/template/library.js +1 -1
  167. package/src/sap/suite/ui/generic/template/listTemplates/fragments/MessagesOnRetrieval.fragment.xml +5 -5
@@ -4,41 +4,64 @@ sap.ui.define([
4
4
 
5
5
  /**
6
6
  * Constructor for SmartTableChartCommon
7
- * ...
8
- * @param {object} mParams
9
- * @param mParams.oCustomFiltersWrapper - wrapper for custom filters (from SFB point of view)
10
- * (currently containing: generic (currently only editState), app extension, and adaptation extension - but this is knowledge of LR, i.e. of iAppStateHandler, not of SFB)
7
+ * @param {sap.ui.core.Control} oControl - The SmartTable or SmartChart control
8
+ * @param {object} oController - The controller instance
9
+ * @param {object} oFactory - The ControlStateWrapperFactory instance
10
+ * @param {string} sInitializationEvent - The initialization event name (e.g., "initialise")
11
+ * @param {object} [mExtensions] - Optional extension functions for control-specific state handling
12
+ * @param {function} [mExtensions.fnExtendGetUiState] - Function to extend UiState during getState
13
+ * Called with (oStateUiState, oControlUiState) where modifications to oStateUiState add to the state
14
+ * @param {function} [mExtensions.fnExtendSetUiState] - Function to extend UiState during setState
15
+ * Called with (oStateUiState, oControlUiState) where oStateUiState contains the state to apply
11
16
  * @returns {object}
12
17
  */
13
18
 
14
19
  // deals with state of SFB itself, without SVM (see SmartVariantManagementWrapper) and go-button
15
20
  // (does not contain a state from SFB point of view - however, we remember whether it was pressed once
16
21
  // to restore data - this information is not considered being part of SFB)
17
- function SmartTableChartCommon(vTarget, oController, oFactory, sInitializationEvent) {
18
- var oSmartControl, oVariantManagementControl, bVariantManagementActive;
19
- var oControlAssignedResolve, oPreliminaryState, bSmartControlInitialized;
22
+ function SmartTableChartCommon(oControl, oController, oFactory, sInitializationEvent, mExtensions) {
23
+ var oSmartControl = oControl;
24
+ var oVariantManagementControl, bVariantManagementActive;
20
25
  var oSmartControlStateWrapper;
21
26
  var oVariantManagementStateWrapper;
27
+ var oVariantManagementInitializedResolve;
28
+ var fnResolveReady;
22
29
 
23
- var oControlAssignedPromise = new Promise(function (resolve) {
24
- oControlAssignedResolve = resolve;
30
+ var oVariantManagementInitializedPromise = new Promise(function(resolve){
31
+ oVariantManagementInitializedResolve = resolve;
25
32
  });
26
33
 
27
- if (typeof vTarget !== "string") {
28
- fnSetControl(vTarget);
34
+ var oReadyPromise = new Promise(function(resolve) {
35
+ fnResolveReady = resolve;
36
+ });
37
+
38
+ // Initialize control state wrapper and check if control is already initialized
39
+ oSmartControlStateWrapper = getControlWrapper(oSmartControl);
40
+ if (!oSmartControl.isInitialised()) {
41
+ // In case Smart Chart/Table is not yet initialized
42
+ // listen to the initialize event & then initialize the wrapper
43
+ oSmartControl.attachEvent(sInitializationEvent, fnControlInitialized);
44
+ } else {
45
+ fnControlInitialized();
29
46
  }
30
47
 
31
48
  // creates a simple wrapper for a SmartTable or SmartChart (a control using UIState) (ignoring initialization and vm)
32
49
  function getControlWrapper(oControl) {
33
50
  var bIsApplying = false; // avoid forwarding change event when caused by us applying a state
34
51
  function fnGetState() {
35
- var oUiState = oControl.getUiState(); // unfortunately not serializable, but a managed object
52
+ var oControlUiState = oControl.getUiState(); // unfortunately not serializable, but a managed object
53
+ var oStateUiState = {
54
+ oPresentationVariant: oControlUiState.getPresentationVariant(),
55
+ oSelectionVariant: oControlUiState.getSelectionVariant()
56
+ };
57
+
58
+ // Allow extension to add control-specific properties (e.g., tableSettings for SmartTable)
59
+ if (mExtensions && mExtensions.fnExtendGetUiState) {
60
+ mExtensions.fnExtendGetUiState(oStateUiState, oControlUiState);
61
+ }
62
+
36
63
  return {
37
- oUiState: {
38
- oPresentationVariant: oUiState.getPresentationVariant(),
39
- oSelectionVariant: oUiState.getSelectionVariant(),
40
- oTableSettings: oUiState.getTableSettings()
41
- }
64
+ oUiState: oStateUiState
42
65
  };
43
66
  }
44
67
 
@@ -53,15 +76,20 @@ sap.ui.define([
53
76
  bIsApplying = true;
54
77
  // don't create UiState (managed object) from scratch, but fetch it from control and only apply known properties from state - thus, if any other properties would be added, we don't
55
78
  // interfere with them
56
- var oUiState = oControl.getUiState();
79
+ var oControlUiState = oControl.getUiState();
57
80
  if (
58
- oUiState.getProperty("variantName") === "" ||
59
- oControl.getVariantManagement().getModified() && oControl.getVariantManagement().getStandardVariantKey() === oUiState.getProperty("variantName")
81
+ oControlUiState.getProperty("variantName") === "" ||
82
+ oControl.getVariantManagement().getModified() && oControl.getVariantManagement().getStandardVariantKey() === oControlUiState.getProperty("variantName")
60
83
  ){
61
- oUiState.setPresentationVariant(oState.oUiState.oPresentationVariant);
62
- oUiState.setSelectionVariant(oState.oUiState.oSelectionVariant);
63
- oUiState.setTableSettings(oState.oUiState.oTableSettings);
64
- oControl.setUiState(oUiState);
84
+ oControlUiState.setPresentationVariant(oState.oUiState.oPresentationVariant);
85
+ oControlUiState.setSelectionVariant(oState.oUiState.oSelectionVariant);
86
+
87
+ // Allow extension to set control-specific properties (e.g., tableSettings for SmartTable)
88
+ if (mExtensions && mExtensions.fnExtendSetUiState) {
89
+ mExtensions.fnExtendSetUiState(oState.oUiState, oControlUiState);
90
+ }
91
+
92
+ oControl.setUiState(oControlUiState);
65
93
  }
66
94
  bIsApplying = false;
67
95
  } else {
@@ -88,76 +116,58 @@ sap.ui.define([
88
116
  setState: fnSetState,
89
117
  getLocalId: fnGetLocalId,
90
118
  bVMConnection: oControl && oControl.getSmartVariant && !!oControl.getSmartVariant(),
91
- attachStateChanged: fnAttachStateChanged
119
+ attachStateChanged: fnAttachStateChanged,
120
+ onAfterVariantInitialise: oVariantManagementInitializedResolve
92
121
  };
93
122
  }
94
123
 
95
124
  function fnGetState() {
96
- if (bSmartControlInitialized) {
97
- if (oVariantManagementStateWrapper) {
98
- // oVariantManagementStateWrapper would be undefined only in cases SmartControl is not yet initialized
99
- // or VariantManagement is not enabled.
100
- return oVariantManagementStateWrapper.getState();
101
- }
102
-
103
- if (oSmartControlStateWrapper && !bVariantManagementActive) {
104
- // VariantManagement is not turned on & SmartControlStateWrapper instance
105
- return oSmartControlStateWrapper.getState();
106
- }
125
+ if (oVariantManagementStateWrapper) {
126
+ // Variant management is active
127
+ return oVariantManagementStateWrapper.getState();
107
128
  }
108
129
 
109
- // Control is not available and StateWrapper is not initialized
110
- return oPreliminaryState;
130
+ // No variant management - return control state directly
131
+ return oSmartControlStateWrapper.getState();
111
132
  }
112
133
 
113
134
  function fnSetState(oState) {
114
- oPreliminaryState = oState;
115
- oControlAssignedPromise.then(function () {
116
- // map legacy states - before separating VM state from state of managed control, inner state information
117
- // (presentation variant and selection variant) were put as oUiState on the same level as VM state
118
- // information (variant id and dirty indicator), now they are contained in map managedControlStates
119
- if (oState){
120
- if (oState.oUiState && !oState.managedControlStates) {
121
- oState.managedControlStates = Object.create(null);
122
- oState.managedControlStates[oSmartControlStateWrapper.getLocalId()] = {oUiState: oState.oUiState};
123
- }
124
- if (oState.bVariantModified !== undefined) {
125
- oState.modified = oState.bVariantModified;
126
- }
127
- if (oState.sVariantId !== undefined) {
128
- oState.variantId = oState.sVariantId;
129
- }
130
- }
131
-
135
+ if (!oState) {
136
+ // If no state provided, set standard variant on control
132
137
  if (bVariantManagementActive) {
133
- // In case VariantManagement is configured
134
- oVariantManagementStateWrapper.setState(oPreliminaryState);
135
- return;
138
+ oVariantManagementStateWrapper.setState(oState);
139
+ } else {
140
+ oSmartControlStateWrapper.setState(oState);
136
141
  }
137
-
138
- // SmartTable/Chart shall be used
139
- oSmartControlStateWrapper.setState(oPreliminaryState);
140
- });
141
- }
142
-
143
- function fnSetControl(oControl) {
144
- oSmartControl = oControl;
145
- oSmartControlStateWrapper = getControlWrapper(oSmartControl);
146
- if (!oSmartControl.isInitialised()) {
147
- // In case Smart Chart/Table is not yet initialized
148
- // listen to the initialize event & then resolve the control
149
- oSmartControl.attachEvent(sInitializationEvent, fnControlInitialized);
150
142
  return;
151
143
  }
152
144
 
153
- fnControlInitialized();
145
+ // Map legacy states - before separating VM state from state of managed control, inner state information
146
+ // (presentation variant and selection variant) were put as oUiState on the same level as VM state
147
+ // information (variant id and dirty indicator), now they are contained in map managedControlStates
148
+ if (oState.oUiState && !oState.managedControlStates) {
149
+ oState.managedControlStates = Object.create(null);
150
+ oState.managedControlStates[oSmartControlStateWrapper.getLocalId()] = {oUiState: oState.oUiState};
151
+ }
152
+ if (oState.bVariantModified !== undefined) {
153
+ oState.modified = oState.bVariantModified;
154
+ }
155
+ if (oState.sVariantId !== undefined) {
156
+ oState.variantId = oState.sVariantId;
157
+ }
158
+
159
+ if (bVariantManagementActive) {
160
+ // In case VariantManagement is configured
161
+ oVariantManagementStateWrapper.setState(oState);
162
+ } else {
163
+ // SmartTable/Chart shall be used
164
+ oSmartControlStateWrapper.setState(oState);
165
+ }
154
166
  }
155
167
 
156
168
  function fnControlInitialized() {
157
- bSmartControlInitialized = true;
158
-
159
169
  // deal with VM
160
- // 3 possibilties with respect to VM
170
+ // 3 possibilities with respect to VM
161
171
  // a) no VM (relevant for this control) at all
162
172
  // b) control managed as part of page wide variant management
163
173
  // c) control creates own VM
@@ -181,39 +191,35 @@ sap.ui.define([
181
191
  oVariantManagementStateWrapper = oFactory.getControlStateWrapper(oVariantManagementControl, {
182
192
  managedControlWrappers: [ oSmartControlStateWrapper ]
183
193
  });
184
- oControlAssignedResolve();
194
+ fnResolveReady();
185
195
  } else {
186
- // Resolve the ControlAssignedPromise only once the VariantManagement is
187
- // also initialized
196
+ // Wait for VariantManagement to be initialized
188
197
  oSmartControl.attachAfterVariantInitialise(fnControlInitialized);
189
198
  }
190
-
191
- return;
199
+ } else {
200
+ // No variant management or page-level variant management - ready immediately
201
+ fnResolveReady();
192
202
  }
193
- // There is no VariantManagement configured for this SmartChart/SmartTable
194
- oControlAssignedResolve(oSmartControl);
195
203
  }
196
204
 
197
205
  function fnAttachStateChanged(fnHandler) {
198
- oControlAssignedPromise.then(function () {
199
- if (bVariantManagementActive) {
200
- oVariantManagementStateWrapper.attachStateChanged(fnHandler);
201
- return;
202
- }
203
-
206
+ if (bVariantManagementActive) {
207
+ oVariantManagementStateWrapper.attachStateChanged(fnHandler);
208
+ } else {
204
209
  oSmartControlStateWrapper.attachStateChanged(fnHandler);
205
-
206
- });
210
+ }
207
211
  }
208
212
 
209
213
  return {
210
214
  getState: fnGetState,
211
215
  setState: fnSetState,
212
- setControl: fnSetControl,
213
216
  attachStateChanged: fnAttachStateChanged,
214
- bVMConnection: oSmartControl && oSmartControl.getSmartVariant && !!oSmartControl.getSmartVariant()
217
+ bVMConnection: oSmartControl && oSmartControl.getSmartVariant && !!oSmartControl.getSmartVariant(),
218
+ oVariantManagementInitializedPromise: oVariantManagementInitializedPromise,
219
+ onAfterVariantInitialise: oVariantManagementInitializedResolve,
220
+ oReadyPromise: oReadyPromise
215
221
  };
216
222
  }
217
223
 
218
224
  return SmartTableChartCommon;
219
- });
225
+ });
@@ -2,10 +2,29 @@ sap.ui.define([
2
2
  "sap/suite/ui/generic/template/genericUtilities/controlStateWrapperFactory/SmartTableChartCommon"
3
3
  ], function(SmartTableChartCommon) {
4
4
  "use strict";
5
-
5
+
6
+ /**
7
+ * Constructor for SmartTableWrapper
8
+ * @param {sap.ui.comp.smarttable.SmartTable} oSmartTable - The SmartTable control
9
+ * @param {object} oController - The controller instance
10
+ * @param {object} oFactory - The ControlStateWrapperFactory instance
11
+ * @returns {object} Wrapper object for SmartTable
12
+ */
6
13
  function SmartTableWrapper(oSmartTable, oController, oFactory){
7
- return new SmartTableChartCommon(oSmartTable, oController, oFactory, "initialise");
14
+ // SmartTable extends SmartTableChartCommon with tableSettings support
15
+ return new SmartTableChartCommon(oSmartTable, oController, oFactory, "initialise", {
16
+ // Extension to add tableSettings to the state
17
+ fnExtendGetUiState: function(oStateUiState, oControlUiState) {
18
+ oStateUiState.oTableSettings = oControlUiState.getTableSettings();
19
+ },
20
+ // Extension to apply tableSettings from the state
21
+ fnExtendSetUiState: function(oStateUiState, oControlUiState) {
22
+ if (oStateUiState.oTableSettings) {
23
+ oControlUiState.setTableSettings(oStateUiState.oTableSettings);
24
+ }
25
+ }
26
+ });
8
27
  }
9
28
 
10
29
  return SmartTableWrapper;
11
- });
30
+ });
@@ -4,18 +4,16 @@ sap.ui.define([
4
4
 
5
5
  /**
6
6
  * Constructor for SmartVariantManagementWrapper
7
- * @param {sap.ui.comp.smartvariants.SmartVariantManagement} vTarget - The SmartVariantManagement control
8
- * or the Id of control for which this wrapper is created
7
+ * @param {sap.ui.comp.smartvariants.SmartVariantManagement} oControl - The SmartVariantManagement control
9
8
  * @param {object} oController - the controller of the current component
10
9
  * @param {object} oFactory - the controlStateWrapperFactory
11
10
  * @param {object} mParams
12
11
  * @param {array} mParams.managedControlWrappers - array of controlStateWrappers for controls handled by the SVM
13
- * (currently also including SFB wrapper - to be removed)
14
- * @param {Object} mParams.dynamicPageWrapper - dynamicPageWrapper instance handled by SVM
12
+ * @param {object} mParams.smartFilterBarWrapper - explicit reference to SmartFilterBarWrapper for special handling
15
13
  * @returns {object}
16
14
  */
17
15
 
18
- function SmartVariantManagementWrapper(vTarget, oController, oFactory, mParams) {
16
+ function SmartVariantManagementWrapper(oControl, oController, oFactory, mParams) {
19
17
  // Special handling of SmartFilterBarWrapper for several reasons:
20
18
  // - Suppress selection when restoring a variant. Selection is solely triggered according to information in appState. Otherwise, erroneous selection could be triggered in
21
19
  // a few situations:
@@ -26,14 +24,10 @@ sap.ui.define([
26
24
  // - Store and restore extension state (extension implemented in SFB instead of SVM, which would be more appropriate from architectural point of view)
27
25
  // flag to control whether we are currently in the process of applying a state to suppress the event to inform about a new state´
28
26
  // only needed when setting the variant itself - for managed controls, their wrappers should avoid firing the event themselves
29
- var oSmartVariantManagement, fnResolveControlAssigned, oPreliminaryState;
30
- var oControlAssignedPromise = new Promise(function (resolve) {
31
- fnResolveControlAssigned = resolve;
32
- });
33
-
34
- if (typeof vTarget !== "string") {
35
- fnSetControl(vTarget);
36
- }
27
+ var oSmartVariantManagement = oControl;
28
+ var oPreliminaryState;
29
+ var bIsApplyingVariant = false;
30
+ var bAllControlsInitialized = false;
37
31
 
38
32
  // Handles the state of the variant management itself (i.e. which variant is selected and whether it's dirty), including the state of the managed controls.
39
33
  // Is responsible esp. to restore this state with correct dependency resp. in correct order
@@ -50,69 +44,74 @@ sap.ui.define([
50
44
  // For these controls, a real user changes are already handled by the direct connection. On the other hand, these controls also fire their change events, if their state is
51
45
  // changed from SVM (by the same connection) - setting variant dirty here would be wrong.
52
46
  mParams.managedControlWrappers.forEach(function(oWrapper){
53
- if (!oWrapper.bVMConnection){
54
- oWrapper.attachStateChanged(function(){
55
- oSmartVariantManagement.currentVariantSetModified(true);
56
- });
57
- }
47
+ (oWrapper.oVMConnectionPromise || Promise.resolve(oWrapper.bVMConnection)).then(function(bVMConnection) {
48
+ if (!bVMConnection) {
49
+ oWrapper.attachStateChanged(function(){
50
+ oSmartVariantManagement.currentVariantSetModified(true);
51
+ });
52
+ }
53
+ });
58
54
  });
59
55
 
56
+ // Get SmartFilterBarWrapper explicitly from params.
57
+ // This connection is needed because SmartFilterBar provides special callbacks to store/restore state
58
+ // for controls that don't have a direct variant management connection (bVMConnection = false), such as:
59
+ // - Extension filters (custom filters added via app or adaptation extensions)
60
+ // - Multiple views state (selected tab in multi-table/chart scenarios)
61
+ // These controls need their state saved/restored with variants via the SFB's beforeVariantFetch/afterVariantLoad events.
62
+ var oSmartFilterBarWrapper = mParams.smartFilterBarWrapper;
60
63
 
61
-
62
- function fnSetControl(oControl) {
63
- oSmartVariantManagement = oControl;
64
- fnResolveControlAssigned(oSmartVariantManagement);
65
- }
66
-
67
- var oSmartFilterBarWrapper = mParams.managedControlWrappers.find(function(oWrapper){
68
- return oWrapper.setSVMWrapperCallbacks;
69
- });
70
-
71
- // provide callbacks needed for SFB wrapper to store/restore extnesion state with variant
64
+ // Provide callbacks needed for SFB wrapper to store/restore extension state with variant
72
65
  if (oSmartFilterBarWrapper){
73
- oSmartFilterBarWrapper.setSVMWrapperCallbacks({
74
- getManagedControlStates: function(){
75
- var mManagedControlStates = Object.create(null);
76
- mParams.managedControlWrappers.forEach(function(oWrapper){
77
- if (!oWrapper.bVMConnection){
78
- mManagedControlStates[oWrapper.getLocalId()] = oWrapper.getState();
79
- }
80
- });
81
- return mManagedControlStates;
82
- },
83
- setManagedControlStates: function(oState){
84
- mParams.managedControlWrappers.forEach(function(oWrapper){
85
- if (!oWrapper.bVMConnection){
86
- oWrapper.setState(oState[oWrapper.getLocalId()]);
87
- }
88
- });
89
- },
90
- setHeaderState: function(bHeaderToBeExpanded) {
91
- mParams.dynamicPageWrapper.setHeaderState(oController, bHeaderToBeExpanded);
92
- }
66
+ // Build array with wrapper + bVMConnection info once all wrappers are ready
67
+ Promise.all(mParams.managedControlWrappers.map(function(oWrapper){
68
+ return (oWrapper.oVMConnectionPromise || Promise.resolve(oWrapper.bVMConnection)).then(function(bVMConnection){
69
+ return {
70
+ wrapper: oWrapper,
71
+ bVMConnection: bVMConnection
72
+ };
73
+ });
74
+ })).then(function(aWrapperInfo) {
75
+ oSmartFilterBarWrapper.setSVMWrapperCallbacks({
76
+ getManagedControlStates: function(){
77
+ var mManagedControlStates = Object.create(null);
78
+ aWrapperInfo.forEach(function(oInfo){
79
+ if (!oInfo.bVMConnection) {
80
+ mManagedControlStates[oInfo.wrapper.getLocalId()] = oInfo.wrapper.getState();
81
+ }
82
+ });
83
+ return mManagedControlStates;
84
+ },
85
+ setManagedControlStates: function(oState){
86
+ aWrapperInfo.forEach(function(oInfo){
87
+ if (!oInfo.bVMConnection) {
88
+ oInfo.wrapper.setState(oState[oInfo.wrapper.getLocalId()]);
89
+ }
90
+ });
91
+ }
92
+ });
93
93
  });
94
94
  }
95
95
 
96
+ // Create promise that resolves when all managed controls' variant management is ready
97
+ // This ensures getState() can query controls even if setState() is never called (e.g., app starts from scratch)
98
+ var oAllControlsInitializedPromise = Promise.all(
99
+ mParams.managedControlWrappers.map(function(oWrapper){
100
+ return oWrapper.oVariantManagementInitializedPromise || Promise.resolve();
101
+ })
102
+ );
103
+
104
+ // Set flag when all controls are initialized
105
+ oAllControlsInitializedPromise.then(function() {
106
+ bAllControlsInitialized = true;
107
+ });
108
+
96
109
  // Wrapper is intended to set a state to the ui, but not to trigger a selection (which should happen only after all (relevant) parts of ui state is set to the correct state
97
110
  // are set correct. Therefore, setting variant from here should never trigger a selection.
98
111
  function fnSetVariant(sVariantId){
99
112
  if (oSmartFilterBarWrapper){
100
113
  oSmartFilterBarWrapper.suppressSelection(true);
101
114
  }
102
- var sId = mParams.managedControlWrappers[0].getLocalId();
103
- var oControl = oController.getView().byId(sId);
104
- if (oControl && oControl.isA("sap.ui.comp.smarttable.SmartTable")) {
105
- oControl.attachAfterVariantInitialise(function() {
106
- //set currentVariantId only when sVariantId is not standard (as it might be overriding existing
107
- //different currentVariantId) or smartTable's (oControl) currentVariantId is not equal to sVariantId.
108
- if (sVariantId !== '*standard*' && sVariantId !== '') {
109
- if (oControl.getCurrentVariantId && oControl.getCurrentVariantId() !== sVariantId) {
110
- oControl.setCurrentVariantId(sVariantId);
111
- }
112
- oSmartVariantManagement.setModified(false);
113
- }
114
- });
115
- }
116
115
  oSmartVariantManagement.setCurrentVariantId(sVariantId);
117
116
  if (oSmartFilterBarWrapper){
118
117
  oSmartFilterBarWrapper.suppressSelection(false);
@@ -133,7 +132,11 @@ sap.ui.define([
133
132
  }
134
133
 
135
134
  function getState() {
136
- if (!oSmartVariantManagement) {
135
+ // Return preliminary state if managed controls not fully initialized
136
+ // Note: If early getState() calls become an issue (controls not initialized yet), we could enhance this to:
137
+ // - Store only SVM-specific data (variantId, modified) in oPreliminaryState
138
+ // - Always query managed control wrappers directly (they handle their own preliminary state via PreliminaryWrapper)
139
+ if (!bAllControlsInitialized) {
137
140
  return oPreliminaryState;
138
141
  }
139
142
 
@@ -150,22 +153,23 @@ sap.ui.define([
150
153
 
151
154
  function setState(oState) {
152
155
  oPreliminaryState = oState;
153
- oControlAssignedPromise.then(function() {
156
+
157
+ // Wait for all managed controls to be initialized before applying state
158
+ oAllControlsInitializedPromise.then(function() {
159
+ bIsApplyingVariant = true;
154
160
  if (!oPreliminaryState) {
155
161
  // if no state is provided set default variant (not modified)
156
162
  // use cases:
157
163
  // - LR: if appStateKey in the URL that cannot be read
158
164
  // - OP: if switching to different object instance (in discovery mode always, in persistency mode when page was not shown)
159
165
  fnSetVariant(oSmartVariantManagement.getDefaultVariantId());
160
- return;
161
- }
162
- if (oPreliminaryState.modified) {
166
+ } else if (oPreliminaryState.modified) {
163
167
  // Special logic according to UX: If variant was modified anyway, there's no benefit for the user to see the name (but it could be confusing), so standard variant (not default!) should be
164
168
  // set (which is achieved by empty string)
165
169
  fnSetVariant("");
170
+ oSmartVariantManagement.currentVariantSetModified(true);
166
171
  // Usually restoring the state of any of the managed controls should mark the variant as dirty, but there might be edge cases (state from an old release not containing information for any
167
172
  // managed control now relevant), so to be on the safe side, we set modified=true explicitly.
168
- oSmartVariantManagement.currentVariantSetModified(true);
169
173
  fnSetManagedControlStates(oPreliminaryState);
170
174
  } else {
171
175
  fnSetVariant(oPreliminaryState.variantId);
@@ -183,6 +187,7 @@ sap.ui.define([
183
187
  }
184
188
  }
185
189
  }
190
+ bIsApplyingVariant = false;
186
191
  });
187
192
  }
188
193
 
@@ -190,26 +195,30 @@ sap.ui.define([
190
195
  // state of variant management itself can be changed directly (user selects a different variant or stores current state as (new) variant), or indirectly (user changes some
191
196
  // data of a control managed by VM, e.g. some filter values in SFB)
192
197
 
193
- oControlAssignedPromise.then(function() {
194
- // state change when user selects a different variant
195
- oSmartVariantManagement.attachSelect(fnHandler);
198
+ // Wrap the handler to suppress events when applying a variant
199
+ var fnSuppressibleHandler = function() {
200
+ if (!bIsApplyingVariant) {
201
+ fnHandler();
202
+ }
203
+ };
196
204
 
197
- // when user saves current state as a new variant, this is also a state change (as the variant id is part of the state)
198
- // note: Even if new (SFB) variant is marked as execute on select, and currently no data is selected, no need to select data here (and thus also not to collapse header).
199
- // This is one of the possible ways to get into a state with a clean variant with execute on select, but no data loaded - see also comment to identify SFB wrapper.
200
- oSmartVariantManagement.attachAfterSave(fnHandler);
205
+ // state change when user selects a different variant
206
+ oSmartVariantManagement.attachSelect(fnSuppressibleHandler);
201
207
 
202
- // any change of a managed control is state change
203
- mParams.managedControlWrappers.forEach(function(oWrapper){
204
- oWrapper.attachStateChanged(fnHandler);
205
- });
208
+ // when user saves current state as a new variant, this is also a state change (as the variant id is part of the state)
209
+ // note: Even if new (SFB) variant is marked as execute on select, and currently no data is selected, no need to select data here (and thus also not to collapse header).
210
+ // This is one of the possible ways to get into a state with a clean variant with execute on select, but no data loaded - see also comment to identify SFB wrapper.
211
+ oSmartVariantManagement.attachAfterSave(fnSuppressibleHandler);
212
+
213
+ // any change of a managed control is state change
214
+ mParams.managedControlWrappers.forEach(function(oWrapper){
215
+ oWrapper.attachStateChanged(fnSuppressibleHandler);
206
216
  });
207
217
  }
208
218
 
209
219
  return {
210
220
  getState : getState,
211
221
  setState : setState,
212
- setControl: fnSetControl,
213
222
  attachStateChanged : attachStateChanged
214
223
  };
215
224
  }
@@ -278,10 +278,10 @@ sap.ui.define([
278
278
  /**
279
279
  * check does column having 1/n property or not.
280
280
  *
281
- * @param {*} oTable - Table instance
282
- * @param {*} sEntitySet - table entity set
283
- * @param {*} sProperty - column property
284
- * @returns
281
+ * @param {Object} oTable - Table instance
282
+ * @param {Object} sEntitySet - table entity set
283
+ * @param {Object} sProperty - column property
284
+ * @returns - returns either "1:n nav property" if any as string or else false.
285
285
  */
286
286
  checkFor1ToNProperty(oTable, sEntitySet, sProperty) {
287
287
  var aProperty = sProperty.split("/");
@@ -295,7 +295,7 @@ sap.ui.define([
295
295
  for (var i = 0; i < aProperty.length - 1; i++) {
296
296
  var oDataAssociationEnd = oTableMetaModel.getODataAssociationEnd(oTableEntityType, aProperty[i]);
297
297
  if (oDataAssociationEnd.multiplicity === "*") {
298
- return true;
298
+ return aProperty[i] + "/";
299
299
  }
300
300
  oTableEntityType = oTableMetaModel.getODataEntityType(oDataAssociationEnd.type);
301
301
  }
@@ -959,7 +959,7 @@ sap.ui.define([
959
959
  * @public
960
960
  * @extends sap.ui.core.UIComponent
961
961
  * @author SAP SE
962
- * @version 1.146.0
962
+ * @version 1.147.0
963
963
  * @name sap.suite.ui.generic.template.lib.AppComponent
964
964
  */
965
965
  var oAppComponent = UIComponent.extend("sap.suite.ui.generic.template.lib.AppComponent", {
@@ -1019,6 +1019,10 @@ sap.ui.define([
1019
1019
  type: "string",
1020
1020
  defaultValue: "Middle"
1021
1021
  },
1022
+ applyButtonNavigatesImmediately : {
1023
+ type:"boolean",
1024
+ defaultValue: false
1025
+ },
1022
1026
  //The column layout is used by default in the SmartForm on the object page
1023
1027
  useColumnLayoutForSmartForm: {
1024
1028
  type: "boolean",