@sapui5/sap.ushell 1.128.1 → 1.129.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (531) hide show
  1. package/package.json +1 -1
  2. package/src/main/js/sap/ushell/.library +1 -1
  3. package/src/main/js/sap/ushell/Fiori20Adapter.js +32 -10
  4. package/src/main/js/sap/ushell/Fiori20AdapterTest.js +17 -14
  5. package/src/main/js/sap/ushell/NWBCInterface.js +1 -1
  6. package/src/main/js/sap/ushell/TechnicalParameters.js +1 -1
  7. package/src/main/js/sap/ushell/UIActions.js +11 -0
  8. package/src/main/js/sap/ushell/URLTemplateProcessor/DefinitionParameterSetBuilder.js +1 -1
  9. package/src/main/js/sap/ushell/URLTemplateProcessor/DependencyGraph.js +1 -1
  10. package/src/main/js/sap/ushell/URLTemplateProcessor/Functions.js +1 -1
  11. package/src/main/js/sap/ushell/URLTemplateProcessor/Resolvers.js +1 -1
  12. package/src/main/js/sap/ushell/URLTemplateProcessor/TemplateParameterParser.js +1 -1
  13. package/src/main/js/sap/ushell/URLTemplateProcessor/utils.js +1 -1
  14. package/src/main/js/sap/ushell/URLTemplateProcessor.js +1 -1
  15. package/src/main/js/sap/ushell/Ui5NativeServiceFactory.js +1 -1
  16. package/src/main/js/sap/ushell/Ui5ServiceFactory.js +1 -1
  17. package/src/main/js/sap/ushell/adapters/AppVariantPersonalizationAdapter.js +1 -1
  18. package/src/main/js/sap/ushell/adapters/cdm/ClientSideTargetResolutionAdapter.js +1 -1
  19. package/src/main/js/sap/ushell/adapters/cdm/CommonDataModelAdapter.js +1 -1
  20. package/src/main/js/sap/ushell/adapters/cdm/ConfigurationDefaultsAdapter.js +1 -1
  21. package/src/main/js/sap/ushell/adapters/cdm/ContainerAdapter.js +1 -1
  22. package/src/main/js/sap/ushell/adapters/cdm/LaunchPageAdapter.js +1 -1
  23. package/src/main/js/sap/ushell/adapters/cdm/PagesCommonDataModelAdapter.js +1 -1
  24. package/src/main/js/sap/ushell/adapters/cdm/PersonalizationAdapter.js +1 -1
  25. package/src/main/js/sap/ushell/adapters/cdm/PersonalizationV2Adapter.js +1 -1
  26. package/src/main/js/sap/ushell/adapters/cdm/Ui5ComponentLoaderAdapter.js +1 -1
  27. package/src/main/js/sap/ushell/adapters/cdm/_LaunchPage/modifyHome.js +1 -1
  28. package/src/main/js/sap/ushell/adapters/cdm/_LaunchPage/readCatalogs.js +1 -1
  29. package/src/main/js/sap/ushell/adapters/cdm/_LaunchPage/readHome.js +1 -1
  30. package/src/main/js/sap/ushell/adapters/cdm/_LaunchPage/uri.transform.js +1 -1
  31. package/src/main/js/sap/ushell/adapters/cdm/util/AppForInbound.js +1 -1
  32. package/src/main/js/sap/ushell/adapters/cdm/util/cdmSiteUtils.js +1 -1
  33. package/src/main/js/sap/ushell/adapters/cdm/v3/AdapterBase.js +1 -1
  34. package/src/main/js/sap/ushell/adapters/cdm/v3/FlpLaunchPageAdapter.js +1 -1
  35. package/src/main/js/sap/ushell/adapters/cdm/v3/LaunchPageAdapter.js +1 -1
  36. package/src/main/js/sap/ushell/adapters/cdm/v3/StaticGroupsAdapter.js +1 -1
  37. package/src/main/js/sap/ushell/adapters/cdm/v3/_LaunchPage/readApplications.js +1 -1
  38. package/src/main/js/sap/ushell/adapters/cdm/v3/_LaunchPage/readCatalogs.js +1 -1
  39. package/src/main/js/sap/ushell/adapters/cdm/v3/_LaunchPage/readHome.js +1 -1
  40. package/src/main/js/sap/ushell/adapters/cdm/v3/_LaunchPage/readPages.js +1 -1
  41. package/src/main/js/sap/ushell/adapters/cdm/v3/_LaunchPage/readUtils.js +1 -1
  42. package/src/main/js/sap/ushell/adapters/cdm/v3/_LaunchPage/readVisualizations.js +1 -1
  43. package/src/main/js/sap/ushell/adapters/cep/NavTargetResolutionAdapter.js +1 -1
  44. package/src/main/js/sap/ushell/adapters/cep/NavTargetResolutionInternalAdapter.js +2 -2
  45. package/src/main/js/sap/ushell/adapters/cep/SearchCEPAdapter.js +1 -1
  46. package/src/main/js/sap/ushell/adapters/cflp/UserDefaultParameterPersistenceAdapter.js +1 -1
  47. package/src/main/js/sap/ushell/adapters/local/AdapterContainer.js +1 -1
  48. package/src/main/js/sap/ushell/adapters/local/AppStateAdapter.js +1 -1
  49. package/src/main/js/sap/ushell/adapters/local/ClientSideTargetResolutionAdapter.js +1 -1
  50. package/src/main/js/sap/ushell/adapters/local/ContainerAdapter.js +1 -1
  51. package/src/main/js/sap/ushell/adapters/local/FlpLaunchPageAdapter.js +1 -1
  52. package/src/main/js/sap/ushell/adapters/local/LaunchPageAdapter.js +1 -1
  53. package/src/main/js/sap/ushell/adapters/local/NavTargetResolutionAdapter.js +1 -1
  54. package/src/main/js/sap/ushell/adapters/local/NavTargetResolutionInternalAdapter.js +1 -1
  55. package/src/main/js/sap/ushell/adapters/local/PageBuildingAdapter.js +1 -1
  56. package/src/main/js/sap/ushell/adapters/local/PagePersistenceAdapter.js +1 -1
  57. package/src/main/js/sap/ushell/adapters/local/PersonalizationAdapter.js +1 -1
  58. package/src/main/js/sap/ushell/adapters/local/PersonalizationV2Adapter.js +1 -1
  59. package/src/main/js/sap/ushell/adapters/local/SearchAdapter.js +1 -1
  60. package/src/main/js/sap/ushell/adapters/local/SearchCEPAdapter.js +1 -1
  61. package/src/main/js/sap/ushell/adapters/local/SupportTicketAdapter.js +1 -1
  62. package/src/main/js/sap/ushell/adapters/local/Ui5ComponentLoaderAdapter.js +1 -1
  63. package/src/main/js/sap/ushell/adapters/local/UserDefaultParameterPersistenceAdapter.js +1 -1
  64. package/src/main/js/sap/ushell/adapters/local/UserInfoAdapter.js +1 -1
  65. package/src/main/js/sap/ushell/api/Copilot.js +42 -0
  66. package/src/main/js/sap/ushell/api/Inbox.js +5 -164
  67. package/src/main/js/sap/ushell/api/S4MyHome.js +132 -0
  68. package/src/main/js/sap/ushell/api/common/ComponentInstantiation.js +215 -0
  69. package/src/main/js/sap/ushell/appRuntime/ui5/AppRuntime.js +26 -23
  70. package/src/main/js/sap/ushell/appRuntime/ui5/plugins/rtaAgent/i18n/i18n_en_US_sappsd.properties +3 -3
  71. package/src/main/js/sap/ushell/appRuntime/ui5/plugins/rtaAgent/i18n/i18n_en_US_saptrc.properties +5 -5
  72. package/src/main/js/sap/ushell/appRuntime/ui5/plugins/rtaShell/i18n/i18n_en_US_sappsd.properties +1 -1
  73. package/src/main/js/sap/ushell/appRuntime/ui5/plugins/rtaShell/i18n/i18n_en_US_saptrc.properties +2 -2
  74. package/src/main/js/sap/ushell/appRuntime/ui5/renderers/fiori2/RendererExtensions.js +1 -1
  75. package/src/main/js/sap/ushell/appRuntime/ui5/services/AppConfiguration.js +1 -1
  76. package/src/main/js/sap/ushell/appRuntime/ui5/services/AppLifeCycle.js +1 -1
  77. package/src/main/js/sap/ushell/appRuntime/ui5/services/AppState.js +1 -1
  78. package/src/main/js/sap/ushell/appRuntime/ui5/services/Bookmark.js +1 -1
  79. package/src/main/js/sap/ushell/appRuntime/ui5/services/BookmarkV2.js +1 -1
  80. package/src/main/js/sap/ushell/appRuntime/ui5/services/CommonDataModel.js +1 -1
  81. package/src/main/js/sap/ushell/appRuntime/ui5/services/Container.js +1 -1
  82. package/src/main/js/sap/ushell/appRuntime/ui5/services/CrossApplicationNavigation.js +1 -1
  83. package/src/main/js/sap/ushell/appRuntime/ui5/services/Extension/Item.js +1 -1
  84. package/src/main/js/sap/ushell/appRuntime/ui5/services/Extension.js +1 -1
  85. package/src/main/js/sap/ushell/appRuntime/ui5/services/FrameBoundExtension.js +1 -1
  86. package/src/main/js/sap/ushell/appRuntime/ui5/services/LaunchPage.js +1 -1
  87. package/src/main/js/sap/ushell/appRuntime/ui5/services/MessageBroker.js +1 -1
  88. package/src/main/js/sap/ushell/appRuntime/ui5/services/NavTargetResolution.js +1 -1
  89. package/src/main/js/sap/ushell/appRuntime/ui5/services/NavTargetResolutionInternal.js +1 -1
  90. package/src/main/js/sap/ushell/appRuntime/ui5/services/Navigation.js +1 -1
  91. package/src/main/js/sap/ushell/appRuntime/ui5/services/ReferenceResolver.js +1 -1
  92. package/src/main/js/sap/ushell/appRuntime/ui5/services/ShellNavigation.js +1 -1
  93. package/src/main/js/sap/ushell/appRuntime/ui5/services/ShellNavigationInternal.js +1 -1
  94. package/src/main/js/sap/ushell/appRuntime/ui5/services/ShellUIService.js +10 -12
  95. package/src/main/js/sap/ushell/appRuntime/ui5/services/UserInfo.js +1 -1
  96. package/src/main/js/sap/ushell/appRuntime/ui5/services/adapters/Ui5ComponentLoaderAdapter.js +1 -1
  97. package/src/main/js/sap/ushell/bootstrap/SchedulingAgent/logger.js +1 -1
  98. package/src/main/js/sap/ushell/bootstrap/SchedulingAgent/state.js +1 -1
  99. package/src/main/js/sap/ushell/bootstrap/common/common.configure.ui5datetimeformat.js +1 -1
  100. package/src/main/js/sap/ushell/bootstrap/common/common.create.configcontract.core.js +2 -1
  101. package/src/main/js/sap/ushell/bootstrap/common/common.load.model.js +2 -8
  102. package/src/main/js/sap/ushell/bootstrap/sandbox2.js +1 -1
  103. package/src/main/js/sap/ushell/components/_HomepageManager/PagingManager.js +1 -3
  104. package/src/main/js/sap/ushell/components/appfinder/AppFinder.controller.js +5 -7
  105. package/src/main/js/sap/ushell/components/appfinder/Component.js +9 -9
  106. package/src/main/js/sap/ushell/components/appfinder/manifest.json +6 -1
  107. package/src/main/js/sap/ushell/components/applicationIntegration/AppLifeCycle.js +689 -592
  108. package/src/main/js/sap/ushell/components/applicationIntegration/application/Application.js +29 -18
  109. package/src/main/js/sap/ushell/components/applicationIntegration/application/BlueBoxHandler.js +5 -5
  110. package/src/main/js/sap/ushell/components/applicationIntegration/application/PostMessageAPI.js +2 -2
  111. package/src/main/js/sap/ushell/components/applicationIntegration/configuration/AppMeta.js +6 -163
  112. package/src/main/js/sap/ushell/components/applicationIntegration/relatedServices/RelatedServices.js +1 -1
  113. package/src/main/js/sap/ushell/components/cepsearchresult/app/Main.controller.js +9 -4
  114. package/src/main/js/sap/ushell/components/cepsearchresult/app/cards/searchresultwidget/i18n/i18n_en_US_sappsd.properties +4 -4
  115. package/src/main/js/sap/ushell/components/cepsearchresult/app/cards/searchresultwidget/i18n/i18n_en_US_saptrc.properties +37 -37
  116. package/src/main/js/sap/ushell/components/cepsearchresult/app/i18n/i18n_en_US_sappsd.properties +1 -1
  117. package/src/main/js/sap/ushell/components/cepsearchresult/app/i18n/i18n_en_US_saptrc.properties +9 -9
  118. package/src/main/js/sap/ushell/components/cepsearchresult/app/util/i18n/i18n_en_US_sappsd.properties +32 -32
  119. package/src/main/js/sap/ushell/components/cepsearchresult/app/util/i18n/i18n_en_US_saptrc.properties +109 -109
  120. package/src/main/js/sap/ushell/components/container/ApplicationContainer.js +1 -1
  121. package/src/main/js/sap/ushell/components/container/IframePOSTUtils.js +1 -1
  122. package/src/main/js/sap/ushell/components/container/resources/resources_en_US_saptrc.properties +6 -6
  123. package/src/main/js/sap/ushell/components/contentFinder/CatalogService.js +18 -15
  124. package/src/main/js/sap/ushell/components/contentFinder/Component.js +27 -20
  125. package/src/main/js/sap/ushell/components/contentFinder/controller/AppSearch.controller.js +100 -7
  126. package/src/main/js/sap/ushell/components/contentFinder/controller/ContentFinderDialog.controller.js +1 -1
  127. package/src/main/js/sap/ushell/components/contentFinder/controller/WidgetGallery.controller.js +1 -1
  128. package/src/main/js/sap/ushell/components/contentFinder/manifest.json +2 -2
  129. package/src/main/js/sap/ushell/components/contentFinder/model/formatter.js +13 -8
  130. package/src/main/js/sap/ushell/components/contentFinder/resources/resources.properties +16 -0
  131. package/src/main/js/sap/ushell/components/contentFinder/resources/resources_ar.properties +4 -1
  132. package/src/main/js/sap/ushell/components/contentFinder/resources/resources_bg.properties +4 -1
  133. package/src/main/js/sap/ushell/components/contentFinder/resources/resources_ca.properties +4 -1
  134. package/src/main/js/sap/ushell/components/contentFinder/resources/resources_cnr.properties +4 -1
  135. package/src/main/js/sap/ushell/components/contentFinder/resources/resources_cs.properties +4 -1
  136. package/src/main/js/sap/ushell/components/contentFinder/resources/resources_cy.properties +4 -1
  137. package/src/main/js/sap/ushell/components/contentFinder/resources/resources_da.properties +4 -1
  138. package/src/main/js/sap/ushell/components/contentFinder/resources/resources_de.properties +4 -1
  139. package/src/main/js/sap/ushell/components/contentFinder/resources/resources_el.properties +4 -1
  140. package/src/main/js/sap/ushell/components/contentFinder/resources/resources_en.properties +4 -1
  141. package/src/main/js/sap/ushell/components/contentFinder/resources/resources_en_GB.properties +4 -1
  142. package/src/main/js/sap/ushell/components/contentFinder/resources/resources_en_US_sappsd.properties +7 -5
  143. package/src/main/js/sap/ushell/components/contentFinder/resources/resources_en_US_saprigi.properties +7 -1
  144. package/src/main/js/sap/ushell/components/contentFinder/resources/resources_en_US_saptrc.properties +26 -24
  145. package/src/main/js/sap/ushell/components/contentFinder/resources/resources_es.properties +4 -1
  146. package/src/main/js/sap/ushell/components/contentFinder/resources/resources_es_MX.properties +4 -1
  147. package/src/main/js/sap/ushell/components/contentFinder/resources/resources_et.properties +4 -1
  148. package/src/main/js/sap/ushell/components/contentFinder/resources/resources_fi.properties +4 -1
  149. package/src/main/js/sap/ushell/components/contentFinder/resources/resources_fr.properties +4 -1
  150. package/src/main/js/sap/ushell/components/contentFinder/resources/resources_fr_CA.properties +4 -1
  151. package/src/main/js/sap/ushell/components/contentFinder/resources/resources_hi.properties +4 -1
  152. package/src/main/js/sap/ushell/components/contentFinder/resources/resources_hr.properties +4 -1
  153. package/src/main/js/sap/ushell/components/contentFinder/resources/resources_hu.properties +6 -3
  154. package/src/main/js/sap/ushell/components/contentFinder/resources/resources_id.properties +4 -1
  155. package/src/main/js/sap/ushell/components/contentFinder/resources/resources_it.properties +4 -1
  156. package/src/main/js/sap/ushell/components/contentFinder/resources/resources_iw.properties +4 -1
  157. package/src/main/js/sap/ushell/components/contentFinder/resources/resources_ja.properties +4 -1
  158. package/src/main/js/sap/ushell/components/contentFinder/resources/resources_kk.properties +4 -1
  159. package/src/main/js/sap/ushell/components/contentFinder/resources/resources_ko.properties +6 -3
  160. package/src/main/js/sap/ushell/components/contentFinder/resources/resources_lt.properties +4 -1
  161. package/src/main/js/sap/ushell/components/contentFinder/resources/resources_lv.properties +4 -1
  162. package/src/main/js/sap/ushell/components/contentFinder/resources/resources_mk.properties +4 -1
  163. package/src/main/js/sap/ushell/components/contentFinder/resources/resources_ms.properties +4 -1
  164. package/src/main/js/sap/ushell/components/contentFinder/resources/resources_nl.properties +4 -1
  165. package/src/main/js/sap/ushell/components/contentFinder/resources/resources_no.properties +4 -1
  166. package/src/main/js/sap/ushell/components/contentFinder/resources/resources_pl.properties +4 -1
  167. package/src/main/js/sap/ushell/components/contentFinder/resources/resources_pt.properties +4 -1
  168. package/src/main/js/sap/ushell/components/contentFinder/resources/resources_pt_PT.properties +4 -1
  169. package/src/main/js/sap/ushell/components/contentFinder/resources/resources_ro.properties +4 -1
  170. package/src/main/js/sap/ushell/components/contentFinder/resources/resources_ru.properties +4 -1
  171. package/src/main/js/sap/ushell/components/contentFinder/resources/resources_sh.properties +4 -1
  172. package/src/main/js/sap/ushell/components/contentFinder/resources/resources_sk.properties +4 -1
  173. package/src/main/js/sap/ushell/components/contentFinder/resources/resources_sl.properties +4 -1
  174. package/src/main/js/sap/ushell/components/contentFinder/resources/resources_sr.properties +4 -1
  175. package/src/main/js/sap/ushell/components/contentFinder/resources/resources_sv.properties +4 -1
  176. package/src/main/js/sap/ushell/components/contentFinder/resources/resources_th.properties +4 -1
  177. package/src/main/js/sap/ushell/components/contentFinder/resources/resources_tr.properties +4 -1
  178. package/src/main/js/sap/ushell/components/contentFinder/resources/resources_uk.properties +4 -1
  179. package/src/main/js/sap/ushell/components/contentFinder/resources/resources_vi.properties +4 -1
  180. package/src/main/js/sap/ushell/components/contentFinder/resources/resources_zh_CN.properties +4 -1
  181. package/src/main/js/sap/ushell/components/contentFinder/resources/resources_zh_TW.properties +4 -1
  182. package/src/main/js/sap/ushell/components/contentFinder/view/AppSearch.view.xml +275 -127
  183. package/src/main/js/sap/ushell/components/contentFinder/view/AppSearchBox.fragment.xml +61 -24
  184. package/src/main/js/sap/ushell/components/contentFinder/view/AppSearchList.fragment.xml +73 -0
  185. package/src/main/js/sap/ushell/components/contentFinder/view/ContentFinderDialog.view.xml +20 -10
  186. package/src/main/js/sap/ushell/components/contentFinderStandalone/Component.js +1 -1
  187. package/src/main/js/sap/ushell/components/contentFinderStandalone/controller/ContentFinderStandalone.controller.js +1 -1
  188. package/src/main/js/sap/ushell/components/contentFinderStandalone/manifest.json +1 -1
  189. package/src/main/js/sap/ushell/components/contentFinderStandalone/manifestAppSearch.json +1 -1
  190. package/src/main/js/sap/ushell/components/contentFinderStandalone/resources/resources_ar.properties +3 -0
  191. package/src/main/js/sap/ushell/components/contentFinderStandalone/resources/resources_bg.properties +3 -0
  192. package/src/main/js/sap/ushell/components/contentFinderStandalone/resources/resources_ca.properties +3 -0
  193. package/src/main/js/sap/ushell/components/contentFinderStandalone/resources/resources_cnr.properties +3 -0
  194. package/src/main/js/sap/ushell/components/contentFinderStandalone/resources/resources_cs.properties +3 -0
  195. package/src/main/js/sap/ushell/components/contentFinderStandalone/resources/resources_cy.properties +3 -0
  196. package/src/main/js/sap/ushell/components/contentFinderStandalone/resources/resources_da.properties +3 -0
  197. package/src/main/js/sap/ushell/components/contentFinderStandalone/resources/resources_de.properties +3 -0
  198. package/src/main/js/sap/ushell/components/contentFinderStandalone/resources/resources_el.properties +3 -0
  199. package/src/main/js/sap/ushell/components/contentFinderStandalone/resources/resources_en.properties +3 -0
  200. package/src/main/js/sap/ushell/components/contentFinderStandalone/resources/resources_en_GB.properties +3 -0
  201. package/src/main/js/sap/ushell/components/contentFinderStandalone/resources/resources_en_US_saprigi.properties +3 -0
  202. package/src/main/js/sap/ushell/components/contentFinderStandalone/resources/resources_es.properties +3 -0
  203. package/src/main/js/sap/ushell/components/contentFinderStandalone/resources/resources_es_MX.properties +3 -0
  204. package/src/main/js/sap/ushell/components/contentFinderStandalone/resources/resources_et.properties +3 -0
  205. package/src/main/js/sap/ushell/components/contentFinderStandalone/resources/resources_fi.properties +3 -0
  206. package/src/main/js/sap/ushell/components/contentFinderStandalone/resources/resources_fr.properties +3 -0
  207. package/src/main/js/sap/ushell/components/contentFinderStandalone/resources/resources_fr_CA.properties +3 -0
  208. package/src/main/js/sap/ushell/components/contentFinderStandalone/resources/resources_hi.properties +3 -0
  209. package/src/main/js/sap/ushell/components/contentFinderStandalone/resources/resources_hr.properties +3 -0
  210. package/src/main/js/sap/ushell/components/contentFinderStandalone/resources/resources_hu.properties +3 -0
  211. package/src/main/js/sap/ushell/components/contentFinderStandalone/resources/resources_id.properties +3 -0
  212. package/src/main/js/sap/ushell/components/contentFinderStandalone/resources/resources_it.properties +3 -0
  213. package/src/main/js/sap/ushell/components/contentFinderStandalone/resources/resources_iw.properties +3 -0
  214. package/src/main/js/sap/ushell/components/contentFinderStandalone/resources/resources_ja.properties +3 -0
  215. package/src/main/js/sap/ushell/components/contentFinderStandalone/resources/resources_kk.properties +3 -0
  216. package/src/main/js/sap/ushell/components/contentFinderStandalone/resources/resources_ko.properties +3 -0
  217. package/src/main/js/sap/ushell/components/contentFinderStandalone/resources/resources_lt.properties +3 -0
  218. package/src/main/js/sap/ushell/components/contentFinderStandalone/resources/resources_lv.properties +3 -0
  219. package/src/main/js/sap/ushell/components/contentFinderStandalone/resources/resources_mk.properties +3 -0
  220. package/src/main/js/sap/ushell/components/contentFinderStandalone/resources/resources_ms.properties +3 -0
  221. package/src/main/js/sap/ushell/components/contentFinderStandalone/resources/resources_nl.properties +3 -0
  222. package/src/main/js/sap/ushell/components/contentFinderStandalone/resources/resources_no.properties +3 -0
  223. package/src/main/js/sap/ushell/components/contentFinderStandalone/resources/resources_pl.properties +3 -0
  224. package/src/main/js/sap/ushell/components/contentFinderStandalone/resources/resources_pt.properties +3 -0
  225. package/src/main/js/sap/ushell/components/contentFinderStandalone/resources/resources_pt_PT.properties +3 -0
  226. package/src/main/js/sap/ushell/components/contentFinderStandalone/resources/resources_ro.properties +3 -0
  227. package/src/main/js/sap/ushell/components/contentFinderStandalone/resources/resources_ru.properties +3 -0
  228. package/src/main/js/sap/ushell/components/contentFinderStandalone/resources/resources_sh.properties +3 -0
  229. package/src/main/js/sap/ushell/components/contentFinderStandalone/resources/resources_sk.properties +3 -0
  230. package/src/main/js/sap/ushell/components/contentFinderStandalone/resources/resources_sl.properties +3 -0
  231. package/src/main/js/sap/ushell/components/contentFinderStandalone/resources/resources_sr.properties +3 -0
  232. package/src/main/js/sap/ushell/components/contentFinderStandalone/resources/resources_sv.properties +3 -0
  233. package/src/main/js/sap/ushell/components/contentFinderStandalone/resources/resources_th.properties +3 -0
  234. package/src/main/js/sap/ushell/components/contentFinderStandalone/resources/resources_tr.properties +3 -0
  235. package/src/main/js/sap/ushell/components/contentFinderStandalone/resources/resources_uk.properties +3 -0
  236. package/src/main/js/sap/ushell/components/contentFinderStandalone/resources/resources_vi.properties +3 -0
  237. package/src/main/js/sap/ushell/components/contentFinderStandalone/resources/resources_zh_CN.properties +3 -0
  238. package/src/main/js/sap/ushell/components/contentFinderStandalone/resources/resources_zh_TW.properties +3 -0
  239. package/src/main/js/sap/ushell/components/factsheet/Component.js +1 -1
  240. package/src/main/js/sap/ushell/components/homepage/ActionMode.js +1 -1
  241. package/src/main/js/sap/ushell/components/homepage/DashboardContent.view.js +1 -1
  242. package/src/main/js/sap/ushell/components/homepage/DashboardGroupsBox.js +1 -1
  243. package/src/main/js/sap/ushell/components/homepage/DashboardUIActions.js +1 -1
  244. package/src/main/js/sap/ushell/components/homepage/manifest.json +1 -1
  245. package/src/main/js/sap/ushell/components/pages/ActionMode.js +1 -1
  246. package/src/main/js/sap/ushell/components/pages/Component.js +1 -1
  247. package/src/main/js/sap/ushell/components/pages/MyHomeImport.js +1 -1
  248. package/src/main/js/sap/ushell/components/pages/controller/PageRuntime.controller.js +12 -1
  249. package/src/main/js/sap/ushell/components/pages/manifest.json +1 -1
  250. package/src/main/js/sap/ushell/components/runtimeSwitcher/controller/RuntimeSwitcher.controller.js +1 -1
  251. package/src/main/js/sap/ushell/components/runtimeSwitcher/manifest.json +1 -1
  252. package/src/main/js/sap/ushell/components/shell/FloatingContainer/Component.js +1158 -0
  253. package/src/main/js/sap/ushell/components/shell/FloatingContainer/FloatingContainer.fragment.xml +17 -0
  254. package/src/main/js/sap/ushell/components/shell/FloatingContainer/controls/FloatingContainer.js +55 -0
  255. package/src/main/js/sap/ushell/components/shell/FloatingContainer/manifest.json +84 -0
  256. package/src/main/js/sap/ushell/components/shell/MenuBar/manifest.json +1 -1
  257. package/src/main/js/sap/ushell/components/shell/NavigationBarMenu/controller/NavigationBarMenu.controller.js +1 -1
  258. package/src/main/js/sap/ushell/components/shell/NavigationBarMenu/manifest.json +1 -1
  259. package/src/main/js/sap/ushell/components/shell/Notifications/Component.js +1 -1
  260. package/src/main/js/sap/ushell/components/shell/PostLoadingHeaderEnhancement/Component.js +1 -1
  261. package/src/main/js/sap/ushell/components/shell/ProductSwitch/Component.js +1 -1
  262. package/src/main/js/sap/ushell/components/shell/Search/manifest.json +1 -1
  263. package/src/main/js/sap/ushell/components/shell/SearchCEP/Component.js +1 -1
  264. package/src/main/js/sap/ushell/components/shell/SearchCEP/SearchProviders/FrequentActivityProvider.js +1 -1
  265. package/src/main/js/sap/ushell/components/shell/SearchCEP/SearchProviders/RecentSearchProvider.js +1 -1
  266. package/src/main/js/sap/ushell/components/shell/SearchCEP/SearchProviders/SearchProvider.js +1 -1
  267. package/src/main/js/sap/ushell/components/shell/SearchCEP/SearchProviders/SearchServiceProvider.js +1 -1
  268. package/src/main/js/sap/ushell/components/shell/Settings/Component.js +1 -1
  269. package/src/main/js/sap/ushell/components/shell/Settings/UserSettings.view.xml +1 -1
  270. package/src/main/js/sap/ushell/components/shell/Settings/notifications/NotificationsSetting.controller.js +3 -0
  271. package/src/main/js/sap/ushell/components/shell/Settings/notifications/NotificationsSetting.view.xml +3 -1
  272. package/src/main/js/sap/ushell/components/shell/Settings/userDefaults/UserDefaultsForm.js +15 -6
  273. package/src/main/js/sap/ushell/components/shell/Settings/userDefaults/controller/UserDefaultsSetting.controller.js +43 -62
  274. package/src/main/js/sap/ushell/components/shell/UserActionsMenu/Component.js +1 -1
  275. package/src/main/js/sap/ushell/components/shell/UserImage/Component.js +1 -1
  276. package/src/main/js/sap/ushell/components/visualizationOrganizer/Component.js +1 -1
  277. package/src/main/js/sap/ushell/components/workPageBuilder/Component.js +2 -2
  278. package/src/main/js/sap/ushell/components/workPageBuilder/controller/WorkPageBuilder.accessibility.js +1 -1
  279. package/src/main/js/sap/ushell/components/workPageBuilder/controller/WorkPageBuilder.controller.js +1 -1
  280. package/src/main/js/sap/ushell/components/workPageBuilder/controls/WorkPage.js +9 -5
  281. package/src/main/js/sap/ushell/components/workPageBuilder/controls/WorkPageButton.js +1 -1
  282. package/src/main/js/sap/ushell/components/workPageBuilder/controls/WorkPageCell.js +8 -5
  283. package/src/main/js/sap/ushell/components/workPageBuilder/controls/WorkPageColumn.js +1 -1
  284. package/src/main/js/sap/ushell/components/workPageBuilder/controls/WorkPageColumnResizer.js +1 -1
  285. package/src/main/js/sap/ushell/components/workPageBuilder/controls/WorkPageRow.js +1 -1
  286. package/src/main/js/sap/ushell/components/workPageBuilder/manifest.json +1 -1
  287. package/src/main/js/sap/ushell/components/workPageBuilder/resources/resources_en_US_sappsd.properties +27 -26
  288. package/src/main/js/sap/ushell/components/workPageBuilder/resources/resources_en_US_saptrc.properties +68 -67
  289. package/src/main/js/sap/ushell/components/workPageRuntime/Component.js +1 -1
  290. package/src/main/js/sap/ushell/components/workPageRuntime/controller/WorkPageRuntime.controller.js +1 -1
  291. package/src/main/js/sap/ushell/components/workPageRuntime/manifest.json +1 -1
  292. package/src/main/js/sap/ushell/components/workPageRuntime/view/WorkPageRuntime.view.xml +3 -4
  293. package/src/main/js/sap/ushell/designtime/ApplicationContainer.designtime.js +1 -1
  294. package/src/main/js/sap/ushell/iconfonts.js +36 -420
  295. package/src/main/js/sap/ushell/library.js +1 -1
  296. package/src/main/js/sap/ushell/navigationMode.js +1 -1
  297. package/src/main/js/sap/ushell/performance/ShellAnalytics.js +1 -1
  298. package/src/main/js/sap/ushell/performance/StatisticalRecord.js +1 -1
  299. package/src/main/js/sap/ushell/plugins/appwarmup/Component.js +1 -1
  300. package/src/main/js/sap/ushell/plugins/rta/i18n/i18n_en_US_sappsd.properties +3 -3
  301. package/src/main/js/sap/ushell/plugins/rta/i18n/i18n_en_US_saptrc.properties +8 -8
  302. package/src/main/js/sap/ushell/renderer/Renderer.js +127 -127
  303. package/src/main/js/sap/ushell/renderer/Shell.controller.js +694 -1182
  304. package/src/main/js/sap/ushell/renderer/Shell.view.js +38 -102
  305. package/src/main/js/sap/ushell/renderer/resources/resources.properties +4 -4
  306. package/src/main/js/sap/ushell/renderer/resources/resources_ar.properties +1 -0
  307. package/src/main/js/sap/ushell/renderer/resources/resources_bg.properties +1 -0
  308. package/src/main/js/sap/ushell/renderer/resources/resources_ca.properties +1 -0
  309. package/src/main/js/sap/ushell/renderer/resources/resources_cnr.properties +1 -0
  310. package/src/main/js/sap/ushell/renderer/resources/resources_cs.properties +1 -0
  311. package/src/main/js/sap/ushell/renderer/resources/resources_cy.properties +1 -0
  312. package/src/main/js/sap/ushell/renderer/resources/resources_da.properties +1 -0
  313. package/src/main/js/sap/ushell/renderer/resources/resources_de.properties +1 -0
  314. package/src/main/js/sap/ushell/renderer/resources/resources_el.properties +1 -0
  315. package/src/main/js/sap/ushell/renderer/resources/resources_en.properties +1 -0
  316. package/src/main/js/sap/ushell/renderer/resources/resources_en_GB.properties +1 -0
  317. package/src/main/js/sap/ushell/renderer/resources/resources_en_US_sappsd.properties +128 -130
  318. package/src/main/js/sap/ushell/renderer/resources/resources_en_US_saprigi.properties +1 -0
  319. package/src/main/js/sap/ushell/renderer/resources/resources_en_US_saptrc.properties +989 -991
  320. package/src/main/js/sap/ushell/renderer/resources/resources_es.properties +1 -0
  321. package/src/main/js/sap/ushell/renderer/resources/resources_es_MX.properties +1 -0
  322. package/src/main/js/sap/ushell/renderer/resources/resources_et.properties +1 -0
  323. package/src/main/js/sap/ushell/renderer/resources/resources_fi.properties +1 -0
  324. package/src/main/js/sap/ushell/renderer/resources/resources_fr.properties +1 -0
  325. package/src/main/js/sap/ushell/renderer/resources/resources_fr_CA.properties +1 -0
  326. package/src/main/js/sap/ushell/renderer/resources/resources_hi.properties +1 -0
  327. package/src/main/js/sap/ushell/renderer/resources/resources_hr.properties +1 -0
  328. package/src/main/js/sap/ushell/renderer/resources/resources_hu.properties +2 -1
  329. package/src/main/js/sap/ushell/renderer/resources/resources_id.properties +1 -0
  330. package/src/main/js/sap/ushell/renderer/resources/resources_it.properties +1 -0
  331. package/src/main/js/sap/ushell/renderer/resources/resources_iw.properties +1 -0
  332. package/src/main/js/sap/ushell/renderer/resources/resources_ja.properties +1 -0
  333. package/src/main/js/sap/ushell/renderer/resources/resources_kk.properties +1 -0
  334. package/src/main/js/sap/ushell/renderer/resources/resources_ko.properties +1 -0
  335. package/src/main/js/sap/ushell/renderer/resources/resources_lt.properties +1 -0
  336. package/src/main/js/sap/ushell/renderer/resources/resources_lv.properties +1 -0
  337. package/src/main/js/sap/ushell/renderer/resources/resources_mk.properties +1 -0
  338. package/src/main/js/sap/ushell/renderer/resources/resources_ms.properties +1 -0
  339. package/src/main/js/sap/ushell/renderer/resources/resources_nl.properties +1 -0
  340. package/src/main/js/sap/ushell/renderer/resources/resources_no.properties +1 -0
  341. package/src/main/js/sap/ushell/renderer/resources/resources_pl.properties +1 -0
  342. package/src/main/js/sap/ushell/renderer/resources/resources_pt.properties +1 -0
  343. package/src/main/js/sap/ushell/renderer/resources/resources_pt_PT.properties +1 -0
  344. package/src/main/js/sap/ushell/renderer/resources/resources_ro.properties +1 -0
  345. package/src/main/js/sap/ushell/renderer/resources/resources_ru.properties +1 -0
  346. package/src/main/js/sap/ushell/renderer/resources/resources_sh.properties +1 -0
  347. package/src/main/js/sap/ushell/renderer/resources/resources_sk.properties +1 -0
  348. package/src/main/js/sap/ushell/renderer/resources/resources_sl.properties +1 -0
  349. package/src/main/js/sap/ushell/renderer/resources/resources_sr.properties +1 -0
  350. package/src/main/js/sap/ushell/renderer/resources/resources_sv.properties +1 -0
  351. package/src/main/js/sap/ushell/renderer/resources/resources_th.properties +1 -0
  352. package/src/main/js/sap/ushell/renderer/resources/resources_tr.properties +1 -0
  353. package/src/main/js/sap/ushell/renderer/resources/resources_uk.properties +1 -0
  354. package/src/main/js/sap/ushell/renderer/resources/resources_vi.properties +1 -0
  355. package/src/main/js/sap/ushell/renderer/resources/resources_zh_CN.properties +1 -0
  356. package/src/main/js/sap/ushell/renderer/resources/resources_zh_TW.properties +1 -0
  357. package/src/main/js/sap/ushell/renderer/search/searchComponent/manifest.json +1 -1
  358. package/src/main/js/sap/ushell/{components/_HeaderManager → renderer/shellHeader}/ShellHeader.controller.js +1 -5
  359. package/src/main/js/sap/ushell/{ui → renderer/shellHeader}/ShellHeader.fragment.xml +6 -3
  360. package/src/main/js/sap/ushell/renderers/fiori2/Shell.view.js +36 -100
  361. package/src/main/js/sap/ushell/services/AppLifeCycle.js +2 -2
  362. package/src/main/js/sap/ushell/services/AppState.js +1 -1
  363. package/src/main/js/sap/ushell/services/Bookmark.js +1 -1
  364. package/src/main/js/sap/ushell/services/BookmarkV2.js +1 -1
  365. package/src/main/js/sap/ushell/services/ClientSideTargetResolution/Formatter.js +1 -1
  366. package/src/main/js/sap/ushell/services/ClientSideTargetResolution/InboundIndex.js +1 -1
  367. package/src/main/js/sap/ushell/services/ClientSideTargetResolution/InboundProvider.js +1 -1
  368. package/src/main/js/sap/ushell/services/ClientSideTargetResolution/PrelaunchOperations.js +1 -1
  369. package/src/main/js/sap/ushell/services/ClientSideTargetResolution/Search.js +1 -1
  370. package/src/main/js/sap/ushell/services/ClientSideTargetResolution/StagedLogger.js +1 -1
  371. package/src/main/js/sap/ushell/services/ClientSideTargetResolution/SystemContext.js +1 -1
  372. package/src/main/js/sap/ushell/services/ClientSideTargetResolution/Utils.js +1 -1
  373. package/src/main/js/sap/ushell/services/ClientSideTargetResolution/VirtualInbounds.js +1 -1
  374. package/src/main/js/sap/ushell/services/ClientSideTargetResolution/XAppStateProcessing.js +1 -1
  375. package/src/main/js/sap/ushell/services/ClientSideTargetResolution.js +1 -1
  376. package/src/main/js/sap/ushell/services/CommonDataModel/SiteConverter.js +1 -1
  377. package/src/main/js/sap/ushell/services/CommonDataModel/vizTypeDefaults/VizTypeDefaults.js +1 -1
  378. package/src/main/js/sap/ushell/services/CommonDataModel.js +1 -1
  379. package/src/main/js/sap/ushell/services/Configuration.js +1 -1
  380. package/src/main/js/sap/ushell/services/ConfigurationDefaults.js +1 -1
  381. package/src/main/js/sap/ushell/services/ContentExtensionAdapterFactory.js +1 -1
  382. package/src/main/js/sap/ushell/services/CrossApplicationNavigation.js +44 -156
  383. package/src/main/js/sap/ushell/services/DarkModeSupport.js +1 -1
  384. package/src/main/js/sap/ushell/services/Extension/Item.js +1 -1
  385. package/src/main/js/sap/ushell/services/Extension.js +1 -1
  386. package/src/main/js/sap/ushell/services/FlpLaunchPage.js +1 -1
  387. package/src/main/js/sap/ushell/services/FrameBoundExtension/FloatingContainer.js +1 -1
  388. package/src/main/js/sap/ushell/services/FrameBoundExtension/Footer.js +1 -1
  389. package/src/main/js/sap/ushell/services/FrameBoundExtension/Item.js +1 -1
  390. package/src/main/js/sap/ushell/services/FrameBoundExtension/SidePane.js +1 -1
  391. package/src/main/js/sap/ushell/services/FrameBoundExtension/ToolArea.js +1 -1
  392. package/src/main/js/sap/ushell/services/FrameBoundExtension.js +1 -1
  393. package/src/main/js/sap/ushell/services/LaunchPage.js +1 -1
  394. package/src/main/js/sap/ushell/services/Menu.js +1 -1
  395. package/src/main/js/sap/ushell/services/Message.js +1 -1
  396. package/src/main/js/sap/ushell/services/MessageBroker/MessageBrokerEngine.js +1 -1
  397. package/src/main/js/sap/ushell/services/MessageBroker.js +1 -1
  398. package/src/main/js/sap/ushell/services/MessageInternal.js +1 -1
  399. package/src/main/js/sap/ushell/services/Navigation/compatibility.js +1 -1
  400. package/src/main/js/sap/ushell/services/Navigation/utils.js +1 -1
  401. package/src/main/js/sap/ushell/services/Navigation.js +1 -1
  402. package/src/main/js/sap/ushell/services/NavigationDataProvider.js +1 -1
  403. package/src/main/js/sap/ushell/services/PageBuilding.js +1 -1
  404. package/src/main/js/sap/ushell/services/PagePersistence.js +1 -1
  405. package/src/main/js/sap/ushell/services/PageReferencing.js +1 -1
  406. package/src/main/js/sap/ushell/services/Pages.js +1 -1
  407. package/src/main/js/sap/ushell/services/Personalization.js +1 -1
  408. package/src/main/js/sap/ushell/services/PersonalizationV2.js +1 -1
  409. package/src/main/js/sap/ushell/services/PluginManager/Extensions.js +1 -1
  410. package/src/main/js/sap/ushell/services/PluginManager/HeaderExtensions.js +1 -1
  411. package/src/main/js/sap/ushell/services/PluginManager/MenuExtensions.js +1 -1
  412. package/src/main/js/sap/ushell/services/PluginManager.js +1 -1
  413. package/src/main/js/sap/ushell/services/ReferenceResolver.js +1 -1
  414. package/src/main/js/sap/ushell/services/Search.js +1 -1
  415. package/src/main/js/sap/ushell/services/SearchCEP.js +1 -1
  416. package/src/main/js/sap/ushell/services/SearchableContent.js +1 -1
  417. package/src/main/js/sap/ushell/services/ShellNavigation.js +1 -1
  418. package/src/main/js/sap/ushell/services/SmartNavigation.js +1 -1
  419. package/src/main/js/sap/ushell/services/SpaceContent.js +1 -1
  420. package/src/main/js/sap/ushell/services/UITracer.js +5 -4
  421. package/src/main/js/sap/ushell/services/URLShortening.js +1 -1
  422. package/src/main/js/sap/ushell/services/URLTemplate.js +1 -1
  423. package/src/main/js/sap/ushell/services/Ui5ComponentLoader/utils.js +1 -1
  424. package/src/main/js/sap/ushell/services/Ui5ComponentLoader.js +1 -1
  425. package/src/main/js/sap/ushell/services/UserDefaultParameterPersistence.js +1 -1
  426. package/src/main/js/sap/ushell/services/UserDefaultParameters.js +100 -65
  427. package/src/main/js/sap/ushell/services/UserInfo.js +1 -1
  428. package/src/main/js/sap/ushell/services/UserRecents/RecentActivity.js +2 -3
  429. package/src/main/js/sap/ushell/services/UserRecents/RecentAppsUsage.js +4 -4
  430. package/src/main/js/sap/ushell/services/UserRecents/RecentsList.js +1 -1
  431. package/src/main/js/sap/ushell/services/UserRecents.js +1 -1
  432. package/src/main/js/sap/ushell/services/VisualizationDataProvider.js +1 -1
  433. package/src/main/js/sap/ushell/services/VisualizationInstantiation.js +2 -2
  434. package/src/main/js/sap/ushell/services/_ContentExtensionAdapterFactory/ContentExtensionAdapterConfig.js +1 -1
  435. package/src/main/js/sap/ushell/services/_ContentExtensionAdapterFactory/FeaturedGroupConfig.js +1 -1
  436. package/src/main/js/sap/ushell/services/_CrossApplicationNavigation/utils.js +1 -1
  437. package/src/main/js/sap/ushell/services/_PageReferencing/PageReferencer.js +1 -1
  438. package/src/main/js/sap/ushell/state/BindingHelper.js +79 -0
  439. package/src/main/js/sap/ushell/state/StateManager.js +4 -2
  440. package/src/main/js/sap/ushell/state/StrategyFactory/FloatingContainerStrategy.js +36 -0
  441. package/src/main/js/sap/ushell/state/StrategyFactory.js +6 -0
  442. package/src/main/js/sap/ushell/support/plugins/flpConfig/FlpConfigurationPlugin.js +1 -1
  443. package/src/main/js/sap/ushell/themes/base/UserSettings.less +0 -12
  444. package/src/main/js/sap/ushell/themes/base/fonts/BusinessSuiteInAppSymbols.json +393 -384
  445. package/src/main/js/sap/ushell/themes/base/fonts/BusinessSuiteInAppSymbols.ttf +0 -0
  446. package/src/main/js/sap/ushell/themes/base/fonts/BusinessSuiteInAppSymbols.woff +0 -0
  447. package/src/main/js/sap/ushell/themes/base/fonts/BusinessSuiteInAppSymbols.woff2 +0 -0
  448. package/src/main/js/sap/ushell/themes/sap_belize_base/UserSettings.less +0 -13
  449. package/src/main/js/sap/ushell/themes/sap_bluecrystal_base/UserSettings.less +0 -13
  450. package/src/main/js/sap/ushell/themes/sap_hcb/base_UserSettings.less +0 -13
  451. package/src/main/js/sap/ushell/ui/ContentNodeSelector.js +18 -6
  452. package/src/main/js/sap/ushell/ui/bookmark/SaveOnPage.view.xml +6 -6
  453. package/src/main/js/sap/ushell/ui/cards/RecentActivitiesExtension.js +1 -1
  454. package/src/main/js/sap/ushell/ui/footerbar/SaveAsTile.view.js +3 -0
  455. package/src/main/js/sap/ushell/ui/launchpad/ExtendedChangeDetection.js +1 -1
  456. package/src/main/js/sap/ushell/ui/launchpad/Section.js +1 -1
  457. package/src/main/js/sap/ushell/ui/launchpad/section/CompactArea.js +1 -1
  458. package/src/main/js/sap/ushell/ui/shell/ToolAreaItem.js +1 -1
  459. package/src/main/js/sap/ushell/ui/utils.js +1 -1
  460. package/src/main/js/sap/ushell/ui5service/ShellUIService.js +811 -22
  461. package/src/main/js/sap/ushell/ui5service/ShellUIServiceFactory.js +477 -0
  462. package/src/main/js/sap/ushell/ui5service/UserStatus.js +1 -1
  463. package/src/main/js/sap/ushell/utils/UrlShortening.js +1 -1
  464. package/src/main/js/sap/ushell/utils/WindowUtils.js +21 -18
  465. package/src/main/js/sap/ushell/utils/tilecard/resources/resources_en_US_sappsd.properties +5 -0
  466. package/src/main/js/sap/ushell/utils/tilecard/resources/resources_en_US_saptrc.properties +5 -0
  467. package/src/main/js/sap/ushell/utils/workpage/DestinationResolver.js +68 -25
  468. package/src/main/js/sap/ushell/utils/workpage/WorkPageHost.js +64 -9
  469. package/src/main/js/sap/ushell/utils/workpage/WorkPageService.js +3 -2
  470. package/src/main/js/sap/ushell/utils/workpage/WorkPageVizInstantiation.js +1 -1
  471. package/src/main/js/sap/ushell/utils/workpage/resources/resources.properties +14 -2
  472. package/src/main/js/sap/ushell/utils/workpage/resources/resources_ar.properties +28 -16
  473. package/src/main/js/sap/ushell/utils/workpage/resources/resources_bg.properties +29 -17
  474. package/src/main/js/sap/ushell/utils/workpage/resources/resources_ca.properties +26 -14
  475. package/src/main/js/sap/ushell/utils/workpage/resources/resources_cnr.properties +11 -0
  476. package/src/main/js/sap/ushell/utils/workpage/resources/resources_cs.properties +15 -3
  477. package/src/main/js/sap/ushell/utils/workpage/resources/resources_cy.properties +15 -3
  478. package/src/main/js/sap/ushell/utils/workpage/resources/resources_da.properties +19 -7
  479. package/src/main/js/sap/ushell/utils/workpage/resources/resources_de.properties +16 -4
  480. package/src/main/js/sap/ushell/utils/workpage/resources/resources_el.properties +16 -4
  481. package/src/main/js/sap/ushell/utils/workpage/resources/resources_en.properties +13 -2
  482. package/src/main/js/sap/ushell/utils/workpage/resources/resources_en_GB.properties +18 -6
  483. package/src/main/js/sap/ushell/utils/workpage/resources/resources_en_US_sappsd.properties +28 -27
  484. package/src/main/js/sap/ushell/utils/workpage/resources/resources_en_US_saprigi.properties +78 -66
  485. package/src/main/js/sap/ushell/utils/workpage/resources/resources_en_US_saptrc.properties +68 -67
  486. package/src/main/js/sap/ushell/utils/workpage/resources/resources_es.properties +44 -32
  487. package/src/main/js/sap/ushell/utils/workpage/resources/resources_es_MX.properties +16 -4
  488. package/src/main/js/sap/ushell/utils/workpage/resources/resources_et.properties +24 -12
  489. package/src/main/js/sap/ushell/utils/workpage/resources/resources_fi.properties +16 -4
  490. package/src/main/js/sap/ushell/utils/workpage/resources/resources_fr.properties +29 -17
  491. package/src/main/js/sap/ushell/utils/workpage/resources/resources_fr_CA.properties +19 -7
  492. package/src/main/js/sap/ushell/utils/workpage/resources/resources_hi.properties +20 -8
  493. package/src/main/js/sap/ushell/utils/workpage/resources/resources_hr.properties +27 -15
  494. package/src/main/js/sap/ushell/utils/workpage/resources/resources_hu.properties +19 -7
  495. package/src/main/js/sap/ushell/utils/workpage/resources/resources_id.properties +13 -1
  496. package/src/main/js/sap/ushell/utils/workpage/resources/resources_it.properties +18 -6
  497. package/src/main/js/sap/ushell/utils/workpage/resources/resources_iw.properties +13 -1
  498. package/src/main/js/sap/ushell/utils/workpage/resources/resources_ja.properties +19 -7
  499. package/src/main/js/sap/ushell/utils/workpage/resources/resources_kk.properties +21 -9
  500. package/src/main/js/sap/ushell/utils/workpage/resources/resources_ko.properties +14 -2
  501. package/src/main/js/sap/ushell/utils/workpage/resources/resources_lt.properties +19 -7
  502. package/src/main/js/sap/ushell/utils/workpage/resources/resources_lv.properties +31 -19
  503. package/src/main/js/sap/ushell/utils/workpage/resources/resources_mk.properties +11 -0
  504. package/src/main/js/sap/ushell/utils/workpage/resources/resources_ms.properties +17 -5
  505. package/src/main/js/sap/ushell/utils/workpage/resources/resources_nl.properties +17 -5
  506. package/src/main/js/sap/ushell/utils/workpage/resources/resources_no.properties +16 -4
  507. package/src/main/js/sap/ushell/utils/workpage/resources/resources_pl.properties +17 -5
  508. package/src/main/js/sap/ushell/utils/workpage/resources/resources_pt.properties +17 -5
  509. package/src/main/js/sap/ushell/utils/workpage/resources/resources_pt_PT.properties +34 -22
  510. package/src/main/js/sap/ushell/utils/workpage/resources/resources_ro.properties +15 -3
  511. package/src/main/js/sap/ushell/utils/workpage/resources/resources_ru.properties +15 -3
  512. package/src/main/js/sap/ushell/utils/workpage/resources/resources_sh.properties +11 -0
  513. package/src/main/js/sap/ushell/utils/workpage/resources/resources_sk.properties +16 -4
  514. package/src/main/js/sap/ushell/utils/workpage/resources/resources_sl.properties +27 -15
  515. package/src/main/js/sap/ushell/utils/workpage/resources/resources_sr.properties +11 -0
  516. package/src/main/js/sap/ushell/utils/workpage/resources/resources_sv.properties +14 -2
  517. package/src/main/js/sap/ushell/utils/workpage/resources/resources_th.properties +18 -6
  518. package/src/main/js/sap/ushell/utils/workpage/resources/resources_tr.properties +22 -10
  519. package/src/main/js/sap/ushell/utils/workpage/resources/resources_uk.properties +15 -3
  520. package/src/main/js/sap/ushell/utils/workpage/resources/resources_vi.properties +24 -12
  521. package/src/main/js/sap/ushell/utils/workpage/resources/resources_zh_CN.properties +13 -1
  522. package/src/main/js/sap/ushell/utils/workpage/resources/resources_zh_TW.properties +17 -5
  523. package/src/main/js/sap/ushell/utils.js +14 -1
  524. package/src/test/js/sap/ushell/bootstrap/sandbox.js +1 -1
  525. package/ui5.yaml +5 -3
  526. package/src/main/js/sap/ushell/themes/base/fonts/horizon/BusinessSuiteInAppSymbols.ttf +0 -0
  527. package/src/main/js/sap/ushell/themes/base/fonts/horizon/BusinessSuiteInAppSymbols.woff +0 -0
  528. package/src/main/js/sap/ushell/themes/base/fonts/horizon/BusinessSuiteInAppSymbols.woff2 +0 -0
  529. package/src/main/js/sap/ushell/ui/shell/FloatingContainer.js +0 -238
  530. package/src/main/js/sap/ushell/ui5service/_ShellUIService/shelluiservice.class.factory.js +0 -746
  531. /package/src/main/js/sap/ushell/{ui → renderer}/RendererRootView.fragment.xml +0 -0
@@ -1,14 +1,14 @@
1
1
  // Copyright (c) 2009-2023 SAP SE, All Rights Reserved
2
+
2
3
  /**
3
4
  * @fileOverview handle all the resources for the different applications.
4
- * @version 1.128.1
5
+ * @version 1.129.1
5
6
  */
6
7
  sap.ui.define([
7
8
  "sap/ui/core/Element",
8
9
  "sap/ui/core/EventBus",
9
10
  "sap/ushell/components/applicationIntegration/Storage",
10
11
  "sap/ushell/components/applicationIntegration/application/BlueBoxHandler",
11
- "sap/ushell/ui5service/ShellUIService",
12
12
  "sap/ushell/components/applicationIntegration/application/Application",
13
13
  "sap/ushell/components/applicationIntegration/application/PostMessageUtils",
14
14
  "sap/ushell/components/applicationIntegration/application/WebGUIStatefulHandler",
@@ -20,24 +20,23 @@ sap.ui.define([
20
20
  "sap/ushell/ApplicationType",
21
21
  "sap/base/util/deepExtend",
22
22
  "sap/ushell/utils/UriParameters",
23
- "sap/ui/thirdparty/jquery",
24
23
  "sap/base/Log",
25
24
  "sap/ushell/EventHub",
26
25
  "sap/ushell/utils/UrlParsing",
27
- "sap/ui/core/Core",
28
26
  "sap/ui/thirdparty/hasher",
29
27
  "sap/ushell/services/MessageBroker/MessageBrokerEngine",
30
28
  "sap/ushell/renderer/utils",
31
29
  "sap/m/library",
32
30
  "sap/ushell/Container",
33
31
  "sap/ushell/state/StateManager",
34
- "sap/ushell/state/KeepAlive"
35
- ], function (
32
+ "sap/ushell/state/KeepAlive",
33
+ "sap/ushell/ui5service/ShellUIServiceFactory",
34
+ "sap/ui/core/service/ServiceFactoryRegistry"
35
+ ], (
36
36
  Element,
37
37
  EventBus,
38
38
  Storage,
39
39
  BlueBoxHandler,
40
- ShellUIService,
41
40
  Application,
42
41
  PostMessageUtils,
43
42
  WebGUIStatefulHandler,
@@ -49,49 +48,56 @@ sap.ui.define([
49
48
  ApplicationType,
50
49
  deepExtend,
51
50
  UriParameters,
52
- jQuery,
53
51
  Log,
54
52
  EventHub,
55
53
  oUrlParsing,
56
- Core,
57
54
  hasher,
58
55
  MessageBrokerEngine,
59
56
  RendererUtils,
60
57
  mobileLibrary,
61
58
  Container,
62
59
  StateManager,
63
- KeepAlive
64
- ) {
60
+ KeepAlive,
61
+ ShellUIServiceFactory,
62
+ ServiceFactoryRegistry
63
+ ) => {
65
64
  "use strict";
66
65
 
67
66
  // shortcut for sap.ushell.state.StateManager.ShellMode
68
67
  const ShellMode = StateManager.ShellMode;
69
68
 
69
+ // shortcut for sap.m.URLHelper
70
+ const URLHelper = mobileLibrary.URLHelper;
71
+
72
+ const CACHED_APP_TYPES = ["URL"];
73
+
74
+ const KEEP_ALIVE_MODES = {
75
+ FULL: "true",
76
+ RESTRICTED: "restricted"
77
+ };
78
+
70
79
  function AppLifeCycle () {
71
80
  //Dangling controls is a queue of requests to change shell elements attributes, requested by the application in the process of createContent before the actual application state was apply.
72
- var oViewPortContainer,
73
- aCachedAppTypes = ["URL"],
74
- sRootIntent,
75
- oShellUIService,
76
- disableHomeAppCache = false,
77
- bEnableRouterRetrigger = true,
78
- oCurrentApplication = {},
79
- oGlobalShellCommunicationHandlers = [],
80
- oGlobalIframeCommunicationHandlers = {},
81
- oComponentCreatedPromises = {},
82
- isBackNavigationChanged = false,
83
- oKeepAliveModes = {
84
- FULL: "true",
85
- RESTRICTED: "restricted"
86
- },
87
- fnOldTriggerEmail;
88
- var URLHelper = mobileLibrary.URLHelper;
81
+ let bDisableHomeAppCache = false;
82
+ let bEnableRouterRetrigger = true;
83
+ let oCurrentApplication = {};
84
+ const oGlobalShellCommunicationHandlers = [];
85
+ const oGlobalIframeCommunicationHandlers = {};
86
+ const oComponentCreatedPromises = {};
87
+ let isBackNavigationChanged = false;
88
+ let sRootIntent,
89
+ oGlobalShellUIService,
90
+ fnOldTriggerEmail,
91
+ oViewPortContainer;
89
92
 
90
93
  //connect FLP to the message broker
91
94
  if (window.QUnit === undefined) {
92
95
  MessageBrokerEngine.connect("FLP");
93
96
  }
94
97
 
98
+ /**
99
+ * @returns {object} Returns the RelatedServices API.
100
+ */
95
101
  this.service = function () {
96
102
  return RelatedServices;
97
103
  };
@@ -99,8 +105,12 @@ sap.ui.define([
99
105
  ///////////////////APPLICATION INTEGRATION API///////////////////////////////
100
106
  ///////////////////END APPLICATION INTEGRATION API///////////////////////////////
101
107
 
102
- this.isCurrentApp = function (appId) {
103
- return (oCurrentApplication.appId === appId);
108
+ /**
109
+ * @param {string} sAppId
110
+ * @returns {boolean} Returns true if it is the current application
111
+ */
112
+ this.isCurrentApp = function (sAppId) {
113
+ return (oCurrentApplication.appId === sAppId);
104
114
  };
105
115
 
106
116
  /**
@@ -146,7 +156,7 @@ sap.ui.define([
146
156
  */
147
157
  this.rejectComponentCreatedPromise = function (sAppId) {
148
158
  if (!sAppId) { return; }
149
- this.setComponentCreatedPromise(sAppId).reject("Component was not created for app " + sAppId);
159
+ this.setComponentCreatedPromise(sAppId).reject(`Component was not created for app "${sAppId}"`);
150
160
  };
151
161
 
152
162
  /**
@@ -161,8 +171,13 @@ sap.ui.define([
161
171
  return this.setComponentCreatedPromise(sAppId).promise;
162
172
  };
163
173
 
164
- this.isAppWithSimilarShellHashInCache = function (appId, sFixedShellHash) {
165
- var oAppEntry = Storage.get(appId);
174
+ /**
175
+ * @param {string} sAppId
176
+ * @param {string} sFixedShellHash
177
+ * @returns {boolean} Returns true if a similar app was found in the cache
178
+ */
179
+ this.isAppWithSimilarShellHashInCache = function (sAppId, sFixedShellHash) {
180
+ const oAppEntry = Storage.get(sAppId);
166
181
 
167
182
  if (oAppEntry) {
168
183
  if (oAppEntry.shellHash === sFixedShellHash) {
@@ -173,13 +188,21 @@ sap.ui.define([
173
188
  return false;
174
189
  };
175
190
 
176
- this.isAppInCache = function (appId) {
177
- return !!Storage.get(appId);
191
+ /**
192
+ * @param {string} sAppId
193
+ * @returns {boolean} Returns true if the app is in the cache
194
+ */
195
+ this.isAppInCache = function (sAppId) {
196
+ return !!Storage.get(sAppId);
178
197
  };
179
198
 
199
+ /**
200
+ * @param {string} sAppId
201
+ * @returns {string} Returns the normalized appId
202
+ */
180
203
  this.normalizeAppId = function (sAppId) {
181
- var sCmp = "-component",
182
- isCmp = sAppId.endsWith(sCmp);
204
+ const sCmp = "-component";
205
+ const isCmp = sAppId.endsWith(sCmp);
183
206
 
184
207
  if (isCmp) {
185
208
  return sAppId.substring(0, sAppId.length - sCmp.length);
@@ -187,9 +210,14 @@ sap.ui.define([
187
210
  return sAppId;
188
211
  };
189
212
 
213
+ /**
214
+ * @param {object} oEvent
215
+ * @param {string} sChannel
216
+ * @param {object} oData
217
+ */
190
218
  this.onComponentCreated = function (oEvent, sChannel, oData) {
191
- var oApp = oData.component,
192
- sAppId = this.normalizeAppId(oApp.getId());
219
+ const oApp = oData.component;
220
+ const sAppId = this.normalizeAppId(oApp.getId());
193
221
 
194
222
  if (this.isAppInCache(sAppId)) {
195
223
  Storage.get(sAppId).app = oApp;
@@ -205,12 +233,20 @@ sap.ui.define([
205
233
  this.resolveComponentCreatedPromise(sAppId);
206
234
  };
207
235
 
236
+ /**
237
+ * @param {object} oEvent
238
+ * @param {string} sChannel
239
+ * @param {object} oData
240
+ */
208
241
  this.onGetMe = function (oEvent, sChannel, oData) {
209
242
  oData.AppLifeCycle = this;
210
243
  };
211
244
 
245
+ /**
246
+ * @param {string} sAppId
247
+ */
212
248
  this.store = function (sAppId) {
213
- var oStorageEntry = Storage.get(sAppId);
249
+ const oStorageEntry = Storage.get(sAppId);
214
250
 
215
251
  if (oStorageEntry) {
216
252
  Application.store(oStorageEntry);
@@ -218,9 +254,14 @@ sap.ui.define([
218
254
  }
219
255
  };
220
256
 
221
- this.destroyApplication = function (sAppId, oFrom, oDeferred, bHardDestroy) {
222
- var oStorageEntry = Storage.get(sAppId),
223
- oPromiseAppDestroy;
257
+ /**
258
+ * @param {string} sAppId
259
+ * @param {object} oFrom
260
+ * @param {boolean} bHardDestroy
261
+ * @returns {Promise} Resolves when the app is destroyed.
262
+ */
263
+ this.destroyApplication = async function (sAppId, oFrom, bHardDestroy) {
264
+ const oStorageEntry = Storage.get(sAppId);
224
265
 
225
266
  if (!sAppId || !oFrom) {
226
267
  return;
@@ -233,95 +274,96 @@ sap.ui.define([
233
274
  KeepAlive.destroy(oStorageEntry);
234
275
  }
235
276
 
236
- if (bHardDestroy === true) {
277
+ if (bHardDestroy) {
237
278
  Storage.removeByContainer(oFrom);
238
279
  this.removeControl(sAppId);
239
280
  doDestroy();
240
- if (oDeferred) {
241
- oDeferred.resolve();
242
- }
243
281
  return;
244
282
  }
245
283
 
246
284
  if (oStorageEntry) {
247
285
  Storage.removeById(sAppId);
248
286
  if (BlueBoxHandler.isStatefulContainer(oStorageEntry.container)) {
249
- oPromiseAppDestroy = BlueBoxHandler.statefulDestroyApp(oStorageEntry.container, sAppId);
287
+ await BlueBoxHandler.statefulDestroyApp(oStorageEntry.container, sAppId);
250
288
  } else if (!BlueBoxHandler.returnUnusedKeepAliveContainer(oStorageEntry.container)) {
251
289
  this.removeControl(sAppId);
252
290
  BlueBoxHandler.deleteBlueBoxByContainer(oStorageEntry.container);
253
291
  oStorageEntry.container.destroy();
254
- oPromiseAppDestroy = Promise.resolve();
255
292
  } else {
256
- oPromiseAppDestroy = this.handleExitStateful(sAppId, oStorageEntry.container, false);
257
- }
258
- if (oDeferred) {
259
- oPromiseAppDestroy.then(oDeferred.resolve);
260
- }
261
- } else {
262
- this.removeControl(sAppId);
263
- // If the application running in an iframe registered for "before close" event,
264
- // we first post it a message to prepare for closing (usually, the app will close
265
- // its session or release locks held on the server), and only when the iframe send a response
266
- // back that it finished processing the event, we will continue to destroy the app (iframe).
267
- // If the app in the iframe did not register to the event, we destroy the app immediately exactly
268
- // as it was done before.
269
- // Note that even if the response from the iframe is not successful, we still destroy the app
270
- // because the second app that we navigated to was already created so we can not stop
271
- // the actual navigation (this is the same behaviour that we had before).
272
- // This mechanism was added to solve the change made in Chrome to disallow Sync XHR on
273
- // browser close.
274
- var oPromise = oFrom && oFrom.sendBeforeAppCloseEvent && oFrom.sendBeforeAppCloseEvent();
275
-
276
- if (oPromise === undefined) {
277
- doDestroy();
278
- if (oDeferred) {
279
- oDeferred.resolve();
280
- }
281
- } else {
282
- oPromise.then(function () {
283
- doDestroy();
284
- if (oDeferred) {
285
- oDeferred.resolve();
286
- }
287
- }, function (sError) {
288
- doDestroy();
289
- if (oDeferred) {
290
- oDeferred.resolve();
291
- }
292
- Log.error(
293
- "FLP got a failed response from the iframe for the 'sap.ushell.services.CrossApplicationNavigation.beforeAppCloseEvent' message sent",
294
- sError,
295
- "sap.ushell.components.applicationIntegration.AppLifeCycle.js");
296
- });
293
+ await this.handleExitStateful(sAppId, oStorageEntry.container, false);
297
294
  }
295
+ return;
296
+ }
297
+
298
+ this.removeControl(sAppId);
299
+ /**
300
+ * If the application running in an iframe registered for "before close" event,
301
+ * we first post it a message to prepare for closing (usually, the app will close
302
+ * its session or release locks held on the server), and only when the iframe send a response
303
+ * back that it finished processing the event, we will continue to destroy the app (iframe).
304
+ * If the app in the iframe did not register to the event, we destroy the app immediately exactly
305
+ * as it was done before.
306
+ * Note that even if the response from the iframe is not successful, we still destroy the app
307
+ * because the second app that we navigated to was already created so we can not stop
308
+ * the actual navigation (this is the same behaviour that we had before).
309
+ * This mechanism was added to solve the change made in Chrome to disallow Sync XHR on
310
+ * browser close.
311
+ */
312
+ const oPromise = oFrom?.sendBeforeAppCloseEvent?.() || Promise.resolve();
313
+
314
+ try {
315
+ await ushellUtils.promisify(oPromise);
316
+ } catch (sError) {
317
+ Log.error(
318
+ "FLP got a failed response from the iframe for the 'sap.ushell.services.CrossApplicationNavigation.beforeAppCloseEvent' message sent",
319
+ sError,
320
+ "sap.ushell.components.applicationIntegration.AppLifeCycle.js"
321
+ );
298
322
  }
323
+ doDestroy();
299
324
  };
300
325
 
326
+ /**
327
+ * @param {string} sAppId
328
+ */
301
329
  this.restore = function (sAppId) {
302
- var oStorageEntry = Storage.get(sAppId);
330
+ const oStorageEntry = Storage.get(sAppId);
303
331
 
304
- if (oStorageEntry && oStorageEntry.stateStored === true) {
332
+ if (oStorageEntry?.stateStored) {
333
+ // 1) Extensions
305
334
  RelatedServices.restore(oStorageEntry.service);
306
335
  this.setBackNavigationChanged(true);
307
336
  AppMeta.restore(oStorageEntry.meta);
337
+ // 2) Extension API
338
+ ShellUIServiceFactory.restore(oStorageEntry);
339
+ // 3) Application
308
340
  Application.restore(oStorageEntry);
309
341
  }
310
342
  };
311
343
 
344
+ /**
345
+ * @param {string} sAppId
346
+ */
312
347
  this.active = function (sAppId) {
313
- var oStorageEntry = Storage.get(sAppId);
348
+ const oStorageEntry = Storage.get(sAppId);
314
349
 
315
350
  if (oStorageEntry) {
316
351
  Application.active(oStorageEntry.app);
317
352
  }
318
353
  };
319
354
 
320
- this.handleExitStateful = function (sFromId, oFrom, isHomePage, bForceCloseApp) {
321
- var sActualAppFromId = oFrom.getCurrentAppId && oFrom.getCurrentAppId();
355
+ /**
356
+ * @param {string} sFromId
357
+ * @param {object} oFrom
358
+ * @param {boolean} bIsHomePage
359
+ * @param {boolean} bForceCloseApp
360
+ * @returns {Promise} Resolves when the app is closed.
361
+ */
362
+ this.handleExitStateful = function (sFromId, oFrom, bIsHomePage, bForceCloseApp) {
363
+ const sActualAppFromId = oFrom.getCurrentAppId?.();
322
364
 
323
365
  if (Storage.get(sActualAppFromId)) {
324
- if ((RelatedServices.isBackNavigation() === true && !isHomePage) || (bForceCloseApp === true)) {
366
+ if ((RelatedServices.isBackNavigation() && !bIsHomePage) || (bForceCloseApp)) {
325
367
  EventBus.getInstance().publish("sap.ushell", "appClosed", oFrom);
326
368
  Storage.removeById(sActualAppFromId);
327
369
  return BlueBoxHandler.statefulDestroyApp(oFrom);
@@ -334,84 +376,84 @@ sap.ui.define([
334
376
  return BlueBoxHandler.statefulDestroyApp(oFrom);
335
377
  };
336
378
 
337
- this.handleExitApplication = function (sFromId, oFrom, sToId, oTo, isHomePage, bFromAfterNavigate) {
338
- var that = this,
339
- bIsAppOfTypeCachable,
340
- oPromiseAppClose,
341
- oDeferredAppClose;
379
+ /**
380
+ * @param {string} sFromId
381
+ * @param {object} oFrom
382
+ * @param {string} sToId
383
+ * @param {object} oTo
384
+ * @param {boolean} bIsHomePage
385
+ * @param {boolean} bFromAfterNavigate
386
+ * @returns {Promise} Resolves when the app is closed.
387
+ */
388
+ this.handleExitApplication = async function (sFromId, oFrom, sToId, oTo, bIsHomePage, bFromAfterNavigate) {
389
+ function fnCloseKeepAliveIfRestricted (oApp) {
390
+ return (oApp.keepAliveMode === KEEP_ALIVE_MODES.RESTRICTED);
391
+ }
342
392
 
343
393
  //this code must be at the beginning of the function to allow it to be processed once in
344
- //a cycle of openning an app
345
- if (sToId && oTo && oTo.getIframeReusedForApp && oTo.getIframeReusedForApp() === true) {
394
+ //a cycle of opening an app
395
+ if (sToId && oTo?.getIframeReusedForApp?.()) {
346
396
  oTo.setProperty("iframeReusedForApp", false, true);
347
397
  PostMessageUtils.postMessageToIframeApp(oTo, "sap.ushell.sessionHandler", "afterApplicationShow", {}, false);
348
398
  }
349
399
 
350
400
  //if called from onAfterNavigate, do nothing if oFrom is stateful container, because
351
401
  //application was already closed at the beginning of 'handleControl'
352
- if (isHomePage === false && bFromAfterNavigate === true && (BlueBoxHandler.isStatefulContainer(oFrom) || BlueBoxHandler.isStatefulContainerInKeepAlivePool(oFrom))) {
353
- return new jQuery.Deferred().resolve().promise();
402
+ if (!bIsHomePage && bFromAfterNavigate && (BlueBoxHandler.isStatefulContainer(oFrom) || BlueBoxHandler.isStatefulContainerInKeepAlivePool(oFrom))) {
403
+ return;
354
404
  }
355
405
 
356
- if (oFrom && oFrom.getCurrentAppId && oFrom.getCurrentAppId()) {
406
+ if (oFrom?.getCurrentAppId?.()) {
357
407
  sFromId = oFrom.getCurrentAppId();
358
408
  }
359
409
 
360
410
  if (sFromId && oFrom) {
361
411
  // STATEFUL
362
412
  if (BlueBoxHandler.isStatefulContainer(oFrom)) {
363
- oPromiseAppClose = this.handleExitStateful(sFromId, oFrom, isHomePage);
413
+ await this.handleExitStateful(sFromId, oFrom, bIsHomePage);
364
414
 
365
- //STATELESS
415
+ //STATELESS
366
416
  } else if (Storage.get(sFromId)) {
367
417
  // Back Navigation Case
368
- if (RelatedServices.isBackNavigation() === true && !isHomePage) {
418
+ if (RelatedServices.isBackNavigation() && !bIsHomePage) {
369
419
  //check if the Iframe needs to be cached instead of destroy
370
420
  if (!BlueBoxHandler.returnUnusedKeepAliveContainer(oFrom)) {
371
- oDeferredAppClose = new jQuery.Deferred();
372
- this.destroyApplication(sFromId, oFrom, oDeferredAppClose);
373
- oPromiseAppClose = oDeferredAppClose.promise();
421
+ await this.destroyApplication(sFromId, oFrom);
374
422
  } else {
375
- oPromiseAppClose = this.handleExitStateful(sFromId, oFrom, isHomePage);
423
+ await this.handleExitStateful(sFromId, oFrom, bIsHomePage);
376
424
  }
377
425
 
378
- // Forward Navigation Cases
426
+ // Forward Navigation Cases
379
427
  } else if (oFrom.getApplicationType() === "UI5") {
380
- // Wait until navigation's source app has been started completey, so that a later back navigation finds a proper app that
428
+ // Wait until navigation's source app has been started completely, so that a later back navigation finds a proper app that
381
429
  // can be re-enabled (keep-alive scenario)
382
- oPromiseAppClose = this.getComponentCreatedPromise(sFromId).then(() => { this.store(sFromId); });
430
+ await this.getComponentCreatedPromise(sFromId);
431
+ this.store(sFromId);
383
432
  } else {
384
433
  this.store(sFromId);
385
434
  }
386
435
  EventBus.getInstance().publish("sap.ushell", "appClosed", oFrom);
387
436
 
388
- // LEGACY STATEFUL (WebGUI)
389
- } else if (oFrom.getStatefulType && oFrom.getStatefulType() === BlueBoxHandler.STATEFUL_TYPES.GUI_V1) {
390
- if (isHomePage) {
391
- oPromiseAppClose = PostMessageUtils.postMessageToIframeApp(oFrom, "sap.gui", "triggerCloseSessionImmediately");
437
+ // LEGACY STATEFUL (WebGUI)
438
+ } else if (oFrom.getStatefulType?.() === BlueBoxHandler.STATEFUL_TYPES.GUI_V1) {
439
+ if (bIsHomePage) {
440
+ await PostMessageUtils.postMessageToIframeApp(oFrom, "sap.gui", "triggerCloseSessionImmediately");
392
441
  }
393
442
 
394
- // THE REST...
443
+ // THE REST...
395
444
  } else {
396
- bIsAppOfTypeCachable = aCachedAppTypes.indexOf(oFrom.getApplicationType) >= 0;
445
+ const bIsAppOfTypeCachable = CACHED_APP_TYPES.indexOf(oFrom.getApplicationType) >= 0;
397
446
 
398
447
  //destroy the application and its resources
399
- var bIsKeepAlive = this.isAppOfTypeCached(sFromId, bIsAppOfTypeCachable);
400
- if (bIsKeepAlive === false) {
401
- oDeferredAppClose = new jQuery.Deferred();
402
- this.destroyApplication(sFromId, oFrom, oDeferredAppClose);
403
- oPromiseAppClose = oDeferredAppClose.promise();
448
+ const bIsKeepAlive = this.isAppOfTypeCached(sFromId, bIsAppOfTypeCachable);
449
+ if (!bIsKeepAlive) {
450
+ await this.destroyApplication(sFromId, oFrom);
404
451
  }
405
452
  }
406
453
 
407
- if (isHomePage === true) {
408
- if (oPromiseAppClose === undefined) {
409
- this.closeKeepAliveApps(fnCloseKeepAliveIfRestricted);
410
- } else {
411
- oPromiseAppClose.then(function () {
412
- that.closeKeepAliveApps(fnCloseKeepAliveIfRestricted);
413
- });
414
- }
454
+ if (bIsHomePage) {
455
+ // todo: [FLPCOREANDUX-10024] Check whether we need to await the close as well
456
+ this.closeKeepAliveApps(fnCloseKeepAliveIfRestricted);
415
457
  }
416
458
 
417
459
  //handle the case of appFiner
@@ -421,61 +463,56 @@ sap.ui.define([
421
463
  }
422
464
 
423
465
  EventBus.getInstance().publish("relatedServices", "resetBackNavigation");
424
-
425
- if (oPromiseAppClose === undefined) {
426
- oPromiseAppClose = new jQuery.Deferred().resolve().promise();
427
- }
428
-
429
- return oPromiseAppClose;
430
466
  };
431
467
 
432
- function fnCloseKeepAliveIfRestricted (oApp) {
433
- return (oApp.keepAliveMode === oKeepAliveModes.RESTRICTED);
434
- }
435
-
436
- this.closeKeepAliveApps = function (fnFilterApps, arrClosePromises) {
468
+ /**
469
+ * @param {function(): boolean} fnFilterApps The filter function
470
+ * @returns {Promise} Resolves when all keep alive apps are closed.
471
+ */
472
+ this.closeKeepAliveApps = function (fnFilterApps) {
437
473
  try {
438
- var that = this,
439
- arrKeepAliveRestrictedApps = [];
474
+ const aKeepAliveRestrictedApps = [];
440
475
 
441
- Storage.forEach(function (oApp) {
442
- if (fnFilterApps.apply(this, [oApp]) === true) {
443
- arrKeepAliveRestrictedApps.push(oApp);
476
+ Storage.forEach((oApp) => {
477
+ if (fnFilterApps(oApp)) {
478
+ aKeepAliveRestrictedApps.push(oApp);
444
479
  }
445
480
  });
446
- arrKeepAliveRestrictedApps.forEach(function (oRestrictedApp) {
481
+ const aClosePromises = aKeepAliveRestrictedApps.map((oRestrictedApp) => {
447
482
  //check if it needs to be cached instead of destroy
448
- var oDeferredAppClose;
449
- var bDestroy = !BlueBoxHandler.returnUnusedKeepAliveContainer(oRestrictedApp.container);
483
+ const bDestroy = !BlueBoxHandler.returnUnusedKeepAliveContainer(oRestrictedApp.container);
450
484
  if (bDestroy) {
451
- if (arrClosePromises) {
452
- oDeferredAppClose = new jQuery.Deferred();
453
- arrClosePromises.push(oDeferredAppClose.promise());
454
- }
455
- that.destroyApplication(oRestrictedApp.appId, oRestrictedApp.container, oDeferredAppClose);
456
- } else {
457
- oDeferredAppClose = that.handleExitStateful(oRestrictedApp.appId, oRestrictedApp.container, true, true);
458
- if (arrClosePromises) {
459
- arrClosePromises.push(oDeferredAppClose.promise());
460
- }
485
+ return this.destroyApplication(oRestrictedApp.appId, oRestrictedApp.container);
461
486
  }
487
+
488
+ return this.handleExitStateful(oRestrictedApp.appId, oRestrictedApp.container, true, true);
462
489
  });
490
+
491
+ return Promise.all(aClosePromises);
463
492
  } catch (e) {
464
- Log.error("Error: sap.ushell.services.appLifeCycle.closeOtherKeepAliveRestrictedApps:" + e);
493
+ Log.error("closeKeepAliveApps call failed", e);
465
494
  }
466
495
  };
467
496
 
497
+ /**
498
+ * @param {string} sFromId
499
+ * @param {object} oFrom
500
+ */
468
501
  this.onBeforeNavigate = function (sFromId, oFrom) {
469
- if (sFromId && oFrom && oFrom._getIFrame && oFrom._getIFrame() &&
470
- (oFrom.getStatefulType && oFrom.getStatefulType() > BlueBoxHandler.STATEFUL_TYPES.NOT_SUPPORTED) || Storage.get(sFromId)) {
502
+ if (sFromId && oFrom?._getIFrame?.() && oFrom?.getStatefulType?.() > BlueBoxHandler.STATEFUL_TYPES.NOT_SUPPORTED || Storage.get(sFromId)) {
471
503
  PostMessageUtils.postMessageToIframeApp(oFrom, "sap.ushell.sessionHandler", "beforeApplicationHide", {}, false);
472
504
  }
473
505
  };
474
506
 
475
- //call lifecycle interface "setInitialConfiguration"
476
- this.onAfterNavigate = function (sFromId, oFrom, sToId, oTo) {
507
+ /**
508
+ * @param {string} sFromId
509
+ * @param {object} oFrom
510
+ * @param {string} sToId
511
+ * @param {object} oTo
512
+ */
513
+ this.onAfterNavigate = function (sFromId, oFrom, sToId, oTo) { //call lifecycle interface "setInitialConfiguration"
477
514
  //destroy the application if not cached or marked for reuse.
478
- var bIsShellApps = sToId.indexOf("Shell-appfinder-component") > 0
515
+ const bIsShellApps = sToId.indexOf("Shell-appfinder-component") > 0
479
516
  || sToId.indexOf("Shell-home-component") > 0
480
517
  || sToId.indexOf("pages-component-container") > 0
481
518
  || sToId.indexOf("homeApp-component-container") > 0
@@ -483,7 +520,7 @@ sap.ui.define([
483
520
  || sToId.indexOf("runtimeSwitcher-component-container") > 0;
484
521
 
485
522
  this.handleExitApplication(sFromId, oFrom, sToId, oTo, bIsShellApps, true);
486
- if (bIsShellApps === true) {
523
+ if (bIsShellApps) {
487
524
  Application.setActiveAppContainer(undefined);
488
525
  }
489
526
 
@@ -498,24 +535,32 @@ sap.ui.define([
498
535
  }
499
536
  };
500
537
 
501
- this.storeApp = function (appId, oContainer, oTarget, sFixedShellHash, oKeepAliveMode) {
502
- if (!this.isAppInCache(appId)) {
538
+ /**
539
+ * @param {string} sAppId
540
+ * @param {object} oContainer
541
+ * @param {object} oTarget
542
+ * @param {string} sFixedShellHash
543
+ * @param {object} oKeepAliveMode
544
+ * @returns {boolean} Returns true if the app was stored
545
+ */
546
+ this.storeApp = function (sAppId, oContainer, oTarget, sFixedShellHash, oKeepAliveMode) {
547
+ if (!this.isAppInCache(sAppId)) {
503
548
  if (oContainer.setProperty) {
504
549
  oContainer.setProperty("isKeepAlive", true, true);
505
550
  }
506
- Storage.set(appId, {
551
+ Storage.set(sAppId, {
507
552
  service: {},
508
553
  shellHash: sFixedShellHash,
509
- appId: appId,
554
+ appId: sAppId,
510
555
  stt: "loading",
511
556
  currentState: null, // current state is stored before close see: sap/ushell/state/CurrentState
512
557
  controlManager: null, // control manager state is stored before close see: sap/ushell/state/ControlManager
513
558
  container: oContainer,
514
559
  meta: AppConfiguration.getMetadata(oTarget),
515
560
  app: undefined,
516
- keepAliveMode: oKeepAliveMode && (oKeepAliveMode.globalValue || oKeepAliveMode.paramValue),
561
+ keepAliveMode: oKeepAliveMode?.globalValue || oKeepAliveMode?.paramValue,
517
562
  appTarget: oTarget,
518
- ui5ComponentName: oTarget && oTarget.ui5ComponentName,
563
+ ui5ComponentName: oTarget?.ui5ComponentName,
519
564
  enableRouterRetrigger: bEnableRouterRetrigger,
520
565
  stateStored: false
521
566
  });
@@ -548,7 +593,7 @@ sap.ui.define([
548
593
  return;
549
594
  }
550
595
 
551
- if (oContainer && oContainer.getApplicationType() === "UI5") {
596
+ if (oContainer?.getApplicationType() === "UI5") {
552
597
  await this.getComponentCreatedPromise(sAppId);
553
598
  }
554
599
 
@@ -560,26 +605,30 @@ sap.ui.define([
560
605
  KeepAlive.store(oStorageEntry);
561
606
  };
562
607
 
563
- this.isAppOfTypeCached = function (appId, bIsAppOfTypeCachable, oKeepAliveMode) {
564
- var sKeepAlive;
565
-
608
+ /**
609
+ * @param {string} sAppId
610
+ * @param {boolean} bIsAppOfTypeCachable
611
+ * @param {object} oKeepAliveMode
612
+ * @returns {boolean} Returns true if the app is of type cached.
613
+ */
614
+ this.isAppOfTypeCached = function (sAppId, bIsAppOfTypeCachable, oKeepAliveMode) {
566
615
  //generic intent currently can never be keep alive
567
- if (appId === "application-Shell-startIntent") {
616
+ if (sAppId === "application-Shell-startIntent") {
568
617
  return false;
569
618
  }
570
619
 
571
620
  //handle the root intent
572
- if (!disableHomeAppCache && appId.indexOf(sRootIntent) !== -1) {
621
+ if (!bDisableHomeAppCache && sAppId.indexOf(sRootIntent) !== -1) {
573
622
  return true;
574
623
  }
575
624
 
576
- if (!disableHomeAppCache && appId.indexOf("Shell-appfinder") !== -1) {
625
+ if (!bDisableHomeAppCache && sAppId.indexOf("Shell-appfinder") !== -1) {
577
626
  return true;
578
627
  }
579
628
 
580
629
  //In order to enable application to play with the keep alive, we read the keep attribute of the hash, if it is true application is cachable.
581
- sKeepAlive = new URLSearchParams(window.location.search).get("sap-keep-alive");
582
- if (sKeepAlive === oKeepAliveModes.FULL || sKeepAlive === oKeepAliveModes.RESTRICTED) {
630
+ const sKeepAlive = new URLSearchParams(window.location.search).get("sap-keep-alive");
631
+ if (sKeepAlive === KEEP_ALIVE_MODES.FULL || sKeepAlive === KEEP_ALIVE_MODES.RESTRICTED) {
583
632
  if (oKeepAliveMode) {
584
633
  oKeepAliveMode.globalValue = sKeepAlive;
585
634
  }
@@ -588,32 +637,31 @@ sap.ui.define([
588
637
  return false;
589
638
  };
590
639
 
640
+ /**
641
+ * @param {object} oShellHash
642
+ * @param {object} oTarget
643
+ * @param {object} oKeepAliveMode
644
+ * @returns {boolean} Returns true if the app should be cached.
645
+ */
591
646
  this.isCachedEnabledAsAppParameter = function (oShellHash, oTarget, oKeepAliveMode) {
592
- var sKeepAlive;
647
+ let sKeepAlive;
593
648
 
594
649
  //generic intent currently can never be keep alive
595
- if (oShellHash && oShellHash.semanticObject === "Shell" && oShellHash.action === "startIntent") {
650
+ if (oShellHash?.semanticObject === "Shell" && oShellHash?.action === "startIntent") {
596
651
  return false;
597
652
  }
598
653
 
599
- //temporary fix for issue found in keep alive fiori apps when stateful container
600
- //is used (meaning - fiori keep alive apps in cFLP). At the moment
601
- //it will not be supported until the issue will be solved
602
- //if (oTarget && oTarget.appCapabilities && oTarget && oTarget.appCapabilities.appFrameworkId === "UI5") {
603
- // return false;
604
- //}
605
-
606
- sKeepAlive = oShellHash && oShellHash.params && oShellHash.params["sap-keep-alive"];
607
- if (sKeepAlive === oKeepAliveModes.FULL || sKeepAlive === oKeepAliveModes.RESTRICTED) {
654
+ sKeepAlive = oShellHash?.params?.["sap-keep-alive"];
655
+ if (sKeepAlive === KEEP_ALIVE_MODES.FULL || sKeepAlive === KEEP_ALIVE_MODES.RESTRICTED) {
608
656
  if (oKeepAliveMode) {
609
657
  oKeepAliveMode.paramValue = sKeepAlive;
610
658
  }
611
659
  return true;
612
660
  }
613
661
 
614
- if (oTarget && oTarget.url) {
662
+ if (oTarget?.url) {
615
663
  sKeepAlive = UriParameters.fromURL(oTarget.url).get("sap-keep-alive");
616
- if (sKeepAlive === oKeepAliveModes.FULL || sKeepAlive === oKeepAliveModes.RESTRICTED) {
664
+ if (sKeepAlive === KEEP_ALIVE_MODES.FULL || sKeepAlive === KEEP_ALIVE_MODES.RESTRICTED) {
617
665
  if (oKeepAliveMode) {
618
666
  oKeepAliveMode.paramValue = sKeepAlive;
619
667
  }
@@ -624,51 +672,65 @@ sap.ui.define([
624
672
  return false;
625
673
  };
626
674
 
675
+ /**
676
+ * @param {object} oTarget
677
+ * @returns {string} Returns the application type.
678
+ */
627
679
  this.calculateAppType = function (oTarget) {
628
- if (oTarget.applicationType === "URL" && oTarget.additionalInformation && oTarget.additionalInformation.startsWith("SAPUI5.Component=")) {
680
+ if (oTarget.applicationType === "URL" && oTarget?.additionalInformation?.startsWith?.("SAPUI5.Component=")) {
629
681
  return "SAPUI5";
630
682
  }
631
683
  return oTarget.applicationType;
632
684
  };
633
685
 
634
- this.reloadCurrentApp = function (oData) {
635
- var oTmpAppContainer = BlueBoxHandler.getBlueBoxById(oData.sAppContainerId);
686
+ /**
687
+ * @param {object} oData
688
+ * @returns {Promise} Resolves when the app is reloded.
689
+ */
690
+ this.reloadCurrentApp = async function (oData) {
691
+ const oTmpAppContainer = BlueBoxHandler.getBlueBoxById(oData.sAppContainerId);
636
692
  if (oTmpAppContainer) {
637
- var sTmpUrl = oTmpAppContainer.getUrl();
693
+ const sTmpUrl = oTmpAppContainer.getUrl();
638
694
  BlueBoxHandler.removeCapabilities(oTmpAppContainer);
639
695
  Storage.removeByContainer(oTmpAppContainer);
640
696
  this.destroyApplication(oData.sAppContainerId, oTmpAppContainer);
641
697
  BlueBoxHandler.deleteBlueBoxByUrl(sTmpUrl);
642
698
  }
643
- Container.getServiceAsync("ShellNavigationInternal").then(function (oShellNavigationInternal) {
644
- try {
645
- oShellNavigationInternal.hashChanger.treatHashChanged(oData.sCurrentHash);
646
- } catch (error) {
647
- Log.error("Error when trying to re-load the current displayed application", error, "sap.ushell.services.AppLifeCycle");
648
- }
649
- });
699
+
700
+ const ShellNavigationInternal = await Container.getServiceAsync("ShellNavigationInternal");
701
+ try {
702
+ ShellNavigationInternal.hashChanger.treatHashChanged(oData.sCurrentHash);
703
+ } catch (error) {
704
+ Log.error("Error when trying to re-load the current displayed application", error, "sap.ushell.services.AppLifeCycle");
705
+ }
650
706
  };
651
707
 
652
- this.openApp = function (inAppId, oTarget, oShellHash, sFixedShellHash) {
653
- var oContainer,
708
+ /**
709
+ * @param {string} sAppId
710
+ * @param {object} oTarget
711
+ * @param {object} oShellHash
712
+ * @param {object} sFixedShellHash
713
+ */
714
+ this.openApp = function (sAppId, oTarget, oShellHash, sFixedShellHash) {
715
+ const bIsAppOfTypeCachable = CACHED_APP_TYPES.indexOf(oTarget.applicationType) >= 0;
716
+ const oKeepAliveMode = {
717
+ globalValue: undefined,
718
+ paramValue: undefined
719
+ };
720
+ let oContainer,
654
721
  sIntent,
655
- bIsAppOfTypeCachable = aCachedAppTypes.indexOf(oTarget.applicationType) >= 0,
656
722
  oTmpAppContainer,
657
723
  oContainerToUse,
658
- sTmpUrl,
659
- oKeepAliveMode = {
660
- globalValue: undefined,
661
- paramValue: undefined
662
- };
724
+ sTmpUrl;
663
725
 
664
726
  //format appId, the is the storage identifier
665
- var appId = "application" + inAppId;
727
+ const appId = `application${sAppId}`;
666
728
 
667
729
  //this case will handle the stateful containers flow.
668
730
  oContainer = BlueBoxHandler.getBlueBoxByUrl(oTarget.url);
669
731
 
670
- var bIsKeepAlive = this.isAppOfTypeCached(appId, bIsAppOfTypeCachable, oKeepAliveMode);
671
- var bIsCachedByParameter = this.isCachedEnabledAsAppParameter(oShellHash, oTarget, oKeepAliveMode);
732
+ const bIsKeepAlive = this.isAppOfTypeCached(appId, bIsAppOfTypeCachable, oKeepAliveMode);
733
+ const bIsCachedByParameter = this.isCachedEnabledAsAppParameter(oShellHash, oTarget, oKeepAliveMode);
672
734
 
673
735
  if (BlueBoxHandler.isStatefulContainer(oContainer)) {
674
736
  if (bIsKeepAlive || bIsCachedByParameter) {
@@ -697,15 +759,15 @@ sap.ui.define([
697
759
  if (!oContainerToUse) {
698
760
  //in cFLP, there night me an existing container of the same app from a different server,
699
761
  //so we will need to destroy it to avoid duplicate id
700
- sIntent = oShellHash.semanticObject + "-" + oShellHash.action;
701
- oTmpAppContainer = BlueBoxHandler.getBlueBoxById("application-" + sIntent) || this.getControl(sIntent);
762
+ sIntent = `${oShellHash.semanticObject}-${oShellHash.action}`;
763
+ oTmpAppContainer = BlueBoxHandler.getBlueBoxById(`application-${sIntent}`) || this.getControl(sIntent);
702
764
  if (oTmpAppContainer) {
703
765
  sTmpUrl = oTmpAppContainer.getUrl();
704
766
  BlueBoxHandler.removeCapabilities(oTmpAppContainer);
705
- this.destroyApplication("application-" + sIntent, oTmpAppContainer);
767
+ this.destroyApplication(`application-${sIntent}`, oTmpAppContainer);
706
768
  BlueBoxHandler.deleteBlueBoxByUrl(sTmpUrl);
707
769
  }
708
- oContainer = Application.createApplicationContainer(inAppId, oTarget);
770
+ oContainer = Application.createApplicationContainer(sAppId, oTarget);
709
771
  } else {
710
772
  oContainer = oContainerToUse;
711
773
  }
@@ -714,27 +776,27 @@ sap.ui.define([
714
776
  if (this.isAppInCache(appId)) {
715
777
  oCurrentApplication = Storage.get(appId);
716
778
  }
717
- } else if (oTarget.applicationType === "TR" || (oTarget.appCapabilities && oTarget.appCapabilities.appFrameworkId === "GUI")) {
779
+ } else if (oTarget.applicationType === "TR" || oTarget?.appCapabilities?.appFrameworkId === "GUI") {
718
780
  oContainer = BlueBoxHandler.getBlueBoxByUrl(oTarget.url);
719
- if (oContainer && oContainer.getStatefulType && oContainer.getStatefulType() !== BlueBoxHandler.STATEFUL_TYPES.GUI_V1) {
781
+ if (oContainer?.getStatefulType && oContainer.getStatefulType() !== BlueBoxHandler.STATEFUL_TYPES.GUI_V1) {
720
782
  oContainer = undefined;
721
783
  }
722
784
 
723
785
  //in cFLP, there night me an existing container of the same app from a different server,
724
786
  //so we will need to destroy it to avoid duplicate id
725
787
  if (oShellHash) {
726
- sIntent = oShellHash.semanticObject + "-" + oShellHash.action;
727
- oTmpAppContainer = BlueBoxHandler.getBlueBoxById("application-" + sIntent) || this.getControl(sIntent);
788
+ sIntent = `${oShellHash.semanticObject}-${oShellHash.action}`;
789
+ oTmpAppContainer = BlueBoxHandler.getBlueBoxById(`application-${sIntent}`) || this.getControl(sIntent);
728
790
  if (oTmpAppContainer && (!oContainer || oTmpAppContainer !== oContainer)) {
729
791
  sTmpUrl = oTmpAppContainer.getUrl();
730
792
  BlueBoxHandler.removeCapabilities(oTmpAppContainer);
731
- this.destroyApplication("application-" + sIntent, oTmpAppContainer);
793
+ this.destroyApplication(`application-${sIntent}`, oTmpAppContainer);
732
794
  BlueBoxHandler.deleteBlueBoxByUrl(sTmpUrl);
733
795
  }
734
796
  }
735
797
 
736
798
  if (!oContainer) {
737
- oContainer = Application.createApplicationContainer(inAppId, oTarget);
799
+ oContainer = Application.createApplicationContainer(sAppId, oTarget);
738
800
  }
739
801
  //create application that is not persisted and not cashed
740
802
  oCurrentApplication = {
@@ -746,7 +808,7 @@ sap.ui.define([
746
808
  };
747
809
  } else {
748
810
  if (oContainer) {
749
- sIntent = oShellHash.semanticObject + "-" + oShellHash.action;
811
+ sIntent = `${oShellHash.semanticObject}-${oShellHash.action}`;
750
812
  this.removeApplication(sIntent);
751
813
  } else if (oTarget.applicationType === "URL" || oTarget.applicationType === "TR" || oTarget.applicationType === "NWBC") {
752
814
  //Temporary fix - fix duplicate app container id in cFLP
@@ -757,16 +819,16 @@ sap.ui.define([
757
819
  // we delete here the blue box and then create the new one.
758
820
  // In future BLI, we will change the id of the container to be
759
821
  // more unique.
760
- sIntent = oShellHash.semanticObject + "-" + oShellHash.action;
761
- oTmpAppContainer = BlueBoxHandler.getBlueBoxById("application-" + sIntent) || this.getControl(sIntent);
822
+ sIntent = `${oShellHash.semanticObject}-${oShellHash.action}`;
823
+ oTmpAppContainer = BlueBoxHandler.getBlueBoxById(`application-${sIntent}`) || this.getControl(sIntent);
762
824
  if (oTmpAppContainer) {
763
825
  sTmpUrl = oTmpAppContainer.getUrl();
764
826
  BlueBoxHandler.removeCapabilities(oTmpAppContainer);
765
- this.destroyApplication("application-" + sIntent, oTmpAppContainer, undefined, true);
827
+ this.destroyApplication(`application-${sIntent}`, oTmpAppContainer, true);
766
828
  BlueBoxHandler.deleteBlueBoxByUrl(sTmpUrl);
767
829
  }
768
830
  }
769
- oContainer = Application.createApplicationContainer(inAppId, oTarget);
831
+ oContainer = Application.createApplicationContainer(sAppId, oTarget);
770
832
 
771
833
  // //create application that is not persisted and not cashed
772
834
  oCurrentApplication = {
@@ -779,25 +841,20 @@ sap.ui.define([
779
841
  }
780
842
  };
781
843
 
782
- this.getAppMeta = function () {
783
- return AppMeta;
784
- };
785
-
786
844
  /**
787
845
  * Any event one wishes to subscribe to during the AppLifeCycle.init() call should be added here.
788
846
  * Events will only be added the first time AppLifeCycle.init() is called.
789
847
  */
790
848
  this.addEvents = (function () {
791
- var hasBeenCalled = false;
849
+ let hasBeenCalled = false;
792
850
  return function () {
793
851
  if (!hasBeenCalled) {
794
852
  hasBeenCalled = true;
795
- var that = this;
796
853
 
797
854
  // Subscribe to events.
798
- EventHub.on("disableKeepAliveRestoreRouterRetrigger").do(function (oData) {
799
- var sIntent = oData.intent.semanticObject + "-" + oData.intent.action;
800
- var sAppId = "application-" + sIntent;
855
+ EventHub.on("disableKeepAliveRestoreRouterRetrigger").do((oData) => {
856
+ const sIntent = `${oData.intent.semanticObject}-${oData.intent.action}`;
857
+ const sAppId = `application-${sIntent}`;
801
858
 
802
859
  bEnableRouterRetrigger = oData.disable;
803
860
 
@@ -805,47 +862,54 @@ sap.ui.define([
805
862
  Storage.get(sAppId).enableRouterRetrigger = oData.disable;
806
863
  }
807
864
  });
808
- EventHub.on("setApplicationFullWidth").do(function (oData) {
809
- that.setApplicationFullWidth(oData.bValue);
865
+ EventHub.on("setApplicationFullWidth").do((oData) => {
866
+ this.setApplicationFullWidth(oData.bValue);
810
867
  });
811
868
 
812
- EventHub.on("reloadCurrentApp").do(function (oData) {
813
- that.reloadCurrentApp(oData);
869
+ EventHub.on("reloadCurrentApp").do((oData) => {
870
+ this.reloadCurrentApp(oData);
814
871
  });
815
872
  }
816
873
  };
817
874
  }());
818
875
 
819
- this.init = function (oInViewPortContainer, inSRootIntent, inDisableHomeAppCache, oShellUIServiceChange) {
876
+ /**
877
+ * @param {object} oInViewPortContainer
878
+ * @param {string} sInRootIntent
879
+ * @param {boolean} bInDisableHomeAppCache
880
+ */
881
+ this.init = function (oInViewPortContainer, sInRootIntent, bInDisableHomeAppCache) {
820
882
  if (Container && Config.last("/core/shell/enablePersistantAppstateWhenSharing")) {
821
- Container.getServiceAsync("AppState").then(function (oAppStateService) {
883
+ Container.getServiceAsync("AppState").then((oAppStateService) => {
822
884
  fnOldTriggerEmail = URLHelper.triggerEmail.bind(URLHelper);
823
885
  URLHelper.triggerEmail = function (sTo, sSubject, sBody, sCc, sBcc) {
824
- var sFLPUrl = document.URL;
886
+ const sFLPUrl = document.URL;
825
887
  oAppStateService.setAppStateToPublic(sFLPUrl)
826
- .done(function (sNewURL, sXStateKey, sIStateKey, sXStateKeyNew, sIStateKeyNew) {
888
+ .done((sNewURL, sXStateKey, sIStateKey, sXStateKeyNew, sIStateKeyNew) => {
827
889
  sSubject = sSubject && sXStateKey && sXStateKeyNew && sSubject.includes(sXStateKey) ? sSubject.replace(sXStateKey, sXStateKeyNew) : sSubject;
828
890
  sSubject = sSubject && sIStateKey && sIStateKeyNew && sSubject.includes(sIStateKey) ? sSubject.replace(sIStateKey, sIStateKeyNew) : sSubject;
829
891
  sBody = sBody && sXStateKey && sXStateKeyNew && sBody.includes(sXStateKey) ? sBody.replace(sXStateKey, sXStateKeyNew) : sBody;
830
892
  sBody = sBody && sIStateKey && sIStateKeyNew && sBody.includes(sIStateKey) ? sBody.replace(sIStateKey, sIStateKeyNew) : sBody;
831
893
  fnOldTriggerEmail(sTo, sSubject, sBody, sCc, sBcc);
832
894
  })
833
- .fail(function (sTo, sSubject, sBody, sCc, sBcc) {
895
+ .fail((sTo, sSubject, sBody, sCc, sBcc) => {
834
896
  fnOldTriggerEmail(sTo, sSubject, sBody, sCc, sBcc);
835
897
  });
836
898
  };
837
899
  });
838
900
  }
839
901
 
840
- oShellUIService = new ShellUIService({
841
- scopeObject: oShellUIServiceChange.ownerComponent,
842
- scopeType: "component"
902
+ ShellUIServiceFactory.init().then(() => {
903
+ ServiceFactoryRegistry.register(
904
+ "sap.ushell.ui5service.ShellUIService",
905
+ ShellUIServiceFactory
906
+ );
843
907
  });
908
+ this._createGlobalShellUIService();
844
909
 
845
910
  oViewPortContainer = oInViewPortContainer;
846
- sRootIntent = inSRootIntent;
847
- AppMeta.init(sRootIntent);
848
- disableHomeAppCache = inDisableHomeAppCache;
911
+ sRootIntent = sInRootIntent;
912
+ bDisableHomeAppCache = bInDisableHomeAppCache;
849
913
 
850
914
  BlueBoxHandler.init();
851
915
  Application.init(BlueBoxHandler, PostMessageUtils);
@@ -874,24 +938,26 @@ sap.ui.define([
874
938
  },
875
939
  oServiceCalls: {
876
940
  subscribe: {
877
- executeServiceCallFn: function (oServiceParams) {
941
+ executeServiceCallFn: async function (oServiceParams) {
878
942
  BlueBoxHandler.addCapabilities(oServiceParams.oContainer, oServiceParams.oMessageData.body);
879
- return new jQuery.Deferred().resolve({}).promise();
943
+ return {};
880
944
  }
881
945
  },
882
946
  setup: {
883
- executeServiceCallFn: function (oServiceParams) {
884
- var oSetup = oServiceParams.oMessageData && oServiceParams.oMessageData.body,
885
- arrCap = [],
886
- bIgnoreStateful = false;
947
+ executeServiceCallFn: async function (oServiceParams) {
948
+ const oSetup = oServiceParams?.oMessageData?.body;
949
+ const { oContainer } = oServiceParams;
950
+
951
+ const arrCap = [];
952
+ let bIgnoreStateful = false;
887
953
  if (oSetup) {
888
- if (oServiceParams.oContainer.getIsKeepAlive() === true &&
889
- ushellUtils.isSAPLegacyApplicationType(oServiceParams.oContainer.getApplicationType(), oServiceParams.oContainer.getFrameworkId())) {
954
+ const bIsSAPLegacyApplicationType = ushellUtils.isSAPLegacyApplicationType(oContainer.getApplicationType(), oContainer.getFrameworkId());
955
+ if (oContainer.getIsKeepAlive() && bIsSAPLegacyApplicationType) {
890
956
  bIgnoreStateful = true;
891
957
  }
892
- if (oSetup.isStateful === true) {
958
+ if (oSetup.isStateful) {
893
959
  if (bIgnoreStateful) {
894
- oServiceParams.oContainer.setProperty("statefulType", -BlueBoxHandler.STATEFUL_TYPES.FLP_V2, true);
960
+ oContainer.setProperty("statefulType", -BlueBoxHandler.STATEFUL_TYPES.FLP_V2, true);
895
961
  } else {
896
962
  arrCap.push({
897
963
  action: "create",
@@ -901,20 +967,19 @@ sap.ui.define([
901
967
  action: "destroy",
902
968
  service: "sap.ushell.services.AppLifeCycle"
903
969
  });
904
- oServiceParams.oContainer.setProperty("statefulType", BlueBoxHandler.STATEFUL_TYPES.FLP_V2, true);
970
+ oContainer.setProperty("statefulType", BlueBoxHandler.STATEFUL_TYPES.FLP_V2, true);
905
971
  }
906
972
  }
907
- if (oSetup.isIframeValid === true) {
908
- arrCap.push({action: "iframeIsValid", service: "sap.ushell.appRuntime"});
973
+ if (oSetup.isIframeValid) {
974
+ arrCap.push({ action: "iframeIsValid", service: "sap.ushell.appRuntime" });
909
975
  }
910
- if (oSetup.session && oSetup.session.bLogoutSupport === true) {
911
- arrCap.push({action: "logout", service: "sap.ushell.sessionHandler"});
976
+ if (oSetup.session?.bLogoutSupport) {
977
+ arrCap.push({ action: "logout", service: "sap.ushell.sessionHandler" });
912
978
  }
913
979
  if (arrCap.length > 0) {
914
- BlueBoxHandler.addCapabilities(oServiceParams.oContainer, arrCap);
980
+ BlueBoxHandler.addCapabilities(oContainer, arrCap);
915
981
  }
916
982
  }
917
- return new jQuery.Deferred().resolve().promise();
918
983
  }
919
984
  }
920
985
  }
@@ -922,20 +987,22 @@ sap.ui.define([
922
987
  "sap.gui": {
923
988
  oServiceCalls: {
924
989
  loadFinished: {
925
- executeServiceCallFn: function (oServiceParams) {
926
- if (oServiceParams.oContainer.getIsKeepAlive() === false) {
927
- oServiceParams.oContainer.setProperty("statefulType", BlueBoxHandler.STATEFUL_TYPES.GUI_V1, true);
990
+ executeServiceCallFn: async function (oServiceParams) {
991
+ const { oContainer } = oServiceParams;
992
+
993
+ if (!oContainer.getIsKeepAlive()) {
994
+ oContainer.setProperty("statefulType", BlueBoxHandler.STATEFUL_TYPES.GUI_V1, true);
928
995
  oCurrentApplication = {
929
- appId: oServiceParams.oContainer.getId(),
996
+ appId: oContainer.getId(),
930
997
  stt: "loading",
931
- container: oServiceParams.oContainer,
998
+ container: oContainer,
932
999
  meta: undefined,
933
1000
  app: undefined
934
1001
  };
935
1002
  } else {
936
- oServiceParams.oContainer.setProperty("statefulType", -BlueBoxHandler.STATEFUL_TYPES.GUI_V1, true);
1003
+ oContainer.setProperty("statefulType", -BlueBoxHandler.STATEFUL_TYPES.GUI_V1, true);
937
1004
  }
938
- return new jQuery.Deferred().resolve({}).promise();
1005
+ return {};
939
1006
  }
940
1007
  }
941
1008
  }
@@ -950,14 +1017,17 @@ sap.ui.define([
950
1017
  this.addEvents();
951
1018
  };
952
1019
 
1020
+ /**
1021
+ * @param {object} oShellNavigationInternal
1022
+ */
953
1023
  this.registerHandleHashChange = function (oShellNavigationInternal) {
954
- oShellNavigationInternal.hashChanger.attachEvent("hashChanged", function (oHashChange) {
1024
+ oShellNavigationInternal.hashChanger.attachEvent("hashChanged", (oHashChange) => {
955
1025
  //FIX for internal incident #1980317281 - In general, hash structure in FLP is splitted into 3 parts:
956
1026
  //A - application identification & B - Application parameters & C - Internal application area
957
1027
  // Now, when an IFrame changes its hash, it sends PostMessage up to the FLP. The FLP does 2 things: Change its URL
958
1028
  // and send a PostMessage back to the IFrame. This fix, initiated in the PostMessageAPI.js, blocks only
959
1029
  // the message back to the IFrame.
960
- if (hasher.disableBlueBoxHashChangeTrigger === true) {
1030
+ if (hasher.disableBlueBoxHashChangeTrigger) {
961
1031
  return;
962
1032
  }
963
1033
  if (oHashChange.mParameters && oShellNavigationInternal.hashChanger.isInnerAppNavigation(oHashChange.mParameters.newHash, oHashChange.mParameters.oldHash)) {
@@ -972,21 +1042,30 @@ sap.ui.define([
972
1042
  });
973
1043
  };
974
1044
 
1045
+ /**
1046
+ * @param {object} oControl
1047
+ */
975
1048
  this.addControl = function (oControl) {
976
1049
  oViewPortContainer.addCenterViewPort(oControl);
977
1050
  };
978
1051
 
1052
+ /**
1053
+ * @param {string} sId
1054
+ */
979
1055
  this.removeControl = function (sId) {
980
- var oBlueBox = BlueBoxHandler.getBlueBoxById(sId),
981
- bIsStateful = BlueBoxHandler.isStatefulContainer(oBlueBox);
1056
+ const oBlueBox = BlueBoxHandler.getBlueBoxById(sId);
1057
+ const bIsStateful = BlueBoxHandler.isStatefulContainer(oBlueBox);
982
1058
 
983
1059
  if (!bIsStateful) {
984
1060
  oViewPortContainer.removeCenterViewPort(sId, true);
985
1061
  }
986
1062
  };
987
1063
 
1064
+ /**
1065
+ * @param {string} sIntent
1066
+ */
988
1067
  this.removeApplication = function (sIntent) {
989
- var oInnerControl = this.getControl(sIntent);
1068
+ const oInnerControl = this.getControl(sIntent);
990
1069
 
991
1070
  if (oInnerControl) {
992
1071
  this.removeControl(oInnerControl.getId());
@@ -994,30 +1073,48 @@ sap.ui.define([
994
1073
  }
995
1074
  };
996
1075
 
1076
+ /**
1077
+ * @param {string} sIntent
1078
+ * @returns {object} Returns the control.
1079
+ */
997
1080
  this.getControl = function (sIntent) {
998
1081
  return oViewPortContainer
999
- && (oViewPortContainer.getViewPortControl("centerViewPort", "application-" + sIntent)
1000
- || oViewPortContainer.getViewPortControl("centerViewPort", "applicationShellPage-" + sIntent));
1082
+ && (oViewPortContainer.getViewPortControl("centerViewPort", `application-${sIntent}`)
1083
+ || oViewPortContainer.getViewPortControl("centerViewPort", `applicationShellPage-${sIntent}`));
1001
1084
  };
1002
1085
 
1086
+ /**
1087
+ * @returns {object} Returns the view port container.
1088
+ */
1003
1089
  this.getViewPortContainer = function () {
1004
1090
  return oViewPortContainer;
1005
1091
  };
1006
1092
 
1093
+ /**
1094
+ * @param {string} sId
1095
+ */
1007
1096
  this.navTo = function (sId) {
1008
1097
  oViewPortContainer.navTo("centerViewPort", sId, "show");
1009
1098
  };
1010
1099
 
1100
+ /**
1101
+ * @returns {object} Returns the current application.
1102
+ */
1011
1103
  this.getCurrentApplication = function () {
1012
1104
  return oCurrentApplication;
1013
1105
  };
1014
1106
 
1107
+ /**
1108
+ */
1015
1109
  this.unsetCurrentApplication = function () {
1016
1110
  oCurrentApplication = {};
1017
1111
  };
1018
1112
 
1113
+ /**
1114
+ * @param {boolean} bIsFull
1115
+ */
1019
1116
  this.setApplicationFullWidth = function (bIsFull) {
1020
- var oCurrent = this.getCurrentApplication();
1117
+ const oCurrent = this.getCurrentApplication();
1021
1118
 
1022
1119
  //validate that we have a valid applicationContainer
1023
1120
  if (oCurrent.container) {
@@ -1033,31 +1130,31 @@ sap.ui.define([
1033
1130
  // however that is 'not needed' since the loaded component
1034
1131
  // is not used. We should evaluate the possible performance
1035
1132
  // hit taken due to this implicit means to an end.
1036
- this.createComponent = function (oResolvedHashFragment, oParsedShellHash) {
1133
+ /**
1134
+ * @param {object} oResolvedHashFragment
1135
+ * @param {object} oParsedShellHash
1136
+ * @returns {Promise} Resolves when the component is created.
1137
+ */
1138
+ this.createComponent = async function (oResolvedHashFragment, oParsedShellHash) {
1037
1139
  function fnCloseKeepAliveIfSameUI5App (oApp) {
1038
1140
  return (oApp.ui5ComponentName === oResolvedHashFragment.ui5ComponentName);
1039
1141
  }
1040
- var arrClosePromises = [];
1041
- var oDeferred = new jQuery.Deferred();
1042
-
1043
- this.closeKeepAliveApps(fnCloseKeepAliveIfSameUI5App, arrClosePromises);
1044
1142
 
1045
- Promise.all(arrClosePromises)
1046
- .then(() => {
1047
- return ushellUtils.promisify(Application.createComponent(oResolvedHashFragment, oParsedShellHash));
1048
- })
1049
- .then((oResult) => {
1050
- oDeferred.resolve(oResult);
1051
- })
1052
- .catch((oError) => {
1053
- oDeferred.reject(oError);
1054
- });
1143
+ await this.closeKeepAliveApps(fnCloseKeepAliveIfSameUI5App);
1055
1144
 
1056
- return oDeferred.promise();
1145
+ await Application.createComponent(oResolvedHashFragment, oParsedShellHash);
1057
1146
  };
1058
1147
 
1148
+ /**
1149
+ * @param {string} sAppId
1150
+ * @param {object} oResolvedNavigationTarget
1151
+ * @param {boolean} bIsColdStart
1152
+ * @param {object} oShellHash
1153
+ * @param {string} sFixedShellHash
1154
+ * @returns {object}
1155
+ */
1059
1156
  this.getAppContainer = function (sAppId, oResolvedNavigationTarget, bIsColdStart, oShellHash, sFixedShellHash) {
1060
- oResolvedNavigationTarget.shellUIService = oShellUIService.getInterface();
1157
+ oResolvedNavigationTarget.shellUIService = oGlobalShellUIService.getInterface();
1061
1158
 
1062
1159
  /*
1063
1160
  * The external navigation mode in the resolution result is calculated
@@ -1082,15 +1179,24 @@ sap.ui.define([
1082
1179
  return oCurrentApplication.container;
1083
1180
  };
1084
1181
 
1182
+ /**
1183
+ * Returns the global ShellUIService instance.
1184
+ * @returns {object} The global ShellUIService instance
1185
+ */
1085
1186
  this.getShellUIService = function () {
1086
- return oShellUIService;
1187
+ return oGlobalShellUIService;
1087
1188
  };
1088
1189
 
1089
- this.initShellUIService = function (oShellUIServiceChange) {
1090
- oShellUIService._attachHierarchyChanged(AppMeta.onHierarchyChange.bind(this));
1091
- oShellUIService._attachTitleChanged(AppMeta.onTitleChange.bind(this));
1092
- oShellUIService._attachRelatedAppsChanged(AppMeta.onRelatedAppsChange.bind(this));
1093
- oShellUIService._attachBackNavigationChanged(oShellUIServiceChange.fnOnBackNavigationChange.bind(this));
1190
+ /**
1191
+ * Creates the ShellUIService instance of the AppLifeCycle in application integration if not already created.
1192
+ *
1193
+ * @returns {Promise} A promise that resolves when the ShellUIService instance is created
1194
+ *
1195
+ * @since 1.127.0
1196
+ * @private
1197
+ */
1198
+ this._createGlobalShellUIService = async function () {
1199
+ oGlobalShellUIService = await ShellUIServiceFactory.createInstanceInternal();
1094
1200
  };
1095
1201
 
1096
1202
  /**
@@ -1114,10 +1220,10 @@ sap.ui.define([
1114
1220
  * @private
1115
1221
  */
1116
1222
  this.activeContainer = function (oApplicationContainer) {
1117
- BlueBoxHandler.forEach(function (oAppContainer) {
1223
+ BlueBoxHandler.forEach((oAppContainer) => {
1118
1224
  if (oAppContainer && oAppContainer !== oApplicationContainer) {
1119
1225
  try {
1120
- Log.info("Deactivating container " + oAppContainer.getId());
1226
+ Log.info(`Deactivating container ${oAppContainer.getId()}`);
1121
1227
  oAppContainer.setActive(false);
1122
1228
  } catch (e) {
1123
1229
  /* empty */
@@ -1126,11 +1232,14 @@ sap.ui.define([
1126
1232
  });
1127
1233
 
1128
1234
  if (oApplicationContainer) {
1129
- Log.info("Activating container " + oApplicationContainer.getId());
1235
+ Log.info(`Activating container "${oApplicationContainer.getId()}"`);
1130
1236
  oApplicationContainer.setActive(true);
1131
1237
  }
1132
1238
  };
1133
1239
 
1240
+ /**
1241
+ * @param {object} oApplicationContainer
1242
+ */
1134
1243
  this.showApplicationContainer = function (oApplicationContainer) {
1135
1244
  this.navTo(oApplicationContainer.getId());
1136
1245
  //Added this because in cases when navigating to the same id (can happen when stateful container, I need the on onAfterNavigate)
@@ -1143,54 +1252,38 @@ sap.ui.define([
1143
1252
  Log.info("New application context opened successfully in an existing transaction UI session.");
1144
1253
  };
1145
1254
 
1146
- this.initAppMetaParams = function () {
1147
- if (!this.getAppMeta().getIsHierarchyChanged()) {
1148
- oShellUIService.setHierarchy();
1149
- }
1150
- if (!this.getAppMeta().getIsTitleChanged()) {
1151
- var sHash = hasher.getHash();
1152
- if (sHash && sHash.indexOf("Shell-startIntent") === 0) {
1153
- oShellUIService.setTitle("", true);
1154
- } else {
1155
- oShellUIService.setTitle();
1156
- }
1157
- }
1158
- if (!this.getAppMeta().getIsRelatedAppsChanged()) {
1159
- oShellUIService.setRelatedApps();
1160
- }
1161
- if (!isBackNavigationChanged) {
1162
- oShellUIService.setBackNavigation();
1163
- }
1164
- };
1165
-
1255
+ /**
1256
+ * @param {object} oAppContainer
1257
+ * @param {object} oApplication
1258
+ * @param {function} fnOnAfterRendering
1259
+ */
1166
1260
  this.publishNavigationStateEvents = function (oAppContainer, oApplication, fnOnAfterRendering) {
1167
1261
  //after the app container is rendered, publish an event to notify
1168
1262
  //that an app was opened
1169
- var origExit,
1170
- sId = oAppContainer.getId ? oAppContainer.getId() : "",
1171
- that = this;
1172
- var appMetaData = AppConfiguration.getMetadata(),
1173
- sIcon = appMetaData.icon,
1174
- sTitle = appMetaData.title;
1263
+ const sId = oAppContainer.getId ? oAppContainer.getId() : "";
1264
+ const appMetaData = AppConfiguration.getMetadata();
1265
+ const sIcon = appMetaData.icon;
1266
+ const sTitle = appMetaData.title;
1175
1267
 
1176
1268
  //Attach an event handler which will be called onAfterRendering
1177
1269
  oAppContainer.addEventDelegate({ onAfterRendering: fnOnAfterRendering });
1178
1270
 
1179
1271
  //after the app container exit, publish an event to notify
1180
1272
  //that an app was closed
1181
- origExit = oAppContainer.exit;
1273
+ const that = this;
1274
+ const origExit = oAppContainer.exit;
1182
1275
  oAppContainer.exit = function () {
1183
1276
  if (origExit) {
1184
1277
  origExit.apply(this, arguments);
1185
1278
  }
1186
1279
  //apply the original density settings
1187
- that.getAppMeta()._applyContentDensityByPriority();
1280
+ AppMeta._applyContentDensityByPriority();
1188
1281
 
1189
1282
  //wrapped in setTimeout since "publish" is not async
1190
- setTimeout(function () {
1283
+ setTimeout(() => {
1191
1284
  // TODO: do not mutate an internal structure (in a Timeout!),
1192
1285
  // create a new object
1193
- var oEventData = deepExtend({}, oApplication);
1286
+ const oEventData = deepExtend({}, oApplication);
1194
1287
  delete oEventData.componentHandle;
1195
1288
  oEventData.appId = sId;
1196
1289
  oEventData.usageIcon = sIcon;
@@ -1202,7 +1295,7 @@ sap.ui.define([
1202
1295
  // the former code leaked an *internal* data structure, making it part of a public API
1203
1296
  // restrict hte public api to the minimal set of precise documented properties which can be retained under
1204
1297
  // under future evolutions
1205
- var oPublicEventData = that._publicEventDataFromResolutionResult(oApplication);
1298
+ const oPublicEventData = that._publicEventDataFromResolutionResult(oApplication);
1206
1299
  //publish the event externally
1207
1300
  RendererUtils.publishExternalEvent("appClosed", oPublicEventData);
1208
1301
  };
@@ -1215,23 +1308,30 @@ sap.ui.define([
1215
1308
  * @returns {object} an object exposing certain information to external stakeholders
1216
1309
  */
1217
1310
  this._publicEventDataFromResolutionResult = function (oApplication) {
1218
- var oPublicEventData = {};
1311
+ const oPublicEventData = {};
1219
1312
  if (!oApplication) {
1220
1313
  return oApplication;
1221
1314
  }
1222
- ["applicationType", "ui5ComponentName", "url", "additionalInformation", "text"].forEach(function (sProp) {
1315
+ ["applicationType", "ui5ComponentName", "url", "additionalInformation", "text"].forEach((sProp) => {
1223
1316
  oPublicEventData[sProp] = oApplication[sProp];
1224
1317
  });
1225
1318
  Object.freeze(oPublicEventData);
1226
1319
  return oPublicEventData;
1227
1320
  };
1228
1321
 
1322
+ /**
1323
+ * @param {string} sIntent
1324
+ * @param {string} sFixedShellHash
1325
+ * @param {string} sAppPart
1326
+ * @param {string} sOldShellHash
1327
+ * @returns {object}
1328
+ */
1229
1329
  this.getInMemoryInstance = function (sIntent, sFixedShellHash, sAppPart, sOldShellHash) {
1230
- var sFullAppId = "application-" + sIntent,
1231
- oAppEntry = Storage.get(sFullAppId),
1232
- sOldShellHashLowerCase = "",
1233
- bNavigateToHomepage = false,
1234
- bNavigatingFromHomeWithAppState;
1330
+ const sFullAppId = `application-${sIntent}`;
1331
+ const oAppEntry = Storage.get(sFullAppId);
1332
+ let sOldShellHashLowerCase = "";
1333
+ let bNavigateToHomepage = false;
1334
+ let bNavigatingFromHomeWithAppState;
1235
1335
 
1236
1336
  //remove application from cache if has different parameters
1237
1337
  if (oAppEntry) {
@@ -1271,29 +1371,40 @@ sap.ui.define([
1271
1371
  };
1272
1372
  };
1273
1373
 
1274
- this.handleOpenStateful = function (bIsInitial, bIsInCache, sToId, oInnerControl, oTarget, sFixedShellHash, oKeepAliveMode,
1275
- bNavigationInSameStatefullContainer, bReturnedFromKeepAlivePoolFLPV2) {
1276
- var that = this,
1277
- oPromise;
1374
+ /**
1375
+ * @param {boolean} bIsInitial
1376
+ * @param {boolean} bIsInCache
1377
+ * @param {string} sToId
1378
+ * @param {object} oInnerControl
1379
+ * @param {object} oTarget
1380
+ * @param {string} sFixedShellHash
1381
+ * @param {object} oKeepAliveMode
1382
+ * @param {boolean} bNavigationInSameStatefulContainer
1383
+ * @param {boolean} bReturnedFromKeepAlivePoolFLPV2
1384
+ * @returns {Promise} Resolves when the stateful app was opened.
1385
+ */ // eslint-disable-next-line max-len
1386
+ this.handleOpenStateful = function (bIsInitial, bIsInCache, sToId, oInnerControl, oTarget, sFixedShellHash, oKeepAliveMode, bNavigationInSameStatefulContainer, bReturnedFromKeepAlivePoolFLPV2) {
1387
+ let oPromise;
1278
1388
 
1279
1389
  oInnerControl.setProperty("iframeReusedForApp", true, true);
1280
- if (Storage.get(sToId) && bIsInitial === false && !bReturnedFromKeepAlivePoolFLPV2) {
1281
- oPromise = BlueBoxHandler.statefulRestoreKeepAliveApp(oInnerControl, oTarget.url, sToId, oTarget, bNavigationInSameStatefullContainer)
1282
- .then(function () {
1283
- that.showApplicationContainer(oInnerControl);
1284
- }, function (vError) {
1285
- Log.error(vError && vError.message || vError);
1390
+ if (Storage.get(sToId) && !bIsInitial && !bReturnedFromKeepAlivePoolFLPV2) {
1391
+ oPromise = BlueBoxHandler.statefulRestoreKeepAliveApp(oInnerControl, oTarget.url, sToId, oTarget, bNavigationInSameStatefulContainer)
1392
+ .then(() => {
1393
+ this.showApplicationContainer(oInnerControl);
1394
+ })
1395
+ .catch((vError) => {
1396
+ Log.error(vError?.message || vError);
1286
1397
  });
1287
1398
  } else {
1288
- this.initAppMetaParams();
1289
- oPromise = BlueBoxHandler.statefulCreateApp(oInnerControl, oTarget.url, sToId, oTarget, bNavigationInSameStatefullContainer)
1290
- .then(function (oResult) {
1291
- if (oResult && oResult.deletedKeepAliveId) {
1399
+ oPromise = BlueBoxHandler.statefulCreateApp(oInnerControl, oTarget.url, sToId, oTarget, bNavigationInSameStatefulContainer)
1400
+ .then((oResult) => {
1401
+ if (oResult?.deletedKeepAliveId) {
1292
1402
  Storage.removeById(oResult.deletedKeepAliveId);
1293
1403
  }
1294
- that.showApplicationContainer(oInnerControl);
1295
- }, function (vError) {
1296
- Log.error(vError && vError.message || vError);
1404
+ this.showApplicationContainer(oInnerControl);
1405
+ })
1406
+ .catch((vError) => {
1407
+ Log.error(vError?.message || vError);
1297
1408
  });
1298
1409
 
1299
1410
  //creating a new application check if needs to be keep (for the keep alive), and if so store the application
@@ -1305,37 +1416,38 @@ sap.ui.define([
1305
1416
  return oPromise;
1306
1417
  };
1307
1418
 
1308
- this.handleControl = function (sIntent, sAppId, oShellHash, oTarget, fnWrapper, sFixedShellHash, sOldFixedShellHash) {
1309
- var that = this,
1310
- oInnerControl,
1419
+ /**
1420
+ * @param {string} sIntent
1421
+ * @param {string} sAppId
1422
+ * @param {object} oShellHash
1423
+ * @param {object} oTarget
1424
+ * @param {function} fnWrapper
1425
+ * @param {string} sFixedShellHash
1426
+ * @param {string} sOldFixedShellHash
1427
+ * @returns {Promise} Resolves when the control is handled
1428
+ */
1429
+ this.handleControl = async function (sIntent, sAppId, oShellHash, oTarget, fnWrapper, sFixedShellHash, sOldFixedShellHash) {
1430
+ let bReturnedFromKeepAlivePoolFLPV2 = false;
1431
+ let bReturnedFromKeepAlivePoolGuiV1 = false;
1432
+ const bIsAppOfTypeCachable = CACHED_APP_TYPES.indexOf(oTarget.applicationType) >= 0;
1433
+ const sFullAppId = `application-${sIntent}`;
1434
+ let bIsInitial = false;
1435
+ const oKeepAliveMode = {
1436
+ globalValue: undefined,
1437
+ paramValue: undefined
1438
+ };
1439
+ let bNavigationInSameStatefulContainer = false;
1440
+ let oInnerControl,
1311
1441
  bReuseStatefulContainer,
1312
- bReturnedFromKeepAlivePoolFLPV2 = false,
1313
- bReturnedFromKeepAlivePoolGuiV1 = false,
1314
- bIsAppOfTypeCachable = aCachedAppTypes.indexOf(oTarget.applicationType) >= 0,
1315
- sFullAppId = "application-" + sIntent,
1316
- oCachedEntry,
1317
- bIsInCache,
1318
- sAppType,
1319
- bIsInitial = false,
1320
- bDefaultFullWidth,
1321
- bKeptAliveApp,
1322
- oDeferredDestroyApp,
1323
- oDeferredOpenApp = new jQuery.Deferred(),
1324
- oDeffedControlCreation,
1325
- oMetadata,
1326
1442
  oCurrentAppContainer,
1327
1443
  oOldAppStorageEntry,
1328
1444
  oTargetAppContainer,
1329
- oPromiseAppClose = new jQuery.Deferred().resolve().promise(),
1330
- oKeepAliveMode = {
1331
- globalValue: undefined,
1332
- paramValue: undefined
1333
- },
1334
1445
  iLastValidTimeDelta,
1335
1446
  oOldHash,
1336
1447
  sOldFullAppId,
1337
1448
  sCurrentPageId,
1338
- bNavigationInSameStatefullContainer = false;
1449
+ bKeptAliveApp,
1450
+ oCachedEntry;
1339
1451
 
1340
1452
  //get the potential target stateful container and check if it's valid. if not, destroy it
1341
1453
  //before we try to create the new application
@@ -1343,14 +1455,13 @@ sap.ui.define([
1343
1455
  if (BlueBoxHandler.isStatefulContainer(oTargetAppContainer)) {
1344
1456
  iLastValidTimeDelta = new Date().getTime() - oTargetAppContainer.getIsIframeValidTime().time;
1345
1457
  if ((BlueBoxHandler.isIframeIsValidSupported(oTargetAppContainer) && iLastValidTimeDelta >= 3500) ||
1346
- oTargetAppContainer.getIsInvalidIframe() === true) {
1347
- var sReason = oTargetAppContainer.getIsInvalidIframe() === true ?
1348
- "iframe did not ping in the last '" + iLastValidTimeDelta + "' ms" :
1349
- "iframe is in invalid state";
1458
+ oTargetAppContainer.getIsInvalidIframe()) {
1459
+ const sReason = oTargetAppContainer.getIsInvalidIframe() ? `iframe did not ping in the last '${iLastValidTimeDelta}' ms` : "iframe is in invalid state";
1350
1460
  Log.warning(
1351
- "Destroying statefull container iframe due to unresponsiveness (" + oTargetAppContainer.getId() + ")",
1352
- "reason: " + sReason,
1353
- "sap.ushell.components.applicationIntegration.AppLifeCycle");
1461
+ `Destroying stateful container iframe due to unresponsiveness (${oTargetAppContainer.getId()})`,
1462
+ `reason: ${sReason}`,
1463
+ "sap.ushell.components.applicationIntegration.AppLifeCycle"
1464
+ );
1354
1465
  BlueBoxHandler.removeCapabilities(oTargetAppContainer);
1355
1466
  this.destroyApplication(sFullAppId, oTargetAppContainer);
1356
1467
  BlueBoxHandler.deleteBlueBoxByUrl(oTarget.url);
@@ -1365,7 +1476,7 @@ sap.ui.define([
1365
1476
  if (typeof sOldFixedShellHash === "string") {
1366
1477
  oOldHash = oUrlParsing.parseShellHash(sOldFixedShellHash);
1367
1478
  if (oOldHash) {
1368
- sOldFullAppId = "application-" + oOldHash.semanticObject + "-" + oOldHash.action;
1479
+ sOldFullAppId = `application-${oOldHash.semanticObject}-${oOldHash.action}`;
1369
1480
  oOldAppStorageEntry = Storage.get(sOldFullAppId);
1370
1481
  }
1371
1482
  if (oOldAppStorageEntry) {
@@ -1381,104 +1492,62 @@ sap.ui.define([
1381
1492
  //we will close the application we are leaving when:
1382
1493
  // 1. the application is running in a stateful container
1383
1494
  // 2. this is a legacy keep alive app, and we navigate back (this in order to return the container to the pool
1384
- // of containers to it can be used again for the upcomming opened app)
1495
+ // of containers to it can be used again for the upcoming opened app)
1385
1496
  bReuseStatefulContainer = BlueBoxHandler.isStatefulContainer(oCurrentAppContainer);
1386
- var bSourceIsKeepAliveFromPool = BlueBoxHandler.isStatefulContainerInKeepAlivePool(oCurrentAppContainer) &&
1387
- oCurrentAppContainer.getCurrentAppId && (oCurrentAppContainer.getCurrentAppId().length > 0);
1497
+ const bSourceIsKeepAliveFromPool = BlueBoxHandler.isStatefulContainerInKeepAlivePool(oCurrentAppContainer) && oCurrentAppContainer.getCurrentAppId?.().length > 0;
1388
1498
  if (bReuseStatefulContainer || bSourceIsKeepAliveFromPool) {
1389
- oPromiseAppClose = this.handleExitApplication(sOldFullAppId, oCurrentAppContainer, undefined, undefined, false, false);
1499
+ await this.handleExitApplication(sOldFullAppId, oCurrentAppContainer, undefined, undefined, false, false);
1390
1500
  if (oCurrentAppContainer === oTargetAppContainer) {
1391
- bNavigationInSameStatefullContainer = true;
1501
+ bNavigationInSameStatefulContainer = true;
1392
1502
  }
1393
1503
  }
1394
1504
 
1395
1505
  //now, we can open the new application
1396
- oPromiseAppClose.then(function () {
1397
- bIsInCache = that.isAppOfTypeCached(sFullAppId, bIsAppOfTypeCachable, oKeepAliveMode) || that.isCachedEnabledAsAppParameter(oShellHash, oTarget, oKeepAliveMode);
1398
- //set the default full width value
1399
- sAppType = that.calculateAppType(oTarget);
1400
- bDefaultFullWidth = ApplicationType.getDefaultFullWidthSetting(sAppType);
1401
-
1402
- oInnerControl = BlueBoxHandler.getBlueBoxByUrl(oTarget.url);
1403
- bReuseStatefulContainer = BlueBoxHandler.isStatefulContainer(oInnerControl);
1404
-
1405
- if (!bReuseStatefulContainer) {
1406
- // only clear oInnerControl in case it is not a navigation from an application to the same application
1407
- if (oCurrentApplication && sFullAppId !== oCurrentApplication.appId) {
1408
- oInnerControl = undefined;
1409
- }
1410
- oCachedEntry = Storage.get("application" + sAppId);
1411
-
1412
- if (oCachedEntry) {
1413
- oInnerControl = oCachedEntry.container;
1414
- if (!bReuseStatefulContainer && bIsInCache && oInnerControl !== undefined) {
1415
- bKeptAliveApp = true;
1416
- }
1417
- }
1506
+ const bIsInCache = this.isAppOfTypeCached(sFullAppId, bIsAppOfTypeCachable, oKeepAliveMode) || this.isCachedEnabledAsAppParameter(oShellHash, oTarget, oKeepAliveMode);
1507
+ //set the default full width value
1508
+ const sAppType = this.calculateAppType(oTarget);
1509
+ const bDefaultFullWidth = ApplicationType.getDefaultFullWidthSetting(sAppType);
1510
+
1511
+ oInnerControl = BlueBoxHandler.getBlueBoxByUrl(oTarget.url);
1512
+ bReuseStatefulContainer = BlueBoxHandler.isStatefulContainer(oInnerControl);
1513
+
1514
+ if (!bReuseStatefulContainer) {
1515
+ // only clear oInnerControl in case it is not a navigation from an application to the same application
1516
+ if (oCurrentApplication && sFullAppId !== oCurrentApplication.appId) {
1517
+ oInnerControl = undefined;
1418
1518
  }
1519
+ oCachedEntry = Storage.get(`application${sAppId}`);
1419
1520
 
1420
- var bFullWidthCapability, bFullWidth;
1421
- bFullWidthCapability = oTarget.appCapabilities && oTarget.appCapabilities.fullWidth;
1422
- oMetadata = AppConfiguration.getMetadata(oTarget);
1423
- //Here there's a double check for the fullwidth - once as a type of boolean and one as a string.
1424
- //This is because we found that developers configured this variable in the manifest also as a string,
1425
- //so the checks of the oMetadata and the oTarget are to avoid regression with the use of this field.
1426
- if (bDefaultFullWidth === true) {
1427
- if (oTarget.fullWidth === false || oTarget.fullWidth === "false" ||
1428
- oMetadata.fullWidth === false || oMetadata.fullWidth === "false" || bFullWidthCapability === false) {
1429
- bFullWidth = false;
1521
+ if (oCachedEntry) {
1522
+ oInnerControl = oCachedEntry.container;
1523
+ if (!bReuseStatefulContainer && bIsInCache && oInnerControl !== undefined) {
1524
+ bKeptAliveApp = true;
1430
1525
  }
1431
- } else if (oTarget.fullWidth === true || oTarget.fullWidth === "true" ||
1432
- oMetadata.fullWidth === true || oMetadata.fullWidth === "true") {
1433
- bFullWidth = true;
1434
1526
  }
1527
+ }
1435
1528
 
1436
- if (bFullWidth === undefined) {
1437
- bFullWidth = bDefaultFullWidth;
1529
+ let bFullWidth;
1530
+ const bFullWidthCapability = oTarget?.appCapabilities?.fullWidth;
1531
+ const oMetadata = AppConfiguration.getMetadata(oTarget);
1532
+ //Here there's a double check for the fullwidth - once as a type of boolean and one as a string.
1533
+ //This is because we found that developers configured this variable in the manifest also as a string,
1534
+ //so the checks of the oMetadata and the oTarget are to avoid regression with the use of this field.
1535
+ if (bDefaultFullWidth) {
1536
+ if (oTarget.fullWidth === false || oTarget.fullWidth === "false" ||
1537
+ oMetadata.fullWidth === false || oMetadata.fullWidth === "false" || bFullWidthCapability === false) {
1538
+ bFullWidth = false;
1438
1539
  }
1540
+ } else if (oTarget.fullWidth || oTarget.fullWidth === "true" ||
1541
+ oMetadata.fullWidth || oMetadata.fullWidth === "true") {
1542
+ bFullWidth = true;
1543
+ }
1439
1544
 
1440
- if (bReuseStatefulContainer) {
1441
- if (!oInnerControl) {
1442
- oInnerControl = fnWrapper(
1443
- sIntent,
1444
- oMetadata,
1445
- oShellHash,
1446
- oTarget,
1447
- sAppId,
1448
- bFullWidth,
1449
- sFixedShellHash
1450
- );
1451
- if (this.isAppInCache(oInnerControl.getId())) {
1452
- oCurrentApplication = Storage.get(oInnerControl.getId());
1453
- }
1454
- that.navTo(oInnerControl.getId());
1455
- bIsInitial = true;
1456
- }
1457
- } else if (BlueBoxHandler.getStatefulContainerType(oTarget.url, true) !== BlueBoxHandler.STATEFUL_TYPES.GUI_V1 && oInnerControl && !bIsInCache) {
1458
- //this case this controler cant be reused and we need it to be embed, so delete it.
1459
- oDeferredDestroyApp = new jQuery.Deferred();
1460
- that.destroyApplication(oInnerControl.getId(), oInnerControl, oDeferredDestroyApp);
1461
-
1462
- // The immediately following method call internally calls
1463
- // `this.oViewPortContainer.addCenterViewPort(oAppContainer)`
1464
- // when Gui V1 Stateful Container is true, and in that case
1465
- // `oInnerControl` will be the component control of an existing session.
1466
- oDeferredDestroyApp.then(function () {
1467
- oInnerControl = fnWrapper(
1468
- sIntent,
1469
- oMetadata,
1470
- oShellHash,
1471
- oTarget,
1472
- sAppId,
1473
- bFullWidth,
1474
- sFixedShellHash
1475
- );
1476
- });
1477
- } else if (!oInnerControl) {
1478
- // The immediately following method call internally calls
1479
- // `this.oViewPortContainer.addCenterViewPort(oAppContainer)`
1480
- // when Gui V1 Stateful Container is true, and in that case
1481
- // `oInnerControl` will be the component control of an existing session.
1545
+ if (bFullWidth === undefined) {
1546
+ bFullWidth = bDefaultFullWidth;
1547
+ }
1548
+
1549
+ if (bReuseStatefulContainer) {
1550
+ if (!oInnerControl) {
1482
1551
  oInnerControl = fnWrapper(
1483
1552
  sIntent,
1484
1553
  oMetadata,
@@ -1488,119 +1557,135 @@ sap.ui.define([
1488
1557
  bFullWidth,
1489
1558
  sFixedShellHash
1490
1559
  );
1491
-
1492
- //if we got an iframe from cache, simulate statefull container
1493
- //open that should happen later here
1494
- // if (oInnerControl && oInnerControl.getProperty && oInnerControl.getProperty("fetchedFromCache") === true) {
1495
- // InnerControl.getProperty("fetchedFromIframeCache", false, true);
1496
- // }
1497
- if (oInnerControl.getIsFetchedFromCache && oInnerControl.getIsFetchedFromCache() && oInnerControl.getStatefulType) {
1498
- if (oInnerControl.getStatefulType() === -BlueBoxHandler.STATEFUL_TYPES.GUI_V1) {
1499
- bReturnedFromKeepAlivePoolGuiV1 = true;
1500
- } else {
1501
- bReuseStatefulContainer = true;
1502
- bReturnedFromKeepAlivePoolFLPV2 = true;
1503
- }
1560
+ if (this.isAppInCache(oInnerControl.getId())) {
1561
+ oCurrentApplication = Storage.get(oInnerControl.getId());
1504
1562
  }
1563
+ this.navTo(oInnerControl.getId());
1564
+ bIsInitial = true;
1505
1565
  }
1506
-
1507
- if (oDeferredDestroyApp === undefined) {
1508
- oDeferredDestroyApp = new jQuery.Deferred().resolve();
1566
+ } else if (BlueBoxHandler.getStatefulContainerType(oTarget.url, true) !== BlueBoxHandler.STATEFUL_TYPES.GUI_V1 && oInnerControl && !bIsInCache) {
1567
+ //this case this controller cant be reused and we need it to be embed, so delete it.
1568
+ await this.destroyApplication(oInnerControl.getId(), oInnerControl);
1569
+
1570
+ // The immediately following method call internally calls
1571
+ // `this.oViewPortContainer.addCenterViewPort(oAppContainer)`
1572
+ // when Gui V1 Stateful Container is true, and in that case
1573
+ // `oInnerControl` will be the component control of an existing session.
1574
+ oInnerControl = fnWrapper(
1575
+ sIntent,
1576
+ oMetadata,
1577
+ oShellHash,
1578
+ oTarget,
1579
+ sAppId,
1580
+ bFullWidth,
1581
+ sFixedShellHash
1582
+ );
1583
+ } else if (!oInnerControl) {
1584
+ // The immediately following method call internally calls
1585
+ // `this.oViewPortContainer.addCenterViewPort(oAppContainer)`
1586
+ // when Gui V1 Stateful Container is true, and in that case
1587
+ // `oInnerControl` will be the component control of an existing session.
1588
+ oInnerControl = fnWrapper(
1589
+ sIntent,
1590
+ oMetadata,
1591
+ oShellHash,
1592
+ oTarget,
1593
+ sAppId,
1594
+ bFullWidth,
1595
+ sFixedShellHash
1596
+ );
1597
+
1598
+ //if we got an iframe from cache, simulate stateful container
1599
+ //open that should happen later here
1600
+ // if (oInnerControl && oInnerControl.getProperty && oInnerControl.getProperty("fetchedFromCache") === true) {
1601
+ // InnerControl.getProperty("fetchedFromIframeCache", false, true);
1602
+ // }
1603
+ if (oInnerControl?.getIsFetchedFromCache?.() && oInnerControl.getStatefulType) {
1604
+ if (oInnerControl.getStatefulType() === -BlueBoxHandler.STATEFUL_TYPES.GUI_V1) {
1605
+ bReturnedFromKeepAlivePoolGuiV1 = true;
1606
+ } else {
1607
+ bReuseStatefulContainer = true;
1608
+ bReturnedFromKeepAlivePoolFLPV2 = true;
1609
+ }
1509
1610
  }
1611
+ }
1510
1612
 
1511
- if (oInnerControl && oInnerControl.getDeffedControlCreation) {
1512
- oDeffedControlCreation = oInnerControl.getDeffedControlCreation();
1513
- } else {
1514
- oDeffedControlCreation = Promise.resolve();
1613
+ if (oInnerControl?.getDeffedControlCreation) {
1614
+ await ushellUtils.promisify(oInnerControl.getDeffedControlCreation());
1615
+ }
1616
+
1617
+ //here, we simply show (turning to visible) the container of the new opened application in case it is not stateful container
1618
+ //and not old gui v1 stateful
1619
+ if (oInnerControl.getStatefulType && oInnerControl.getStatefulType() !== BlueBoxHandler.STATEFUL_TYPES.GUI_V1 && !bReuseStatefulContainer) {
1620
+ if (bKeptAliveApp) {
1621
+ EventBus.getInstance().publish("launchpad", "appOpening", oTarget);
1622
+ }
1623
+ if (this.isAppInCache(oInnerControl.getId())) {
1624
+ oCurrentApplication = Storage.get(oInnerControl.getId());
1515
1625
  }
1626
+ this.navTo(oInnerControl.getId());
1627
+ if (bKeptAliveApp) {
1628
+ EventBus.getInstance().publish("sap.ushell", "appOpened", oTarget);
1629
+ }
1630
+ }
1516
1631
 
1517
- /**
1518
- * The code below should have been written with Promise.all, but as a result
1519
- * of a failure in shell.qunit.js, it was written in the way below (the only way that the
1520
- * qunit works.
1521
- * Later, the qunit should be analyzed to check how to fix it (the main issue is that the
1522
- * tests run in parallel and there is a dependency between them.
1523
- */
1524
- oDeferredDestroyApp.then(function () {
1525
- oDeffedControlCreation.then(function () {
1526
- //here, we simply show (turning to visible) the container of the new opened application in case it is not stateful container
1527
- //and not old gui v1 statefull
1528
- if (oInnerControl.getStatefulType && oInnerControl.getStatefulType() !== BlueBoxHandler.STATEFUL_TYPES.GUI_V1 && !bReuseStatefulContainer) {
1529
- if (bKeptAliveApp === true) {
1530
- EventBus.getInstance().publish("launchpad", "appOpening", oTarget);
1531
- }
1532
- if (that.isAppInCache(oInnerControl.getId())) {
1533
- oCurrentApplication = Storage.get(oInnerControl.getId());
1534
- }
1535
- that.navTo(oInnerControl.getId());
1536
- if (bKeptAliveApp === true) {
1537
- that.initAppMetaParams();
1538
- EventBus.getInstance().publish("sap.ushell", "appOpened", oTarget);
1539
- }
1540
- }
1632
+ // Assuming a previously existing TR container existed and is now
1633
+ // going to be reused, we prompt the container to load the new application context.
1541
1634
 
1542
- // Assuming a previously existing TR container existed and is now
1543
- // going to be reused, we prompt the container to load the new application context.
1544
- var oPromiseAsyncAppCreate = new jQuery.Deferred().resolve().promise();
1545
- // SAP GUI is sending post messages for back navigation as soon the create application event is sent to the iframe,
1546
- // so this makes sure the container is active before sending the event.
1547
- // For WD applications, the application is active only after the application is created.
1548
- // So it is not navigated twice.
1549
- if (oInnerControl.getApplicationType() === ApplicationType.TR.type) {
1550
- that.activeContainer(oInnerControl);
1551
- }
1552
- //here, we create the application in case this is a stateful container (meaning, using the existing iframe)
1553
- if (bReuseStatefulContainer) {
1554
- //for scube - make sure the container is active before we open the app
1555
- //to allow post messages form the iframe to flp that are sent
1556
- //as part of the target resolution process
1557
- if (oTarget.appCapabilities && oTarget.appCapabilities.appFrameworkId === "UI5") {
1558
- oInnerControl.setProperty("active", true, true);
1559
- }
1560
- oPromiseAsyncAppCreate = that.handleOpenStateful(
1561
- bIsInitial, bIsInCache, "application" + sAppId, oInnerControl, oTarget,
1562
- sFixedShellHash, oKeepAliveMode, bNavigationInSameStatefullContainer, bReturnedFromKeepAlivePoolFLPV2);
1563
- } else if (oInnerControl.getStatefulType && oInnerControl.getStatefulType() === BlueBoxHandler.STATEFUL_TYPES.GUI_V1 || bReturnedFromKeepAlivePoolGuiV1) {
1564
- //here, we create the application in case this is old gui v1 statefull
1565
- oPromiseAsyncAppCreate = WebGUIStatefulHandler.guiStatefulCreateApp(that, oInnerControl, oTarget);
1566
- }
1567
-
1568
- //for case of stateful container or gui v1 stateful, show the application view (make it visible)
1569
- oPromiseAsyncAppCreate.then(function () {
1570
- ushellUtils.setPerformanceMark("FLP -- centerViewPort");
1571
- if (oInnerControl.getApplicationType() !== ApplicationType.TR.type) {
1572
- // Activate container before showing it (start reacting to postMessage calls)
1573
- that.activeContainer(oInnerControl);
1574
- }
1635
+ // SAP GUI is sending post messages for back navigation as soon the create application event is sent to the iframe,
1636
+ // so this makes sure the container is active before sending the event.
1637
+ // For WD applications, the application is active only after the application is created.
1638
+ // So it is not navigated twice.
1639
+ if (oInnerControl.getApplicationType() === ApplicationType.TR.type) {
1640
+ this.activeContainer(oInnerControl);
1641
+ }
1642
+ //here, we create the application in case this is a stateful container (meaning, using the existing iframe)
1643
+ if (bReuseStatefulContainer) {
1644
+ //for scube - make sure the container is active before we open the app
1645
+ //to allow post messages form the iframe to flp that are sent
1646
+ //as part of the target resolution process
1647
+ if (oTarget.appCapabilities?.appFrameworkId === "UI5") {
1648
+ oInnerControl.setProperty("active", true, true);
1649
+ }
1650
+ // eslint-disable-next-line max-len
1651
+ await this.handleOpenStateful(bIsInitial, bIsInCache, `application${sAppId}`, oInnerControl, oTarget, sFixedShellHash, oKeepAliveMode, bNavigationInSameStatefulContainer, bReturnedFromKeepAlivePoolFLPV2);
1652
+ } else if (oInnerControl.getStatefulType?.() === BlueBoxHandler.STATEFUL_TYPES.GUI_V1 || bReturnedFromKeepAlivePoolGuiV1) {
1653
+ //here, we create the application in case this is old gui v1 stateful
1654
+ await WebGUIStatefulHandler.guiStatefulCreateApp(this, oInnerControl, oTarget);
1655
+ }
1575
1656
 
1576
- /*
1577
- * Workaround:
1578
- * The oCurrentApplication object does not reflect the currently opened application.
1579
- * This leads to store/restore calls on the wrong application.
1580
- * Create application that is not persisted and not cashed as a fallback.
1581
- *
1582
- * This issue occurs for iframe applications reusing the iframe.
1583
- */
1584
- if (oCurrentApplication.appId !== sFullAppId) {
1585
- oCurrentApplication = {
1586
- appId: sFullAppId,
1587
- stt: "loading",
1588
- container: oInnerControl,
1589
- meta: AppConfiguration.getMetadata(oTarget),
1590
- app: undefined
1591
- };
1592
- }
1593
- oDeferredOpenApp.resolve();
1594
- });
1595
- });
1596
- });
1597
- });
1657
+ //for case of stateful container or gui v1 stateful, show the application view (make it visible)
1658
+ ushellUtils.setPerformanceMark("FLP -- centerViewPort");
1659
+ if (oInnerControl.getApplicationType() !== ApplicationType.TR.type) {
1660
+ // Activate container before showing it (start reacting to postMessage calls)
1661
+ this.activeContainer(oInnerControl);
1662
+ }
1598
1663
 
1599
- return oDeferredOpenApp.promise();
1664
+ /*
1665
+ * Workaround:
1666
+ * The oCurrentApplication object does not reflect the currently opened application.
1667
+ * This leads to store/restore calls on the wrong application.
1668
+ * Create application that is not persisted and not cashed as a fallback.
1669
+ *
1670
+ * This issue occurs for iframe applications reusing the iframe.
1671
+ */
1672
+ if (oCurrentApplication.appId !== sFullAppId) {
1673
+ oCurrentApplication = {
1674
+ appId: sFullAppId,
1675
+ stt: "loading",
1676
+ container: oInnerControl,
1677
+ meta: AppConfiguration.getMetadata(oTarget),
1678
+ app: undefined
1679
+ };
1680
+ }
1600
1681
  };
1601
1682
 
1602
1683
  /**
1603
1684
  * New app was created and we now have to switch the state
1685
+ * @param {string} sLaunchpadState
1686
+ * @param {string} sAppId
1687
+ * @param {string} sAppType
1688
+ * @param {boolean} bIsExplaceNavigation
1604
1689
  */
1605
1690
  this.switchViewState = function (sLaunchpadState, sAppId, sAppType, bIsExplaceNavigation) {
1606
1691
  // Store state before creating a new one
@@ -1610,7 +1695,6 @@ sap.ui.define([
1610
1695
  StateManager.destroyManagedControls();
1611
1696
  }
1612
1697
 
1613
-
1614
1698
  const sShellMode = StateManager.getShellMode();
1615
1699
  // GUI Applications need a back button to work properly
1616
1700
  const oShellModeOverrides = {
@@ -1626,7 +1710,7 @@ sap.ui.define([
1626
1710
  StateManager.switchState(sLaunchpadState, sShellModeOverride);
1627
1711
 
1628
1712
  // Restore state if it already exists
1629
- const oToStorageEntry = Storage.get("application" + sAppId);
1713
+ const oToStorageEntry = Storage.get(`application${sAppId}`);
1630
1714
  if (oToStorageEntry) {
1631
1715
  KeepAlive.restore(oToStorageEntry);
1632
1716
  } else {
@@ -1637,18 +1721,31 @@ sap.ui.define([
1637
1721
  StateManager.applyStalledChanges();
1638
1722
  };
1639
1723
 
1724
+ /**
1725
+ * @param {object} oCommunicationHandler
1726
+ */
1640
1727
  this.registerShellCommunicationHandler = function (oCommunicationHandler) {
1641
1728
  Application.registerShellCommunicationHandler(oCommunicationHandler);
1642
1729
  };
1643
1730
 
1731
+ /**
1732
+ * @param {string} sHandlers
1733
+ * @param {string} sType
1734
+ */
1644
1735
  this.registerIframeCommunicationHandler = function (sHandlers, sType) {
1645
1736
  oGlobalIframeCommunicationHandlers[sType] = sHandlers;
1646
1737
  };
1647
1738
 
1648
- this.setBackNavigationChanged = function (isBackNavigationChangedValue) {
1649
- isBackNavigationChanged = isBackNavigationChangedValue;
1739
+ /**
1740
+ * @param {boolean} bIsBackNavigationChangedValue
1741
+ */
1742
+ this.setBackNavigationChanged = function (bIsBackNavigationChangedValue) {
1743
+ isBackNavigationChanged = bIsBackNavigationChangedValue;
1650
1744
  };
1651
1745
 
1746
+ /**
1747
+ * @returns {boolean} Whether the back navigation was changed.
1748
+ */
1652
1749
  this.getBackNavigationChanged = function () {
1653
1750
  return isBackNavigationChanged;
1654
1751
  };