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