import { Controller } from "@hotwired/stimulus" // Shared across all instances — drag spans multiple elements let lastEnterTime export default class extends Controller { static values = { dragPath: String, dropId: String, dropIdParam: String } start(event) { lastEnterTime = event.timeStamp this.element.closest("table").querySelectorAll("thead tr").forEach(tr => { tr.toggleAttribute("hidden") }) event.dataTransfer.setData("text/plain", this.dragPathValue) const rect = this.element.getBoundingClientRect() event.dataTransfer.setDragImage(this.element, event.x - rect.left, event.y - rect.top) event.dataTransfer.dropEffect = "move" } end(event) { this.leave(event) this.element.closest("table").querySelectorAll("thead tr").forEach(tr => { tr.toggleAttribute("hidden") }) } enter(event) { this.leave(event) lastEnterTime = event.timeStamp document.getElementById(this.dropIdValue)?.classList.add("dropzone") } over(event) { event.preventDefault() } leave(event) { if (event.timeStamp <= lastEnterTime) return this.element.closest("table").querySelectorAll(".dropzone").forEach(tr => { tr.classList.remove("dropzone") }) } drop(event) { event.preventDefault() const id = this.dropIdValue.split("_").pop() const form = document.createElement('form') form.action = event.dataTransfer.getData("text/plain") form.method = 'post' form.dataset.turboStream = 'true' const input = document.createElement('input') input.type = 'hidden'; input.name = this.dropIdParamValue; input.value = id form.appendChild(input) form.addEventListener('turbo:submit-end', () => form.remove()) document.body.appendChild(form) form.requestSubmit() } }