53 lines
1.3 KiB
JavaScript
53 lines
1.3 KiB
JavaScript
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 });
|
|
}
|
|
}
|