export class ActionLink extends HTMLAnchorElement {
private boundOnKeyDown_: ((e: KeyboardEvent) => void)|null = null;
private boundOnMouseDown_: (() => void)|null = null;
private boundOnBlur_: (() => void)|null = null;
connectedCallback() {
this.tabIndex = this.disabled ? -1 : 0;
if (!this.hasAttribute('role')) {
this.setAttribute('role', 'link');
}
this.boundOnKeyDown_ = (e: KeyboardEvent) => {
if (!this.disabled && e.key === 'Enter' && !this.href) {
window.setTimeout(() => this.click(), 0);
}
};
this.addEventListener('keydown', this.boundOnKeyDown_);
function preventDefault(e: Event) {
e.preventDefault();
}
function removePreventDefault() {
document.removeEventListener('selectstart', preventDefault);
document.removeEventListener('mouseup', removePreventDefault);
}
this.boundOnMouseDown_ = () => {
document.addEventListener('selectstart', preventDefault);
document.addEventListener('mouseup', removePreventDefault);
if (document.activeElement !== this) {
this.classList.add('no-outline');
}
};
this.addEventListener('mousedown', this.boundOnMouseDown_);
this.boundOnBlur_ = () => this.classList.remove('no-outline');
this.addEventListener('blur', this.boundOnBlur_);
}
disconnectedCallback() {
this.removeEventListener('keydown', this.boundOnKeyDown_!);
this.boundOnKeyDown_ = null;
this.removeEventListener('mousedown', this.boundOnMouseDown_!);
this.boundOnMouseDown_ = null;
this.removeEventListener('blur', this.boundOnBlur_!);
this.boundOnBlur_ = null;
}
set disabled(disabled: boolean) {
if (disabled) {
HTMLAnchorElement.prototype.setAttribute.call(this, 'disabled', '');
} else {
HTMLAnchorElement.prototype.removeAttribute.call(this, 'disabled');
}
this.tabIndex = disabled ? -1 : 0;
}
get disabled(): boolean {
return this.hasAttribute('disabled');
}
override setAttribute(attr: string, val: string) {
if (attr.toLowerCase() === 'disabled') {
this.disabled = true;
} else {
super.setAttribute(attr, val);
}
}
override removeAttribute(attr: string) {
if (attr.toLowerCase() === 'disabled') {
this.disabled = false;
} else {
super.removeAttribute(attr);
}
}
}
customElements.define('action-link', ActionLink, {extends: 'a'});