@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.
- package/package.json +1 -1
- package/src/main/js/sap/ushell/.library +1 -1
- package/src/main/js/sap/ushell/Fiori20Adapter.js +32 -10
- package/src/main/js/sap/ushell/Fiori20AdapterTest.js +17 -14
- package/src/main/js/sap/ushell/NWBCInterface.js +1 -1
- package/src/main/js/sap/ushell/TechnicalParameters.js +1 -1
- package/src/main/js/sap/ushell/UIActions.js +11 -0
- package/src/main/js/sap/ushell/URLTemplateProcessor/DefinitionParameterSetBuilder.js +1 -1
- package/src/main/js/sap/ushell/URLTemplateProcessor/DependencyGraph.js +1 -1
- package/src/main/js/sap/ushell/URLTemplateProcessor/Functions.js +1 -1
- package/src/main/js/sap/ushell/URLTemplateProcessor/Resolvers.js +1 -1
- package/src/main/js/sap/ushell/URLTemplateProcessor/TemplateParameterParser.js +1 -1
- package/src/main/js/sap/ushell/URLTemplateProcessor/utils.js +1 -1
- package/src/main/js/sap/ushell/URLTemplateProcessor.js +1 -1
- package/src/main/js/sap/ushell/Ui5NativeServiceFactory.js +1 -1
- package/src/main/js/sap/ushell/Ui5ServiceFactory.js +1 -1
- package/src/main/js/sap/ushell/adapters/AppVariantPersonalizationAdapter.js +1 -1
- package/src/main/js/sap/ushell/adapters/cdm/ClientSideTargetResolutionAdapter.js +1 -1
- package/src/main/js/sap/ushell/adapters/cdm/CommonDataModelAdapter.js +1 -1
- package/src/main/js/sap/ushell/adapters/cdm/ConfigurationDefaultsAdapter.js +1 -1
- package/src/main/js/sap/ushell/adapters/cdm/ContainerAdapter.js +1 -1
- package/src/main/js/sap/ushell/adapters/cdm/LaunchPageAdapter.js +1 -1
- package/src/main/js/sap/ushell/adapters/cdm/PagesCommonDataModelAdapter.js +1 -1
- package/src/main/js/sap/ushell/adapters/cdm/PersonalizationAdapter.js +1 -1
- package/src/main/js/sap/ushell/adapters/cdm/PersonalizationV2Adapter.js +1 -1
- package/src/main/js/sap/ushell/adapters/cdm/Ui5ComponentLoaderAdapter.js +1 -1
- package/src/main/js/sap/ushell/adapters/cdm/_LaunchPage/modifyHome.js +1 -1
- package/src/main/js/sap/ushell/adapters/cdm/_LaunchPage/readCatalogs.js +1 -1
- package/src/main/js/sap/ushell/adapters/cdm/_LaunchPage/readHome.js +1 -1
- package/src/main/js/sap/ushell/adapters/cdm/_LaunchPage/uri.transform.js +1 -1
- package/src/main/js/sap/ushell/adapters/cdm/util/AppForInbound.js +1 -1
- package/src/main/js/sap/ushell/adapters/cdm/util/cdmSiteUtils.js +1 -1
- package/src/main/js/sap/ushell/adapters/cdm/v3/AdapterBase.js +1 -1
- package/src/main/js/sap/ushell/adapters/cdm/v3/FlpLaunchPageAdapter.js +1 -1
- package/src/main/js/sap/ushell/adapters/cdm/v3/LaunchPageAdapter.js +1 -1
- package/src/main/js/sap/ushell/adapters/cdm/v3/StaticGroupsAdapter.js +1 -1
- package/src/main/js/sap/ushell/adapters/cdm/v3/_LaunchPage/readApplications.js +1 -1
- package/src/main/js/sap/ushell/adapters/cdm/v3/_LaunchPage/readCatalogs.js +1 -1
- package/src/main/js/sap/ushell/adapters/cdm/v3/_LaunchPage/readHome.js +1 -1
- package/src/main/js/sap/ushell/adapters/cdm/v3/_LaunchPage/readPages.js +1 -1
- package/src/main/js/sap/ushell/adapters/cdm/v3/_LaunchPage/readUtils.js +1 -1
- package/src/main/js/sap/ushell/adapters/cdm/v3/_LaunchPage/readVisualizations.js +1 -1
- package/src/main/js/sap/ushell/adapters/cep/NavTargetResolutionAdapter.js +1 -1
- package/src/main/js/sap/ushell/adapters/cep/NavTargetResolutionInternalAdapter.js +2 -2
- package/src/main/js/sap/ushell/adapters/cep/SearchCEPAdapter.js +1 -1
- package/src/main/js/sap/ushell/adapters/cflp/UserDefaultParameterPersistenceAdapter.js +1 -1
- package/src/main/js/sap/ushell/adapters/local/AdapterContainer.js +1 -1
- package/src/main/js/sap/ushell/adapters/local/AppStateAdapter.js +1 -1
- package/src/main/js/sap/ushell/adapters/local/ClientSideTargetResolutionAdapter.js +1 -1
- package/src/main/js/sap/ushell/adapters/local/ContainerAdapter.js +1 -1
- package/src/main/js/sap/ushell/adapters/local/FlpLaunchPageAdapter.js +1 -1
- package/src/main/js/sap/ushell/adapters/local/LaunchPageAdapter.js +1 -1
- package/src/main/js/sap/ushell/adapters/local/NavTargetResolutionAdapter.js +1 -1
- package/src/main/js/sap/ushell/adapters/local/NavTargetResolutionInternalAdapter.js +1 -1
- package/src/main/js/sap/ushell/adapters/local/PageBuildingAdapter.js +1 -1
- package/src/main/js/sap/ushell/adapters/local/PagePersistenceAdapter.js +1 -1
- package/src/main/js/sap/ushell/adapters/local/PersonalizationAdapter.js +1 -1
- package/src/main/js/sap/ushell/adapters/local/PersonalizationV2Adapter.js +1 -1
- package/src/main/js/sap/ushell/adapters/local/SearchAdapter.js +1 -1
- package/src/main/js/sap/ushell/adapters/local/SearchCEPAdapter.js +1 -1
- package/src/main/js/sap/ushell/adapters/local/SupportTicketAdapter.js +1 -1
- package/src/main/js/sap/ushell/adapters/local/Ui5ComponentLoaderAdapter.js +1 -1
- package/src/main/js/sap/ushell/adapters/local/UserDefaultParameterPersistenceAdapter.js +1 -1
- package/src/main/js/sap/ushell/adapters/local/UserInfoAdapter.js +1 -1
- package/src/main/js/sap/ushell/api/Copilot.js +42 -0
- package/src/main/js/sap/ushell/api/Inbox.js +5 -164
- package/src/main/js/sap/ushell/api/S4MyHome.js +132 -0
- package/src/main/js/sap/ushell/api/common/ComponentInstantiation.js +215 -0
- package/src/main/js/sap/ushell/appRuntime/ui5/AppRuntime.js +26 -23
- package/src/main/js/sap/ushell/appRuntime/ui5/plugins/rtaAgent/i18n/i18n_en_US_sappsd.properties +3 -3
- package/src/main/js/sap/ushell/appRuntime/ui5/plugins/rtaAgent/i18n/i18n_en_US_saptrc.properties +5 -5
- package/src/main/js/sap/ushell/appRuntime/ui5/plugins/rtaShell/i18n/i18n_en_US_sappsd.properties +1 -1
- package/src/main/js/sap/ushell/appRuntime/ui5/plugins/rtaShell/i18n/i18n_en_US_saptrc.properties +2 -2
- package/src/main/js/sap/ushell/appRuntime/ui5/renderers/fiori2/RendererExtensions.js +1 -1
- package/src/main/js/sap/ushell/appRuntime/ui5/services/AppConfiguration.js +1 -1
- package/src/main/js/sap/ushell/appRuntime/ui5/services/AppLifeCycle.js +1 -1
- package/src/main/js/sap/ushell/appRuntime/ui5/services/AppState.js +1 -1
- package/src/main/js/sap/ushell/appRuntime/ui5/services/Bookmark.js +1 -1
- package/src/main/js/sap/ushell/appRuntime/ui5/services/BookmarkV2.js +1 -1
- package/src/main/js/sap/ushell/appRuntime/ui5/services/CommonDataModel.js +1 -1
- package/src/main/js/sap/ushell/appRuntime/ui5/services/Container.js +1 -1
- package/src/main/js/sap/ushell/appRuntime/ui5/services/CrossApplicationNavigation.js +1 -1
- package/src/main/js/sap/ushell/appRuntime/ui5/services/Extension/Item.js +1 -1
- package/src/main/js/sap/ushell/appRuntime/ui5/services/Extension.js +1 -1
- package/src/main/js/sap/ushell/appRuntime/ui5/services/FrameBoundExtension.js +1 -1
- package/src/main/js/sap/ushell/appRuntime/ui5/services/LaunchPage.js +1 -1
- package/src/main/js/sap/ushell/appRuntime/ui5/services/MessageBroker.js +1 -1
- package/src/main/js/sap/ushell/appRuntime/ui5/services/NavTargetResolution.js +1 -1
- package/src/main/js/sap/ushell/appRuntime/ui5/services/NavTargetResolutionInternal.js +1 -1
- package/src/main/js/sap/ushell/appRuntime/ui5/services/Navigation.js +1 -1
- package/src/main/js/sap/ushell/appRuntime/ui5/services/ReferenceResolver.js +1 -1
- package/src/main/js/sap/ushell/appRuntime/ui5/services/ShellNavigation.js +1 -1
- package/src/main/js/sap/ushell/appRuntime/ui5/services/ShellNavigationInternal.js +1 -1
- package/src/main/js/sap/ushell/appRuntime/ui5/services/ShellUIService.js +10 -12
- package/src/main/js/sap/ushell/appRuntime/ui5/services/UserInfo.js +1 -1
- package/src/main/js/sap/ushell/appRuntime/ui5/services/adapters/Ui5ComponentLoaderAdapter.js +1 -1
- package/src/main/js/sap/ushell/bootstrap/SchedulingAgent/logger.js +1 -1
- package/src/main/js/sap/ushell/bootstrap/SchedulingAgent/state.js +1 -1
- package/src/main/js/sap/ushell/bootstrap/common/common.configure.ui5datetimeformat.js +1 -1
- package/src/main/js/sap/ushell/bootstrap/common/common.create.configcontract.core.js +2 -1
- package/src/main/js/sap/ushell/bootstrap/common/common.load.model.js +2 -8
- package/src/main/js/sap/ushell/bootstrap/sandbox2.js +1 -1
- package/src/main/js/sap/ushell/components/_HomepageManager/PagingManager.js +1 -3
- package/src/main/js/sap/ushell/components/appfinder/AppFinder.controller.js +5 -7
- package/src/main/js/sap/ushell/components/appfinder/Component.js +9 -9
- package/src/main/js/sap/ushell/components/appfinder/manifest.json +6 -1
- package/src/main/js/sap/ushell/components/applicationIntegration/AppLifeCycle.js +689 -592
- package/src/main/js/sap/ushell/components/applicationIntegration/application/Application.js +29 -18
- package/src/main/js/sap/ushell/components/applicationIntegration/application/BlueBoxHandler.js +5 -5
- package/src/main/js/sap/ushell/components/applicationIntegration/application/PostMessageAPI.js +2 -2
- package/src/main/js/sap/ushell/components/applicationIntegration/configuration/AppMeta.js +6 -163
- package/src/main/js/sap/ushell/components/applicationIntegration/relatedServices/RelatedServices.js +1 -1
- package/src/main/js/sap/ushell/components/cepsearchresult/app/Main.controller.js +9 -4
- package/src/main/js/sap/ushell/components/cepsearchresult/app/cards/searchresultwidget/i18n/i18n_en_US_sappsd.properties +4 -4
- package/src/main/js/sap/ushell/components/cepsearchresult/app/cards/searchresultwidget/i18n/i18n_en_US_saptrc.properties +37 -37
- package/src/main/js/sap/ushell/components/cepsearchresult/app/i18n/i18n_en_US_sappsd.properties +1 -1
- package/src/main/js/sap/ushell/components/cepsearchresult/app/i18n/i18n_en_US_saptrc.properties +9 -9
- package/src/main/js/sap/ushell/components/cepsearchresult/app/util/i18n/i18n_en_US_sappsd.properties +32 -32
- package/src/main/js/sap/ushell/components/cepsearchresult/app/util/i18n/i18n_en_US_saptrc.properties +109 -109
- package/src/main/js/sap/ushell/components/container/ApplicationContainer.js +1 -1
- package/src/main/js/sap/ushell/components/container/IframePOSTUtils.js +1 -1
- package/src/main/js/sap/ushell/components/container/resources/resources_en_US_saptrc.properties +6 -6
- package/src/main/js/sap/ushell/components/contentFinder/CatalogService.js +18 -15
- package/src/main/js/sap/ushell/components/contentFinder/Component.js +27 -20
- package/src/main/js/sap/ushell/components/contentFinder/controller/AppSearch.controller.js +100 -7
- package/src/main/js/sap/ushell/components/contentFinder/controller/ContentFinderDialog.controller.js +1 -1
- package/src/main/js/sap/ushell/components/contentFinder/controller/WidgetGallery.controller.js +1 -1
- package/src/main/js/sap/ushell/components/contentFinder/manifest.json +2 -2
- package/src/main/js/sap/ushell/components/contentFinder/model/formatter.js +13 -8
- package/src/main/js/sap/ushell/components/contentFinder/resources/resources.properties +16 -0
- package/src/main/js/sap/ushell/components/contentFinder/resources/resources_ar.properties +4 -1
- package/src/main/js/sap/ushell/components/contentFinder/resources/resources_bg.properties +4 -1
- package/src/main/js/sap/ushell/components/contentFinder/resources/resources_ca.properties +4 -1
- package/src/main/js/sap/ushell/components/contentFinder/resources/resources_cnr.properties +4 -1
- package/src/main/js/sap/ushell/components/contentFinder/resources/resources_cs.properties +4 -1
- package/src/main/js/sap/ushell/components/contentFinder/resources/resources_cy.properties +4 -1
- package/src/main/js/sap/ushell/components/contentFinder/resources/resources_da.properties +4 -1
- package/src/main/js/sap/ushell/components/contentFinder/resources/resources_de.properties +4 -1
- package/src/main/js/sap/ushell/components/contentFinder/resources/resources_el.properties +4 -1
- package/src/main/js/sap/ushell/components/contentFinder/resources/resources_en.properties +4 -1
- package/src/main/js/sap/ushell/components/contentFinder/resources/resources_en_GB.properties +4 -1
- package/src/main/js/sap/ushell/components/contentFinder/resources/resources_en_US_sappsd.properties +7 -5
- package/src/main/js/sap/ushell/components/contentFinder/resources/resources_en_US_saprigi.properties +7 -1
- package/src/main/js/sap/ushell/components/contentFinder/resources/resources_en_US_saptrc.properties +26 -24
- package/src/main/js/sap/ushell/components/contentFinder/resources/resources_es.properties +4 -1
- package/src/main/js/sap/ushell/components/contentFinder/resources/resources_es_MX.properties +4 -1
- package/src/main/js/sap/ushell/components/contentFinder/resources/resources_et.properties +4 -1
- package/src/main/js/sap/ushell/components/contentFinder/resources/resources_fi.properties +4 -1
- package/src/main/js/sap/ushell/components/contentFinder/resources/resources_fr.properties +4 -1
- package/src/main/js/sap/ushell/components/contentFinder/resources/resources_fr_CA.properties +4 -1
- package/src/main/js/sap/ushell/components/contentFinder/resources/resources_hi.properties +4 -1
- package/src/main/js/sap/ushell/components/contentFinder/resources/resources_hr.properties +4 -1
- package/src/main/js/sap/ushell/components/contentFinder/resources/resources_hu.properties +6 -3
- package/src/main/js/sap/ushell/components/contentFinder/resources/resources_id.properties +4 -1
- package/src/main/js/sap/ushell/components/contentFinder/resources/resources_it.properties +4 -1
- package/src/main/js/sap/ushell/components/contentFinder/resources/resources_iw.properties +4 -1
- package/src/main/js/sap/ushell/components/contentFinder/resources/resources_ja.properties +4 -1
- package/src/main/js/sap/ushell/components/contentFinder/resources/resources_kk.properties +4 -1
- package/src/main/js/sap/ushell/components/contentFinder/resources/resources_ko.properties +6 -3
- package/src/main/js/sap/ushell/components/contentFinder/resources/resources_lt.properties +4 -1
- package/src/main/js/sap/ushell/components/contentFinder/resources/resources_lv.properties +4 -1
- package/src/main/js/sap/ushell/components/contentFinder/resources/resources_mk.properties +4 -1
- package/src/main/js/sap/ushell/components/contentFinder/resources/resources_ms.properties +4 -1
- package/src/main/js/sap/ushell/components/contentFinder/resources/resources_nl.properties +4 -1
- package/src/main/js/sap/ushell/components/contentFinder/resources/resources_no.properties +4 -1
- package/src/main/js/sap/ushell/components/contentFinder/resources/resources_pl.properties +4 -1
- package/src/main/js/sap/ushell/components/contentFinder/resources/resources_pt.properties +4 -1
- package/src/main/js/sap/ushell/components/contentFinder/resources/resources_pt_PT.properties +4 -1
- package/src/main/js/sap/ushell/components/contentFinder/resources/resources_ro.properties +4 -1
- package/src/main/js/sap/ushell/components/contentFinder/resources/resources_ru.properties +4 -1
- package/src/main/js/sap/ushell/components/contentFinder/resources/resources_sh.properties +4 -1
- package/src/main/js/sap/ushell/components/contentFinder/resources/resources_sk.properties +4 -1
- package/src/main/js/sap/ushell/components/contentFinder/resources/resources_sl.properties +4 -1
- package/src/main/js/sap/ushell/components/contentFinder/resources/resources_sr.properties +4 -1
- package/src/main/js/sap/ushell/components/contentFinder/resources/resources_sv.properties +4 -1
- package/src/main/js/sap/ushell/components/contentFinder/resources/resources_th.properties +4 -1
- package/src/main/js/sap/ushell/components/contentFinder/resources/resources_tr.properties +4 -1
- package/src/main/js/sap/ushell/components/contentFinder/resources/resources_uk.properties +4 -1
- package/src/main/js/sap/ushell/components/contentFinder/resources/resources_vi.properties +4 -1
- package/src/main/js/sap/ushell/components/contentFinder/resources/resources_zh_CN.properties +4 -1
- package/src/main/js/sap/ushell/components/contentFinder/resources/resources_zh_TW.properties +4 -1
- package/src/main/js/sap/ushell/components/contentFinder/view/AppSearch.view.xml +275 -127
- package/src/main/js/sap/ushell/components/contentFinder/view/AppSearchBox.fragment.xml +61 -24
- package/src/main/js/sap/ushell/components/contentFinder/view/AppSearchList.fragment.xml +73 -0
- package/src/main/js/sap/ushell/components/contentFinder/view/ContentFinderDialog.view.xml +20 -10
- package/src/main/js/sap/ushell/components/contentFinderStandalone/Component.js +1 -1
- package/src/main/js/sap/ushell/components/contentFinderStandalone/controller/ContentFinderStandalone.controller.js +1 -1
- package/src/main/js/sap/ushell/components/contentFinderStandalone/manifest.json +1 -1
- package/src/main/js/sap/ushell/components/contentFinderStandalone/manifestAppSearch.json +1 -1
- package/src/main/js/sap/ushell/components/contentFinderStandalone/resources/resources_ar.properties +3 -0
- package/src/main/js/sap/ushell/components/contentFinderStandalone/resources/resources_bg.properties +3 -0
- package/src/main/js/sap/ushell/components/contentFinderStandalone/resources/resources_ca.properties +3 -0
- package/src/main/js/sap/ushell/components/contentFinderStandalone/resources/resources_cnr.properties +3 -0
- package/src/main/js/sap/ushell/components/contentFinderStandalone/resources/resources_cs.properties +3 -0
- package/src/main/js/sap/ushell/components/contentFinderStandalone/resources/resources_cy.properties +3 -0
- package/src/main/js/sap/ushell/components/contentFinderStandalone/resources/resources_da.properties +3 -0
- package/src/main/js/sap/ushell/components/contentFinderStandalone/resources/resources_de.properties +3 -0
- package/src/main/js/sap/ushell/components/contentFinderStandalone/resources/resources_el.properties +3 -0
- package/src/main/js/sap/ushell/components/contentFinderStandalone/resources/resources_en.properties +3 -0
- package/src/main/js/sap/ushell/components/contentFinderStandalone/resources/resources_en_GB.properties +3 -0
- package/src/main/js/sap/ushell/components/contentFinderStandalone/resources/resources_en_US_saprigi.properties +3 -0
- package/src/main/js/sap/ushell/components/contentFinderStandalone/resources/resources_es.properties +3 -0
- package/src/main/js/sap/ushell/components/contentFinderStandalone/resources/resources_es_MX.properties +3 -0
- package/src/main/js/sap/ushell/components/contentFinderStandalone/resources/resources_et.properties +3 -0
- package/src/main/js/sap/ushell/components/contentFinderStandalone/resources/resources_fi.properties +3 -0
- package/src/main/js/sap/ushell/components/contentFinderStandalone/resources/resources_fr.properties +3 -0
- package/src/main/js/sap/ushell/components/contentFinderStandalone/resources/resources_fr_CA.properties +3 -0
- package/src/main/js/sap/ushell/components/contentFinderStandalone/resources/resources_hi.properties +3 -0
- package/src/main/js/sap/ushell/components/contentFinderStandalone/resources/resources_hr.properties +3 -0
- package/src/main/js/sap/ushell/components/contentFinderStandalone/resources/resources_hu.properties +3 -0
- package/src/main/js/sap/ushell/components/contentFinderStandalone/resources/resources_id.properties +3 -0
- package/src/main/js/sap/ushell/components/contentFinderStandalone/resources/resources_it.properties +3 -0
- package/src/main/js/sap/ushell/components/contentFinderStandalone/resources/resources_iw.properties +3 -0
- package/src/main/js/sap/ushell/components/contentFinderStandalone/resources/resources_ja.properties +3 -0
- package/src/main/js/sap/ushell/components/contentFinderStandalone/resources/resources_kk.properties +3 -0
- package/src/main/js/sap/ushell/components/contentFinderStandalone/resources/resources_ko.properties +3 -0
- package/src/main/js/sap/ushell/components/contentFinderStandalone/resources/resources_lt.properties +3 -0
- package/src/main/js/sap/ushell/components/contentFinderStandalone/resources/resources_lv.properties +3 -0
- package/src/main/js/sap/ushell/components/contentFinderStandalone/resources/resources_mk.properties +3 -0
- package/src/main/js/sap/ushell/components/contentFinderStandalone/resources/resources_ms.properties +3 -0
- package/src/main/js/sap/ushell/components/contentFinderStandalone/resources/resources_nl.properties +3 -0
- package/src/main/js/sap/ushell/components/contentFinderStandalone/resources/resources_no.properties +3 -0
- package/src/main/js/sap/ushell/components/contentFinderStandalone/resources/resources_pl.properties +3 -0
- package/src/main/js/sap/ushell/components/contentFinderStandalone/resources/resources_pt.properties +3 -0
- package/src/main/js/sap/ushell/components/contentFinderStandalone/resources/resources_pt_PT.properties +3 -0
- package/src/main/js/sap/ushell/components/contentFinderStandalone/resources/resources_ro.properties +3 -0
- package/src/main/js/sap/ushell/components/contentFinderStandalone/resources/resources_ru.properties +3 -0
- package/src/main/js/sap/ushell/components/contentFinderStandalone/resources/resources_sh.properties +3 -0
- package/src/main/js/sap/ushell/components/contentFinderStandalone/resources/resources_sk.properties +3 -0
- package/src/main/js/sap/ushell/components/contentFinderStandalone/resources/resources_sl.properties +3 -0
- package/src/main/js/sap/ushell/components/contentFinderStandalone/resources/resources_sr.properties +3 -0
- package/src/main/js/sap/ushell/components/contentFinderStandalone/resources/resources_sv.properties +3 -0
- package/src/main/js/sap/ushell/components/contentFinderStandalone/resources/resources_th.properties +3 -0
- package/src/main/js/sap/ushell/components/contentFinderStandalone/resources/resources_tr.properties +3 -0
- package/src/main/js/sap/ushell/components/contentFinderStandalone/resources/resources_uk.properties +3 -0
- package/src/main/js/sap/ushell/components/contentFinderStandalone/resources/resources_vi.properties +3 -0
- package/src/main/js/sap/ushell/components/contentFinderStandalone/resources/resources_zh_CN.properties +3 -0
- package/src/main/js/sap/ushell/components/contentFinderStandalone/resources/resources_zh_TW.properties +3 -0
- package/src/main/js/sap/ushell/components/factsheet/Component.js +1 -1
- package/src/main/js/sap/ushell/components/homepage/ActionMode.js +1 -1
- package/src/main/js/sap/ushell/components/homepage/DashboardContent.view.js +1 -1
- package/src/main/js/sap/ushell/components/homepage/DashboardGroupsBox.js +1 -1
- package/src/main/js/sap/ushell/components/homepage/DashboardUIActions.js +1 -1
- package/src/main/js/sap/ushell/components/homepage/manifest.json +1 -1
- package/src/main/js/sap/ushell/components/pages/ActionMode.js +1 -1
- package/src/main/js/sap/ushell/components/pages/Component.js +1 -1
- package/src/main/js/sap/ushell/components/pages/MyHomeImport.js +1 -1
- package/src/main/js/sap/ushell/components/pages/controller/PageRuntime.controller.js +12 -1
- package/src/main/js/sap/ushell/components/pages/manifest.json +1 -1
- package/src/main/js/sap/ushell/components/runtimeSwitcher/controller/RuntimeSwitcher.controller.js +1 -1
- package/src/main/js/sap/ushell/components/runtimeSwitcher/manifest.json +1 -1
- package/src/main/js/sap/ushell/components/shell/FloatingContainer/Component.js +1158 -0
- package/src/main/js/sap/ushell/components/shell/FloatingContainer/FloatingContainer.fragment.xml +17 -0
- package/src/main/js/sap/ushell/components/shell/FloatingContainer/controls/FloatingContainer.js +55 -0
- package/src/main/js/sap/ushell/components/shell/FloatingContainer/manifest.json +84 -0
- package/src/main/js/sap/ushell/components/shell/MenuBar/manifest.json +1 -1
- package/src/main/js/sap/ushell/components/shell/NavigationBarMenu/controller/NavigationBarMenu.controller.js +1 -1
- package/src/main/js/sap/ushell/components/shell/NavigationBarMenu/manifest.json +1 -1
- package/src/main/js/sap/ushell/components/shell/Notifications/Component.js +1 -1
- package/src/main/js/sap/ushell/components/shell/PostLoadingHeaderEnhancement/Component.js +1 -1
- package/src/main/js/sap/ushell/components/shell/ProductSwitch/Component.js +1 -1
- package/src/main/js/sap/ushell/components/shell/Search/manifest.json +1 -1
- package/src/main/js/sap/ushell/components/shell/SearchCEP/Component.js +1 -1
- package/src/main/js/sap/ushell/components/shell/SearchCEP/SearchProviders/FrequentActivityProvider.js +1 -1
- package/src/main/js/sap/ushell/components/shell/SearchCEP/SearchProviders/RecentSearchProvider.js +1 -1
- package/src/main/js/sap/ushell/components/shell/SearchCEP/SearchProviders/SearchProvider.js +1 -1
- package/src/main/js/sap/ushell/components/shell/SearchCEP/SearchProviders/SearchServiceProvider.js +1 -1
- package/src/main/js/sap/ushell/components/shell/Settings/Component.js +1 -1
- package/src/main/js/sap/ushell/components/shell/Settings/UserSettings.view.xml +1 -1
- package/src/main/js/sap/ushell/components/shell/Settings/notifications/NotificationsSetting.controller.js +3 -0
- package/src/main/js/sap/ushell/components/shell/Settings/notifications/NotificationsSetting.view.xml +3 -1
- package/src/main/js/sap/ushell/components/shell/Settings/userDefaults/UserDefaultsForm.js +15 -6
- package/src/main/js/sap/ushell/components/shell/Settings/userDefaults/controller/UserDefaultsSetting.controller.js +43 -62
- package/src/main/js/sap/ushell/components/shell/UserActionsMenu/Component.js +1 -1
- package/src/main/js/sap/ushell/components/shell/UserImage/Component.js +1 -1
- package/src/main/js/sap/ushell/components/visualizationOrganizer/Component.js +1 -1
- package/src/main/js/sap/ushell/components/workPageBuilder/Component.js +2 -2
- package/src/main/js/sap/ushell/components/workPageBuilder/controller/WorkPageBuilder.accessibility.js +1 -1
- package/src/main/js/sap/ushell/components/workPageBuilder/controller/WorkPageBuilder.controller.js +1 -1
- package/src/main/js/sap/ushell/components/workPageBuilder/controls/WorkPage.js +9 -5
- package/src/main/js/sap/ushell/components/workPageBuilder/controls/WorkPageButton.js +1 -1
- package/src/main/js/sap/ushell/components/workPageBuilder/controls/WorkPageCell.js +8 -5
- package/src/main/js/sap/ushell/components/workPageBuilder/controls/WorkPageColumn.js +1 -1
- package/src/main/js/sap/ushell/components/workPageBuilder/controls/WorkPageColumnResizer.js +1 -1
- package/src/main/js/sap/ushell/components/workPageBuilder/controls/WorkPageRow.js +1 -1
- package/src/main/js/sap/ushell/components/workPageBuilder/manifest.json +1 -1
- package/src/main/js/sap/ushell/components/workPageBuilder/resources/resources_en_US_sappsd.properties +27 -26
- package/src/main/js/sap/ushell/components/workPageBuilder/resources/resources_en_US_saptrc.properties +68 -67
- package/src/main/js/sap/ushell/components/workPageRuntime/Component.js +1 -1
- package/src/main/js/sap/ushell/components/workPageRuntime/controller/WorkPageRuntime.controller.js +1 -1
- package/src/main/js/sap/ushell/components/workPageRuntime/manifest.json +1 -1
- package/src/main/js/sap/ushell/components/workPageRuntime/view/WorkPageRuntime.view.xml +3 -4
- package/src/main/js/sap/ushell/designtime/ApplicationContainer.designtime.js +1 -1
- package/src/main/js/sap/ushell/iconfonts.js +36 -420
- package/src/main/js/sap/ushell/library.js +1 -1
- package/src/main/js/sap/ushell/navigationMode.js +1 -1
- package/src/main/js/sap/ushell/performance/ShellAnalytics.js +1 -1
- package/src/main/js/sap/ushell/performance/StatisticalRecord.js +1 -1
- package/src/main/js/sap/ushell/plugins/appwarmup/Component.js +1 -1
- package/src/main/js/sap/ushell/plugins/rta/i18n/i18n_en_US_sappsd.properties +3 -3
- package/src/main/js/sap/ushell/plugins/rta/i18n/i18n_en_US_saptrc.properties +8 -8
- package/src/main/js/sap/ushell/renderer/Renderer.js +127 -127
- package/src/main/js/sap/ushell/renderer/Shell.controller.js +694 -1182
- package/src/main/js/sap/ushell/renderer/Shell.view.js +38 -102
- package/src/main/js/sap/ushell/renderer/resources/resources.properties +4 -4
- package/src/main/js/sap/ushell/renderer/resources/resources_ar.properties +1 -0
- package/src/main/js/sap/ushell/renderer/resources/resources_bg.properties +1 -0
- package/src/main/js/sap/ushell/renderer/resources/resources_ca.properties +1 -0
- package/src/main/js/sap/ushell/renderer/resources/resources_cnr.properties +1 -0
- package/src/main/js/sap/ushell/renderer/resources/resources_cs.properties +1 -0
- package/src/main/js/sap/ushell/renderer/resources/resources_cy.properties +1 -0
- package/src/main/js/sap/ushell/renderer/resources/resources_da.properties +1 -0
- package/src/main/js/sap/ushell/renderer/resources/resources_de.properties +1 -0
- package/src/main/js/sap/ushell/renderer/resources/resources_el.properties +1 -0
- package/src/main/js/sap/ushell/renderer/resources/resources_en.properties +1 -0
- package/src/main/js/sap/ushell/renderer/resources/resources_en_GB.properties +1 -0
- package/src/main/js/sap/ushell/renderer/resources/resources_en_US_sappsd.properties +128 -130
- package/src/main/js/sap/ushell/renderer/resources/resources_en_US_saprigi.properties +1 -0
- package/src/main/js/sap/ushell/renderer/resources/resources_en_US_saptrc.properties +989 -991
- package/src/main/js/sap/ushell/renderer/resources/resources_es.properties +1 -0
- package/src/main/js/sap/ushell/renderer/resources/resources_es_MX.properties +1 -0
- package/src/main/js/sap/ushell/renderer/resources/resources_et.properties +1 -0
- package/src/main/js/sap/ushell/renderer/resources/resources_fi.properties +1 -0
- package/src/main/js/sap/ushell/renderer/resources/resources_fr.properties +1 -0
- package/src/main/js/sap/ushell/renderer/resources/resources_fr_CA.properties +1 -0
- package/src/main/js/sap/ushell/renderer/resources/resources_hi.properties +1 -0
- package/src/main/js/sap/ushell/renderer/resources/resources_hr.properties +1 -0
- package/src/main/js/sap/ushell/renderer/resources/resources_hu.properties +2 -1
- package/src/main/js/sap/ushell/renderer/resources/resources_id.properties +1 -0
- package/src/main/js/sap/ushell/renderer/resources/resources_it.properties +1 -0
- package/src/main/js/sap/ushell/renderer/resources/resources_iw.properties +1 -0
- package/src/main/js/sap/ushell/renderer/resources/resources_ja.properties +1 -0
- package/src/main/js/sap/ushell/renderer/resources/resources_kk.properties +1 -0
- package/src/main/js/sap/ushell/renderer/resources/resources_ko.properties +1 -0
- package/src/main/js/sap/ushell/renderer/resources/resources_lt.properties +1 -0
- package/src/main/js/sap/ushell/renderer/resources/resources_lv.properties +1 -0
- package/src/main/js/sap/ushell/renderer/resources/resources_mk.properties +1 -0
- package/src/main/js/sap/ushell/renderer/resources/resources_ms.properties +1 -0
- package/src/main/js/sap/ushell/renderer/resources/resources_nl.properties +1 -0
- package/src/main/js/sap/ushell/renderer/resources/resources_no.properties +1 -0
- package/src/main/js/sap/ushell/renderer/resources/resources_pl.properties +1 -0
- package/src/main/js/sap/ushell/renderer/resources/resources_pt.properties +1 -0
- package/src/main/js/sap/ushell/renderer/resources/resources_pt_PT.properties +1 -0
- package/src/main/js/sap/ushell/renderer/resources/resources_ro.properties +1 -0
- package/src/main/js/sap/ushell/renderer/resources/resources_ru.properties +1 -0
- package/src/main/js/sap/ushell/renderer/resources/resources_sh.properties +1 -0
- package/src/main/js/sap/ushell/renderer/resources/resources_sk.properties +1 -0
- package/src/main/js/sap/ushell/renderer/resources/resources_sl.properties +1 -0
- package/src/main/js/sap/ushell/renderer/resources/resources_sr.properties +1 -0
- package/src/main/js/sap/ushell/renderer/resources/resources_sv.properties +1 -0
- package/src/main/js/sap/ushell/renderer/resources/resources_th.properties +1 -0
- package/src/main/js/sap/ushell/renderer/resources/resources_tr.properties +1 -0
- package/src/main/js/sap/ushell/renderer/resources/resources_uk.properties +1 -0
- package/src/main/js/sap/ushell/renderer/resources/resources_vi.properties +1 -0
- package/src/main/js/sap/ushell/renderer/resources/resources_zh_CN.properties +1 -0
- package/src/main/js/sap/ushell/renderer/resources/resources_zh_TW.properties +1 -0
- package/src/main/js/sap/ushell/renderer/search/searchComponent/manifest.json +1 -1
- package/src/main/js/sap/ushell/{components/_HeaderManager → renderer/shellHeader}/ShellHeader.controller.js +1 -5
- package/src/main/js/sap/ushell/{ui → renderer/shellHeader}/ShellHeader.fragment.xml +6 -3
- package/src/main/js/sap/ushell/renderers/fiori2/Shell.view.js +36 -100
- package/src/main/js/sap/ushell/services/AppLifeCycle.js +2 -2
- package/src/main/js/sap/ushell/services/AppState.js +1 -1
- package/src/main/js/sap/ushell/services/Bookmark.js +1 -1
- package/src/main/js/sap/ushell/services/BookmarkV2.js +1 -1
- package/src/main/js/sap/ushell/services/ClientSideTargetResolution/Formatter.js +1 -1
- package/src/main/js/sap/ushell/services/ClientSideTargetResolution/InboundIndex.js +1 -1
- package/src/main/js/sap/ushell/services/ClientSideTargetResolution/InboundProvider.js +1 -1
- package/src/main/js/sap/ushell/services/ClientSideTargetResolution/PrelaunchOperations.js +1 -1
- package/src/main/js/sap/ushell/services/ClientSideTargetResolution/Search.js +1 -1
- package/src/main/js/sap/ushell/services/ClientSideTargetResolution/StagedLogger.js +1 -1
- package/src/main/js/sap/ushell/services/ClientSideTargetResolution/SystemContext.js +1 -1
- package/src/main/js/sap/ushell/services/ClientSideTargetResolution/Utils.js +1 -1
- package/src/main/js/sap/ushell/services/ClientSideTargetResolution/VirtualInbounds.js +1 -1
- package/src/main/js/sap/ushell/services/ClientSideTargetResolution/XAppStateProcessing.js +1 -1
- package/src/main/js/sap/ushell/services/ClientSideTargetResolution.js +1 -1
- package/src/main/js/sap/ushell/services/CommonDataModel/SiteConverter.js +1 -1
- package/src/main/js/sap/ushell/services/CommonDataModel/vizTypeDefaults/VizTypeDefaults.js +1 -1
- package/src/main/js/sap/ushell/services/CommonDataModel.js +1 -1
- package/src/main/js/sap/ushell/services/Configuration.js +1 -1
- package/src/main/js/sap/ushell/services/ConfigurationDefaults.js +1 -1
- package/src/main/js/sap/ushell/services/ContentExtensionAdapterFactory.js +1 -1
- package/src/main/js/sap/ushell/services/CrossApplicationNavigation.js +44 -156
- package/src/main/js/sap/ushell/services/DarkModeSupport.js +1 -1
- package/src/main/js/sap/ushell/services/Extension/Item.js +1 -1
- package/src/main/js/sap/ushell/services/Extension.js +1 -1
- package/src/main/js/sap/ushell/services/FlpLaunchPage.js +1 -1
- package/src/main/js/sap/ushell/services/FrameBoundExtension/FloatingContainer.js +1 -1
- package/src/main/js/sap/ushell/services/FrameBoundExtension/Footer.js +1 -1
- package/src/main/js/sap/ushell/services/FrameBoundExtension/Item.js +1 -1
- package/src/main/js/sap/ushell/services/FrameBoundExtension/SidePane.js +1 -1
- package/src/main/js/sap/ushell/services/FrameBoundExtension/ToolArea.js +1 -1
- package/src/main/js/sap/ushell/services/FrameBoundExtension.js +1 -1
- package/src/main/js/sap/ushell/services/LaunchPage.js +1 -1
- package/src/main/js/sap/ushell/services/Menu.js +1 -1
- package/src/main/js/sap/ushell/services/Message.js +1 -1
- package/src/main/js/sap/ushell/services/MessageBroker/MessageBrokerEngine.js +1 -1
- package/src/main/js/sap/ushell/services/MessageBroker.js +1 -1
- package/src/main/js/sap/ushell/services/MessageInternal.js +1 -1
- package/src/main/js/sap/ushell/services/Navigation/compatibility.js +1 -1
- package/src/main/js/sap/ushell/services/Navigation/utils.js +1 -1
- package/src/main/js/sap/ushell/services/Navigation.js +1 -1
- package/src/main/js/sap/ushell/services/NavigationDataProvider.js +1 -1
- package/src/main/js/sap/ushell/services/PageBuilding.js +1 -1
- package/src/main/js/sap/ushell/services/PagePersistence.js +1 -1
- package/src/main/js/sap/ushell/services/PageReferencing.js +1 -1
- package/src/main/js/sap/ushell/services/Pages.js +1 -1
- package/src/main/js/sap/ushell/services/Personalization.js +1 -1
- package/src/main/js/sap/ushell/services/PersonalizationV2.js +1 -1
- package/src/main/js/sap/ushell/services/PluginManager/Extensions.js +1 -1
- package/src/main/js/sap/ushell/services/PluginManager/HeaderExtensions.js +1 -1
- package/src/main/js/sap/ushell/services/PluginManager/MenuExtensions.js +1 -1
- package/src/main/js/sap/ushell/services/PluginManager.js +1 -1
- package/src/main/js/sap/ushell/services/ReferenceResolver.js +1 -1
- package/src/main/js/sap/ushell/services/Search.js +1 -1
- package/src/main/js/sap/ushell/services/SearchCEP.js +1 -1
- package/src/main/js/sap/ushell/services/SearchableContent.js +1 -1
- package/src/main/js/sap/ushell/services/ShellNavigation.js +1 -1
- package/src/main/js/sap/ushell/services/SmartNavigation.js +1 -1
- package/src/main/js/sap/ushell/services/SpaceContent.js +1 -1
- package/src/main/js/sap/ushell/services/UITracer.js +5 -4
- package/src/main/js/sap/ushell/services/URLShortening.js +1 -1
- package/src/main/js/sap/ushell/services/URLTemplate.js +1 -1
- package/src/main/js/sap/ushell/services/Ui5ComponentLoader/utils.js +1 -1
- package/src/main/js/sap/ushell/services/Ui5ComponentLoader.js +1 -1
- package/src/main/js/sap/ushell/services/UserDefaultParameterPersistence.js +1 -1
- package/src/main/js/sap/ushell/services/UserDefaultParameters.js +100 -65
- package/src/main/js/sap/ushell/services/UserInfo.js +1 -1
- package/src/main/js/sap/ushell/services/UserRecents/RecentActivity.js +2 -3
- package/src/main/js/sap/ushell/services/UserRecents/RecentAppsUsage.js +4 -4
- package/src/main/js/sap/ushell/services/UserRecents/RecentsList.js +1 -1
- package/src/main/js/sap/ushell/services/UserRecents.js +1 -1
- package/src/main/js/sap/ushell/services/VisualizationDataProvider.js +1 -1
- package/src/main/js/sap/ushell/services/VisualizationInstantiation.js +2 -2
- package/src/main/js/sap/ushell/services/_ContentExtensionAdapterFactory/ContentExtensionAdapterConfig.js +1 -1
- package/src/main/js/sap/ushell/services/_ContentExtensionAdapterFactory/FeaturedGroupConfig.js +1 -1
- package/src/main/js/sap/ushell/services/_CrossApplicationNavigation/utils.js +1 -1
- package/src/main/js/sap/ushell/services/_PageReferencing/PageReferencer.js +1 -1
- package/src/main/js/sap/ushell/state/BindingHelper.js +79 -0
- package/src/main/js/sap/ushell/state/StateManager.js +4 -2
- package/src/main/js/sap/ushell/state/StrategyFactory/FloatingContainerStrategy.js +36 -0
- package/src/main/js/sap/ushell/state/StrategyFactory.js +6 -0
- package/src/main/js/sap/ushell/support/plugins/flpConfig/FlpConfigurationPlugin.js +1 -1
- package/src/main/js/sap/ushell/themes/base/UserSettings.less +0 -12
- package/src/main/js/sap/ushell/themes/base/fonts/BusinessSuiteInAppSymbols.json +393 -384
- package/src/main/js/sap/ushell/themes/base/fonts/BusinessSuiteInAppSymbols.ttf +0 -0
- package/src/main/js/sap/ushell/themes/base/fonts/BusinessSuiteInAppSymbols.woff +0 -0
- package/src/main/js/sap/ushell/themes/base/fonts/BusinessSuiteInAppSymbols.woff2 +0 -0
- package/src/main/js/sap/ushell/themes/sap_belize_base/UserSettings.less +0 -13
- package/src/main/js/sap/ushell/themes/sap_bluecrystal_base/UserSettings.less +0 -13
- package/src/main/js/sap/ushell/themes/sap_hcb/base_UserSettings.less +0 -13
- package/src/main/js/sap/ushell/ui/ContentNodeSelector.js +18 -6
- package/src/main/js/sap/ushell/ui/bookmark/SaveOnPage.view.xml +6 -6
- package/src/main/js/sap/ushell/ui/cards/RecentActivitiesExtension.js +1 -1
- package/src/main/js/sap/ushell/ui/footerbar/SaveAsTile.view.js +3 -0
- package/src/main/js/sap/ushell/ui/launchpad/ExtendedChangeDetection.js +1 -1
- package/src/main/js/sap/ushell/ui/launchpad/Section.js +1 -1
- package/src/main/js/sap/ushell/ui/launchpad/section/CompactArea.js +1 -1
- package/src/main/js/sap/ushell/ui/shell/ToolAreaItem.js +1 -1
- package/src/main/js/sap/ushell/ui/utils.js +1 -1
- package/src/main/js/sap/ushell/ui5service/ShellUIService.js +811 -22
- package/src/main/js/sap/ushell/ui5service/ShellUIServiceFactory.js +477 -0
- package/src/main/js/sap/ushell/ui5service/UserStatus.js +1 -1
- package/src/main/js/sap/ushell/utils/UrlShortening.js +1 -1
- package/src/main/js/sap/ushell/utils/WindowUtils.js +21 -18
- package/src/main/js/sap/ushell/utils/tilecard/resources/resources_en_US_sappsd.properties +5 -0
- package/src/main/js/sap/ushell/utils/tilecard/resources/resources_en_US_saptrc.properties +5 -0
- package/src/main/js/sap/ushell/utils/workpage/DestinationResolver.js +68 -25
- package/src/main/js/sap/ushell/utils/workpage/WorkPageHost.js +64 -9
- package/src/main/js/sap/ushell/utils/workpage/WorkPageService.js +3 -2
- package/src/main/js/sap/ushell/utils/workpage/WorkPageVizInstantiation.js +1 -1
- package/src/main/js/sap/ushell/utils/workpage/resources/resources.properties +14 -2
- package/src/main/js/sap/ushell/utils/workpage/resources/resources_ar.properties +28 -16
- package/src/main/js/sap/ushell/utils/workpage/resources/resources_bg.properties +29 -17
- package/src/main/js/sap/ushell/utils/workpage/resources/resources_ca.properties +26 -14
- package/src/main/js/sap/ushell/utils/workpage/resources/resources_cnr.properties +11 -0
- package/src/main/js/sap/ushell/utils/workpage/resources/resources_cs.properties +15 -3
- package/src/main/js/sap/ushell/utils/workpage/resources/resources_cy.properties +15 -3
- package/src/main/js/sap/ushell/utils/workpage/resources/resources_da.properties +19 -7
- package/src/main/js/sap/ushell/utils/workpage/resources/resources_de.properties +16 -4
- package/src/main/js/sap/ushell/utils/workpage/resources/resources_el.properties +16 -4
- package/src/main/js/sap/ushell/utils/workpage/resources/resources_en.properties +13 -2
- package/src/main/js/sap/ushell/utils/workpage/resources/resources_en_GB.properties +18 -6
- package/src/main/js/sap/ushell/utils/workpage/resources/resources_en_US_sappsd.properties +28 -27
- package/src/main/js/sap/ushell/utils/workpage/resources/resources_en_US_saprigi.properties +78 -66
- package/src/main/js/sap/ushell/utils/workpage/resources/resources_en_US_saptrc.properties +68 -67
- package/src/main/js/sap/ushell/utils/workpage/resources/resources_es.properties +44 -32
- package/src/main/js/sap/ushell/utils/workpage/resources/resources_es_MX.properties +16 -4
- package/src/main/js/sap/ushell/utils/workpage/resources/resources_et.properties +24 -12
- package/src/main/js/sap/ushell/utils/workpage/resources/resources_fi.properties +16 -4
- package/src/main/js/sap/ushell/utils/workpage/resources/resources_fr.properties +29 -17
- package/src/main/js/sap/ushell/utils/workpage/resources/resources_fr_CA.properties +19 -7
- package/src/main/js/sap/ushell/utils/workpage/resources/resources_hi.properties +20 -8
- package/src/main/js/sap/ushell/utils/workpage/resources/resources_hr.properties +27 -15
- package/src/main/js/sap/ushell/utils/workpage/resources/resources_hu.properties +19 -7
- package/src/main/js/sap/ushell/utils/workpage/resources/resources_id.properties +13 -1
- package/src/main/js/sap/ushell/utils/workpage/resources/resources_it.properties +18 -6
- package/src/main/js/sap/ushell/utils/workpage/resources/resources_iw.properties +13 -1
- package/src/main/js/sap/ushell/utils/workpage/resources/resources_ja.properties +19 -7
- package/src/main/js/sap/ushell/utils/workpage/resources/resources_kk.properties +21 -9
- package/src/main/js/sap/ushell/utils/workpage/resources/resources_ko.properties +14 -2
- package/src/main/js/sap/ushell/utils/workpage/resources/resources_lt.properties +19 -7
- package/src/main/js/sap/ushell/utils/workpage/resources/resources_lv.properties +31 -19
- package/src/main/js/sap/ushell/utils/workpage/resources/resources_mk.properties +11 -0
- package/src/main/js/sap/ushell/utils/workpage/resources/resources_ms.properties +17 -5
- package/src/main/js/sap/ushell/utils/workpage/resources/resources_nl.properties +17 -5
- package/src/main/js/sap/ushell/utils/workpage/resources/resources_no.properties +16 -4
- package/src/main/js/sap/ushell/utils/workpage/resources/resources_pl.properties +17 -5
- package/src/main/js/sap/ushell/utils/workpage/resources/resources_pt.properties +17 -5
- package/src/main/js/sap/ushell/utils/workpage/resources/resources_pt_PT.properties +34 -22
- package/src/main/js/sap/ushell/utils/workpage/resources/resources_ro.properties +15 -3
- package/src/main/js/sap/ushell/utils/workpage/resources/resources_ru.properties +15 -3
- package/src/main/js/sap/ushell/utils/workpage/resources/resources_sh.properties +11 -0
- package/src/main/js/sap/ushell/utils/workpage/resources/resources_sk.properties +16 -4
- package/src/main/js/sap/ushell/utils/workpage/resources/resources_sl.properties +27 -15
- package/src/main/js/sap/ushell/utils/workpage/resources/resources_sr.properties +11 -0
- package/src/main/js/sap/ushell/utils/workpage/resources/resources_sv.properties +14 -2
- package/src/main/js/sap/ushell/utils/workpage/resources/resources_th.properties +18 -6
- package/src/main/js/sap/ushell/utils/workpage/resources/resources_tr.properties +22 -10
- package/src/main/js/sap/ushell/utils/workpage/resources/resources_uk.properties +15 -3
- package/src/main/js/sap/ushell/utils/workpage/resources/resources_vi.properties +24 -12
- package/src/main/js/sap/ushell/utils/workpage/resources/resources_zh_CN.properties +13 -1
- package/src/main/js/sap/ushell/utils/workpage/resources/resources_zh_TW.properties +17 -5
- package/src/main/js/sap/ushell/utils.js +14 -1
- package/src/test/js/sap/ushell/bootstrap/sandbox.js +1 -1
- package/ui5.yaml +5 -3
- package/src/main/js/sap/ushell/themes/base/fonts/horizon/BusinessSuiteInAppSymbols.ttf +0 -0
- package/src/main/js/sap/ushell/themes/base/fonts/horizon/BusinessSuiteInAppSymbols.woff +0 -0
- package/src/main/js/sap/ushell/themes/base/fonts/horizon/BusinessSuiteInAppSymbols.woff2 +0 -0
- package/src/main/js/sap/ushell/ui/shell/FloatingContainer.js +0 -238
- package/src/main/js/sap/ushell/ui5service/_ShellUIService/shelluiservice.class.factory.js +0 -746
- /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.
|
|
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
|
-
|
|
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
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
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
|
-
|
|
103
|
-
|
|
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(
|
|
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
|
-
|
|
165
|
-
|
|
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
|
-
|
|
177
|
-
|
|
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
|
-
|
|
182
|
-
|
|
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
|
-
|
|
192
|
-
|
|
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
|
-
|
|
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
|
-
|
|
222
|
-
|
|
223
|
-
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
330
|
+
const oStorageEntry = Storage.get(sAppId);
|
|
303
331
|
|
|
304
|
-
if (oStorageEntry
|
|
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
|
-
|
|
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
|
-
|
|
321
|
-
|
|
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()
|
|
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
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
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
|
|
345
|
-
if (sToId && oTo
|
|
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 (
|
|
353
|
-
return
|
|
402
|
+
if (!bIsHomePage && bFromAfterNavigate && (BlueBoxHandler.isStatefulContainer(oFrom) || BlueBoxHandler.isStatefulContainerInKeepAlivePool(oFrom))) {
|
|
403
|
+
return;
|
|
354
404
|
}
|
|
355
405
|
|
|
356
|
-
if (oFrom
|
|
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
|
-
|
|
413
|
+
await this.handleExitStateful(sFromId, oFrom, bIsHomePage);
|
|
364
414
|
|
|
365
|
-
|
|
415
|
+
//STATELESS
|
|
366
416
|
} else if (Storage.get(sFromId)) {
|
|
367
417
|
// Back Navigation Case
|
|
368
|
-
if (RelatedServices.isBackNavigation()
|
|
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
|
-
|
|
372
|
-
this.destroyApplication(sFromId, oFrom, oDeferredAppClose);
|
|
373
|
-
oPromiseAppClose = oDeferredAppClose.promise();
|
|
421
|
+
await this.destroyApplication(sFromId, oFrom);
|
|
374
422
|
} else {
|
|
375
|
-
|
|
423
|
+
await this.handleExitStateful(sFromId, oFrom, bIsHomePage);
|
|
376
424
|
}
|
|
377
425
|
|
|
378
|
-
|
|
426
|
+
// Forward Navigation Cases
|
|
379
427
|
} else if (oFrom.getApplicationType() === "UI5") {
|
|
380
|
-
// Wait until navigation's source app has been started
|
|
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
|
-
|
|
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
|
-
|
|
389
|
-
} else if (oFrom.getStatefulType
|
|
390
|
-
if (
|
|
391
|
-
|
|
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
|
-
|
|
443
|
+
// THE REST...
|
|
395
444
|
} else {
|
|
396
|
-
bIsAppOfTypeCachable =
|
|
445
|
+
const bIsAppOfTypeCachable = CACHED_APP_TYPES.indexOf(oFrom.getApplicationType) >= 0;
|
|
397
446
|
|
|
398
447
|
//destroy the application and its resources
|
|
399
|
-
|
|
400
|
-
if (bIsKeepAlive
|
|
401
|
-
|
|
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 (
|
|
408
|
-
|
|
409
|
-
|
|
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
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
this.closeKeepAliveApps = function (fnFilterApps
|
|
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
|
-
|
|
439
|
-
arrKeepAliveRestrictedApps = [];
|
|
474
|
+
const aKeepAliveRestrictedApps = [];
|
|
440
475
|
|
|
441
|
-
Storage.forEach(
|
|
442
|
-
if (fnFilterApps
|
|
443
|
-
|
|
476
|
+
Storage.forEach((oApp) => {
|
|
477
|
+
if (fnFilterApps(oApp)) {
|
|
478
|
+
aKeepAliveRestrictedApps.push(oApp);
|
|
444
479
|
}
|
|
445
480
|
});
|
|
446
|
-
|
|
481
|
+
const aClosePromises = aKeepAliveRestrictedApps.map((oRestrictedApp) => {
|
|
447
482
|
//check if it needs to be cached instead of destroy
|
|
448
|
-
|
|
449
|
-
var bDestroy = !BlueBoxHandler.returnUnusedKeepAliveContainer(oRestrictedApp.container);
|
|
483
|
+
const bDestroy = !BlueBoxHandler.returnUnusedKeepAliveContainer(oRestrictedApp.container);
|
|
450
484
|
if (bDestroy) {
|
|
451
|
-
|
|
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("
|
|
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.
|
|
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
|
-
|
|
476
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
502
|
-
|
|
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(
|
|
551
|
+
Storage.set(sAppId, {
|
|
507
552
|
service: {},
|
|
508
553
|
shellHash: sFixedShellHash,
|
|
509
|
-
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
|
|
561
|
+
keepAliveMode: oKeepAliveMode?.globalValue || oKeepAliveMode?.paramValue,
|
|
517
562
|
appTarget: oTarget,
|
|
518
|
-
ui5ComponentName: oTarget
|
|
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
|
|
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
|
-
|
|
564
|
-
|
|
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 (
|
|
616
|
+
if (sAppId === "application-Shell-startIntent") {
|
|
568
617
|
return false;
|
|
569
618
|
}
|
|
570
619
|
|
|
571
620
|
//handle the root intent
|
|
572
|
-
if (!
|
|
621
|
+
if (!bDisableHomeAppCache && sAppId.indexOf(sRootIntent) !== -1) {
|
|
573
622
|
return true;
|
|
574
623
|
}
|
|
575
624
|
|
|
576
|
-
if (!
|
|
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 ===
|
|
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
|
-
|
|
647
|
+
let sKeepAlive;
|
|
593
648
|
|
|
594
649
|
//generic intent currently can never be keep alive
|
|
595
|
-
if (oShellHash
|
|
650
|
+
if (oShellHash?.semanticObject === "Shell" && oShellHash?.action === "startIntent") {
|
|
596
651
|
return false;
|
|
597
652
|
}
|
|
598
653
|
|
|
599
|
-
|
|
600
|
-
|
|
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
|
|
662
|
+
if (oTarget?.url) {
|
|
615
663
|
sKeepAlive = UriParameters.fromURL(oTarget.url).get("sap-keep-alive");
|
|
616
|
-
if (sKeepAlive ===
|
|
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
|
|
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
|
-
|
|
635
|
-
|
|
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
|
-
|
|
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
|
-
|
|
644
|
-
|
|
645
|
-
|
|
646
|
-
|
|
647
|
-
|
|
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
|
-
|
|
653
|
-
|
|
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
|
-
|
|
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
|
-
|
|
671
|
-
|
|
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
|
|
701
|
-
oTmpAppContainer = BlueBoxHandler.getBlueBoxById(
|
|
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(
|
|
767
|
+
this.destroyApplication(`application-${sIntent}`, oTmpAppContainer);
|
|
706
768
|
BlueBoxHandler.deleteBlueBoxByUrl(sTmpUrl);
|
|
707
769
|
}
|
|
708
|
-
oContainer = Application.createApplicationContainer(
|
|
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" ||
|
|
779
|
+
} else if (oTarget.applicationType === "TR" || oTarget?.appCapabilities?.appFrameworkId === "GUI") {
|
|
718
780
|
oContainer = BlueBoxHandler.getBlueBoxByUrl(oTarget.url);
|
|
719
|
-
if (oContainer
|
|
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
|
|
727
|
-
oTmpAppContainer = BlueBoxHandler.getBlueBoxById(
|
|
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(
|
|
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(
|
|
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
|
|
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
|
|
761
|
-
oTmpAppContainer = BlueBoxHandler.getBlueBoxById(
|
|
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(
|
|
827
|
+
this.destroyApplication(`application-${sIntent}`, oTmpAppContainer, true);
|
|
766
828
|
BlueBoxHandler.deleteBlueBoxByUrl(sTmpUrl);
|
|
767
829
|
}
|
|
768
830
|
}
|
|
769
|
-
oContainer = Application.createApplicationContainer(
|
|
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
|
-
|
|
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(
|
|
799
|
-
|
|
800
|
-
|
|
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(
|
|
809
|
-
|
|
865
|
+
EventHub.on("setApplicationFullWidth").do((oData) => {
|
|
866
|
+
this.setApplicationFullWidth(oData.bValue);
|
|
810
867
|
});
|
|
811
868
|
|
|
812
|
-
EventHub.on("reloadCurrentApp").do(
|
|
813
|
-
|
|
869
|
+
EventHub.on("reloadCurrentApp").do((oData) => {
|
|
870
|
+
this.reloadCurrentApp(oData);
|
|
814
871
|
});
|
|
815
872
|
}
|
|
816
873
|
};
|
|
817
874
|
}());
|
|
818
875
|
|
|
819
|
-
|
|
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(
|
|
883
|
+
Container.getServiceAsync("AppState").then((oAppStateService) => {
|
|
822
884
|
fnOldTriggerEmail = URLHelper.triggerEmail.bind(URLHelper);
|
|
823
885
|
URLHelper.triggerEmail = function (sTo, sSubject, sBody, sCc, sBcc) {
|
|
824
|
-
|
|
886
|
+
const sFLPUrl = document.URL;
|
|
825
887
|
oAppStateService.setAppStateToPublic(sFLPUrl)
|
|
826
|
-
.done(
|
|
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(
|
|
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
|
-
|
|
841
|
-
|
|
842
|
-
|
|
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 =
|
|
847
|
-
|
|
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
|
|
943
|
+
return {};
|
|
880
944
|
}
|
|
881
945
|
},
|
|
882
946
|
setup: {
|
|
883
|
-
executeServiceCallFn: function (oServiceParams) {
|
|
884
|
-
|
|
885
|
-
|
|
886
|
-
|
|
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
|
-
|
|
889
|
-
|
|
954
|
+
const bIsSAPLegacyApplicationType = ushellUtils.isSAPLegacyApplicationType(oContainer.getApplicationType(), oContainer.getFrameworkId());
|
|
955
|
+
if (oContainer.getIsKeepAlive() && bIsSAPLegacyApplicationType) {
|
|
890
956
|
bIgnoreStateful = true;
|
|
891
957
|
}
|
|
892
|
-
if (oSetup.isStateful
|
|
958
|
+
if (oSetup.isStateful) {
|
|
893
959
|
if (bIgnoreStateful) {
|
|
894
|
-
|
|
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
|
-
|
|
970
|
+
oContainer.setProperty("statefulType", BlueBoxHandler.STATEFUL_TYPES.FLP_V2, true);
|
|
905
971
|
}
|
|
906
972
|
}
|
|
907
|
-
if (oSetup.isIframeValid
|
|
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
|
|
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(
|
|
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
|
-
|
|
927
|
-
|
|
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:
|
|
996
|
+
appId: oContainer.getId(),
|
|
930
997
|
stt: "loading",
|
|
931
|
-
container:
|
|
998
|
+
container: oContainer,
|
|
932
999
|
meta: undefined,
|
|
933
1000
|
app: undefined
|
|
934
1001
|
};
|
|
935
1002
|
} else {
|
|
936
|
-
|
|
1003
|
+
oContainer.setProperty("statefulType", -BlueBoxHandler.STATEFUL_TYPES.GUI_V1, true);
|
|
937
1004
|
}
|
|
938
|
-
return
|
|
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",
|
|
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
|
|
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
|
-
|
|
981
|
-
|
|
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
|
-
|
|
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",
|
|
1000
|
-
|| oViewPortContainer.getViewPortControl("centerViewPort",
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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 =
|
|
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
|
|
1187
|
+
return oGlobalShellUIService;
|
|
1087
1188
|
};
|
|
1088
1189
|
|
|
1089
|
-
|
|
1090
|
-
|
|
1091
|
-
|
|
1092
|
-
|
|
1093
|
-
|
|
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(
|
|
1223
|
+
BlueBoxHandler.forEach((oAppContainer) => {
|
|
1118
1224
|
if (oAppContainer && oAppContainer !== oApplicationContainer) {
|
|
1119
1225
|
try {
|
|
1120
|
-
Log.info(
|
|
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(
|
|
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
|
-
|
|
1147
|
-
|
|
1148
|
-
|
|
1149
|
-
|
|
1150
|
-
|
|
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
|
-
|
|
1170
|
-
|
|
1171
|
-
|
|
1172
|
-
|
|
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
|
-
|
|
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
|
-
|
|
1280
|
+
AppMeta._applyContentDensityByPriority();
|
|
1188
1281
|
|
|
1189
1282
|
//wrapped in setTimeout since "publish" is not async
|
|
1190
|
-
setTimeout(
|
|
1283
|
+
setTimeout(() => {
|
|
1191
1284
|
// TODO: do not mutate an internal structure (in a Timeout!),
|
|
1192
1285
|
// create a new object
|
|
1193
|
-
|
|
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
|
-
|
|
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
|
-
|
|
1311
|
+
const oPublicEventData = {};
|
|
1219
1312
|
if (!oApplication) {
|
|
1220
1313
|
return oApplication;
|
|
1221
1314
|
}
|
|
1222
|
-
["applicationType", "ui5ComponentName", "url", "additionalInformation", "text"].forEach(
|
|
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
|
-
|
|
1231
|
-
|
|
1232
|
-
|
|
1233
|
-
|
|
1234
|
-
|
|
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
|
-
|
|
1275
|
-
|
|
1276
|
-
|
|
1277
|
-
|
|
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
|
|
1281
|
-
oPromise = BlueBoxHandler.statefulRestoreKeepAliveApp(oInnerControl, oTarget.url, sToId, oTarget,
|
|
1282
|
-
.then(
|
|
1283
|
-
|
|
1284
|
-
}
|
|
1285
|
-
|
|
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
|
-
|
|
1289
|
-
|
|
1290
|
-
|
|
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
|
-
|
|
1295
|
-
}
|
|
1296
|
-
|
|
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
|
-
|
|
1309
|
-
|
|
1310
|
-
|
|
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
|
-
|
|
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()
|
|
1347
|
-
|
|
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
|
-
|
|
1352
|
-
|
|
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 =
|
|
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
|
|
1495
|
+
// of containers to it can be used again for the upcoming opened app)
|
|
1385
1496
|
bReuseStatefulContainer = BlueBoxHandler.isStatefulContainer(oCurrentAppContainer);
|
|
1386
|
-
|
|
1387
|
-
oCurrentAppContainer.getCurrentAppId && (oCurrentAppContainer.getCurrentAppId().length > 0);
|
|
1497
|
+
const bSourceIsKeepAliveFromPool = BlueBoxHandler.isStatefulContainerInKeepAlivePool(oCurrentAppContainer) && oCurrentAppContainer.getCurrentAppId?.().length > 0;
|
|
1388
1498
|
if (bReuseStatefulContainer || bSourceIsKeepAliveFromPool) {
|
|
1389
|
-
|
|
1499
|
+
await this.handleExitApplication(sOldFullAppId, oCurrentAppContainer, undefined, undefined, false, false);
|
|
1390
1500
|
if (oCurrentAppContainer === oTargetAppContainer) {
|
|
1391
|
-
|
|
1501
|
+
bNavigationInSameStatefulContainer = true;
|
|
1392
1502
|
}
|
|
1393
1503
|
}
|
|
1394
1504
|
|
|
1395
1505
|
//now, we can open the new application
|
|
1396
|
-
|
|
1397
|
-
|
|
1398
|
-
|
|
1399
|
-
|
|
1400
|
-
|
|
1401
|
-
|
|
1402
|
-
|
|
1403
|
-
|
|
1404
|
-
|
|
1405
|
-
|
|
1406
|
-
|
|
1407
|
-
|
|
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
|
-
|
|
1421
|
-
|
|
1422
|
-
|
|
1423
|
-
|
|
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
|
-
|
|
1437
|
-
|
|
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
|
-
|
|
1441
|
-
|
|
1442
|
-
|
|
1443
|
-
|
|
1444
|
-
|
|
1445
|
-
|
|
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
|
-
|
|
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
|
-
|
|
1508
|
-
|
|
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
|
-
|
|
1512
|
-
|
|
1513
|
-
|
|
1514
|
-
|
|
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
|
-
|
|
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
|
-
|
|
1543
|
-
|
|
1544
|
-
|
|
1545
|
-
|
|
1546
|
-
|
|
1547
|
-
|
|
1548
|
-
|
|
1549
|
-
|
|
1550
|
-
|
|
1551
|
-
|
|
1552
|
-
|
|
1553
|
-
|
|
1554
|
-
|
|
1555
|
-
|
|
1556
|
-
|
|
1557
|
-
|
|
1558
|
-
|
|
1559
|
-
|
|
1560
|
-
|
|
1561
|
-
|
|
1562
|
-
|
|
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
|
-
|
|
1578
|
-
|
|
1579
|
-
|
|
1580
|
-
|
|
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
|
-
|
|
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(
|
|
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
|
-
|
|
1649
|
-
|
|
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
|
};
|