69 lines
2.2 KiB
JavaScript
69 lines
2.2 KiB
JavaScript
/**
|
|
* Drag and drop for board view - allows moving issue cards between status columns
|
|
*/
|
|
(function () {
|
|
document.addEventListener("dragstart", function (e) {
|
|
if (e.target.closest("button") || e.target.closest("a")) return;
|
|
const card = e.target.closest(".board-card");
|
|
if (!card) return;
|
|
e.dataTransfer.setData("text/plain", card.dataset.issueId);
|
|
e.dataTransfer.effectAllowed = "move";
|
|
card.classList.add("opacity-50");
|
|
});
|
|
|
|
document.addEventListener("dragend", function (e) {
|
|
const card = e.target.closest(".board-card");
|
|
if (card) card.classList.remove("opacity-50");
|
|
});
|
|
|
|
document.addEventListener("dragover", function (e) {
|
|
const zone = e.target.closest(".column-drop-zone");
|
|
if (!zone) return;
|
|
e.preventDefault();
|
|
e.dataTransfer.dropEffect = "move";
|
|
zone.classList.add("ring-2", "ring-primary", "ring-inset");
|
|
});
|
|
|
|
document.addEventListener("dragleave", function (e) {
|
|
const zone = e.target.closest(".column-drop-zone");
|
|
if (!zone || zone.contains(e.relatedTarget)) return;
|
|
zone.classList.remove("ring-2", "ring-primary", "ring-inset");
|
|
});
|
|
|
|
document.addEventListener("drop", function (e) {
|
|
const zone = e.target.closest(".column-drop-zone");
|
|
if (!zone) return;
|
|
e.preventDefault();
|
|
zone.classList.remove("ring-2", "ring-primary", "ring-inset");
|
|
const issueId = e.dataTransfer.getData("text/plain");
|
|
const newStatus = zone.dataset.status;
|
|
if (!issueId || !newStatus) return;
|
|
|
|
const formData = new URLSearchParams();
|
|
formData.append("status", newStatus);
|
|
|
|
fetch("/issues/" + issueId + "?from=board", {
|
|
method: "PATCH",
|
|
body: formData,
|
|
headers: {
|
|
"Content-Type": "application/x-www-form-urlencoded",
|
|
"HX-Request": "true",
|
|
},
|
|
}).then(function (r) {
|
|
if (r.ok) {
|
|
var redirect = r.headers.get("HX-Redirect");
|
|
if (redirect) {
|
|
window.location.href = redirect;
|
|
} else if (typeof htmx !== "undefined") {
|
|
htmx.ajax("GET", "/?board=true", {
|
|
target: "main",
|
|
swap: "innerHTML",
|
|
});
|
|
} else {
|
|
window.location.href = "/?board=true";
|
|
}
|
|
}
|
|
});
|
|
});
|
|
})();
|