@sapui5/sap.ushell_abap 1.146.0 → 1.147.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +4 -4
- package/src/main/js/sap/ushell_abap/.library +1 -1
- package/src/main/js/sap/ushell_abap/adapters/abap/AdapterContainer.js +4 -5
- package/src/main/js/sap/ushell_abap/adapters/abap/AppStateAdapter.js +1 -1
- package/src/main/js/sap/ushell_abap/adapters/abap/ClientSideTargetResolutionAdapter.js +10 -8
- package/src/main/js/sap/ushell_abap/adapters/abap/CommonDataModelAdapter.js +1 -1
- package/src/main/js/sap/ushell_abap/adapters/abap/ConfigurationDefaultsAdapter.js +7 -4
- package/src/main/js/sap/ushell_abap/adapters/abap/ContainerAdapter.js +8 -10
- package/src/main/js/sap/ushell_abap/adapters/abap/FlpLaunchPageAdapter.js +148 -109
- package/src/main/js/sap/ushell_abap/adapters/abap/LaunchPageAdapter.js +1 -1
- package/src/main/js/sap/ushell_abap/adapters/abap/NavTargetResolutionAdapter.js +1 -1
- package/src/main/js/sap/ushell_abap/adapters/abap/NavTargetResolutionInternalAdapter.js +1 -1
- package/src/main/js/sap/ushell_abap/adapters/abap/PageBuildingAdapter.js +1 -1
- package/src/main/js/sap/ushell_abap/adapters/abap/PagePersistenceAdapter.js +1 -1
- package/src/main/js/sap/ushell_abap/adapters/abap/PersonalizationAdapter.js +1 -1
- package/src/main/js/sap/ushell_abap/adapters/abap/PersonalizationV2Adapter.js +1 -1
- package/src/main/js/sap/ushell_abap/adapters/abap/SearchAdapter.js +1 -1
- package/src/main/js/sap/ushell_abap/adapters/abap/SupportTicketAdapter.js +1 -1
- package/src/main/js/sap/ushell_abap/adapters/abap/Ui5ComponentLoaderAdapter.js +1 -1
- package/src/main/js/sap/ushell_abap/adapters/hana/ContainerAdapter.js +1 -1
- package/src/main/js/sap/ushell_abap/bootstrap/BootTask/PrepareDirectAppStart.js +20 -0
- package/src/main/js/sap/ushell_abap/bootstrap/BootTask/RequestGroups.js +51 -0
- package/src/main/js/sap/ushell_abap/bootstrap/BootTask/RequestTargetMappings.js +29 -0
- package/src/main/js/sap/ushell_abap/bootstrap/BootTask.js +47 -0
- package/src/main/js/sap/ushell_abap/bootstrap/ConfigurationProvider.js +87 -0
- package/src/main/js/sap/ushell_abap/bootstrap/DirectAppStart.js +231 -0
- package/src/main/js/sap/ushell_abap/bootstrap/LoadLaunchpad/CreateRenderer.js +43 -0
- package/src/main/js/sap/ushell_abap/bootstrap/LoadLaunchpad/InitXhrLogon.js +148 -0
- package/src/main/js/sap/ushell_abap/bootstrap/LoadLaunchpad/RequestPages.js +86 -0
- package/src/main/js/sap/ushell_abap/bootstrap/LoadLaunchpad.js +63 -0
- package/src/main/js/sap/ushell_abap/bootstrap/LoadLaunchpadModule.js +11 -0
- package/src/main/js/sap/ushell_abap/bootstrap/PageSetsRequestHandler.js +247 -0
- package/src/main/js/sap/ushell_abap/bootstrap/PlatformConfig.js +385 -0
- package/src/main/js/sap/ushell_abap/bootstrap/{evo/SAPCompanionConditionSetter.js → SAPCompanionConditionSetter.js} +6 -4
- package/src/main/js/sap/ushell_abap/bootstrap/StartupRequestHandler.js +145 -0
- package/src/main/js/sap/ushell_abap/bootstrap/ThemeHandler.js +276 -0
- package/src/main/js/sap/ushell_abap/bootstrap/XhrFactory.js +69 -0
- package/src/main/js/sap/ushell_abap/bootstrap/{evo/XhrLogonEventHandler.js → XhrLogonEventHandler.js} +13 -7
- package/src/main/js/sap/ushell_abap/bootstrap/XhrLogonLibLoader.js +51 -0
- package/src/main/js/sap/ushell_abap/bootstrap/abap-def-dev.js +20 -0
- package/src/main/js/sap/ushell_abap/bootstrap/{evo/abap-def-loader.js → abap-def-loader.js} +2 -2
- package/src/main/js/sap/ushell_abap/bootstrap/abap-def.js +22 -0
- package/src/main/js/sap/ushell_abap/bootstrap/evo/abap.js +1 -1
- package/src/main/js/sap/ushell_abap/components/TCodeNavigation.js +3 -3
- package/src/main/js/sap/ushell_abap/library.js +1 -1
- package/src/main/js/sap/ushell_abap/pbServices/ui2/Contracts.js +33 -0
- package/ui5.yaml +7 -6
- package/src/main/js/sap/ushell_abap/bootstrap/evo/abap-def-dev.js +0 -42
- package/src/main/js/sap/ushell_abap/bootstrap/evo/abap-def.js +0 -45
- package/src/main/js/sap/ushell_abap/bootstrap/evo/abap.bootstrap.utils.js +0 -172
- package/src/main/js/sap/ushell_abap/bootstrap/evo/abap.configure.theme.js +0 -28
- package/src/main/js/sap/ushell_abap/bootstrap/evo/abap.configure.ushell.js +0 -181
- package/src/main/js/sap/ushell_abap/bootstrap/evo/abap.load.launchpad.js +0 -72
- package/src/main/js/sap/ushell_abap/bootstrap/evo/abap.request.pageset.js +0 -219
- package/src/main/js/sap/ushell_abap/bootstrap/evo/abap.request.startup.js +0 -154
- package/src/main/js/sap/ushell_abap/bootstrap/evo/abap.theme.handler.js +0 -79
- package/src/main/js/sap/ushell_abap/bootstrap/evo/abap.xhrlogon.LibLoader.js +0 -21
- package/src/main/js/sap/ushell_abap/bootstrap/evo/abap.xhrlogon.configure.js +0 -62
- package/src/main/js/sap/ushell_abap/bootstrap/evo/abap.xhrlogon.handler.js +0 -82
- package/src/main/js/sap/ushell_abap/bootstrap/evo/boottask.js +0 -944
- /package/src/main/js/sap/ushell_abap/bootstrap/{evo/abap.constants.js → abapConstants.js} +0 -0
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
// Copyright (c) 2009-2026 SAP SE, All Rights Reserved
|
|
2
|
+
sap.ui.define([
|
|
3
|
+
"sap/base/Log",
|
|
4
|
+
"sap/ushell_abap/bootstrap/DirectAppStart"
|
|
5
|
+
], (
|
|
6
|
+
Log,
|
|
7
|
+
DirectAppStart
|
|
8
|
+
) => {
|
|
9
|
+
"use strict";
|
|
10
|
+
|
|
11
|
+
class PrepareDirectAppStart {
|
|
12
|
+
async run () {
|
|
13
|
+
DirectAppStart.prepare().catch((oError) => {
|
|
14
|
+
Log.error("Error during the preparation of direct app start", oError, "sap.ushell_abap.bootstrap.BootTask");
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
return new PrepareDirectAppStart();
|
|
20
|
+
});
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
// Copyright (c) 2009-2026 SAP SE, All Rights Reserved
|
|
2
|
+
sap.ui.define([
|
|
3
|
+
"sap/base/util/ObjectPath",
|
|
4
|
+
"sap/ushell_abap/bootstrap/PageSetsRequestHandler",
|
|
5
|
+
"sap/ushell/bootstrap/Config"
|
|
6
|
+
], (
|
|
7
|
+
ObjectPath,
|
|
8
|
+
PageSetsRequestHandler,
|
|
9
|
+
BootstrapConfig
|
|
10
|
+
) => {
|
|
11
|
+
"use strict";
|
|
12
|
+
|
|
13
|
+
class RequestGroups {
|
|
14
|
+
#aInternTargets = [
|
|
15
|
+
"#Shell-home",
|
|
16
|
+
"#Launchpad-openFLPPage",
|
|
17
|
+
"#Shell-appfinder",
|
|
18
|
+
"#Shell-catalog",
|
|
19
|
+
"#shell-catalog",
|
|
20
|
+
"#Action-search"
|
|
21
|
+
];
|
|
22
|
+
|
|
23
|
+
#isRelevant () {
|
|
24
|
+
const oUshellConfig = BootstrapConfig.get();
|
|
25
|
+
if (ObjectPath.get("ushell.spaces.enabled", oUshellConfig)) {
|
|
26
|
+
return false;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
const sHash = this.getLocationHash();
|
|
30
|
+
|
|
31
|
+
return this.#aInternTargets.some((sTarget) => sHash.startsWith(sTarget));
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
async run () {
|
|
35
|
+
if (!this.#isRelevant()) {
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
const oConfig = BootstrapConfig.get();
|
|
40
|
+
const oContainerAdapterConfig = ObjectPath.get("services.Container.adapter.config", oConfig);
|
|
41
|
+
|
|
42
|
+
PageSetsRequestHandler.requestPageSets(oContainerAdapterConfig);
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
getLocationHash () {
|
|
46
|
+
return window.location.hash || "#";
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
return new RequestGroups();
|
|
51
|
+
});
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
// Copyright (c) 2009-2026 SAP SE, All Rights Reserved
|
|
2
|
+
sap.ui.define([
|
|
3
|
+
"sap/base/util/ObjectPath",
|
|
4
|
+
"sap/ushell_abap/bootstrap/StartupRequestHandler",
|
|
5
|
+
"sap/ushell/bootstrap/Config"
|
|
6
|
+
], (
|
|
7
|
+
ObjectPath,
|
|
8
|
+
StartupRequestHandler,
|
|
9
|
+
BootstrapConfig
|
|
10
|
+
) => {
|
|
11
|
+
"use strict";
|
|
12
|
+
|
|
13
|
+
class RequestTargetMappings {
|
|
14
|
+
async run () {
|
|
15
|
+
const oUshellConfig = BootstrapConfig.get();
|
|
16
|
+
|
|
17
|
+
const pResult = StartupRequestHandler.requestFullTM();
|
|
18
|
+
|
|
19
|
+
ObjectPath.set("services.ClientSideTargetResolution.adapter.config.navTargetDataPromise", pResult, oUshellConfig);
|
|
20
|
+
// Do not issue the separate compact request for the launchpage adapter, as it was done in the earlier FLP versions.
|
|
21
|
+
// Reuse the existing full target mappings request that is sent in any case.
|
|
22
|
+
ObjectPath.set("services.LaunchPage.adapter.config.compactTMPromise", pResult, oUshellConfig);
|
|
23
|
+
ObjectPath.set("services.FlpLaunchPage.adapter.config.compactTMPromise", pResult, oUshellConfig);
|
|
24
|
+
ObjectPath.set("services.VisualizationDataProvider.adapter.config.compactTMPromise", pResult, oUshellConfig);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
return new RequestTargetMappings();
|
|
29
|
+
});
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
// Copyright (c) 2009-2026 SAP SE, All Rights Reserved
|
|
2
|
+
sap.ui.define([
|
|
3
|
+
"sap/base/Log",
|
|
4
|
+
"sap/ui/performance/trace/initTraces",
|
|
5
|
+
"sap/ushell_abap/bootstrap/BootTask/PrepareDirectAppStart",
|
|
6
|
+
"sap/ushell_abap/bootstrap/BootTask/RequestTargetMappings",
|
|
7
|
+
"sap/ushell_abap/bootstrap/BootTask/RequestGroups"
|
|
8
|
+
], (
|
|
9
|
+
Log,
|
|
10
|
+
initTraces,
|
|
11
|
+
PrepareDirectAppStart,
|
|
12
|
+
RequestTargetMappings,
|
|
13
|
+
RequestGroups
|
|
14
|
+
) => {
|
|
15
|
+
"use strict";
|
|
16
|
+
|
|
17
|
+
class BootTask {
|
|
18
|
+
async run (fnCallback, fnErrorCallback) {
|
|
19
|
+
try {
|
|
20
|
+
performance?.mark("FLP - boottask start");
|
|
21
|
+
|
|
22
|
+
// initialize UI5 performance tracing (FESR) before first request is sent, so that this is also instrumented
|
|
23
|
+
initTraces();
|
|
24
|
+
|
|
25
|
+
PrepareDirectAppStart.run().catch((oError) => {
|
|
26
|
+
Log.error("Error during the preparation of direct app start", oError, "sap.ushell_abap.bootstrap.BootTask");
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
RequestGroups.run().catch((oError) => {
|
|
30
|
+
Log.error("Error during request of groups", oError, "sap.ushell_abap.bootstrap.BootTask");
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
RequestTargetMappings.run().catch((oError) => {
|
|
34
|
+
Log.error("Error during request of target mappings", oError, "sap.ushell_abap.bootstrap.BootTask");
|
|
35
|
+
});
|
|
36
|
+
|
|
37
|
+
performance?.mark("FLP - boottask end");
|
|
38
|
+
|
|
39
|
+
fnCallback();
|
|
40
|
+
} catch (oError) {
|
|
41
|
+
fnErrorCallback(oError);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
return new BootTask();
|
|
47
|
+
});
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
// Copyright (c) 2009-2026 SAP SE, All Rights Reserved
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* @fileoverview ABAP bootstrap configuration provider.
|
|
5
|
+
*
|
|
6
|
+
* Coordinates the initialization of BootstrapConfig, PlatformConfig, and
|
|
7
|
+
* the merged UI5 configuration for the ABAP platform. Returns a singleton.
|
|
8
|
+
*/
|
|
9
|
+
sap.ui.define([
|
|
10
|
+
"sap/base/util/deepExtend",
|
|
11
|
+
"sap/ushell_abap/bootstrap/abapConstants",
|
|
12
|
+
"sap/ushell_abap/bootstrap/PlatformConfig",
|
|
13
|
+
"sap/ushell/bootstrap/Config"
|
|
14
|
+
], (
|
|
15
|
+
deepExtend,
|
|
16
|
+
abapConstants,
|
|
17
|
+
PlatformConfig,
|
|
18
|
+
BootstrapConfig
|
|
19
|
+
) => {
|
|
20
|
+
"use strict";
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* @alias sap.ushell_abap.bootstrap.ConfigurationProvider
|
|
24
|
+
* @namespace
|
|
25
|
+
* @description Configuration provider for the ABAP bootstrap.
|
|
26
|
+
*
|
|
27
|
+
* Initializes the ushell configuration with ABAP defaults, applies
|
|
28
|
+
* platform-specific settings, and merges the resulting UI5 configuration.
|
|
29
|
+
*
|
|
30
|
+
* @since 1.147.0
|
|
31
|
+
* @private
|
|
32
|
+
*/
|
|
33
|
+
class ConfigurationProvider {
|
|
34
|
+
/** @type {object} The merged UI5 configuration */
|
|
35
|
+
#oUI5Config;
|
|
36
|
+
|
|
37
|
+
constructor () {
|
|
38
|
+
this.#init();
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* Runs the initialization sequence: initializes BootstrapConfig with ABAP
|
|
43
|
+
* defaults, configures the ushell via PlatformConfig, merges UI5 configs,
|
|
44
|
+
* and applies module paths.
|
|
45
|
+
*
|
|
46
|
+
* @since 1.147.0
|
|
47
|
+
* @private
|
|
48
|
+
*/
|
|
49
|
+
#init () {
|
|
50
|
+
BootstrapConfig.initialize(abapConstants.defaultUshellConfig);
|
|
51
|
+
|
|
52
|
+
// Extend the default config with platform specific config inplace
|
|
53
|
+
PlatformConfig.configureUshell();
|
|
54
|
+
|
|
55
|
+
this.#oUI5Config = deepExtend({}, BootstrapConfig.getUI5Config(), PlatformConfig.getUI5Config());
|
|
56
|
+
|
|
57
|
+
BootstrapConfig.applyModulePaths();
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* Returns the value of a UI5 configuration property.
|
|
62
|
+
*
|
|
63
|
+
* @param {string} sCamelizedKey The camelCase key of the UI5 configuration property (e.g. "sapUiTheme", "sapUiLanguage")
|
|
64
|
+
* @returns {any} The value of the requested key, or <code>undefined</code>
|
|
65
|
+
*
|
|
66
|
+
* @since 1.147.0
|
|
67
|
+
* @private
|
|
68
|
+
*/
|
|
69
|
+
get (sCamelizedKey) {
|
|
70
|
+
return this.#oUI5Config[sCamelizedKey];
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
* Only for testing purposes!
|
|
75
|
+
* Resets the configuration and re-runs initialization.
|
|
76
|
+
*
|
|
77
|
+
* @since 1.147.0
|
|
78
|
+
* @private
|
|
79
|
+
*/
|
|
80
|
+
reset () {
|
|
81
|
+
BootstrapConfig.reset();
|
|
82
|
+
this.#init();
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
return new ConfigurationProvider();
|
|
87
|
+
});
|
|
@@ -0,0 +1,231 @@
|
|
|
1
|
+
// Copyright (c) 2009-2026 SAP SE, All Rights Reserved
|
|
2
|
+
sap.ui.define([
|
|
3
|
+
"sap/base/Log",
|
|
4
|
+
"sap/base/util/ObjectPath",
|
|
5
|
+
"sap/ushell_abap/bootstrap/StartupRequestHandler",
|
|
6
|
+
"sap/ushell/bootstrap/Config",
|
|
7
|
+
"sap/ushell/base/promisify",
|
|
8
|
+
"sap/ushell/base/requireAsync",
|
|
9
|
+
"sap/ushell/base/UrlParsing"
|
|
10
|
+
], (
|
|
11
|
+
Log,
|
|
12
|
+
ObjectPath,
|
|
13
|
+
StartupRequestHandler,
|
|
14
|
+
BootstrapConfig,
|
|
15
|
+
promisify,
|
|
16
|
+
requireAsync,
|
|
17
|
+
UrlParsing
|
|
18
|
+
) => {
|
|
19
|
+
"use strict";
|
|
20
|
+
|
|
21
|
+
class DirectAppStart {
|
|
22
|
+
#aInternTargets = [
|
|
23
|
+
"#Shell-home",
|
|
24
|
+
"#Launchpad-openFLPPage",
|
|
25
|
+
"#Shell-appfinder",
|
|
26
|
+
"#Shell-catalog",
|
|
27
|
+
"#shell-catalog",
|
|
28
|
+
"#Action-search"
|
|
29
|
+
];
|
|
30
|
+
|
|
31
|
+
#isRelevant () {
|
|
32
|
+
const sHash = this.#getFullHash();
|
|
33
|
+
|
|
34
|
+
return sHash !== "#" && !this.#aInternTargets.some((sTarget) => sHash.startsWith(sTarget));
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
async prepare () {
|
|
38
|
+
const oUshellConfig = BootstrapConfig.get();
|
|
39
|
+
|
|
40
|
+
if (!this.#isRelevant()) {
|
|
41
|
+
ObjectPath.set("services.ClientSideTargetResolution.adapter.config.initialSegmentPromise", Promise.resolve(null), oUshellConfig);
|
|
42
|
+
ObjectPath.set("services.AppState.config.initialAppStatesPromise", Promise.resolve({}), oUshellConfig);
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
const oParsedHash = UrlParsing.parseShellHash(this.#getFullHash(), true);
|
|
47
|
+
const oInitialKeys = {
|
|
48
|
+
"sap-xapp-state": oParsedHash.params?.["sap-xapp-state"]?.[0],
|
|
49
|
+
"sap-intent-param": oParsedHash.params?.["sap-intent-param"]?.[0],
|
|
50
|
+
"sap-system": oParsedHash.params?.["sap-system"]?.[0],
|
|
51
|
+
"sap-iapp-state": oParsedHash.params?.["sap-iapp-state"]?.[0]
|
|
52
|
+
};
|
|
53
|
+
|
|
54
|
+
// consider iapp-state also from appSpecificRoute
|
|
55
|
+
if (!oInitialKeys["sap-iapp-state"] && oParsedHash.appSpecificRoute?.includes("sap-iapp-state")) {
|
|
56
|
+
const rRegex = /(\?|&|[/])(sap-iapp-state=[A-Z0-9]+)/;
|
|
57
|
+
const aMatch = oParsedHash.appSpecificRoute.match(rRegex);
|
|
58
|
+
if (aMatch?.[2]) {
|
|
59
|
+
oInitialKeys["sap-iapp-state"] = aMatch[2].split("=")[1];
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
// remove all undefined values, as they would cause issues in the query
|
|
64
|
+
Object.keys(oInitialKeys).forEach((sKey) => {
|
|
65
|
+
if (oInitialKeys[sKey] === undefined) {
|
|
66
|
+
delete oInitialKeys[sKey];
|
|
67
|
+
}
|
|
68
|
+
});
|
|
69
|
+
|
|
70
|
+
const oSegment = {
|
|
71
|
+
semanticObject: oParsedHash.semanticObject,
|
|
72
|
+
action: oParsedHash.action
|
|
73
|
+
};
|
|
74
|
+
|
|
75
|
+
const pTargetMappings = StartupRequestHandler.requestDirectStart(oSegment, oInitialKeys);
|
|
76
|
+
|
|
77
|
+
const pInitialSegmentPromise = pTargetMappings.then((oResult) => {
|
|
78
|
+
if (!oResult.targetMappings) {
|
|
79
|
+
return null;
|
|
80
|
+
}
|
|
81
|
+
return [
|
|
82
|
+
[oSegment],
|
|
83
|
+
oResult.targetMappings,
|
|
84
|
+
oResult.systemAliases,
|
|
85
|
+
oResult.urlTemplates
|
|
86
|
+
];
|
|
87
|
+
});
|
|
88
|
+
ObjectPath.set("services.ClientSideTargetResolution.adapter.config.initialSegmentPromise", pInitialSegmentPromise, oUshellConfig);
|
|
89
|
+
|
|
90
|
+
const pInitialAppStatesPromise = pTargetMappings.then((oResult) => {
|
|
91
|
+
const oInitialAppStates = [
|
|
92
|
+
{ key: "sap-intent-param", startUpKey: "iparState" },
|
|
93
|
+
{ key: "sap-iapp-state", startUpKey: "iappState" },
|
|
94
|
+
{ key: "sap-xapp-state", startUpKey: "xappState" }
|
|
95
|
+
].reduce((oAppStates, { key, startUpKey }) => {
|
|
96
|
+
const sAppStateKey = oInitialKeys[key];
|
|
97
|
+
|
|
98
|
+
if (sAppStateKey && oResult[startUpKey]) {
|
|
99
|
+
oAppStates[sAppStateKey] = oResult[startUpKey];
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
return oAppStates;
|
|
103
|
+
}, {});
|
|
104
|
+
|
|
105
|
+
ObjectPath.set("services.AppState.config.initialAppStates", oInitialAppStates, oUshellConfig);
|
|
106
|
+
});
|
|
107
|
+
ObjectPath.set("services.AppState.config.initialAppStatesPromise", pInitialAppStatesPromise, oUshellConfig);
|
|
108
|
+
|
|
109
|
+
return Promise.all([
|
|
110
|
+
pTargetMappings,
|
|
111
|
+
pInitialSegmentPromise,
|
|
112
|
+
pInitialAppStatesPromise
|
|
113
|
+
]);
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
async startApp () {
|
|
117
|
+
if (!this.#isRelevant()) {
|
|
118
|
+
return;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
window["sap-ushell-async-libs-promise-directstart"] = this.#startApp();
|
|
122
|
+
|
|
123
|
+
await window["sap-ushell-async-libs-promise-directstart"];
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
async #startApp () {
|
|
127
|
+
let sHash = this.#getFullHash();
|
|
128
|
+
if (sHash.includes("sap-ssb-eval-id")) {
|
|
129
|
+
sHash = await this.#resolveEvalId(sHash);
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
const [Container] = await requireAsync(["sap/ushell/Container"]);
|
|
133
|
+
const NavTargetResolutionInternal = await Container.getServiceAsync("NavTargetResolutionInternal");
|
|
134
|
+
const oDeferred = NavTargetResolutionInternal.resolveHashFragment(UrlParsing.ensureLeadingHash(sHash));
|
|
135
|
+
|
|
136
|
+
const oResolvedHashFragment = await promisify(oDeferred);
|
|
137
|
+
|
|
138
|
+
const [AppConfiguration] = await requireAsync(["sap/ushell/services/AppConfiguration"]);
|
|
139
|
+
|
|
140
|
+
AppConfiguration.setCurrentApplication(oResolvedHashFragment);
|
|
141
|
+
|
|
142
|
+
if (oResolvedHashFragment?.ui5ComponentName) {
|
|
143
|
+
// create UI5 component early
|
|
144
|
+
const Ui5ComponentLoader = await Container.getServiceAsync("Ui5ComponentLoader");
|
|
145
|
+
|
|
146
|
+
const oResolvedHashFragmentWithComponentHandle = await Ui5ComponentLoader.createComponent(
|
|
147
|
+
oResolvedHashFragment,
|
|
148
|
+
[this.#createWaitForRendererCreatedPromise(Container)],
|
|
149
|
+
"Application"
|
|
150
|
+
);
|
|
151
|
+
|
|
152
|
+
return {
|
|
153
|
+
resolvedHashFragment: oResolvedHashFragmentWithComponentHandle,
|
|
154
|
+
dependenciesLoaded: true
|
|
155
|
+
};
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
// non-ui5 app
|
|
159
|
+
return {
|
|
160
|
+
resolvedHashFragment: oResolvedHashFragment,
|
|
161
|
+
dependenciesLoaded: false
|
|
162
|
+
};
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
/**
|
|
166
|
+
* For a Smart Business direct start the parameter sap-ssb-eval-id has to be
|
|
167
|
+
* resolved by Smart Business early so that the resolved parameters are already
|
|
168
|
+
* passed to the app component during the early component creation.
|
|
169
|
+
* @param {string} sHash the current hash
|
|
170
|
+
*/
|
|
171
|
+
async #resolveEvalId (sHash) {
|
|
172
|
+
const [SmartBusiness] = await requireAsync(["sap/ushell/utils/SmartBusiness"]);
|
|
173
|
+
|
|
174
|
+
// At this early point in time the Smart Business library has not been loaded yet.
|
|
175
|
+
// Load it to avoid single file requests.
|
|
176
|
+
// On ABAP, the path where the library is loaded from differs from the
|
|
177
|
+
// common namespace so it has to be mapped.
|
|
178
|
+
await SmartBusiness.loadSmartBusinessLibrary("/sap/bc/ui5_ui5/sap/ssbtileslibs1");
|
|
179
|
+
|
|
180
|
+
let oParsedShellHash = UrlParsing.parseShellHash(sHash);
|
|
181
|
+
oParsedShellHash = await SmartBusiness.resolveEvaluationId(oParsedShellHash, true);
|
|
182
|
+
return UrlParsing.constructShellHash(oParsedShellHash);
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
/**
|
|
186
|
+
* Creates an ECMA6 Promise which resolves after the shell renderer has been created. This
|
|
187
|
+
* is necessary to delay the component creation in direct start case, so that the shell renderer
|
|
188
|
+
* had time to initialize (e.g. init shell navigation service).
|
|
189
|
+
*
|
|
190
|
+
* This method must only be called after the shell bootstrap!
|
|
191
|
+
* @param {sap.ushell.Container} Container The shell container instance
|
|
192
|
+
* @returns {Promise} A promise to chain following steps.
|
|
193
|
+
* @private
|
|
194
|
+
*/
|
|
195
|
+
async #createWaitForRendererCreatedPromise (Container) {
|
|
196
|
+
const [EventHub] = await requireAsync(["sap/ushell/EventHub"]);
|
|
197
|
+
const oDeferred = Promise.withResolvers();
|
|
198
|
+
|
|
199
|
+
function fnOnRendererCreated () {
|
|
200
|
+
Log.info("Direct application start: resolving component waitFor promise after shell renderer created event fired.");
|
|
201
|
+
Container.detachRendererCreatedInternal(fnOnRendererCreated);
|
|
202
|
+
oDeferred.resolve();
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
EventHub.once("ShellNavigationInitialized").do(() => {
|
|
206
|
+
if (Container.getRendererInternal()) {
|
|
207
|
+
Log.info("Direct application start: resolving component waitFor promise immediately (shell renderer already created).");
|
|
208
|
+
oDeferred.resolve();
|
|
209
|
+
} else {
|
|
210
|
+
// the renderer should be created when the shell navigation is initialized, just to but be robust
|
|
211
|
+
Container.attachRendererCreatedInternal(fnOnRendererCreated);
|
|
212
|
+
}
|
|
213
|
+
});
|
|
214
|
+
|
|
215
|
+
return oDeferred.promise;
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
#getFullHash () {
|
|
219
|
+
const sHash = this.getLocationHash();
|
|
220
|
+
const sSanitizedHash = sHash.startsWith("#") ? sHash : `#${sHash}`;
|
|
221
|
+
// decode hash: identical behavior to ShellNavigationInternal.hrefForExternal
|
|
222
|
+
return decodeURI(sSanitizedHash);
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
getLocationHash () {
|
|
226
|
+
return window.location.hash;
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
return new DirectAppStart();
|
|
231
|
+
});
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
// Copyright (c) 2009-2026 SAP SE, All Rights Reserved
|
|
2
|
+
sap.ui.define([
|
|
3
|
+
"sap/ushell/Container",
|
|
4
|
+
"sap/ushell/state/StateManager",
|
|
5
|
+
"sap/ushell/renderer/ShellLayout",
|
|
6
|
+
"sap/ushell/ui/shell/SysInfoBar"
|
|
7
|
+
], (
|
|
8
|
+
Container,
|
|
9
|
+
StateManager,
|
|
10
|
+
ShellLayout,
|
|
11
|
+
SysInfoBar
|
|
12
|
+
) => {
|
|
13
|
+
"use strict";
|
|
14
|
+
|
|
15
|
+
// shortcut for sap.ushell.state.StateManager.ShellMode
|
|
16
|
+
const ShellMode = StateManager.ShellMode;
|
|
17
|
+
|
|
18
|
+
class CreateRenderer {
|
|
19
|
+
async run () {
|
|
20
|
+
const oRenderer = await Container.createRendererInternal("fiori2");
|
|
21
|
+
oRenderer.placeAt("canvas", "only");
|
|
22
|
+
const oSystem = Container.getLogonSystem();
|
|
23
|
+
const sCurrentShellMode = StateManager.getShellMode();
|
|
24
|
+
|
|
25
|
+
if (!oSystem.getSysInfoBar() || sCurrentShellMode === ShellMode.Headerless) {
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
const sSystemInfoHtml = "<div id='systemInfo-shellArea'></div>";
|
|
30
|
+
const oShellHeaderShellArea = document.getElementById(ShellLayout.ShellArea.ShellHeader);
|
|
31
|
+
oShellHeaderShellArea.insertAdjacentHTML("beforebegin", sSystemInfoHtml);
|
|
32
|
+
|
|
33
|
+
new SysInfoBar({
|
|
34
|
+
icon: oSystem.getSysInfoBarIcon(),
|
|
35
|
+
text: oSystem.getSysInfoBarMainText(),
|
|
36
|
+
subText: oSystem.getSysInfoBarSecondaryText(),
|
|
37
|
+
color: oSystem.getSysInfoBarColor()
|
|
38
|
+
}).placeAt("systemInfo-shellArea");
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
return new CreateRenderer();
|
|
43
|
+
});
|