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();