aboutsummaryrefslogtreecommitdiffstats
path: root/app/javascript/activestorage/direct_uploads_controller.js
diff options
context:
space:
mode:
authorJavan Makhmali <javan@javan.us>2017-07-27 19:47:03 -0400
committerDavid Heinemeier Hansson <david@loudthinking.com>2017-07-27 18:47:03 -0500
commit6262891b5669716db7c46dcdcec685d2f55903b5 (patch)
tree51528471efe698fe0e66d0f0359a5d5eaefab995 /app/javascript/activestorage/direct_uploads_controller.js
parentdc235c4d1366b4f3185d30a8a4e35ad12173fd89 (diff)
downloadrails-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.js50
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 })
+ }
+}