You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							215 lines
						
					
					
						
							6.4 KiB
						
					
					
				
			
		
		
	
	
							215 lines
						
					
					
						
							6.4 KiB
						
					
					
				| /* Redmine - project management software
 | |
|    Copyright (C) 2006-2013  Jean-Philippe Lang */
 | |
| 
 | |
| function addFile(inputEl, file, eagerUpload) {
 | |
| 
 | |
|   if ($('#attachments_fields').children().length < 10) {
 | |
| 
 | |
|     var attachmentId = addFile.nextAttachmentId++;
 | |
| 
 | |
|     var fileSpan = $('<span>', { 'id': 'attachments_' + attachmentId, 'class':'attachment' });
 | |
| 
 | |
|     fileSpan.append(
 | |
|         $('<input>', { 'type': 'text', 'class': 'filename readonly', 'name': 'attachments[' + attachmentId + '][filename]', 'readonly': 'readonly'} ).val(file.name),
 | |
|         $('<input>', { 'type': 'text', 'class': 'description', 'name': 'attachments[' + attachmentId + '][description]', 'maxlength': 255, 'placeholder': $(inputEl).data('description-placeholder') } ).toggle(!eagerUpload),
 | |
|         $('<a> </a>').attr({ 'href': "#", 'class': 'remove-upload', 'data-confirm' : "您确定要删除吗?" }).click(removeFile).toggle(!eagerUpload)
 | |
|     ).appendTo('#attachments_fields');
 | |
| 	
 | |
|     if(eagerUpload) {
 | |
|       ajaxUpload(file, attachmentId, fileSpan, inputEl);
 | |
|     }
 | |
| 
 | |
|     return attachmentId;
 | |
|   }
 | |
|   return null;
 | |
| }
 | |
| 
 | |
| addFile.nextAttachmentId = 1;
 | |
| 
 | |
| function ajaxUpload(file, attachmentId, fileSpan, inputEl) {
 | |
| 
 | |
|   function onLoadstart(e) {
 | |
|     fileSpan.removeClass('ajax-waiting');
 | |
|     fileSpan.addClass('ajax-loading');
 | |
|     $('input:submit', $(this).parents('form')).attr('disabled', 'disabled');
 | |
|   }
 | |
| 
 | |
|   function onProgress(e) {
 | |
|     if(e.lengthComputable) {
 | |
|       this.progressbar( 'value', e.loaded * 100 / e.total );
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   function actualUpload(file, attachmentId, fileSpan, inputEl) {
 | |
| 
 | |
|     ajaxUpload.uploading++;
 | |
| 
 | |
|     uploadBlob(file, $(inputEl).data('upload-path'), attachmentId, {
 | |
|         loadstartEventHandler: onLoadstart.bind(progressSpan),
 | |
|         progressEventHandler: onProgress.bind(progressSpan)
 | |
|       })
 | |
|       .done(function(result) {
 | |
|         progressSpan.progressbar( 'value', 100 ).remove();
 | |
|         fileSpan.find('input.description, a').css('display', 'inline-block');
 | |
|       })
 | |
|       .fail(function(result) {
 | |
|         progressSpan.text(result.statusText);
 | |
|       }).always(function() {
 | |
|         ajaxUpload.uploading--;
 | |
|         fileSpan.removeClass('ajax-loading');
 | |
|         var form = fileSpan.parents('form');
 | |
|         if (form.queue('upload').length == 0 && ajaxUpload.uploading == 0) {
 | |
|           $('input:submit', form).removeAttr('disabled');
 | |
|         }
 | |
|         form.dequeue('upload');
 | |
|       });
 | |
|       
 | |
|     //gcm files count and add delete_all link
 | |
| 
 | |
|     var count=$('#attachments_fields>span').length;  
 | |
|     $('#upload_file_count').html("已上传"+"<span id=\"count\">"+count+"</span>"+"个文件");
 | |
| 
 | |
|     if(count>=1){
 | |
|     	var add_attachs=$('.add_attachment');
 | |
|     	var delete_all=$('.remove_all');	
 | |
|     	if(delete_all.length<1){
 | |
|     		add_attachs.append($("<a> </a>").attr({"href":"javascript:void(0)", 'class': 'remove_all',"onclick": "removeAll()"}));
 | |
|     	}
 | |
|   	}
 | |
| 
 | |
| 	//gcm
 | |
| 	
 | |
|   }
 | |
| 
 | |
|   var progressSpan = $('<div>').insertAfter(fileSpan.find('input.filename'));
 | |
|   progressSpan.progressbar();
 | |
|   fileSpan.addClass('ajax-waiting');
 | |
| 
 | |
|   var maxSyncUpload = $(inputEl).data('max-concurrent-uploads');
 | |
| 
 | |
|   if(maxSyncUpload == null || maxSyncUpload <= 0 || ajaxUpload.uploading < maxSyncUpload)
 | |
|     actualUpload(file, attachmentId, fileSpan, inputEl);
 | |
|   else
 | |
|     $(inputEl).parents('form').queue('upload', actualUpload.bind(this, file, attachmentId, fileSpan, inputEl));
 | |
| }
 | |
| 
 | |
| ajaxUpload.uploading = 0;
 | |
| 
 | |
| function removeFile() {
 | |
|   $(this).parent('span').remove();
 | |
|   return false;
 | |
| }
 | |
| 
 | |
| //gcm delete all file
 | |
| function removeAll(){
 | |
| 	if(confirm("您确定要删除所有文件吗?")){
 | |
| 		$(".remove-upload").removeAttr("data-confirm");
 | |
| 		$(".remove-upload").click();
 | |
| 	}
 | |
| //	return false;
 | |
| }
 | |
| //gcm
 | |
| 
 | |
| function uploadBlob(blob, uploadUrl, attachmentId, options) {
 | |
| 
 | |
|   var actualOptions = $.extend({
 | |
|     loadstartEventHandler: $.noop,
 | |
|     progressEventHandler: $.noop
 | |
|   }, options);
 | |
| 
 | |
|   uploadUrl = uploadUrl + '?attachment_id=' + attachmentId;
 | |
|   if (blob instanceof window.File) {
 | |
|     uploadUrl += '&filename=' + encodeURIComponent(blob.name);
 | |
|   }
 | |
| 
 | |
|   return $.ajax(uploadUrl, {
 | |
|     type: 'POST',
 | |
|     contentType: 'application/octet-stream',
 | |
|     beforeSend: function(jqXhr) {
 | |
|       jqXhr.setRequestHeader('Accept', 'application/js');
 | |
|     },
 | |
|     xhr: function() {
 | |
|       var xhr = $.ajaxSettings.xhr();
 | |
|       xhr.upload.onloadstart = actualOptions.loadstartEventHandler;
 | |
|       xhr.upload.onprogress = actualOptions.progressEventHandler;
 | |
|       return xhr;
 | |
|     },
 | |
|     data: blob,
 | |
|     cache: false,
 | |
|     processData: false
 | |
|   });
 | |
| }
 | |
| 
 | |
| function addInputFiles(inputEl) {
 | |
|   var clearedFileInput = $(inputEl).clone().val('');
 | |
| 
 | |
|   if (inputEl.files) {
 | |
|     // upload files using ajax
 | |
|     uploadAndAttachFiles(inputEl.files, inputEl);
 | |
|     $(inputEl).remove();
 | |
|   } else {
 | |
|     // browser not supporting the file API, upload on form submission
 | |
|     var attachmentId;
 | |
|     var aFilename = inputEl.value.split(/\/|\\/);
 | |
|     attachmentId = addFile(inputEl, { name: aFilename[ aFilename.length - 1 ] }, false);
 | |
|     if (attachmentId) {
 | |
|       $(inputEl).attr({ name: 'attachments[' + attachmentId + '][file]', style: 'display:none;' }).appendTo('#attachments_' + attachmentId);
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   clearedFileInput.insertAfter('#attachments_fields');
 | |
| }
 | |
| 
 | |
| function uploadAndAttachFiles(files, inputEl) {
 | |
| 
 | |
|   var maxFileSize = $(inputEl).data('max-file-size');
 | |
|   var maxFileSizeExceeded = $(inputEl).data('max-file-size-message');
 | |
| 
 | |
|   var sizeExceeded = false;
 | |
|   $.each(files, function() {
 | |
|     if (this.size && maxFileSize != null && this.size > parseInt(maxFileSize)) {sizeExceeded=true;}
 | |
|   });
 | |
|   if (sizeExceeded) {
 | |
|     window.alert(maxFileSizeExceeded);
 | |
|   } else {
 | |
|     $.each(files, function() {addFile(inputEl, this, true);});
 | |
|   }
 | |
| }
 | |
| 
 | |
| function handleFileDropEvent(e) {
 | |
| 
 | |
|   $(this).removeClass('fileover');
 | |
|   blockEventPropagation(e);
 | |
| 
 | |
|   if ($.inArray('Files', e.dataTransfer.types) > -1) {
 | |
|     uploadAndAttachFiles(e.dataTransfer.files, $('input:file.file_selector'));
 | |
|   }
 | |
| }
 | |
| 
 | |
| function dragOverHandler(e) {
 | |
|   $(this).addClass('fileover');
 | |
|   blockEventPropagation(e);
 | |
| }
 | |
| 
 | |
| function dragOutHandler(e) {
 | |
|   $(this).removeClass('fileover');
 | |
|   blockEventPropagation(e);
 | |
| }
 | |
| 
 | |
| function setupFileDrop() {
 | |
|   if (window.File && window.FileList && window.ProgressEvent && window.FormData) {
 | |
| 
 | |
|     $.event.fixHooks.drop = { props: [ 'dataTransfer' ] };
 | |
| 
 | |
|     $('form div.box').has('input:file').each(function() {
 | |
|       $(this).on({
 | |
|           dragover: dragOverHandler,
 | |
|           dragleave: dragOutHandler,
 | |
|           drop: handleFileDropEvent
 | |
|       });
 | |
|     });
 | |
|   }
 | |
| }
 | |
| 
 | |
| $(document).ready(setupFileDrop);
 |