@sapui5/sap.cux.home 1.141.0 → 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 (355) hide show
  1. package/package.json +1 -1
  2. package/src/sap/cux/home/.library +4 -1
  3. package/src/sap/cux/home/AdvancedSettingsPanel.d.ts +3 -2
  4. package/src/sap/cux/home/AdvancedSettingsPanel.d.ts.map +1 -1
  5. package/src/sap/cux/home/AdvancedSettingsPanel.js +6 -6
  6. package/src/sap/cux/home/AdvancedSettingsPanel.js.map +1 -1
  7. package/src/sap/cux/home/AdvancedSettingsPanel.ts +6 -6
  8. package/src/sap/cux/home/App.d.ts.map +1 -1
  9. package/src/sap/cux/home/App.js +9 -1
  10. package/src/sap/cux/home/App.js.map +1 -1
  11. package/src/sap/cux/home/App.ts +10 -1
  12. package/src/sap/cux/home/AppsAdditionPanel.d.ts +75 -34
  13. package/src/sap/cux/home/AppsAdditionPanel.d.ts.map +1 -1
  14. package/src/sap/cux/home/AppsAdditionPanel.js +378 -179
  15. package/src/sap/cux/home/AppsAdditionPanel.js.map +1 -1
  16. package/src/sap/cux/home/AppsAdditionPanel.ts +399 -175
  17. package/src/sap/cux/home/AppsContainer.d.ts +5 -1
  18. package/src/sap/cux/home/AppsContainer.d.ts.map +1 -1
  19. package/src/sap/cux/home/AppsContainer.js +32 -17
  20. package/src/sap/cux/home/AppsContainer.js.map +1 -1
  21. package/src/sap/cux/home/AppsContainer.ts +31 -15
  22. package/src/sap/cux/home/BaseAppPanel.d.ts +2 -1
  23. package/src/sap/cux/home/BaseAppPanel.d.ts.map +1 -1
  24. package/src/sap/cux/home/BaseAppPanel.js +2 -1
  25. package/src/sap/cux/home/BaseAppPanel.js.map +1 -1
  26. package/src/sap/cux/home/BaseAppPanel.ts +4 -2
  27. package/src/sap/cux/home/BaseContainer.d.ts +8 -0
  28. package/src/sap/cux/home/BaseContainer.d.ts.map +1 -1
  29. package/src/sap/cux/home/BaseContainer.js +35 -5
  30. package/src/sap/cux/home/BaseContainer.js.map +1 -1
  31. package/src/sap/cux/home/BaseContainer.ts +32 -5
  32. package/src/sap/cux/home/BaseContainerRenderer.d.ts.map +1 -1
  33. package/src/sap/cux/home/BaseContainerRenderer.js +6 -0
  34. package/src/sap/cux/home/BaseContainerRenderer.js.map +1 -1
  35. package/src/sap/cux/home/BaseContainerRenderer.ts +7 -1
  36. package/src/sap/cux/home/BaseNewsPanel.js.map +1 -1
  37. package/src/sap/cux/home/BaseNewsPanel.ts +2 -2
  38. package/src/sap/cux/home/BasePanel.d.ts +7 -0
  39. package/src/sap/cux/home/BasePanel.d.ts.map +1 -1
  40. package/src/sap/cux/home/BasePanel.js +23 -2
  41. package/src/sap/cux/home/BasePanel.js.map +1 -1
  42. package/src/sap/cux/home/BasePanel.ts +18 -1
  43. package/src/sap/cux/home/CardsContainer.d.ts +108 -0
  44. package/src/sap/cux/home/CardsContainer.d.ts.map +1 -0
  45. package/src/sap/cux/home/CardsContainer.js +207 -0
  46. package/src/sap/cux/home/CardsContainer.js.map +1 -0
  47. package/src/sap/cux/home/CardsContainer.ts +202 -0
  48. package/src/sap/cux/home/CardsPanel.d.ts +32 -59
  49. package/src/sap/cux/home/CardsPanel.d.ts.map +1 -1
  50. package/src/sap/cux/home/CardsPanel.js +270 -249
  51. package/src/sap/cux/home/CardsPanel.js.map +1 -1
  52. package/src/sap/cux/home/CardsPanel.ts +169 -181
  53. package/src/sap/cux/home/ContentAdditionDialog.d.ts +2 -0
  54. package/src/sap/cux/home/ContentAdditionDialog.d.ts.map +1 -1
  55. package/src/sap/cux/home/ContentAdditionDialog.js +17 -7
  56. package/src/sap/cux/home/ContentAdditionDialog.js.map +1 -1
  57. package/src/sap/cux/home/ContentAdditionDialog.ts +18 -6
  58. package/src/sap/cux/home/ErrorPanel.d.ts +0 -5
  59. package/src/sap/cux/home/ErrorPanel.d.ts.map +1 -1
  60. package/src/sap/cux/home/ErrorPanel.gen.d.ts +31 -0
  61. package/src/sap/cux/home/ErrorPanel.js +11 -16
  62. package/src/sap/cux/home/ErrorPanel.js.map +1 -1
  63. package/src/sap/cux/home/ErrorPanel.ts +7 -19
  64. package/src/sap/cux/home/FavAppPanel.d.ts +1 -12
  65. package/src/sap/cux/home/FavAppPanel.d.ts.map +1 -1
  66. package/src/sap/cux/home/FavAppPanel.js +354 -414
  67. package/src/sap/cux/home/FavAppPanel.js.map +1 -1
  68. package/src/sap/cux/home/FavAppPanel.ts +25 -70
  69. package/src/sap/cux/home/FrequentAppPanel.d.ts.map +1 -1
  70. package/src/sap/cux/home/FrequentAppPanel.js +5 -1
  71. package/src/sap/cux/home/FrequentAppPanel.js.map +1 -1
  72. package/src/sap/cux/home/FrequentAppPanel.ts +4 -0
  73. package/src/sap/cux/home/InsightsAdditionPanel.d.ts +4 -4
  74. package/src/sap/cux/home/InsightsAdditionPanel.d.ts.map +1 -1
  75. package/src/sap/cux/home/InsightsAdditionPanel.js +12 -9
  76. package/src/sap/cux/home/InsightsAdditionPanel.js.map +1 -1
  77. package/src/sap/cux/home/InsightsAdditionPanel.ts +11 -8
  78. package/src/sap/cux/home/InsightsTilesSettingsPanel.js +1 -1
  79. package/src/sap/cux/home/InsightsTilesSettingsPanel.js.map +1 -1
  80. package/src/sap/cux/home/InsightsTilesSettingsPanel.ts +3 -3
  81. package/src/sap/cux/home/KeyUserLayoutSettingsPanel.d.ts +3 -0
  82. package/src/sap/cux/home/KeyUserLayoutSettingsPanel.d.ts.map +1 -1
  83. package/src/sap/cux/home/KeyUserLayoutSettingsPanel.js +252 -39
  84. package/src/sap/cux/home/KeyUserLayoutSettingsPanel.js.map +1 -1
  85. package/src/sap/cux/home/KeyUserLayoutSettingsPanel.ts +288 -58
  86. package/src/sap/cux/home/KeyUserNewsPagesSettingsPanel.d.ts.map +1 -1
  87. package/src/sap/cux/home/KeyUserNewsPagesSettingsPanel.js +11 -10
  88. package/src/sap/cux/home/KeyUserNewsPagesSettingsPanel.js.map +1 -1
  89. package/src/sap/cux/home/KeyUserNewsPagesSettingsPanel.ts +12 -10
  90. package/src/sap/cux/home/KeyUserNewsSettingsPanel.js +2 -2
  91. package/src/sap/cux/home/KeyUserNewsSettingsPanel.js.map +1 -1
  92. package/src/sap/cux/home/KeyUserNewsSettingsPanel.ts +7 -7
  93. package/src/sap/cux/home/KeyUserPagesSettingsPanel.js.map +1 -1
  94. package/src/sap/cux/home/KeyUserPagesSettingsPanel.ts +2 -2
  95. package/src/sap/cux/home/Layout.d.ts +3 -1
  96. package/src/sap/cux/home/Layout.d.ts.map +1 -1
  97. package/src/sap/cux/home/Layout.js +45 -8
  98. package/src/sap/cux/home/Layout.js.map +1 -1
  99. package/src/sap/cux/home/Layout.ts +55 -8
  100. package/src/sap/cux/home/LayoutSettingsPanel.d.ts +10 -0
  101. package/src/sap/cux/home/LayoutSettingsPanel.d.ts.map +1 -1
  102. package/src/sap/cux/home/LayoutSettingsPanel.js +341 -56
  103. package/src/sap/cux/home/LayoutSettingsPanel.js.map +1 -1
  104. package/src/sap/cux/home/LayoutSettingsPanel.ts +380 -64
  105. package/src/sap/cux/home/{NewsAndPagesContainer.d.ts → NewsContainer.d.ts} +13 -18
  106. package/src/sap/cux/home/NewsContainer.d.ts.map +1 -0
  107. package/src/sap/cux/home/{NewsAndPagesContainer.gen.d.ts → NewsContainer.gen.d.ts} +3 -3
  108. package/src/sap/cux/home/{NewsAndPagesContainer.js → NewsContainer.js} +26 -113
  109. package/src/sap/cux/home/NewsContainer.js.map +1 -0
  110. package/src/sap/cux/home/{NewsAndPagesContainer.ts → NewsContainer.ts} +31 -120
  111. package/src/sap/cux/home/NewsGroup.js.map +1 -1
  112. package/src/sap/cux/home/NewsGroup.ts +1 -1
  113. package/src/sap/cux/home/NewsPanel.d.ts +17 -0
  114. package/src/sap/cux/home/NewsPanel.d.ts.map +1 -1
  115. package/src/sap/cux/home/NewsPanel.js +90 -57
  116. package/src/sap/cux/home/NewsPanel.js.map +1 -1
  117. package/src/sap/cux/home/NewsPanel.ts +51 -23
  118. package/src/sap/cux/home/NewsSettingsPanel.d.ts +42 -6
  119. package/src/sap/cux/home/NewsSettingsPanel.d.ts.map +1 -1
  120. package/src/sap/cux/home/NewsSettingsPanel.js +219 -81
  121. package/src/sap/cux/home/NewsSettingsPanel.js.map +1 -1
  122. package/src/sap/cux/home/NewsSettingsPanel.ts +216 -81
  123. package/src/sap/cux/home/Page.d.ts.map +1 -1
  124. package/src/sap/cux/home/Page.js +4 -1
  125. package/src/sap/cux/home/Page.js.map +1 -1
  126. package/src/sap/cux/home/Page.ts +2 -0
  127. package/src/sap/cux/home/PagePanel.d.ts +1 -1
  128. package/src/sap/cux/home/PagePanel.d.ts.map +1 -1
  129. package/src/sap/cux/home/PagePanel.js +19 -11
  130. package/src/sap/cux/home/PagePanel.js.map +1 -1
  131. package/src/sap/cux/home/PagePanel.ts +26 -20
  132. package/src/sap/cux/home/PageSettingsPanel.d.ts.map +1 -1
  133. package/src/sap/cux/home/PageSettingsPanel.js +6 -3
  134. package/src/sap/cux/home/PageSettingsPanel.js.map +1 -1
  135. package/src/sap/cux/home/PageSettingsPanel.ts +2 -2
  136. package/src/sap/cux/home/PagesContainer.d.ts +72 -0
  137. package/src/sap/cux/home/PagesContainer.d.ts.map +1 -0
  138. package/src/sap/cux/home/PagesContainer.gen.d.ts +78 -0
  139. package/src/sap/cux/home/PagesContainer.js +333 -0
  140. package/src/sap/cux/home/PagesContainer.js.map +1 -0
  141. package/src/sap/cux/home/PagesContainer.ts +179 -0
  142. package/src/sap/cux/home/RecentAppPanel.d.ts.map +1 -1
  143. package/src/sap/cux/home/RecentAppPanel.js +6 -0
  144. package/src/sap/cux/home/RecentAppPanel.js.map +1 -1
  145. package/src/sap/cux/home/RecentAppPanel.ts +5 -1
  146. package/src/sap/cux/home/RecommendedAppPanel.d.ts.map +1 -1
  147. package/src/sap/cux/home/RecommendedAppPanel.js +7 -0
  148. package/src/sap/cux/home/RecommendedAppPanel.js.map +1 -1
  149. package/src/sap/cux/home/RecommendedAppPanel.ts +6 -1
  150. package/src/sap/cux/home/SettingsDialog.d.ts +7 -0
  151. package/src/sap/cux/home/SettingsDialog.d.ts.map +1 -1
  152. package/src/sap/cux/home/SettingsDialog.js +18 -10
  153. package/src/sap/cux/home/SettingsDialog.js.map +1 -1
  154. package/src/sap/cux/home/SettingsDialog.ts +20 -13
  155. package/src/sap/cux/home/SideBySideIconTabFilter.d.ts +10 -0
  156. package/src/sap/cux/home/SideBySideIconTabFilter.d.ts.map +1 -1
  157. package/src/sap/cux/home/SideBySideIconTabFilter.js +11 -1
  158. package/src/sap/cux/home/SideBySideIconTabFilter.js.map +1 -1
  159. package/src/sap/cux/home/SideBySideIconTabFilter.ts +11 -0
  160. package/src/sap/cux/home/SituationPanel.d.ts.map +1 -1
  161. package/src/sap/cux/home/SituationPanel.js +7 -2
  162. package/src/sap/cux/home/SituationPanel.js.map +1 -1
  163. package/src/sap/cux/home/SituationPanel.ts +2 -0
  164. package/src/sap/cux/home/SpaceInsightsPanel.d.ts +8 -60
  165. package/src/sap/cux/home/SpaceInsightsPanel.d.ts.map +1 -1
  166. package/src/sap/cux/home/SpaceInsightsPanel.js +67 -133
  167. package/src/sap/cux/home/SpaceInsightsPanel.js.map +1 -1
  168. package/src/sap/cux/home/SpaceInsightsPanel.ts +70 -152
  169. package/src/sap/cux/home/TaskPanel.d.ts.map +1 -1
  170. package/src/sap/cux/home/TaskPanel.js +17 -12
  171. package/src/sap/cux/home/TaskPanel.js.map +1 -1
  172. package/src/sap/cux/home/TaskPanel.ts +19 -16
  173. package/src/sap/cux/home/TilesContainer.d.ts +111 -0
  174. package/src/sap/cux/home/TilesContainer.d.ts.map +1 -0
  175. package/src/sap/cux/home/TilesContainer.js +218 -0
  176. package/src/sap/cux/home/TilesContainer.js.map +1 -0
  177. package/src/sap/cux/home/TilesContainer.ts +216 -0
  178. package/src/sap/cux/home/TilesPanel.d.ts +22 -52
  179. package/src/sap/cux/home/TilesPanel.d.ts.map +1 -1
  180. package/src/sap/cux/home/TilesPanel.js +194 -168
  181. package/src/sap/cux/home/TilesPanel.js.map +1 -1
  182. package/src/sap/cux/home/TilesPanel.ts +167 -157
  183. package/src/sap/cux/home/ToDoPanel.d.ts.map +1 -1
  184. package/src/sap/cux/home/ToDoPanel.js +59 -66
  185. package/src/sap/cux/home/ToDoPanel.js.map +1 -1
  186. package/src/sap/cux/home/ToDoPanel.ts +46 -34
  187. package/src/sap/cux/home/ToDosContainer.js +3 -3
  188. package/src/sap/cux/home/ToDosContainer.js.map +1 -1
  189. package/src/sap/cux/home/ToDosContainer.ts +1 -1
  190. package/src/sap/cux/home/changeHandler/NewsFeedVisibilityChange.d.ts +2 -2
  191. package/src/sap/cux/home/changeHandler/NewsFeedVisibilityChange.d.ts.map +1 -1
  192. package/src/sap/cux/home/changeHandler/NewsFeedVisibilityChange.js +1 -1
  193. package/src/sap/cux/home/changeHandler/NewsFeedVisibilityChange.js.map +1 -1
  194. package/src/sap/cux/home/changeHandler/NewsFeedVisibilityChange.ts +4 -4
  195. package/src/sap/cux/home/changeHandler/SetNewsFeedUrl.d.ts +2 -2
  196. package/src/sap/cux/home/changeHandler/SetNewsFeedUrl.d.ts.map +1 -1
  197. package/src/sap/cux/home/changeHandler/SetNewsFeedUrl.js +1 -1
  198. package/src/sap/cux/home/changeHandler/SetNewsFeedUrl.js.map +1 -1
  199. package/src/sap/cux/home/changeHandler/SetNewsFeedUrl.ts +4 -4
  200. package/src/sap/cux/home/changeHandler/SpacePageColorHandler.d.ts +2 -2
  201. package/src/sap/cux/home/changeHandler/SpacePageColorHandler.d.ts.map +1 -1
  202. package/src/sap/cux/home/changeHandler/SpacePageColorHandler.js +1 -1
  203. package/src/sap/cux/home/changeHandler/SpacePageColorHandler.js.map +1 -1
  204. package/src/sap/cux/home/changeHandler/SpacePageColorHandler.ts +3 -3
  205. package/src/sap/cux/home/changeHandler/SpacePageIconHandler.d.ts +2 -2
  206. package/src/sap/cux/home/changeHandler/SpacePageIconHandler.d.ts.map +1 -1
  207. package/src/sap/cux/home/changeHandler/SpacePageIconHandler.js +4 -4
  208. package/src/sap/cux/home/changeHandler/SpacePageIconHandler.js.map +1 -1
  209. package/src/sap/cux/home/changeHandler/SpacePageIconHandler.ts +5 -5
  210. package/src/sap/cux/home/flexibility/BaseContainer.flexibility.d.ts.map +1 -1
  211. package/src/sap/cux/home/flexibility/BaseContainer.flexibility.js +30 -3
  212. package/src/sap/cux/home/flexibility/BaseContainer.flexibility.js.map +1 -1
  213. package/src/sap/cux/home/flexibility/BaseContainer.flexibility.ts +23 -1
  214. package/src/sap/cux/home/flexibility/Layout.flexibility.d.ts +29 -19
  215. package/src/sap/cux/home/flexibility/Layout.flexibility.d.ts.map +1 -1
  216. package/src/sap/cux/home/flexibility/Layout.flexibility.js +78 -2
  217. package/src/sap/cux/home/flexibility/Layout.flexibility.js.map +1 -1
  218. package/src/sap/cux/home/flexibility/Layout.flexibility.ts +81 -1
  219. package/src/sap/cux/home/i18n/messagebundle.properties +40 -14
  220. package/src/sap/cux/home/i18n/messagebundle_ar.properties +8 -4
  221. package/src/sap/cux/home/i18n/messagebundle_bg.properties +8 -4
  222. package/src/sap/cux/home/i18n/messagebundle_ca.properties +8 -4
  223. package/src/sap/cux/home/i18n/messagebundle_cnr.properties +8 -4
  224. package/src/sap/cux/home/i18n/messagebundle_cs.properties +8 -4
  225. package/src/sap/cux/home/i18n/messagebundle_cy.properties +8 -4
  226. package/src/sap/cux/home/i18n/messagebundle_da.properties +8 -4
  227. package/src/sap/cux/home/i18n/messagebundle_de.properties +8 -4
  228. package/src/sap/cux/home/i18n/messagebundle_el.properties +8 -4
  229. package/src/sap/cux/home/i18n/messagebundle_en.properties +9 -5
  230. package/src/sap/cux/home/i18n/messagebundle_en_GB.properties +8 -4
  231. package/src/sap/cux/home/i18n/messagebundle_en_US_sappsd.properties +14 -6
  232. package/src/sap/cux/home/i18n/messagebundle_en_US_saprigi.properties +14 -6
  233. package/src/sap/cux/home/i18n/messagebundle_en_US_saptrc.properties +8 -4
  234. package/src/sap/cux/home/i18n/messagebundle_es.properties +8 -4
  235. package/src/sap/cux/home/i18n/messagebundle_es_MX.properties +8 -4
  236. package/src/sap/cux/home/i18n/messagebundle_et.properties +8 -4
  237. package/src/sap/cux/home/i18n/messagebundle_fi.properties +8 -4
  238. package/src/sap/cux/home/i18n/messagebundle_fr.properties +8 -4
  239. package/src/sap/cux/home/i18n/messagebundle_fr_CA.properties +8 -4
  240. package/src/sap/cux/home/i18n/messagebundle_hi.properties +8 -4
  241. package/src/sap/cux/home/i18n/messagebundle_hr.properties +8 -4
  242. package/src/sap/cux/home/i18n/messagebundle_hu.properties +8 -4
  243. package/src/sap/cux/home/i18n/messagebundle_id.properties +8 -4
  244. package/src/sap/cux/home/i18n/messagebundle_it.properties +10 -6
  245. package/src/sap/cux/home/i18n/messagebundle_iw.properties +8 -4
  246. package/src/sap/cux/home/i18n/messagebundle_ja.properties +8 -4
  247. package/src/sap/cux/home/i18n/messagebundle_kk.properties +8 -4
  248. package/src/sap/cux/home/i18n/messagebundle_ko.properties +8 -4
  249. package/src/sap/cux/home/i18n/messagebundle_lt.properties +8 -4
  250. package/src/sap/cux/home/i18n/messagebundle_lv.properties +8 -4
  251. package/src/sap/cux/home/i18n/messagebundle_mk.properties +8 -4
  252. package/src/sap/cux/home/i18n/messagebundle_ms.properties +8 -4
  253. package/src/sap/cux/home/i18n/messagebundle_nl.properties +8 -4
  254. package/src/sap/cux/home/i18n/messagebundle_no.properties +8 -4
  255. package/src/sap/cux/home/i18n/messagebundle_pl.properties +8 -4
  256. package/src/sap/cux/home/i18n/messagebundle_pt.properties +9 -5
  257. package/src/sap/cux/home/i18n/messagebundle_pt_PT.properties +8 -4
  258. package/src/sap/cux/home/i18n/messagebundle_ro.properties +8 -4
  259. package/src/sap/cux/home/i18n/messagebundle_ru.properties +8 -4
  260. package/src/sap/cux/home/i18n/messagebundle_sh.properties +8 -4
  261. package/src/sap/cux/home/i18n/messagebundle_sk.properties +8 -4
  262. package/src/sap/cux/home/i18n/messagebundle_sl.properties +8 -4
  263. package/src/sap/cux/home/i18n/messagebundle_sr.properties +8 -4
  264. package/src/sap/cux/home/i18n/messagebundle_sv.properties +8 -4
  265. package/src/sap/cux/home/i18n/messagebundle_th.properties +8 -4
  266. package/src/sap/cux/home/i18n/messagebundle_tr.properties +8 -4
  267. package/src/sap/cux/home/i18n/messagebundle_uk.properties +8 -4
  268. package/src/sap/cux/home/i18n/messagebundle_vi.properties +8 -4
  269. package/src/sap/cux/home/i18n/messagebundle_zh_CN.properties +8 -4
  270. package/src/sap/cux/home/i18n/messagebundle_zh_TW.properties +8 -4
  271. package/src/sap/cux/home/interface/AppsInterface.d.ts +6 -0
  272. package/src/sap/cux/home/interface/AppsInterface.d.ts.map +1 -1
  273. package/src/sap/cux/home/interface/AppsInterface.js.map +1 -1
  274. package/src/sap/cux/home/interface/AppsInterface.ts +7 -0
  275. package/src/sap/cux/home/interface/KeyUserInterface.d.ts +27 -4
  276. package/src/sap/cux/home/interface/KeyUserInterface.d.ts.map +1 -1
  277. package/src/sap/cux/home/interface/KeyUserInterface.js.map +1 -1
  278. package/src/sap/cux/home/interface/KeyUserInterface.ts +23 -4
  279. package/src/sap/cux/home/interface/LayoutInterface.d.ts +7 -0
  280. package/src/sap/cux/home/interface/LayoutInterface.d.ts.map +1 -1
  281. package/src/sap/cux/home/interface/LayoutInterface.js.map +1 -1
  282. package/src/sap/cux/home/interface/LayoutInterface.ts +7 -0
  283. package/src/sap/cux/home/library.d.ts.map +1 -1
  284. package/src/sap/cux/home/library.js +7 -4
  285. package/src/sap/cux/home/library.js.map +1 -1
  286. package/src/sap/cux/home/library.ts +10 -5
  287. package/src/sap/cux/home/themes/base/AppsContainer.less +12 -1
  288. package/src/sap/cux/home/themes/base/BaseContainer.less +36 -0
  289. package/src/sap/cux/home/themes/base/BaseLayout.less +22 -0
  290. package/src/sap/cux/home/themes/base/{InsightsContainer.less → CardsContainer.less} +4 -45
  291. package/src/sap/cux/home/themes/base/ContentAdditionDialog.less +10 -18
  292. package/src/sap/cux/home/themes/base/PlaceHolder.less +1 -1
  293. package/src/sap/cux/home/themes/base/SettingsDialog.less +4 -0
  294. package/src/sap/cux/home/themes/base/TilesContainer.less +65 -0
  295. package/src/sap/cux/home/themes/base/ToDosContainer.less +4 -0
  296. package/src/sap/cux/home/themes/base/library.source.less +2 -1
  297. package/src/sap/cux/home/utils/AppManager.d.ts.map +1 -1
  298. package/src/sap/cux/home/utils/AppManager.js +2 -1
  299. package/src/sap/cux/home/utils/AppManager.js.map +1 -1
  300. package/src/sap/cux/home/utils/AppManager.ts +2 -2
  301. package/src/sap/cux/home/utils/FESRUtil.d.ts +30 -0
  302. package/src/sap/cux/home/utils/FESRUtil.d.ts.map +1 -1
  303. package/src/sap/cux/home/utils/FESRUtil.js +36 -1
  304. package/src/sap/cux/home/utils/FESRUtil.js.map +1 -1
  305. package/src/sap/cux/home/utils/FESRUtil.ts +36 -0
  306. package/src/sap/cux/home/utils/PXFeedback.d.ts +4 -0
  307. package/src/sap/cux/home/utils/PXFeedback.d.ts.map +1 -0
  308. package/src/sap/cux/home/utils/PXFeedback.js +28 -0
  309. package/src/sap/cux/home/utils/PXFeedback.js.map +1 -0
  310. package/src/sap/cux/home/utils/PXFeedback.ts +19 -0
  311. package/src/sap/cux/home/utils/PageManager.d.ts +0 -4
  312. package/src/sap/cux/home/utils/PageManager.d.ts.map +1 -1
  313. package/src/sap/cux/home/utils/PageManager.js +6 -6
  314. package/src/sap/cux/home/utils/PageManager.js.map +1 -1
  315. package/src/sap/cux/home/utils/PageManager.ts +6 -5
  316. package/src/sap/cux/home/utils/PerformanceUtils.d.ts +4 -2
  317. package/src/sap/cux/home/utils/PerformanceUtils.d.ts.map +1 -1
  318. package/src/sap/cux/home/utils/PerformanceUtils.js +4 -2
  319. package/src/sap/cux/home/utils/PerformanceUtils.js.map +1 -1
  320. package/src/sap/cux/home/utils/PerformanceUtils.ts +4 -2
  321. package/src/sap/cux/home/utils/fragment/appsAdditionContent.fragment.xml +155 -151
  322. package/src/sap/cux/home/utils/placeholder/CardsPlaceholder.d.ts +8 -0
  323. package/src/sap/cux/home/utils/placeholder/CardsPlaceholder.d.ts.map +1 -0
  324. package/src/sap/cux/home/utils/placeholder/{InsightsPlaceholder.js → CardsPlaceholder.js} +3 -77
  325. package/src/sap/cux/home/utils/placeholder/CardsPlaceholder.js.map +1 -0
  326. package/src/sap/cux/home/utils/placeholder/{InsightsPlaceholder.ts → CardsPlaceholder.ts} +1 -75
  327. package/src/sap/cux/home/utils/placeholder/NewsPlaceholder.d.ts +8 -0
  328. package/src/sap/cux/home/utils/placeholder/NewsPlaceholder.d.ts.map +1 -0
  329. package/src/sap/cux/home/utils/placeholder/NewsPlaceholder.js +44 -0
  330. package/src/sap/cux/home/utils/placeholder/NewsPlaceholder.js.map +1 -0
  331. package/src/sap/cux/home/utils/placeholder/NewsPlaceholder.ts +34 -0
  332. package/src/sap/cux/home/utils/placeholder/PagesPlaceholder.d.ts +8 -0
  333. package/src/sap/cux/home/utils/placeholder/PagesPlaceholder.d.ts.map +1 -0
  334. package/src/sap/cux/home/utils/placeholder/{NewsAndPagesPlaceholder.js → PagesPlaceholder.js} +3 -23
  335. package/src/sap/cux/home/utils/placeholder/PagesPlaceholder.js.map +1 -0
  336. package/src/sap/cux/home/utils/placeholder/{NewsAndPagesPlaceholder.ts → PagesPlaceholder.ts} +1 -21
  337. package/src/sap/cux/home/utils/placeholder/TilesPlaceholder.d.ts +8 -0
  338. package/src/sap/cux/home/utils/placeholder/TilesPlaceholder.d.ts.map +1 -0
  339. package/src/sap/cux/home/utils/placeholder/TilesPlaceholder.js +95 -0
  340. package/src/sap/cux/home/utils/placeholder/TilesPlaceholder.js.map +1 -0
  341. package/src/sap/cux/home/utils/placeholder/TilesPlaceholder.ts +85 -0
  342. package/ui5.yaml +1 -0
  343. package/src/sap/cux/home/InsightsContainer.d.ts +0 -205
  344. package/src/sap/cux/home/InsightsContainer.d.ts.map +0 -1
  345. package/src/sap/cux/home/InsightsContainer.js +0 -459
  346. package/src/sap/cux/home/InsightsContainer.js.map +0 -1
  347. package/src/sap/cux/home/InsightsContainer.ts +0 -489
  348. package/src/sap/cux/home/NewsAndPagesContainer.d.ts.map +0 -1
  349. package/src/sap/cux/home/NewsAndPagesContainer.js.map +0 -1
  350. package/src/sap/cux/home/utils/placeholder/InsightsPlaceholder.d.ts +0 -8
  351. package/src/sap/cux/home/utils/placeholder/InsightsPlaceholder.d.ts.map +0 -1
  352. package/src/sap/cux/home/utils/placeholder/InsightsPlaceholder.js.map +0 -1
  353. package/src/sap/cux/home/utils/placeholder/NewsAndPagesPlaceholder.d.ts +0 -8
  354. package/src/sap/cux/home/utils/placeholder/NewsAndPagesPlaceholder.d.ts.map +0 -1
  355. package/src/sap/cux/home/utils/placeholder/NewsAndPagesPlaceholder.js.map +0 -1
@@ -3,24 +3,31 @@
3
3
  * * (c) Copyright 2009-2025 SAP SE. All rights reserved
4
4
  */
5
5
 
6
+ import Localization from "sap/base/i18n/Localization";
6
7
  import Log from "sap/base/Log";
7
8
  import Button from "sap/m/Button";
8
9
  import CustomListItem from "sap/m/CustomListItem";
9
10
  import ExpandableText from "sap/m/ExpandableText";
10
11
  import FlexBox from "sap/m/FlexBox";
12
+ import FlexItemData from "sap/m/FlexItemData";
11
13
  import GenericTile, { GenericTile$PressEvent } from "sap/m/GenericTile";
12
14
  import HBox from "sap/m/HBox";
15
+ import IllustratedMessage from "sap/m/IllustratedMessage";
13
16
  import Label from "sap/m/Label";
14
- import { ButtonType, URLHelper } from "sap/m/library";
17
+ import { ButtonType, FlexAlignItems, FlexDirection, FlexJustifyContent, FlexRendertype, URLHelper } from "sap/m/library";
15
18
  import List from "sap/m/List";
16
19
  import { ListBase$SelectionChangeEvent } from "sap/m/ListBase";
17
20
  import MessageToast from "sap/m/MessageToast";
18
- import Text from "sap/m/Text";
21
+ import ObjectStatus from "sap/m/ObjectStatus";
22
+ import SegmentedButton from "sap/m/SegmentedButton";
23
+ import SegmentedButtonItem from "sap/m/SegmentedButtonItem";
24
+ import Switch, { Switch$ChangeEvent } from "sap/m/Switch";
19
25
  import TextArea, { TextArea$LiveChangeEvent } from "sap/m/TextArea";
26
+ import Title from "sap/m/Title";
20
27
  import VBox from "sap/m/VBox";
21
28
  import Control from "sap/ui/core/Control";
22
29
  import Fragment from "sap/ui/core/Fragment";
23
- import { ValueState } from "sap/ui/core/library";
30
+ import { TitleLevel, ValueState } from "sap/ui/core/library";
24
31
  import ChangeReason from "sap/ui/model/ChangeReason";
25
32
  import Context from "sap/ui/model/Context";
26
33
  import JSONModel from "sap/ui/model/json/JSONModel";
@@ -35,9 +42,10 @@ import BaseLayout from "./BaseLayout";
35
42
  import BaseSettingsPanel from "./BaseSettingsPanel";
36
43
  import ContentAdditionDialog from "./ContentAdditionDialog";
37
44
  import FavAppPanel from "./FavAppPanel";
38
- import InsightsContainer from "./InsightsContainer";
39
45
  import { ICustomVisualization, ICustomVizInstance, IVisualization } from "./interface/AppsInterface";
40
- import AppManager from "./utils/AppManager";
46
+ import TilesContainer from "./TilesContainer";
47
+ import { DisplayFormat } from "./TilesPanel";
48
+ import AppManager, { _isSmartBusinessTile } from "./utils/AppManager";
41
49
  import {
42
50
  AI_APP_FINDER_API,
43
51
  AI_APP_FINDER_BASE_URL,
@@ -45,16 +53,19 @@ import {
45
53
  DEFAULT_APP_ICON,
46
54
  FEATURE_TOGGLES,
47
55
  FESR_IDS,
56
+ MYHOME_PAGE_ID,
48
57
  MYINSIGHT_SECTION_ID
49
58
  } from "./utils/Constants";
50
59
  import { recycleId } from "./utils/DataFormatUtils";
51
60
  import { isNavigationSupportedForFeature } from "./utils/FeatureUtils";
52
61
  import { addFESRSemanticStepName, FESR_EVENTS } from "./utils/FESRUtil";
62
+ import { triggerPXIntegration } from "./utils/PXFeedback";
53
63
 
54
64
  const Constants = {
55
65
  DeprecatedInfoText: "deprecated",
56
66
  MinQueryLength: 2,
57
- MaxDescriptionLength: 500
67
+ MaxQueryLength: 2000,
68
+ MaxDescriptionLength: 300
58
69
  };
59
70
 
60
71
  enum SearchStatus {
@@ -69,7 +80,8 @@ enum ErrorType {
69
80
  }
70
81
 
71
82
  enum TileType {
72
- Static = "STATIC"
83
+ Static = "STATIC",
84
+ Dynamic = "DYNAMIC"
73
85
  }
74
86
 
75
87
  interface RawAppData {
@@ -81,16 +93,17 @@ interface RawAppData {
81
93
  iconUrl: string;
82
94
  configuration: string;
83
95
  }
84
- interface SuggestedApp {
96
+ export interface SuggestedApp {
85
97
  icon: string;
86
98
  title: string;
87
99
  chipID: string;
88
- status: string[];
89
100
  subTitle: string;
90
101
  description: string;
91
102
  isStaticApp: boolean;
92
- addedToHomePage: boolean;
103
+ addedToApps?: boolean;
104
+ addedToInsights?: boolean;
93
105
  vizData?: IVisualization;
106
+ isDeprecated?: boolean;
94
107
  }
95
108
 
96
109
  interface QueryResponse {
@@ -201,7 +214,7 @@ export default class AppsAdditionPanel extends BaseSettingsPanel {
201
214
 
202
215
  //load ui fragment
203
216
  const panelContent = (await Fragment.load({
204
- id: `${this.getId()}-content`,
217
+ id: recycleId(`${this.getId()}-content`),
205
218
  name: "sap.cux.home.utils.fragment.appsAdditionContent",
206
219
  controller: this
207
220
  })) as Control;
@@ -250,14 +263,13 @@ export default class AppsAdditionPanel extends BaseSettingsPanel {
250
263
  path: "/suggestedApps",
251
264
  factory: this._generateListItem.bind(this),
252
265
  sorter: new Sorter({
253
- path: "status",
254
- comparator: (firstApp: string[], secondApp: string[]) => {
255
- const getPriority = (statusArray: string[]) => {
256
- if (statusArray.length === 0) return 0; // Empty array has highest priority
257
-
258
- const hasAlreadyAdded = statusArray.includes(this._i18nBundle.getText("alreadyAddedApp") as string);
259
- const hasDeprecated = statusArray.includes(this._i18nBundle.getText("deprecatedApp") as string);
266
+ path: "",
267
+ comparator: (firstApp: SuggestedApp, secondApp: SuggestedApp) => {
268
+ const getPriority = (app: SuggestedApp) => {
269
+ const hasAlreadyAdded = app.isStaticApp ? app.addedToApps : app.addedToInsights;
270
+ const hasDeprecated = app.isDeprecated;
260
271
 
272
+ if (!hasAlreadyAdded && !hasDeprecated) return 0; // Neither status - highest priority
261
273
  if (hasAlreadyAdded && hasDeprecated) return 3; // Both statuses - lowest priority
262
274
  if (hasAlreadyAdded) return 1; // Only "Already Added"
263
275
  if (hasDeprecated) return 2; // Only "Deprecated"
@@ -294,21 +306,31 @@ export default class AppsAdditionPanel extends BaseSettingsPanel {
294
306
  * @returns {CustomListItem} The generated list item control.
295
307
  */
296
308
  private _generateListItem(id: string, context: Context): CustomListItem {
309
+ const langTag = Localization.getLanguageTag();
310
+ const currentLanguage = langTag.language.toLowerCase();
311
+ const isEnglishLanguage = currentLanguage.startsWith("en");
297
312
  const listItem = new CustomListItem(id, {
298
- selected: context.getProperty("addedToHomePage") as boolean,
313
+ //when toggled b/w app and tile view, the selection should update according to whether the app is already added to selected section
314
+ selected: {
315
+ path: "selectedView",
316
+ formatter: () => {
317
+ const isAppAlreadyAdded = this.isAppAlreadyAdded(context);
318
+ //bind associated checkbox to disable it when the app is already added
319
+ listItem.getMultiSelectControl(true).setEnabled(!isAppAlreadyAdded);
320
+ // if app is already added or if user has selected the app, mark it as selected
321
+ return isAppAlreadyAdded || this.userSelectedApps.has(listItem);
322
+ }
323
+ },
299
324
  content: [
300
325
  new FlexBox(recycleId(`${id}-result-container`), {
301
- renderType: "Bare",
302
- direction: context.getProperty("isStaticApp") ? "Column" : "Row",
303
- alignItems: context.getProperty("isStaticApp") ? "Start" : "Center",
304
- items: [this._getAppPreviewContainer(id, context), this._getAppDetailsContainer(id, context)]
326
+ renderType: FlexRendertype.Bare,
327
+ direction: FlexDirection.Row,
328
+ gap: "1rem",
329
+ items: [this._getAppDetailsContainer(id, context, isEnglishLanguage), this._getAppPreviewContainer(id, context)]
305
330
  }).addStyleClass("sapUiSmallMargin")
306
331
  ]
307
332
  });
308
333
 
309
- //bind associated checkbox to disable it when the app is already added to home page
310
- listItem.getMultiSelectControl(true).setEnabled(!context.getProperty("addedToHomePage"));
311
-
312
334
  return listItem;
313
335
  }
314
336
 
@@ -322,37 +344,69 @@ export default class AppsAdditionPanel extends BaseSettingsPanel {
322
344
  */
323
345
  private _getAppPreviewContainer(id: string, context: Context): HBox {
324
346
  const container = new HBox(recycleId(`${id}-suggestedAppContainer`), {
325
- renderType: "Bare"
347
+ renderType: FlexRendertype.Bare,
348
+ width: "19rem",
349
+ layoutData: new FlexItemData({
350
+ growFactor: 0,
351
+ shrinkFactor: 0,
352
+ alignSelf: FlexAlignItems.Center
353
+ }),
354
+ justifyContent: FlexJustifyContent.Center
326
355
  });
356
+ container.addItem(
357
+ new GenericTile(recycleId(`${id}-staticApp`), {
358
+ mode: "IconMode",
359
+ frameType: "TwoByHalf",
360
+ width: "19rem",
361
+ header: context.getProperty("title") as string,
362
+ subheader: context.getProperty("subTitle") as string,
363
+ tileIcon: (context.getProperty("icon") as string) || DEFAULT_APP_ICON,
364
+ visible: "{= ${selectedView} === 'STATIC' || ${isStaticApp} }",
365
+ url: context.getProperty("url") as string,
366
+ press: (event: GenericTile$PressEvent) => {
367
+ this._persistDialog(this.getParent() as ContentAdditionDialog);
368
+ URLHelper.redirect(event.getSource()?.getUrl(), false);
369
+ }
370
+ }).addStyleClass("suggestedTile")
371
+ );
372
+
373
+ if (!(context.getProperty("isStaticApp") as boolean)) {
374
+ const vizData = context.getProperty("vizData") as IVisualization;
375
+ const supportedDisplayFormatVizs = [
376
+ {
377
+ ...vizData,
378
+ displayFormatHint: DisplayFormat.Standard
379
+ }
380
+ ];
381
+ if (this.isWideTileSupported(context)) {
382
+ supportedDisplayFormatVizs.push({
383
+ ...vizData,
384
+ displayFormatHint: DisplayFormat.StandardWide
385
+ });
386
+ }
327
387
 
328
- if (context.getProperty("isStaticApp") as boolean) {
329
- // create generic tile for static app
330
- container.addItem(
331
- new GenericTile(recycleId(`${id}-staticApp`), {
332
- mode: "IconMode",
333
- frameType: "TwoByHalf",
334
- width: "19rem",
335
- header: context.getProperty("title") as string,
336
- subheader: context.getProperty("subTitle") as string,
337
- tileIcon: (context.getProperty("icon") as string) || DEFAULT_APP_ICON,
338
- visible: context.getProperty("isStaticApp") as boolean,
339
- url: context.getProperty("url") as string,
340
- press: (event: GenericTile$PressEvent) => {
341
- this._persistDialog(this.getParent() as ContentAdditionDialog);
342
- URLHelper.redirect(event.getSource()?.getUrl(), false);
388
+ supportedDisplayFormatVizs.forEach((vizData) => {
389
+ // instantiate visualization for dynamic app
390
+ const vizInstance = this.vizInstantiationService.instantiateVisualization(vizData) as ICustomVizInstance;
391
+ vizInstance?.setActive(true);
392
+ vizInstance?.setProperty("sizeBehavior", "Small", true);
393
+ vizInstance?.attachPress(() => this._persistDialog(this.getParent() as ContentAdditionDialog));
394
+ vizInstance.bindProperty("visible", {
395
+ parts: ["selectedDisplayFormat", "selectedView"],
396
+ formatter: (selectedDisplayFormat: DisplayFormat, selectedView: TileType) => {
397
+ if (selectedView && selectedView === TileType.Static) {
398
+ return false;
399
+ }
400
+ return vizData.displayFormatHint === DisplayFormat.StandardWide
401
+ ? selectedDisplayFormat === DisplayFormat.StandardWide
402
+ : selectedDisplayFormat !== DisplayFormat.StandardWide;
343
403
  }
344
- }).addStyleClass("suggestedTile")
345
- );
346
- } else {
347
- // create custom visualization for other apps
348
- const vizData = context.getProperty("vizData") as ICustomVisualization;
349
- const instance = this.vizInstantiationService.instantiateVisualization(vizData) as ICustomVizInstance;
350
- instance?.setActive(true);
351
- instance?.attachPress(() => this._persistDialog(this.getParent() as ContentAdditionDialog));
352
- container.addItem(instance);
404
+ });
405
+ container.addItem(vizInstance);
406
+ });
353
407
  }
354
408
 
355
- return container;
409
+ return container.addStyleClass("suggestedAppPreviewContainer");
356
410
  }
357
411
 
358
412
  /**
@@ -361,33 +415,70 @@ export default class AppsAdditionPanel extends BaseSettingsPanel {
361
415
  * @private
362
416
  * @param {string} id - The unique ID for the container.
363
417
  * @param {Context} context - The binding context for the app.
418
+ * @param {boolean} isEnglishLanguage - Flag indicating if the language is english.
364
419
  * @returns {VBox} The app details container.
365
420
  */
366
- private _getAppDetailsContainer(id: string, context: Context): VBox {
421
+ private _getAppDetailsContainer(id: string, context: Context, isEnglishLanguage: boolean): VBox {
422
+ let description = isEnglishLanguage
423
+ ? (context.getProperty("description") as string)
424
+ : (this._i18nBundle.getText("NoDescriptionAvailable") as string);
367
425
  return new VBox(recycleId(`${id}-app-details-container`), {
368
- renderType: "Bare",
426
+ renderType: FlexRendertype.Bare,
369
427
  gap: "0.5rem",
428
+ layoutData: new FlexItemData({
429
+ growFactor: 1
430
+ }),
370
431
  items: [
432
+ new HBox(recycleId(`${id}-title-container`), {
433
+ gap: "1rem",
434
+ alignItems: FlexAlignItems.Center,
435
+ renderType: FlexRendertype.Bare,
436
+ items: [
437
+ new Title(recycleId(`${id}-app-title`), {
438
+ text: context.getProperty("title") as string,
439
+ titleStyle: TitleLevel.H6
440
+ }),
441
+ new ObjectStatus(recycleId(`${id}-deprecatedApp`), {
442
+ text: this._i18nBundle.getText("deprecatedApp") as string,
443
+ icon: "sap-icon://alert",
444
+ state: ValueState.Warning,
445
+ visible: context.getProperty("isDeprecated") as boolean
446
+ })
447
+ ]
448
+ }),
371
449
  new ExpandableText(recycleId(`${id}-description`), {
372
- text: context.getProperty("description") as string,
450
+ text: description,
373
451
  maxCharacters: Constants.MaxDescriptionLength
374
452
  }),
453
+ // app actions container
454
+ new HBox(recycleId(`${id}-app-actions-container`), {
455
+ renderType: FlexRendertype.Bare,
456
+ gap: "1.5rem",
457
+ visible: !context.getProperty("isStaticApp"),
458
+ items: [this.getAppViewTypeAction(id), this.getDisplayFormatAction(id, context)]
459
+ }),
375
460
  new HBox(recycleId(`${id}-app-status-container`), {
376
- renderType: "Bare",
377
- visible: (context.getProperty("status") as string[]).length > 0,
461
+ renderType: FlexRendertype.Bare,
462
+ visible: {
463
+ parts: ["selectedView"],
464
+ formatter: () => {
465
+ return this.isAppAlreadyAdded(context);
466
+ }
467
+ },
378
468
  items: [
379
469
  new Label(recycleId(`${id}-appStatusLabel`), {
380
470
  text: this._i18nBundle.getText("appStatus"),
381
471
  showColon: true
382
472
  }),
383
- new HBox(recycleId(`${id}-app-status-texts`), {
384
- renderType: "Bare",
385
- items: this._generateStatusTexts(id, context.getProperty("status") as string[])
386
- }).addStyleClass("sapUiTinyMarginBegin statusTextsContainer")
473
+ new ObjectStatus(recycleId(`${id}-alreadyAddedStatus`), {
474
+ text: "{= (${isStaticApp} || ${selectedView} === 'STATIC') ? ${i18n>alreadyAddedApp} : ${i18n>alreadyAddedTile} }",
475
+ icon: "sap-icon://sys-enter-2",
476
+ state: "Success"
477
+ }).addStyleClass("sapUiTinyMarginBegin")
387
478
  ]
388
- })
479
+ }).addStyleClass("sapUiTinyMarginTop")
389
480
  ]
390
- }).addStyleClass((context.getProperty("isStaticApp") as boolean) ? "sapUiSmallMarginTop" : "sapUiSmallMarginBegin");
481
+ });
391
482
  }
392
483
 
393
484
  /**
@@ -458,15 +549,16 @@ export default class AppsAdditionPanel extends BaseSettingsPanel {
458
549
  `<svg height="167" fill="none">
459
550
  ${loadingShimmer}
460
551
  <rect x="16" y="75" width="16" height="16" rx="4" fill="var(--sapContent_Placeholderloading_Background)"/>
461
- <rect x="48" y="16" width="37%" height="70" rx="16" fill="url(#loadingShimmer)"/>
462
- <rect x="48" y="102" width="93%" height="48" rx="4" fill="url(#loadingShimmer)"/>
552
+ <rect x="48" y="54" width="59%" height="48" rx="4" fill="url(#loadingShimmer)"/>
553
+ <rect x="48" y="110" width="13%" height="16" rx="4" fill="url(#loadingShimmer)"/>
554
+ <rect x="600" y="40" width="303" height="70" rx="16" fill="url(#loadingShimmer)"/>
463
555
  </svg>`,
464
556
  `<svg height="180" fill="none">
465
557
  ${loadingShimmer}
466
558
  <rect x="16" y="82" width="16" height="16" rx="4" fill="var(--sapContent_Placeholderloading_Background)"/>
467
- <rect x="48" y="16" width="148" height="148" rx="16" fill="url(#loadingShimmer)"/>
468
- <rect x="212" y="54" width="75%" height="48" rx="4" fill="url(#loadingShimmer)"/>
469
- <rect x="212" y="110" width="13%" height="16" rx="4" fill="url(#loadingShimmer)"/>
559
+ <rect x="48" y="54" width="58%" height="48" rx="4" fill="url(#loadingShimmer)"/>
560
+ <rect x="48" y="110" width="13%" height="16" rx="4" fill="url(#loadingShimmer)"/>
561
+ <rect x="675" y="16" width="148" height="148" rx="16" fill="url(#loadingShimmer)"/>
470
562
  </svg>`
471
563
  ];
472
564
  }
@@ -511,6 +603,21 @@ export default class AppsAdditionPanel extends BaseSettingsPanel {
511
603
  this.userSelectedApps?.clear();
512
604
  }
513
605
 
606
+ public setIllustrationSize(): void {
607
+ const containerDom = (Fragment.byId(`${this.getId()}-content`, "container") as VBox)?.getDomRef() as HTMLElement;
608
+ if (containerDom) {
609
+ const clientHeight = containerDom.clientHeight;
610
+ const illustratedMessage = Fragment.byId(`${this.getId()}-content`, "beforeSearch") as IllustratedMessage;
611
+ if (clientHeight <= 500) {
612
+ illustratedMessage.setIllustrationSize("ExtraSmall");
613
+ } else if (500 < clientHeight && clientHeight < 650) {
614
+ illustratedMessage.setIllustrationSize("Small");
615
+ } else {
616
+ illustratedMessage.setIllustrationSize("Medium");
617
+ }
618
+ }
619
+ }
620
+
514
621
  /**
515
622
  * Handles the "Go" button press event for searching suggested apps.
516
623
  *
@@ -534,7 +641,7 @@ export default class AppsAdditionPanel extends BaseSettingsPanel {
534
641
  const insightsApps = await this.appManagerInstance.fetchInsightApps(true, this._i18nBundle.getText("insights") as string);
535
642
 
536
643
  // generate suggested apps
537
- const apps = this._generateApps(rawApps, allVisualizations, [...favoriteApps, ...insightsApps]);
644
+ const apps = this._generateApps(rawApps, allVisualizations, favoriteApps, insightsApps);
538
645
  const suggestedApps = await this._filterUnsupportedApps(apps);
539
646
 
540
647
  if (suggestedApps.length === 0 && !this.model.getProperty("/hasError")) {
@@ -547,8 +654,9 @@ export default class AppsAdditionPanel extends BaseSettingsPanel {
547
654
  }
548
655
  }
549
656
  } catch (err) {
550
- Log.error((err as Error).message);
551
- this._handleError();
657
+ const message = (err as Error).message || "";
658
+ Log.error(message);
659
+ this._handleError(message);
552
660
  } finally {
553
661
  // update search status only if search is not cancelled
554
662
  if (this.model.getProperty("/searchStatus") === SearchStatus.Searching) {
@@ -579,17 +687,21 @@ export default class AppsAdditionPanel extends BaseSettingsPanel {
579
687
  * @private
580
688
  * @param {RawAppData[]} rawApps - The raw app data to process.
581
689
  * @param {IVisualization[]} allVisualizations - All available visualizations.
582
- * @param {ICustomVisualization[]} homePageVisualizations - Visualizations available in homepage.
690
+ * @param {ICustomVisualization[]} favoriteApps - Favorite apps available in homepage.
691
+ * @param {ICustomVisualization[]} insightsApps - Insights apps available in homepage.
583
692
  * @returns {SuggestedApp[]} The list of suggested apps.
584
693
  */
585
694
  private _generateApps(
586
695
  rawApps: RawAppData[],
587
696
  allVisualizations: IVisualization[],
588
- homePageVisualizations: ICustomVisualization[]
697
+ favoriteApps: ICustomVisualization[],
698
+ insightsApps: ICustomVisualization[]
589
699
  ): SuggestedApp[] {
590
700
  return rawApps.map((app) => {
591
701
  const vizData = allVisualizations.find((viz) => viz.vizId === app.chipID);
592
- const addedToHomePage = homePageVisualizations.some((viz) => viz.visualization?.vizId === app.chipID);
702
+ const addedToApps = favoriteApps.some((viz) => viz.visualization?.vizId === app.chipID);
703
+ const addedToInsights = insightsApps.some((viz) => viz.visualization?.vizId === app.chipID);
704
+ const tileConfig = this.parseTileConfiguration(app.configuration);
593
705
  return {
594
706
  title: app.title,
595
707
  chipID: app.chipID,
@@ -597,10 +709,12 @@ export default class AppsAdditionPanel extends BaseSettingsPanel {
597
709
  description: app.appDescription,
598
710
  icon: app.iconUrl,
599
711
  vizData,
600
- addedToHomePage,
712
+ addedToApps,
713
+ addedToInsights,
601
714
  isStaticApp: app.tileType === TileType.Static,
602
- status: this.getAppStatusTexts(app.configuration, addedToHomePage),
603
- url: vizData?.targetURL || ""
715
+ url: vizData?.targetURL || "",
716
+ isDeprecated: (tileConfig?.display_info_text || "").toLowerCase() === Constants.DeprecatedInfoText,
717
+ selectedView: app.tileType === TileType.Static ? TileType.Static : TileType.Dynamic
604
718
  };
605
719
  }) as SuggestedApp[];
606
720
  }
@@ -614,7 +728,7 @@ export default class AppsAdditionPanel extends BaseSettingsPanel {
614
728
  */
615
729
  private isValidQuery(query: string = ""): boolean {
616
730
  query = query?.trim();
617
- return query.length >= Constants.MinQueryLength && query.length <= Constants.MaxDescriptionLength;
731
+ return query.length >= Constants.MinQueryLength && query.length <= Constants.MaxQueryLength;
618
732
  }
619
733
 
620
734
  /**
@@ -662,97 +776,26 @@ export default class AppsAdditionPanel extends BaseSettingsPanel {
662
776
  * @returns {Promise<RawAppData[]>} A promise that resolves to the list of raw app data.
663
777
  */
664
778
  private async fetchAppsFromSearch(query: string): Promise<RawAppData[]> {
665
- try {
666
- const token = await this._fetchCSRFToken();
667
- const headers = {
668
- "Content-Type": "application/json",
669
- ...(token && { "X-CSRF-Token": token })
670
- };
671
-
672
- const response = await fetch(AI_APP_FINDER_API, {
673
- method: "POST",
674
- headers,
675
- body: JSON.stringify({ UserInput: query })
676
- });
677
-
678
- // handle error responses
679
- if (!response.ok) {
680
- const errorResponse = (await response.json()) as ErrorResponse;
681
- this._handleError(errorResponse.error?.message || "");
682
- return [];
683
- }
684
-
685
- const queryResult = (await response.json()) as QueryResponse;
686
- return queryResult.value || [];
687
- } catch (error) {
688
- Log.error((error as Error).message);
689
- this._handleError();
690
- return [];
691
- }
692
- }
693
-
694
- /**
695
- * Retrieves status texts for an app based on its configuration and homepage status.
696
- *
697
- * @private
698
- * @param {string} configuration - The app's configuration string.
699
- * @param {boolean} addedToHomePage - Indicates if the app is already added to the homepage.
700
- * @returns {string[]} An array of status texts for the app.
701
- */
702
- private getAppStatusTexts(configuration: string, addedToHomePage: boolean): string[] {
703
- let statusTexts = [];
704
-
705
- if (configuration) {
706
- try {
707
- const parsedConfig = JSON.parse(configuration) as Configuration;
708
- const tileConfig = JSON.parse(parsedConfig?.tileConfiguration) as TileConfig;
709
- const infoText = (tileConfig?.display_info_text || "").toLowerCase();
710
- if (infoText === Constants.DeprecatedInfoText) {
711
- statusTexts.push(this._i18nBundle.getText("deprecatedApp") as string);
712
- }
713
- } catch (error: unknown) {
714
- Log.warning((error as Error).message);
715
- }
716
- }
717
-
718
- if (addedToHomePage) {
719
- statusTexts.push(this._i18nBundle.getText("alreadyAddedApp") as string);
720
- }
721
-
722
- return statusTexts;
723
- }
779
+ const token = await this._fetchCSRFToken();
780
+ const headers = {
781
+ "Content-Type": "application/json",
782
+ ...(token && { "X-CSRF-Token": token })
783
+ };
724
784
 
725
- /**
726
- * Generates status text controls for the provided status texts.
727
- *
728
- * @private
729
- * @param {string} id - The id of the list item.
730
- * @param {string[]} stausTexts - The list of status texts.
731
- * @returns {Text[]} An array of Text controls with applied styles.
732
- */
733
- private _generateStatusTexts(id: string, stausTexts: string[]): Text[] {
734
- return stausTexts.map((status, index) => {
735
- return new Text(recycleId(`${id}-statusText-${index}`), {
736
- text: status
737
- }).addStyleClass(this.applyStatusClass(status));
785
+ const response = await fetch(AI_APP_FINDER_API, {
786
+ method: "POST",
787
+ headers,
788
+ body: JSON.stringify({ UserInput: query })
738
789
  });
739
- }
740
790
 
741
- /**
742
- * Applies a CSS class to the status text based on its type.
743
- *
744
- * @private
745
- * @param {string} status - The status text to classify.
746
- * @returns {string} The CSS class for the status text.
747
- */
748
- public applyStatusClass(status: string): string {
749
- if (status === this._i18nBundle.getText("alreadyAddedApp")) {
750
- return "addedAppStatusText";
751
- } else if (status === this._i18nBundle.getText("deprecatedApp")) {
752
- return "deprecatedAppStatusText";
753
- } else {
754
- return "";
791
+ // handle error responses
792
+ if (!response.ok) {
793
+ const errorResponse = (await response.json()) as ErrorResponse;
794
+ throw new Error(errorResponse.error?.message || "");
755
795
  }
796
+
797
+ const queryResult = (await response.json()) as QueryResponse;
798
+ return queryResult.value || [];
756
799
  }
757
800
 
758
801
  /**
@@ -762,17 +805,29 @@ export default class AppsAdditionPanel extends BaseSettingsPanel {
762
805
  * @async
763
806
  */
764
807
  private async onPressAddApps(): Promise<void> {
808
+ triggerPXIntegration("addAppsButton");
765
809
  const userSelectedApps = this.model.getProperty("/userSelectedApps") as CustomListItem[];
766
810
  let staticAppsPresent = false;
767
811
  let dynamicAppsPresent = false;
768
812
 
769
813
  for (const app of userSelectedApps) {
770
- const isStaticApp = app.getBindingContext()?.getProperty("isStaticApp") as boolean;
814
+ const isStaticApp =
815
+ (app.getBindingContext()?.getProperty("isStaticApp") as boolean) ||
816
+ app.getBindingContext()?.getProperty("selectedView") === TileType.Static;
817
+ const displayFormatHint = (app.getBindingContext()?.getProperty("vizData") as IVisualization)
818
+ ?.displayFormatHint as DisplayFormat;
819
+ const selectedDisplayFormat = app.getBindingContext()?.getProperty("selectedDisplayFormat") as DisplayFormat;
771
820
  if (isStaticApp) staticAppsPresent = true;
772
821
  else dynamicAppsPresent = true;
773
822
 
774
823
  const vizId = app.getBindingContext()?.getProperty("chipID") as string;
775
824
  await this.appManagerInstance.addVisualization(vizId, isStaticApp ? undefined : MYINSIGHT_SECTION_ID);
825
+ // for dynamic app, if display format is changed, update it
826
+ if (!isStaticApp && selectedDisplayFormat && displayFormatHint !== selectedDisplayFormat) {
827
+ // TODO: Check if addVisualization method in SpaceContent service can expose 'displayFormat' parameter to avoid this extra call
828
+ // since the internal Pages service method already supports it
829
+ await this.updateDisplayFormat(vizId, selectedDisplayFormat);
830
+ }
776
831
  }
777
832
 
778
833
  if (staticAppsPresent) {
@@ -840,25 +895,25 @@ export default class AppsAdditionPanel extends BaseSettingsPanel {
840
895
  }
841
896
 
842
897
  /**
843
- * Retrieves the InsightsContainer instance from the parent layout.
898
+ * Retrieves the TilesContainer instance from the parent layout.
844
899
  *
845
900
  * @private
846
- * @returns {InsightsContainer | undefined} The AppsContainer instance or undefined if not found.
901
+ * @returns {TilesContainer | undefined} The AppsContainer instance or undefined if not found.
847
902
  */
848
- private getInsightsContainer(): InsightsContainer | undefined {
903
+ private getTilesContainer(): TilesContainer | undefined {
849
904
  return this.getLayout()
850
905
  ?.getItems()
851
- .find((container) => container instanceof InsightsContainer);
906
+ .find((container) => container instanceof TilesContainer);
852
907
  }
853
908
 
854
909
  /**
855
- * Refreshes the Insights tiles panel in the InsightsContainer.
910
+ * Refreshes the Insights tiles panel in the TilesContainer.
856
911
  *
857
912
  * @private
858
913
  * @async
859
914
  */
860
915
  private async refreshInsightsApps(): Promise<void> {
861
- await this.getInsightsContainer()?.refreshData("tiles");
916
+ await this.getTilesContainer()?.refreshData("tiles");
862
917
  }
863
918
 
864
919
  /**
@@ -874,8 +929,7 @@ export default class AppsAdditionPanel extends BaseSettingsPanel {
874
929
  if (!selected) this.userSelectedApps.delete(listItem);
875
930
  else {
876
931
  const context = listItem.getBindingContext();
877
- const addedToHomePage = context?.getProperty("addedToHomePage") as boolean;
878
- if (!addedToHomePage) this.userSelectedApps.add(listItem);
932
+ if (context && !this.isAppAlreadyAdded(context)) this.userSelectedApps.add(listItem);
879
933
  }
880
934
 
881
935
  this.model.setProperty("/userSelectedApps", Array.from(this.userSelectedApps));
@@ -925,7 +979,7 @@ export default class AppsAdditionPanel extends BaseSettingsPanel {
925
979
  if (query.length !== 0 && query.length < Constants.MinQueryLength) {
926
980
  textArea.setValueState(ValueState.Information);
927
981
  textArea.setValueStateText(this._i18nBundle.getText("minLengthRequired"));
928
- } else if (query.length > Constants.MaxDescriptionLength) {
982
+ } else if (query.length > Constants.MaxQueryLength) {
929
983
  textArea.setValueState(ValueState.Warning);
930
984
  textArea.setValueStateText(this._i18nBundle.getText("maxLengthExceeded"));
931
985
  } else {
@@ -967,8 +1021,178 @@ export default class AppsAdditionPanel extends BaseSettingsPanel {
967
1021
  public sendFeedback(feedbackType: string): void {
968
1022
  this.resetFeedback();
969
1023
  this.model.setProperty(`/feedback/${feedbackType}`, true);
1024
+ triggerPXIntegration(feedbackType);
970
1025
  MessageToast.show(this._i18nBundle.getText("feedBackSent") as string, {
971
1026
  width: "20em"
972
1027
  });
973
1028
  }
1029
+
1030
+ /**
1031
+ * Creates the action to change view type (App / Tile) for suggested app.
1032
+ *
1033
+ * @private
1034
+ * @param {string} id - The unique ID for the container.
1035
+ * @returns {HBox} The app view action container.
1036
+ */
1037
+ private getAppViewTypeAction(id: string): HBox {
1038
+ const appViewToggleButton = new SegmentedButton(recycleId(`${id}-app-addAs-segmentedBtn`), {
1039
+ selectedKey: "{selectedView}",
1040
+ items: [
1041
+ new SegmentedButtonItem(recycleId(`${id}-addAs-app`), {
1042
+ key: TileType.Static,
1043
+ text: this._i18nBundle.getText("addAsApp")
1044
+ }),
1045
+ new SegmentedButtonItem(recycleId(`${id}-addAs-tile`), {
1046
+ key: TileType.Dynamic,
1047
+ text: this._i18nBundle.getText("addAsTile")
1048
+ })
1049
+ ]
1050
+ }).addStyleClass("sapUiTinyMarginBegin");
1051
+
1052
+ const appViewLabel = new Label(recycleId(`${id}-addAsLabel`), {
1053
+ text: this._i18nBundle.getText("addAs"),
1054
+ showColon: true
1055
+ });
1056
+
1057
+ try {
1058
+ appViewToggleButton.setProperty("contentMode", "ContentFit");
1059
+ appViewLabel.setWidth("100%");
1060
+ } catch (error) {
1061
+ Log.error(error instanceof Error ? error.message : (error as string));
1062
+ }
1063
+
1064
+ return new HBox(recycleId(`${id}-app-addAs-container`), {
1065
+ renderType: FlexRendertype.Bare,
1066
+ alignItems: FlexAlignItems.Center,
1067
+ items: [appViewLabel, appViewToggleButton]
1068
+ });
1069
+ }
1070
+
1071
+ /**
1072
+ * Creates the action to change display format (standard / wide) for suggested tile.
1073
+ *
1074
+ * @private
1075
+ * @param {string} id - The unique ID for the container.
1076
+ * @param {Context} context - The binding context for the app.
1077
+ * @returns {HBox} The display format action container.
1078
+ */
1079
+ private getDisplayFormatAction(id: string, context: Context): HBox {
1080
+ return new HBox(recycleId(`${id}-app-displayFormatSwitch-container`), {
1081
+ renderType: FlexRendertype.Bare,
1082
+ alignItems: FlexAlignItems.Center,
1083
+ visible: {
1084
+ parts: ["selectedView"],
1085
+ formatter: (selectedView: TileType) => {
1086
+ return selectedView !== TileType.Static && this.isWideTileSupported(context);
1087
+ }
1088
+ },
1089
+ items: [
1090
+ new Label(recycleId(`${id}-displayFormatSwitchLabel`), {
1091
+ text: this._i18nBundle.getText("wide"),
1092
+ showColon: true
1093
+ }),
1094
+ new Switch({
1095
+ id: `${id}-displayFormatSwitch`,
1096
+ state: (context.getProperty("vizData") as IVisualization)?.displayFormatHint !== DisplayFormat.Standard,
1097
+ customTextOn: " ",
1098
+ customTextOff: " ",
1099
+ change: (event) => this.toggleDisplayFormat(event, context)
1100
+ }).addStyleClass("sapUiTinyMarginBegin")
1101
+ ]
1102
+ });
1103
+ }
1104
+
1105
+ /**
1106
+ * Checks if the visualization supports wide tile conversion.
1107
+ *
1108
+ * @private
1109
+ * @param {Context} context - The binding context for the app.
1110
+ * @returns {boolean} True if wide display format is supported, false otherwise.
1111
+ */
1112
+ private isWideTileSupported(context: Context): boolean {
1113
+ const vizData = context.getProperty("vizData") as IVisualization;
1114
+ const supportedDisplayFormats = vizData?.supportedDisplayFormats || ([] as string[]);
1115
+ return (
1116
+ vizData &&
1117
+ (vizData.indicatorDataSource || _isSmartBusinessTile(vizData)) &&
1118
+ supportedDisplayFormats.includes(DisplayFormat.Standard) &&
1119
+ supportedDisplayFormats.includes(DisplayFormat.StandardWide)
1120
+ );
1121
+ }
1122
+
1123
+ /**
1124
+ * Handler to switch between standard and wide format for tile.
1125
+ *
1126
+ * @private
1127
+ * @param {Switch$ChangeEvent} event - The switch change event.
1128
+ * @param {Context} context - The binding context for the app being modified.
1129
+ * @returns {void}
1130
+ */
1131
+ private toggleDisplayFormat(event: Switch$ChangeEvent, context: Context): void {
1132
+ const switchToWideTile = event.getParameter("state") as boolean;
1133
+ const displayFormatHint = switchToWideTile ? DisplayFormat.StandardWide : DisplayFormat.Standard;
1134
+ const path = context.getPath();
1135
+ this.model.setProperty(`${path}/selectedDisplayFormat`, displayFormatHint);
1136
+ }
1137
+
1138
+ /**
1139
+ * Updates the display format of a visualization in the insights section.
1140
+ *
1141
+ * @private
1142
+ * @param {string} vizId - Id of the visualization for which display format has to be updated.
1143
+ * @param {DisplayFormat} displayFormatHint - The new display format to apply.
1144
+ * @returns {Promise<void>} A promise that resolves when the display format is updated.
1145
+ */
1146
+ private async updateDisplayFormat(vizId: string, displayFormatHint: DisplayFormat): Promise<void> {
1147
+ const insightsApps = await this.appManagerInstance.fetchInsightApps(true, this._i18nBundle.getText("insights") as string);
1148
+ const viz = insightsApps.find((insightApp) => insightApp.visualization?.vizId === vizId);
1149
+ if (viz) {
1150
+ const updateConfig = {
1151
+ pageId: MYHOME_PAGE_ID,
1152
+ sourceSectionIndex: viz.persConfig?.sectionIndex as number,
1153
+ sourceVisualizationIndex: viz.persConfig?.visualizationIndex as number,
1154
+ oVisualizationData: {
1155
+ displayFormatHint
1156
+ }
1157
+ };
1158
+ await this.appManagerInstance.updateVisualizations(updateConfig);
1159
+ }
1160
+ }
1161
+
1162
+ /**
1163
+ * Determines if an app is already added to the appropriate section based on its type and selected view.
1164
+ * For static apps or apps with Static view selected, checks if added to favorites apps section.
1165
+ * For dynamic apps with Dynamic view selected, checks if added to insights section.
1166
+ *
1167
+ * @private
1168
+ * @param {Context} context - The binding context for the app to check.
1169
+ * @returns {boolean} True if the app is already added to the corresponding section, false otherwise.
1170
+ */
1171
+ private isAppAlreadyAdded(context: Context): boolean {
1172
+ const isStaticApp = context.getProperty("isStaticApp") as boolean;
1173
+ const selectedAppView = context.getProperty("selectedView") as TileType;
1174
+ return (
1175
+ isStaticApp || selectedAppView === TileType.Static ? context.getProperty("addedToApps") : context.getProperty("addedToInsights")
1176
+ ) as boolean;
1177
+ }
1178
+
1179
+ /**
1180
+ * Parses the tile configuration string from raw app configuration.
1181
+ *
1182
+ * @private
1183
+ * @param {string} configuration - The raw app configuration string containing tile settings.
1184
+ * @returns {TileConfig | null} The parsed tile configuration object or null if parsing fails.
1185
+ */
1186
+ private parseTileConfiguration(configuration: string): TileConfig | null {
1187
+ if (configuration) {
1188
+ try {
1189
+ const parsedConfig = JSON.parse(configuration) as Configuration;
1190
+ const tileConfig = JSON.parse(parsedConfig?.tileConfiguration) as TileConfig;
1191
+ return tileConfig;
1192
+ } catch (error: unknown) {
1193
+ Log.warning((error as Error).message);
1194
+ }
1195
+ }
1196
+ return null;
1197
+ }
974
1198
  }