import { DirectUploadsController } from “./direct_uploads_controller” import { findElement } from “./helpers”
const processingAttribute = “data-direct-uploads-processing” const submitButtonsByForm = new WeakMap let started = false
export function start() {
if (!started) { started = true document.addEventListener("click", didClick, true) document.addEventListener("submit", didSubmitForm, true) document.addEventListener("ajax:before", didSubmitRemoteElement) }
}
function didClick(event) {
const button = event.target.closest("button, input") if (button && button.type === "submit" && button.form) { submitButtonsByForm.set(button.form, button) }
}
function didSubmitForm(event) {
handleFormSubmissionEvent(event)
}
function didSubmitRemoteElement(event) {
if (event.target.tagName == "FORM") { handleFormSubmissionEvent(event) }
}
function handleFormSubmissionEvent(event) {
const form = event.target if (form.hasAttribute(processingAttribute)) { event.preventDefault() return } const controller = new DirectUploadsController(form) const { inputs } = controller if (inputs.length) { event.preventDefault() form.setAttribute(processingAttribute, "") inputs.forEach(disable) controller.start(error => { form.removeAttribute(processingAttribute) if (error) { inputs.forEach(enable) } else { submitForm(form) } }) }
}
function submitForm(form) {
let button = submitButtonsByForm.get(form) || findElement(form, "input[type=submit], button[type=submit]") if (button) { const { disabled } = button button.disabled = false button.focus() button.click() button.disabled = disabled } else { button = document.createElement("input") button.type = "submit" button.style.display = "none" form.appendChild(button) button.click() form.removeChild(button) } submitButtonsByForm.delete(form)
}
function disable(input) {
input.disabled = true
}
function enable(input) {
input.disabled = false
}