diff options
author | Javan Makhmali <javan@javan.us> | 2017-07-27 19:47:03 -0400 |
---|---|---|
committer | David Heinemeier Hansson <david@loudthinking.com> | 2017-07-27 18:47:03 -0500 |
commit | 6262891b5669716db7c46dcdcec685d2f55903b5 (patch) | |
tree | 51528471efe698fe0e66d0f0359a5d5eaefab995 /app/javascript/activestorage/ujs.js | |
parent | dc235c4d1366b4f3185d30a8a4e35ad12173fd89 (diff) | |
download | rails-6262891b5669716db7c46dcdcec685d2f55903b5.tar.gz rails-6262891b5669716db7c46dcdcec685d2f55903b5.tar.bz2 rails-6262891b5669716db7c46dcdcec685d2f55903b5.zip |
Add JavaScript direct upload support (#81)
Diffstat (limited to 'app/javascript/activestorage/ujs.js')
-rw-r--r-- | app/javascript/activestorage/ujs.js | 74 |
1 files changed, 74 insertions, 0 deletions
diff --git a/app/javascript/activestorage/ujs.js b/app/javascript/activestorage/ujs.js new file mode 100644 index 0000000000..a2ce2cfc58 --- /dev/null +++ b/app/javascript/activestorage/ujs.js @@ -0,0 +1,74 @@ +import { DirectUploadsController } from "./direct_uploads_controller" +import { findElement } from "./helpers" + +const processingAttribute = "data-direct-uploads-processing" +let started = false + +export function start() { + if (!started) { + started = true + document.addEventListener("submit", didSubmitForm) + document.addEventListener("ajax:before", didSubmitRemoteElement) + } +} + +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 = findElement(form, "input[type=submit]") + if (button) { + const { disabled } = button + button.disabled = false + 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) + } +} + +function disable(input) { + input.disabled = true +} + +function enable(input) { + input.disabled = false +} |