app.views.ListSelect = class ListSelect extends app.View { static activeClass = "active"; static events = { click: "onClick" }; deactivate() { if (super.deactivate(...arguments)) { this.deselect(); } } select(el) { this.deselect(); if (el) { el.classList.add(this.constructor.activeClass); $.trigger(el, "select"); } } deselect() { let selection; if ((selection = this.getSelection())) { selection.classList.remove(this.constructor.activeClass); $.trigger(selection, "deselect"); } } selectByHref(href) { if (this.getSelection()?.getAttribute("href") !== href) { this.select(this.find(`a[href='${href}']`)); } } selectCurrent() { this.selectByHref(location.pathname + location.hash); } getSelection() { return this.findByClass(this.constructor.activeClass); } onClick(event) { if (event.which !== 1 || event.metaKey || event.ctrlKey) { return; } const target = $.eventTarget(event); if (target.tagName === "A") { this.select(target); } } };