mirror of
https://github.com/sissbruecker/linkding.git
synced 2025-08-08 03:08:29 +02:00
74 lines
2.0 KiB
JavaScript
74 lines
2.0 KiB
JavaScript
import { Behavior, registerBehavior } from "./index";
|
|
|
|
class DropdownBehavior extends Behavior {
|
|
constructor(element) {
|
|
super(element);
|
|
this.opened = false;
|
|
this.onClick = this.onClick.bind(this);
|
|
this.onOutsideClick = this.onOutsideClick.bind(this);
|
|
this.onEscape = this.onEscape.bind(this);
|
|
this.onFocusOut = this.onFocusOut.bind(this);
|
|
|
|
// Prevent opening the dropdown automatically on focus, so that it only
|
|
// opens on click then JS is enabled
|
|
this.element.style.setProperty("--dropdown-focus-display", "none");
|
|
this.element.addEventListener("keydown", this.onEscape);
|
|
this.element.addEventListener("focusout", this.onFocusOut);
|
|
|
|
this.toggle = element.querySelector(".dropdown-toggle");
|
|
this.toggle.setAttribute("aria-expanded", "false");
|
|
this.toggle.addEventListener("click", this.onClick);
|
|
}
|
|
|
|
destroy() {
|
|
this.close();
|
|
this.toggle.removeEventListener("click", this.onClick);
|
|
this.element.removeEventListener("keydown", this.onEscape);
|
|
this.element.removeEventListener("focusout", this.onFocusOut);
|
|
}
|
|
|
|
open() {
|
|
this.opened = true;
|
|
this.element.classList.add("active");
|
|
this.toggle.setAttribute("aria-expanded", "true");
|
|
document.addEventListener("click", this.onOutsideClick);
|
|
}
|
|
|
|
close() {
|
|
this.opened = false;
|
|
this.element.classList.remove("active");
|
|
this.toggle.setAttribute("aria-expanded", "false");
|
|
document.removeEventListener("click", this.onOutsideClick);
|
|
}
|
|
|
|
onClick() {
|
|
if (this.opened) {
|
|
this.close();
|
|
} else {
|
|
this.open();
|
|
}
|
|
}
|
|
|
|
onOutsideClick(event) {
|
|
if (!this.element.contains(event.target)) {
|
|
this.close();
|
|
}
|
|
}
|
|
|
|
onEscape(event) {
|
|
if (event.key === "Escape" && this.opened) {
|
|
event.preventDefault();
|
|
this.close();
|
|
this.toggle.focus();
|
|
}
|
|
}
|
|
|
|
onFocusOut(event) {
|
|
if (!this.element.contains(event.relatedTarget)) {
|
|
this.close();
|
|
}
|
|
}
|
|
}
|
|
|
|
registerBehavior("ld-dropdown", DropdownBehavior);
|