pics/public/js/upload_queue.js

81 lines
2.0 KiB
JavaScript
Raw Normal View History

2016-09-04 11:54:17 +02:00
function UploadQueue(options) {
this.queue = options.queue_element;
this.previews = options.preview_area;
this.submit = options.submit_button;
2016-09-04 11:54:17 +02:00
this.addEvents();
}
UploadQueue.prototype.addEvents = function() {
var that = this;
that.queue.addEventListener('change', function() {
that.showSpinner(that.queue);
that.clearPreviews();
2016-09-04 11:54:17 +02:00
for (var i = 0; i < that.queue.files.length; i++) {
var callback = (i !== that.queue.files.length - 1) ? null : function() {
that.hideSpinner();
};
that.addPreviewForFile(that.queue.files[i], i, callback);
2016-09-04 11:54:17 +02:00
};
});
that.submit.addEventListener('click', function(e) {
e.preventDefault();
that.process();
});
2016-09-04 11:54:17 +02:00
};
UploadQueue.prototype.clearPreviews = function() {
2016-09-04 11:54:17 +02:00
this.previews.innerHTML = '';
}
UploadQueue.prototype.addPreviewForFile = function(file, index, callback) {
2016-09-04 11:54:17 +02:00
if (!file) {
return false;
}
var preview = document.createElement('img');
preview.id = 'upload_preview_' + index;
2016-09-04 11:54:17 +02:00
preview.style.maxHeight = '150px';
var reader = new FileReader();
var that = this;
var appendMe = function() {
2016-09-04 11:54:17 +02:00
preview.src = reader.result;
if (callback) {
preview.addEventListener('load', function() {
callback();
});
}
2016-09-04 11:54:17 +02:00
that.previews.appendChild(preview);
};
var waitForMe = function() {
var previews = that.previews.childNodes;
if (previews.length === 0 || previews[previews.length - 1].id === 'upload_preview_' + (index - 1)) {
appendMe();
} else {
setTimeout(waitForMe, 10);
}
};
reader.addEventListener('load', waitForMe, false);
2016-09-04 11:54:17 +02:00
reader.readAsDataURL(file);
};
UploadQueue.prototype.process = function() {
this.showSpinner(this.submit);
alert('Should now upload ' + this.queue.files.length + " files");
};
UploadQueue.prototype.showSpinner = function(sibling) {
if (this.spinner) {
return;
}
this.spinner = document.createElement('div');
this.spinner.className = 'spinner';
sibling.parentNode.appendChild(this.spinner);
};
UploadQueue.prototype.hideSpinner = function() {
this.spinner.parentNode.removeChild(this.spinner);
this.spinner = null;
};