mirror of
https://github.com/sissbruecker/linkding.git
synced 2025-08-07 10:58:25 +02:00

* return updated HTML from bookmark actions * open details through URL * fix details update * improve modal behavior * use a frame * make behaviors properly destroy themselves * remove page and details params from tag urls * use separate behavior for details and tags * remove separate details view * make it work with other views * add asset actions * remove asset refresh for now * remove details partial * fix tests * remove old partials * update tests * cache and reuse tags * extract search autocomplete behavior * remove details param from pagination * fix tests * only return details modal when navigating in frame * fix link target * remove unused behaviors * use auto submit behavior for user select * fix import
63 lines
1.6 KiB
JavaScript
63 lines
1.6 KiB
JavaScript
import { Behavior, registerBehavior } from "./index";
|
|
|
|
class DetailsModalBehavior extends Behavior {
|
|
constructor(element) {
|
|
super(element);
|
|
|
|
this.onClose = this.onClose.bind(this);
|
|
this.onKeyDown = this.onKeyDown.bind(this);
|
|
|
|
this.overlayLink = element.querySelector("a:has(.modal-overlay)");
|
|
this.buttonLink = element.querySelector("a:has(button.close)");
|
|
|
|
this.overlayLink.addEventListener("click", this.onClose);
|
|
this.buttonLink.addEventListener("click", this.onClose);
|
|
document.addEventListener("keydown", this.onKeyDown);
|
|
}
|
|
|
|
destroy() {
|
|
this.overlayLink.removeEventListener("click", this.onClose);
|
|
this.buttonLink.removeEventListener("click", this.onClose);
|
|
document.removeEventListener("keydown", this.onKeyDown);
|
|
}
|
|
|
|
onKeyDown(event) {
|
|
// Skip if event occurred within an input element
|
|
const targetNodeName = event.target.nodeName;
|
|
const isInputTarget =
|
|
targetNodeName === "INPUT" ||
|
|
targetNodeName === "SELECT" ||
|
|
targetNodeName === "TEXTAREA";
|
|
|
|
if (isInputTarget) {
|
|
return;
|
|
}
|
|
|
|
if (event.key === "Escape") {
|
|
this.onClose(event);
|
|
}
|
|
}
|
|
|
|
onClose(event) {
|
|
event.preventDefault();
|
|
this.element.classList.add("closing");
|
|
this.element.addEventListener(
|
|
"animationend",
|
|
(event) => {
|
|
if (event.animationName === "fade-out") {
|
|
this.element.remove();
|
|
|
|
const closeUrl = this.overlayLink.href;
|
|
Turbo.visit(closeUrl, {
|
|
action: "replace",
|
|
frame: "details-modal",
|
|
});
|
|
}
|
|
},
|
|
{ once: true },
|
|
);
|
|
}
|
|
}
|
|
|
|
registerBehavior("ld-details-modal", DetailsModalBehavior);
|