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/direct_uploads_controller.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/direct_uploads_controller.js')
-rw-r--r-- | app/javascript/activestorage/direct_uploads_controller.js | 50 |
1 files changed, 50 insertions, 0 deletions
diff --git a/app/javascript/activestorage/direct_uploads_controller.js b/app/javascript/activestorage/direct_uploads_controller.js new file mode 100644 index 0000000000..94b89c9119 --- /dev/null +++ b/app/javascript/activestorage/direct_uploads_controller.js @@ -0,0 +1,50 @@ +import { DirectUploadController } from "./direct_upload_controller" +import { findElements, dispatchEvent, toArray } from "./helpers" + +const inputSelector = "input[type=file][data-direct-upload-url]:not([disabled])" + +export class DirectUploadsController { + constructor(form) { + this.form = form + this.inputs = findElements(form, inputSelector).filter(input => input.files.length) + } + + start(callback) { + const controllers = this.createDirectUploadControllers() + + const startNextController = () => { + const controller = controllers.shift() + if (controller) { + controller.start(error => { + if (error) { + callback(error) + this.dispatch("end") + } else { + startNextController() + } + }) + } else { + callback() + this.dispatch("end") + } + } + + this.dispatch("start") + startNextController() + } + + createDirectUploadControllers() { + const controllers = [] + this.inputs.forEach(input => { + toArray(input.files).forEach(file => { + const controller = new DirectUploadController(input, file) + controllers.push(controller) + }) + }) + return controllers + } + + dispatch(name, detail = {}) { + return dispatchEvent(this.form, `direct-uploads:${name}`, { detail }) + } +} |