forked from Public/pics
		
	Add spinner; retain preview image order.
This commit is contained in:
		
							parent
							
								
									6aaa21b176
								
							
						
					
					
						commit
						c912c3327e
					
				@ -669,3 +669,44 @@ a#previous_photo:hover, a#next_photo:hover {
 | 
				
			|||||||
		width: auto;
 | 
							width: auto;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Upload form
 | 
				
			||||||
 | 
					----------------*/
 | 
				
			||||||
 | 
					#upload_preview_area {
 | 
				
			||||||
 | 
						margin: 10px 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					#upload_preview_area img {
 | 
				
			||||||
 | 
						margin: 0 5px 0 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Spinner animation
 | 
				
			||||||
 | 
					----------------------*/
 | 
				
			||||||
 | 
					.spinner {
 | 
				
			||||||
 | 
						display: inline-block;
 | 
				
			||||||
 | 
						background-color: #74AFCF;
 | 
				
			||||||
 | 
						height: 20px;
 | 
				
			||||||
 | 
						width: 20px;
 | 
				
			||||||
 | 
						-webkit-animation: sk-rotateplane 1.2s infinite ease-in-out;
 | 
				
			||||||
 | 
						animation: sk-rotateplane 1.2s infinite ease-in-out;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@-webkit-keyframes sk-rotateplane {
 | 
				
			||||||
 | 
						0% { -webkit-transform: perspective(120px) }
 | 
				
			||||||
 | 
						50% { -webkit-transform: perspective(120px) rotateY(180deg) }
 | 
				
			||||||
 | 
						100% { -webkit-transform: perspective(120px) rotateY(180deg)  rotateX(180deg) }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@keyframes sk-rotateplane {
 | 
				
			||||||
 | 
						0% {
 | 
				
			||||||
 | 
							transform: perspective(120px) rotateX(0deg) rotateY(0deg);
 | 
				
			||||||
 | 
							-webkit-transform: perspective(120px) rotateX(0deg) rotateY(0deg)
 | 
				
			||||||
 | 
						} 50% {
 | 
				
			||||||
 | 
							transform: perspective(120px) rotateX(-180.1deg) rotateY(0deg);
 | 
				
			||||||
 | 
							-webkit-transform: perspective(120px) rotateX(-180.1deg) rotateY(0deg)
 | 
				
			||||||
 | 
						} 100% {
 | 
				
			||||||
 | 
							transform: perspective(120px) rotateX(-180deg) rotateY(-179.9deg);
 | 
				
			||||||
 | 
							-webkit-transform: perspective(120px) rotateX(-180deg) rotateY(-179.9deg);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -1,38 +1,80 @@
 | 
				
			|||||||
function UploadQueue(options) {
 | 
					function UploadQueue(options) {
 | 
				
			||||||
	this.queue = options.queue_element;
 | 
						this.queue = options.queue_element;
 | 
				
			||||||
	this.previews = options.preview_area;
 | 
						this.previews = options.preview_area;
 | 
				
			||||||
 | 
						this.submit = options.submit_button;
 | 
				
			||||||
	this.addEvents();
 | 
						this.addEvents();
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
UploadQueue.prototype.addEvents = function() {
 | 
					UploadQueue.prototype.addEvents = function() {
 | 
				
			||||||
	var that = this;
 | 
						var that = this;
 | 
				
			||||||
	that.queue.addEventListener('change', function() {
 | 
						that.queue.addEventListener('change', function() {
 | 
				
			||||||
		that.clearArea();
 | 
							that.showSpinner(that.queue);
 | 
				
			||||||
 | 
							that.clearPreviews();
 | 
				
			||||||
		for (var i = 0; i < that.queue.files.length; i++) {
 | 
							for (var i = 0; i < that.queue.files.length; i++) {
 | 
				
			||||||
			that.addPreviewForFile(that.queue.files[i]);
 | 
								var callback = (i !== that.queue.files.length - 1) ? null : function() {
 | 
				
			||||||
 | 
									that.hideSpinner();
 | 
				
			||||||
 | 
								};
 | 
				
			||||||
 | 
								that.addPreviewForFile(that.queue.files[i], i, callback);
 | 
				
			||||||
		};
 | 
							};
 | 
				
			||||||
	});
 | 
						});
 | 
				
			||||||
 | 
						that.submit.addEventListener('click', function(e) {
 | 
				
			||||||
 | 
							e.preventDefault();
 | 
				
			||||||
 | 
							that.process();
 | 
				
			||||||
 | 
						});
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
UploadQueue.prototype.clearArea = function() {
 | 
					UploadQueue.prototype.clearPreviews = function() {
 | 
				
			||||||
	this.previews.innerHTML = '';
 | 
						this.previews.innerHTML = '';
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
UploadQueue.prototype.addPreviewForFile = function(file) {
 | 
					UploadQueue.prototype.addPreviewForFile = function(file, index, callback) {
 | 
				
			||||||
	if (!file) {
 | 
						if (!file) {
 | 
				
			||||||
		return false;
 | 
							return false;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	var preview = document.createElement('img');
 | 
						var preview = document.createElement('img');
 | 
				
			||||||
	preview.id = ''
 | 
						preview.id = 'upload_preview_' + index;
 | 
				
			||||||
	preview.style.maxWidth = '150px';
 | 
					 | 
				
			||||||
	preview.style.maxHeight = '150px';
 | 
						preview.style.maxHeight = '150px';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	var reader = new FileReader();
 | 
						var reader = new FileReader();
 | 
				
			||||||
	var that = this;
 | 
						var that = this;
 | 
				
			||||||
	reader.addEventListener('load', function() {
 | 
						var appendMe = function() {
 | 
				
			||||||
		preview.src = reader.result;
 | 
							preview.src = reader.result;
 | 
				
			||||||
 | 
							if (callback) {
 | 
				
			||||||
 | 
								preview.addEventListener('load', function() {
 | 
				
			||||||
 | 
									callback();
 | 
				
			||||||
 | 
								});
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
		that.previews.appendChild(preview);
 | 
							that.previews.appendChild(preview);
 | 
				
			||||||
	}, false);
 | 
						};
 | 
				
			||||||
 | 
						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);
 | 
				
			||||||
	reader.readAsDataURL(file);
 | 
						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;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
				
			|||||||
@ -17,11 +17,11 @@ class MediaUploader extends SubTemplate
 | 
				
			|||||||
					<h3>Select files</h3>
 | 
										<h3>Select files</h3>
 | 
				
			||||||
					<input type="file" id="upload_queue" name="uploads[]" multiple>
 | 
										<input type="file" id="upload_queue" name="uploads[]" multiple>
 | 
				
			||||||
				</div>
 | 
									</div>
 | 
				
			||||||
				<div id="upload_preview_area">
 | 
					 | 
				
			||||||
				</div>
 | 
					 | 
				
			||||||
				<div>
 | 
									<div>
 | 
				
			||||||
					<input name="save" type="submit" value="Upload the lot">
 | 
										<input name="save" type="submit" value="Upload the lot">
 | 
				
			||||||
				</div>
 | 
									</div>
 | 
				
			||||||
 | 
									<div id="upload_preview_area">
 | 
				
			||||||
 | 
									</div>
 | 
				
			||||||
			</form>
 | 
								</form>
 | 
				
			||||||
			<script type="text/javascript" src="', BASEURL, '/js/upload_queue.js" defer="defer"></script>
 | 
								<script type="text/javascript" src="', BASEURL, '/js/upload_queue.js" defer="defer"></script>
 | 
				
			||||||
			<script type="text/javascript" defer="defer">
 | 
								<script type="text/javascript" defer="defer">
 | 
				
			||||||
@ -29,6 +29,7 @@ class MediaUploader extends SubTemplate
 | 
				
			|||||||
					var upload_queue = new UploadQueue({
 | 
										var upload_queue = new UploadQueue({
 | 
				
			||||||
						queue_element: document.getElementById("upload_queue"),
 | 
											queue_element: document.getElementById("upload_queue"),
 | 
				
			||||||
						preview_area: document.getElementById("upload_preview_area"),
 | 
											preview_area: document.getElementById("upload_preview_area"),
 | 
				
			||||||
 | 
											submit_button: document.querySelector("input[type=submit]")
 | 
				
			||||||
					});
 | 
										});
 | 
				
			||||||
				}, 100);
 | 
									}, 100);
 | 
				
			||||||
			</script>';
 | 
								</script>';
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user