@sapui5/sap.fe.navigation 1.124.2 → 1.126.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.
@@ -12,6 +12,8 @@ import V4ODataModel from "sap/ui/model/odata/v4/ODataModel";
12
12
  import URI from "sap/ui/thirdparty/URI";
13
13
  import jQuery from "sap/ui/thirdparty/jquery";
14
14
  import openWindow from "sap/ui/util/openWindow";
15
+ import type Container from "sap/ushell/Container";
16
+ import type Navigation from "sap/ushell/services/Navigation";
15
17
  import NavError from "./NavError";
16
18
  import type { SerializedSelectionVariant } from "./SelectionVariant";
17
19
  import SelectionVariant from "./SelectionVariant";
@@ -217,13 +219,15 @@ export class NavigationHandler extends BaseObject {
217
219
  * @returns The Navigation service
218
220
  * @private
219
221
  */
220
- _getAppNavigationServiceAsync(): any {
221
- return sap.ushell.Container.getServiceAsync("CrossApplicationNavigation")
222
- .then(function (oCrossAppNavService: any) {
223
- return oCrossAppNavService;
222
+ async _getAppNavigationServiceAsync(): Promise<Navigation> {
223
+ const ushellContainer: Container = sap.ui.require("sap/ushell/Container");
224
+ return ushellContainer
225
+ ?.getServiceAsync("Navigation")
226
+ .then(function (oCrossAppNavService: object) {
227
+ return oCrossAppNavService as Navigation;
224
228
  })
225
229
  .catch(function () {
226
- Log.error("NavigationHandler: CrossApplicationNavigation is not available.");
230
+ Log.error("NavigationHandler: Navigation is not available.");
227
231
  throw new NavError("NavigationHandler.NO.XAPPSERVICE");
228
232
  });
229
233
  }
@@ -429,7 +433,7 @@ export class NavigationHandler extends BaseObject {
429
433
  }
430
434
 
431
435
  const fnNavExplace = function () {
432
- const sNewHrefPromise = oCrossAppNavService.hrefForExternalAsync(oNavArguments, oNavHandler.oComponent);
436
+ const sNewHrefPromise = oCrossAppNavService.getHref(oNavArguments, oNavHandler.oComponent);
433
437
  sNewHrefPromise
434
438
  .then(function (sNewHref: any) {
435
439
  openWindow(sNewHref);
@@ -454,7 +458,7 @@ export class NavigationHandler extends BaseObject {
454
458
  if (sNavMode == "explace") {
455
459
  fnNavExplace();
456
460
  } else {
457
- const ptoExt = oCrossAppNavService.toExternal(oNavArguments, oNavHandler.oComponent);
461
+ const ptoExt = oCrossAppNavService.navigate(oNavArguments, oNavHandler.oComponent);
458
462
  // TODO: This is just a temporary solution to allow FE V2 to use toExternal promise.
459
463
  if (oNavHandler._navigateCallback) {
460
464
  oNavHandler._navigateCallback(ptoExt);
@@ -483,9 +487,12 @@ export class NavigationHandler extends BaseObject {
483
487
  }
484
488
  oNavHandler
485
489
  ._getAppNavigationServiceAsync()
486
- .then(function (oCrossAppNavService: any) {
487
- const oSupportedPromise = oCrossAppNavService.isNavigationSupported([oNavArguments], oNavHandler.oComponent);
488
- oSupportedPromise.done(function (oTargets: any) {
490
+ .then(async function (oCrossAppNavService: Navigation) {
491
+ try {
492
+ const oTargets = await (oCrossAppNavService.isNavigationSupported(
493
+ [oNavArguments],
494
+ oNavHandler.oComponent
495
+ ) as unknown as Promise<{ supported: boolean }[]>);
489
496
  if (oTargets[0].supported) {
490
497
  if (!bExPlace) {
491
498
  fnStoreAndNavigate(oCrossAppNavService);
@@ -497,15 +504,14 @@ export class NavigationHandler extends BaseObject {
497
504
  const oError = new NavError("NavigationHandler.isIntentSupported.notSupported");
498
505
  fnOnError(oError);
499
506
  }
500
- });
501
-
502
- if (fnOnError) {
503
- oSupportedPromise.fail(function () {
507
+ } catch (oError) {
508
+ if (fnOnError) {
504
509
  // technical error: could not determine if intent is supported
505
510
  const oError = oNavHandler._createTechnicalError("NavigationHandler.isIntentSupported.failed");
506
511
  fnOnError(oError);
507
- });
512
+ }
508
513
  }
514
+ return;
509
515
  })
510
516
  .catch(function (oError: any) {
511
517
  if (fnOnError) {
@@ -666,60 +672,60 @@ export class NavigationHandler extends BaseObject {
666
672
  // inner app state was not found in the AppHash, but xapp state => try to read the xapp state
667
673
  this._getAppNavigationServiceAsync()
668
674
  .then(function (oCrossAppNavService: any) {
669
- const oStartupPromise = oCrossAppNavService.getStartupAppState(that.oComponent);
670
- oStartupPromise.done(function (oAppState: any) {
671
- // get app state from sap-xapp-state,
672
- // create a copy, not only a reference, because we want to modify the object
673
- let oAppStateData = oAppState.getData();
674
- let oError;
675
- if (oAppStateData) {
676
- try {
677
- oAppStateData = JSON.parse(JSON.stringify(oAppStateData));
678
- } catch (x) {
679
- oError = oNavHandler._createTechnicalError("NavigationHandler.AppStateData.parseError");
680
- oMyDeferred.reject(oError, oStartupParameters, NavType.xAppState);
681
- return oMyDeferred.promise();
682
- }
675
+ return oCrossAppNavService.getStartupAppState(that.oComponent);
676
+ })
677
+ .catch(function () {
678
+ const oError = oNavHandler._createTechnicalError("NavigationHandler.getStartupState.failed");
679
+ oMyDeferred.reject(oError, {}, NavType.xAppState);
680
+ })
681
+ .then(function (oAppState: any) {
682
+ // get app state from sap-xapp-state,
683
+ // create a copy, not only a reference, because we want to modify the object
684
+ let oAppStateData = oAppState.getData();
685
+ let oError;
686
+ if (oAppStateData) {
687
+ try {
688
+ oAppStateData = JSON.parse(JSON.stringify(oAppStateData));
689
+ } catch (x) {
690
+ oError = oNavHandler._createTechnicalError("NavigationHandler.AppStateData.parseError");
691
+ oMyDeferred.reject(oError, oStartupParameters, NavType.xAppState);
692
+ return oMyDeferred.promise();
683
693
  }
694
+ }
684
695
 
685
- if (oAppStateData) {
686
- const oSelVar = new SelectionVariant(oAppStateData.selectionVariant);
687
-
688
- const oSelVars = oNavHandler._splitInboundNavigationParameters(
689
- oSelVar,
690
- oStartupParameters,
691
- aDefaultedParameters
696
+ if (oAppStateData) {
697
+ const oSelVar = new SelectionVariant(oAppStateData.selectionVariant);
698
+
699
+ const oSelVars = oNavHandler._splitInboundNavigationParameters(
700
+ oSelVar,
701
+ oStartupParameters,
702
+ aDefaultedParameters
703
+ );
704
+ oAppStateData.selectionVariant = oSelVars.oNavigationSelVar.toJSONString();
705
+ oAppStateData.oSelectionVariant = oSelVars.oNavigationSelVar;
706
+ oAppStateData.oDefaultedSelectionVariant = oSelVars.oDefaultedSelVar;
707
+ oAppStateData.bNavSelVarHasDefaultsOnly = oSelVars.bNavSelVarHasDefaultsOnly;
708
+ const successHandlerHybridState = function (iAppStateData: object, _ref: object, navType: string): void {
709
+ oAppStateData.iAppState = iAppStateData;
710
+ oMyDeferred.resolve(oAppStateData, oStartupParameters, navType);
711
+ };
712
+ if (hybridIAppStateKeyParams !== undefined && iAppStateHybridDeferred !== undefined) {
713
+ iAppStateHybridDeferred.done(successHandlerHybridState);
714
+ } else if (oAppStateData[HYBRID_IAPP_STATE_KEY]) {
715
+ that._loadAppState(oAppStateData[HYBRID_IAPP_STATE_KEY], hybridDeferred, NavType.hybrid).done(
716
+ successHandlerHybridState
692
717
  );
693
- oAppStateData.selectionVariant = oSelVars.oNavigationSelVar.toJSONString();
694
- oAppStateData.oSelectionVariant = oSelVars.oNavigationSelVar;
695
- oAppStateData.oDefaultedSelectionVariant = oSelVars.oDefaultedSelVar;
696
- oAppStateData.bNavSelVarHasDefaultsOnly = oSelVars.bNavSelVarHasDefaultsOnly;
697
- const successHandlerHybridState = function (iAppStateData: object, _ref: object, navType: string) {
698
- oAppStateData.iAppState = iAppStateData;
699
- oMyDeferred.resolve(oAppStateData, oStartupParameters, navType);
700
- };
701
- if (hybridIAppStateKeyParams !== undefined && iAppStateHybridDeferred !== undefined) {
702
- iAppStateHybridDeferred.done(successHandlerHybridState);
703
- } else if (oAppStateData[HYBRID_IAPP_STATE_KEY]) {
704
- that._loadAppState(oAppStateData[HYBRID_IAPP_STATE_KEY], hybridDeferred, NavType.hybrid).done(
705
- successHandlerHybridState
706
- );
707
- } else {
708
- oMyDeferred.resolve(oAppStateData, oStartupParameters, NavType.xAppState);
709
- }
710
- } else if (oStartupParameters) {
711
- parseUrlParams(oStartupParameters, aDefaultedParameters, oMyDeferred, NavType.xAppState);
712
718
  } else {
713
- // sap-xapp-state navigation, but ID has already expired, but URL parameters available
714
- oError = oNavHandler._createTechnicalError("NavigationHandler.getDataFromAppState.failed");
715
- oMyDeferred.reject(oError, oStartupParameters || {}, NavType.xAppState);
719
+ oMyDeferred.resolve(oAppStateData, oStartupParameters, NavType.xAppState);
716
720
  }
717
- });
718
- oStartupPromise.fail(function () {
719
- const oError = oNavHandler._createTechnicalError("NavigationHandler.getStartupState.failed");
720
- oMyDeferred.reject(oError, {}, NavType.xAppState);
721
- });
722
- return oStartupPromise;
721
+ } else if (oStartupParameters) {
722
+ parseUrlParams(oStartupParameters, aDefaultedParameters, oMyDeferred, NavType.xAppState);
723
+ } else {
724
+ // sap-xapp-state navigation, but ID has already expired, but URL parameters available
725
+ oError = oNavHandler._createTechnicalError("NavigationHandler.getDataFromAppState.failed");
726
+ oMyDeferred.reject(oError, oStartupParameters || {}, NavType.xAppState);
727
+ }
728
+ return;
723
729
  })
724
730
  .catch(function () {
725
731
  const oError = oNavHandler._createTechnicalError("NavigationHandler._getAppNavigationServiceAsync.failed");
@@ -1415,8 +1421,8 @@ export class NavigationHandler extends BaseObject {
1415
1421
  presentationVariant?: object;
1416
1422
  valueTexts?: object;
1417
1423
  }
1418
- ): JQuery.Promise<any, any, any> {
1419
- const oMyDeferred = jQuery.Deferred();
1424
+ ): JQuery.Promise<unknown, unknown, unknown> {
1425
+ const oMyDeferred = jQuery.Deferred() as JQuery.Deferred<unknown, unknown, unknown>;
1420
1426
  let mSemanticAttributes: any;
1421
1427
  if (oTableEventParameters != undefined) {
1422
1428
  mSemanticAttributes = oTableEventParameters.semanticAttributes;
@@ -1536,7 +1542,8 @@ export class NavigationHandler extends BaseObject {
1536
1542
  * @private
1537
1543
  * @ui5-restricted
1538
1544
  */
1539
- _getAppStateKeyAndUrlParameters(sSelectionVariant: string) {
1545
+ // eslint-disable-next-line @typescript-eslint/promise-function-async
1546
+ _getAppStateKeyAndUrlParameters(sSelectionVariant: string): JQuery.Promise<unknown, unknown, unknown> {
1540
1547
  return this.processBeforeSmartLinkPopoverOpens(undefined, sSelectionVariant, undefined, undefined);
1541
1548
  }
1542
1549
 
@@ -1550,7 +1557,7 @@ export class NavigationHandler extends BaseObject {
1550
1557
  async _getAppSpecificHash(appHash: string): Promise<string | undefined> {
1551
1558
  try {
1552
1559
  const crossAppService = await this._getAppNavigationServiceAsync();
1553
- return crossAppService.hrefForAppSpecificHashAsync(appHash);
1560
+ return await crossAppService.getHref({ appSpecificRoute: appHash });
1554
1561
  } catch (error: unknown) {
1555
1562
  const message = error instanceof Error ? error.message : String(error);
1556
1563
  Log.error(`FE : Can not fetch App sepcific URL : ${message}`);
@@ -1840,7 +1847,7 @@ export class NavigationHandler extends BaseObject {
1840
1847
  const oNavHandler = this;
1841
1848
  return this._getAppNavigationServiceAsync()
1842
1849
  .then(function (oCrossAppNavService: any) {
1843
- return oCrossAppNavService.createEmptyAppStateAsync(oNavHandler.oComponent);
1850
+ return oCrossAppNavService.createEmptyAppState(oNavHandler.oComponent);
1844
1851
  })
1845
1852
  .then(function (oAppState: any) {
1846
1853
  return oNavHandler._fnSaveAppStateWithImmediateReturn(oAppData, oAppState, fnOnError);
@@ -1871,77 +1878,77 @@ export class NavigationHandler extends BaseObject {
1871
1878
  const oNavHandler = this;
1872
1879
  this._getAppNavigationServiceAsync()
1873
1880
  .then(function (oCrossAppNavService: any) {
1874
- const oAppStatePromise = oCrossAppNavService.getAppState(oNavHandler.oComponent, sAppStateKey);
1875
- oAppStatePromise.done(function (oAppState: any) {
1876
- let oAppData: any = {};
1877
- const oAppDataLoaded = oAppState.getData();
1878
-
1879
- if (typeof oAppDataLoaded === "undefined") {
1880
- const oError = oNavHandler._createTechnicalError("NavigationHandler.getDataFromAppState.failed");
1881
- oDeferred.reject(oError, {}, navType);
1882
- } else if (oNavHandler._sMode === Mode.ODataV2) {
1883
- oAppData = {
1884
- selectionVariant: "{}",
1885
- oSelectionVariant: new SelectionVariant(),
1886
- oDefaultedSelectionVariant: new SelectionVariant(),
1887
- bNavSelVarHasDefaultsOnly: false,
1888
- tableVariantId: "",
1889
- customData: {},
1890
- appStateKey: sAppStateKey,
1891
- presentationVariant: {},
1892
- valueTexts: {},
1893
- semanticDates: {},
1894
- data: {}
1895
- };
1896
- if (oAppDataLoaded.selectionVariant) {
1897
- /*
1898
- * In case that we get an object from the stored AppData (=persistency), we need to stringify the JSON object.
1899
- */
1900
- oAppData.selectionVariant = oNavHandler._ensureSelectionVariantFormatString(oAppDataLoaded.selectionVariant);
1901
- oAppData.oSelectionVariant = new SelectionVariant(oAppData.selectionVariant);
1902
- }
1903
- if (oAppDataLoaded.tableVariantId) {
1904
- oAppData.tableVariantId = oAppDataLoaded.tableVariantId;
1905
- }
1906
- if (oAppDataLoaded.customData) {
1907
- oAppData.customData = oAppDataLoaded.customData;
1908
- }
1909
- if (oAppDataLoaded.presentationVariant) {
1910
- oAppData.presentationVariant = oAppDataLoaded.presentationVariant;
1911
- }
1912
- if (oAppDataLoaded.valueTexts) {
1913
- oAppData.valueTexts = oAppDataLoaded.valueTexts;
1914
- }
1915
- if (oAppDataLoaded.semanticDates) {
1916
- oAppData.semanticDates = oAppDataLoaded.semanticDates;
1917
- }
1918
- /* In V2 case, we need the data in the below format for hybrid case */
1919
- if (navType === NavType.hybrid) {
1920
- oAppData.data = oAppDataLoaded;
1921
- }
1922
- } else {
1923
- oAppData = merge(oAppData, oAppDataLoaded);
1924
- if (oAppDataLoaded.selectionVariant) {
1925
- /*
1926
- * In case that we get an object from the stored AppData (=persistency), we need to stringify the JSON object.
1927
- */
1928
- oAppData.selectionVariant = oNavHandler._ensureSelectionVariantFormatString(oAppDataLoaded.selectionVariant);
1929
- oAppData.oSelectionVariant = new SelectionVariant(oAppData.selectionVariant);
1930
- }
1931
- }
1881
+ return oCrossAppNavService.getAppState(oNavHandler.oComponent, sAppStateKey);
1882
+ })
1883
+ .catch(function () {
1884
+ const oError = oNavHandler._createTechnicalError("NavigationHandler._getAppNavigationServiceAsync.failed");
1885
+ oDeferred.reject(oError, {}, navType);
1886
+ })
1887
+ .then(function (oAppState: any) {
1888
+ let oAppData: any = {};
1889
+ const oAppDataLoaded = oAppState.getData();
1932
1890
 
1933
- // resolve is called on passed Deferred object to trigger a call of the done method, if implemented
1934
- // the done method will receive the loaded appState and the navigation type as parameters
1935
- oDeferred.resolve(oAppData, {}, navType);
1936
- });
1937
- oAppStatePromise.fail(function () {
1938
- const oError = oNavHandler._createTechnicalError("NavigationHandler.getAppState.failed");
1891
+ if (typeof oAppDataLoaded === "undefined") {
1892
+ const oError = oNavHandler._createTechnicalError("NavigationHandler.getDataFromAppState.failed");
1939
1893
  oDeferred.reject(oError, {}, navType);
1940
- });
1941
- return oAppStatePromise;
1894
+ } else if (oNavHandler._sMode === Mode.ODataV2) {
1895
+ oAppData = {
1896
+ selectionVariant: "{}",
1897
+ oSelectionVariant: new SelectionVariant(),
1898
+ oDefaultedSelectionVariant: new SelectionVariant(),
1899
+ bNavSelVarHasDefaultsOnly: false,
1900
+ tableVariantId: "",
1901
+ customData: {},
1902
+ appStateKey: sAppStateKey,
1903
+ presentationVariant: {},
1904
+ valueTexts: {},
1905
+ semanticDates: {},
1906
+ data: {}
1907
+ };
1908
+ if (oAppDataLoaded.selectionVariant) {
1909
+ /*
1910
+ * In case that we get an object from the stored AppData (=persistency), we need to stringify the JSON object.
1911
+ */
1912
+ oAppData.selectionVariant = oNavHandler._ensureSelectionVariantFormatString(oAppDataLoaded.selectionVariant);
1913
+ oAppData.oSelectionVariant = new SelectionVariant(oAppData.selectionVariant);
1914
+ }
1915
+ if (oAppDataLoaded.tableVariantId) {
1916
+ oAppData.tableVariantId = oAppDataLoaded.tableVariantId;
1917
+ }
1918
+ if (oAppDataLoaded.customData) {
1919
+ oAppData.customData = oAppDataLoaded.customData;
1920
+ }
1921
+ if (oAppDataLoaded.presentationVariant) {
1922
+ oAppData.presentationVariant = oAppDataLoaded.presentationVariant;
1923
+ }
1924
+ if (oAppDataLoaded.valueTexts) {
1925
+ oAppData.valueTexts = oAppDataLoaded.valueTexts;
1926
+ }
1927
+ if (oAppDataLoaded.semanticDates) {
1928
+ oAppData.semanticDates = oAppDataLoaded.semanticDates;
1929
+ }
1930
+ /* In V2 case, we need the data in the below format for hybrid case */
1931
+ if (navType === NavType.hybrid) {
1932
+ oAppData.data = oAppDataLoaded;
1933
+ }
1934
+ } else {
1935
+ oAppData = merge(oAppData, oAppDataLoaded);
1936
+ if (oAppDataLoaded.selectionVariant) {
1937
+ /*
1938
+ * In case that we get an object from the stored AppData (=persistency), we need to stringify the JSON object.
1939
+ */
1940
+ oAppData.selectionVariant = oNavHandler._ensureSelectionVariantFormatString(oAppDataLoaded.selectionVariant);
1941
+ oAppData.oSelectionVariant = new SelectionVariant(oAppData.selectionVariant);
1942
+ }
1943
+ }
1944
+
1945
+ // resolve is called on passed Deferred object to trigger a call of the done method, if implemented
1946
+ // the done method will receive the loaded appState and the navigation type as parameters
1947
+ oDeferred.resolve(oAppData, {}, navType);
1948
+ return;
1942
1949
  })
1943
1950
  .catch(function () {
1944
- const oError = oNavHandler._createTechnicalError("NavigationHandler._getAppNavigationServiceAsync.failed");
1951
+ const oError = oNavHandler._createTechnicalError("NavigationHandler.getAppState.failed");
1945
1952
  oDeferred.reject(oError, {}, navType);
1946
1953
  });
1947
1954
 
@@ -93,7 +93,7 @@ sap.ui.define(["sap/ui/core/Lib", "sap/ui/core/library"], function (Library, _li
93
93
  const thisLib = Library.init({
94
94
  name: "sap.fe.navigation",
95
95
  // eslint-disable-next-line no-template-curly-in-string
96
- version: "1.124.2",
96
+ version: "1.126.0",
97
97
  dependencies: ["sap.ui.core"],
98
98
  types: ["sap.fe.navigation.NavType", "sap.fe.navigation.ParamHandlingMode", "sap.fe.navigation.SuppressionBehavior"],
99
99
  interfaces: [],