diff --git a/packages/fiori/cypress/specs/SideNavigation.cy.tsx b/packages/fiori/cypress/specs/SideNavigation.cy.tsx
index 71dcc70e4891..bb177d285c1b 100644
--- a/packages/fiori/cypress/specs/SideNavigation.cy.tsx
+++ b/packages/fiori/cypress/specs/SideNavigation.cy.tsx
@@ -308,6 +308,94 @@ describe("Side Navigation interaction", () => {
});
});
+ it("Tests link opening with mouse click", () => {
+ cy.mount(
+
+
+
+
+ );
+
+ cy.url().should("not.include", "#test");
+
+ cy.get("#unselectableItemWithLink").realClick();
+
+ cy.url().should("include", "#test");
+
+ // Remove #test from the URL
+ cy.window().then(win => {
+ win.history.back();
+ });
+
+ cy.url().should("not.include", "#test");
+ });
+
+ it("Tests link opening with Enter", () => {
+ cy.mount(
+
+
+
+
+ );
+
+ cy.url().should("not.include", "#test");
+
+ cy.get("#focusStart").realClick();
+ cy.realPress("ArrowDown");
+ cy.realPress("Enter");
+
+ cy.url().should("include", "#test");
+
+ // Remove #test from the URL
+ cy.window().then(win => {
+ win.history.back();
+ });
+
+ cy.url().should("not.include", "#test");
+ });
+
+ it("Tests link opening with Space", () => {
+ cy.mount(
+
+
+
+
+ );
+
+ cy.url().should("not.include", "#test");
+
+ cy.get("#focusStart").realClick();
+ cy.realPress("ArrowDown");
+ cy.realPress("Space");
+
+ cy.url().should("include", "#test");
+
+ // Remove #test from the URL
+ cy.window().then(win => {
+ win.history.back();
+ });
+
+ cy.url().should("not.include", "#test");
+
+ cy.get("#focusStart").realClick();
+ cy.realPress("ArrowDown");
+ cy.get("#linkItem").should("be.focused");
+
+ // act
+ cy.focused().trigger("keyup", {
+ key: " ",
+ });
+
+ cy.url().should("include", "#test");
+
+ // Remove #test from the URL
+ cy.window().then(win => {
+ win.history.back();
+ });
+
+ cy.url().should("not.include", "#test");
+ });
+
it("Tests 'selection-change' event", () => {
cy.mount(
diff --git a/packages/fiori/src/SideNavigationSelectableItemBase.ts b/packages/fiori/src/SideNavigationSelectableItemBase.ts
index 2cae53b00af0..9ab84f33bd34 100644
--- a/packages/fiori/src/SideNavigationSelectableItemBase.ts
+++ b/packages/fiori/src/SideNavigationSelectableItemBase.ts
@@ -206,6 +206,18 @@ class SideNavigationSelectableItemBase extends SideNavigationItemBase {
_onkeyup(e: KeyboardEvent) {
if (isSpace(e)) {
this._activate(e);
+
+ if (this.href && !e.defaultPrevented) {
+ const customEvent = new MouseEvent("click");
+
+ customEvent.stopImmediatePropagation();
+ if (this.getDomRef()!.querySelector("a")) {
+ this.getDomRef()!.querySelector("a")!.dispatchEvent(customEvent);
+ } else {
+ // when Side Navigation is collapsed and it is first level item we have directly element
+ this.getDomRef()!.dispatchEvent(customEvent);
+ }
+ }
}
}
diff --git a/packages/fiori/test/pages/SideNavigation.html b/packages/fiori/test/pages/SideNavigation.html
index e75ab5dfefa1..670287db1238 100644
--- a/packages/fiori/test/pages/SideNavigation.html
+++ b/packages/fiori/test/pages/SideNavigation.html
@@ -47,6 +47,7 @@
+
diff --git a/packages/fiori/test/specs/SideNavigation.spec.js b/packages/fiori/test/specs/SideNavigation.spec.js
index fa047e61df08..95e0bc32988f 100644
--- a/packages/fiori/test/specs/SideNavigation.spec.js
+++ b/packages/fiori/test/specs/SideNavigation.spec.js
@@ -225,9 +225,9 @@ describe("Component Behavior", () => {
// fixed items
assert.strictEqual(await sideNavigationFixedTree.getAttribute("aria-roledescription"), roleDescription, "Role description of the SideNavigation fixed tree element is correctly set");
- assert.notExists(await items[10].getAttribute("aria-roledescription"), "Role description of the SideNavigation fixed tree item is not set");
- assert.strictEqual(await items[10].getAttribute("aria-haspopup"), "tree", "There is 'aria-haspopup' with correct value");
- assert.notExists(await items[11].getAttribute("aria-haspopup"), "There is no 'aria-haspopup'");
+ assert.notExists(await items[11].getAttribute("aria-roledescription"), "Role description of the SideNavigation fixed tree item is not set");
+ assert.strictEqual(await items[11].getAttribute("aria-haspopup"), "tree", "There is 'aria-haspopup' with correct value");
+ assert.notExists(await items[12].getAttribute("aria-haspopup"), "There is no 'aria-haspopup'");
// popup
await browser.$("#item2").click();