Skip to content

Commit 34d2faf

Browse files
vaadin-botcaaladorArtur-
authored
fix: detect router-link attribute in ancestor elements during click navigation (#23786) (#23800) (#23804)
When a nested element (e.g., Button) inside a RouterLink is clicked, the navigation trigger was incorrectly reported as CLIENT_SIDE because only the direct click target was checked for the router-link attribute. Traverse the composed path instead so any ancestor with router-link is correctly identified as a ROUTER_LINK trigger. Co-authored-by: caalador <mikael.grankvist@vaadin.com> Co-authored-by: Artur Signell <artur@vaadin.com>
1 parent fc0ac42 commit 34d2faf

File tree

3 files changed

+24
-15
lines changed

3 files changed

+24
-15
lines changed

flow-client/src/main/frontend/Flow.ts

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -175,13 +175,9 @@ export class Flow {
175175
'click',
176176
(_e) => {
177177
if (_e.target) {
178-
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
179-
// @ts-ignore
180-
if (_e.target.hasAttribute('router-link')) {
178+
if (_e.composedPath().some((node) => node instanceof HTMLElement && node.hasAttribute('router-link'))) {
181179
this.navigation = 'link';
182-
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
183-
// @ts-ignore
184-
} else if (_e.composedPath().some((node) => node.nodeName === 'A')) {
180+
} else if (_e.composedPath().some((node) => (node as Element).nodeName === 'A')) {
185181
this.navigation = 'client';
186182
}
187183
}

flow-tests/test-root-context/src/main/java/com/vaadin/flow/uitest/ui/NavigationTriggerView.java

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,14 @@ public NavigationTriggerView() {
3939
.createRouterLink(CLASS_NAME + "/routerlink/", "Router link");
4040
routerLink.setAttribute("id", "routerlink");
4141

42+
Element routerLinkWithButton = ElementFactory
43+
.createRouterLink(CLASS_NAME + "/routerlink-button/", null);
44+
routerLinkWithButton.setAttribute("id", "routerlink-with-button");
45+
Element nestedButton = ElementFactory
46+
.createButton("Router link button");
47+
nestedButton.setAttribute("id", "routerlink-button");
48+
routerLinkWithButton.appendChild(nestedButton);
49+
4250
Element navigateButton = ElementFactory.createButton("UI.navigate");
4351
navigateButton.addEventListener("click",
4452
e -> getUI().get().navigate(CLASS_NAME + "/navigate"));
@@ -54,8 +62,8 @@ public NavigationTriggerView() {
5462
.navigate(NavigationTriggerView.class, "reroute"));
5563
rerouteButton.setAttribute("id", "rerouteButton");
5664

57-
getElement().appendChild(routerLink, navigateButton, forwardButton,
58-
rerouteButton);
65+
getElement().appendChild(routerLink, routerLinkWithButton,
66+
navigateButton, forwardButton, rerouteButton);
5967
}
6068

6169
public static String buildMessage(String path, NavigationTrigger trigger,

flow-tests/test-root-context/src/test/java/com/vaadin/flow/uitest/ui/NavigationTriggerIT.java

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -45,27 +45,32 @@ public void testNavigationTriggers() {
4545
assertLastMessage("/routerlink", NavigationTrigger.ROUTER_LINK,
4646
"routerlink");
4747

48-
findElement(By.id("navigate")).click();
48+
findElement(By.id("routerlink-button")).click();
4949
assertMessageCount(3);
50+
assertLastMessage("/routerlink-button", NavigationTrigger.ROUTER_LINK,
51+
"routerlink-button");
52+
53+
findElement(By.id("navigate")).click();
54+
assertMessageCount(4);
5055
assertLastMessage("/navigate", NavigationTrigger.UI_NAVIGATE,
5156
"navigate");
5257

5358
getDriver().navigate().back();
54-
assertMessageCount(4);
55-
assertLastMessage("/routerlink", NavigationTrigger.HISTORY,
56-
"routerlink");
59+
assertMessageCount(5);
60+
assertLastMessage("/routerlink-button", NavigationTrigger.HISTORY,
61+
"routerlink-button");
5762

5863
getDriver().navigate().forward();
59-
assertMessageCount(5);
64+
assertMessageCount(6);
6065
assertLastMessage("/navigate", NavigationTrigger.HISTORY, "navigate");
6166

6267
findElement(By.id("forwardButton")).click();
63-
assertMessageCount(6);
68+
assertMessageCount(7);
6469
assertLastMessage("/forwarded", NavigationTrigger.PROGRAMMATIC,
6570
"forwarded");
6671

6772
findElement(By.id("rerouteButton")).click();
68-
assertMessageCount(7);
73+
assertMessageCount(8);
6974
assertLastMessage("/rerouted", NavigationTrigger.PROGRAMMATIC,
7075
"rerouted");
7176
}

0 commit comments

Comments
 (0)