-
Notifications
You must be signed in to change notification settings - Fork 85
Closed
Labels
Description
Bug description
up-href not working on table tr element.
I have a table which I want to make rows clickable.
This is not supported by plain HTML and because of that I read about up-href
[up-href]
Makes any element behave like a hyperlink.
Unfortunately this does not work so I still have to use a custom stimulus controller instead.
Reproduction project
https://shelled-terrific-waitress.glitch.me/
Steps to reproduce the behavior:
- Go to reproduction project linked above
- Click next to the links within the table row
- See mouse is pointer but nothing happens on click
Expected behavior
The table row should expect like a link the following the URL on click.
Browser version
- OS: Linux
- Browser Firefox
- Version 113.0
Additional context
It works with my custom written stimulus controller:
<table>
<tr
data-controller="anchor"
data-anchor-href-value="./target"
>
<td>whatever</td>
</tr>
</table>import { Controller } from '@hotwired/stimulus';
/**
* Handles any element like an anchor element
* (follow link defined in href on click)
*
* This is useful for table rows (tr) to be clickable
* as the tr-element is not allowed to be surrounded by an anchor element.
*/
export default class extends Controller {
static values = {
href: String,
};
declare hrefValue: string;
onClick = (event: Event) => {
// Do not follow link on selecting text within this anchor
const selectedText = window.getSelection()?.toString();
if (selectedText) {
return;
}
// Do not follow link on clicking a sub anchor within this anchor
// e.g. <tr data-contoller="anchor" ...><td><a href="#">test</a></td></tr>
if (event.target instanceof HTMLElement) {
const targetAnchor = event.target instanceof HTMLAnchorElement ? event.target : event.target.closest('a');
if (targetAnchor && !targetAnchor.contains(this.element)) {
return;
}
}
window.location.href = this.hrefValue;
};
connect() {
this.element.addEventListener('click', this.onClick);
if (this.element instanceof HTMLElement) {
this.element.style.cursor = 'pointer';
}
super.connect();
}
disconnect() {
this.element.removeEventListener('click', this.onClick);
super.disconnect();
}
}