/* Redmine - project management software Copyright (C) 2006-2013 Jean-Philippe Lang */ function postUpMsg(attachmentId) { $.ajax({ url: '/attachments/renderTag', type: "GET", data: { attachmentId: attachmentId } }) } function reload(fileSpan) { fileSpan.remove(); $('#upload_file_count').html("<%= l(:label_no_file_uploaded)%>"); $old_file = $("#_file"); $new_file = $old_file.clone(true); $old_file.replaceWith($new_file); $new_file.show(); } function addFile_board(inputEl, file, eagerUpload, id) { var attachments_frame = '#attachments_fields' + id; if ($(attachments_frame).children().length < 30) { deleteallfiles = $(inputEl).data('deleteAllFiles'); var attachmentId = addFile.nextAttachmentId++; var fileSpan = $('', { 'id': 'attachments_' + attachmentId, 'class':'attachment' }); fileSpan.append( $('', { 'type': 'text', 'class': 'filename readonly', 'name': 'attachments[' + attachmentId + '][filename]', 'readonly': 'readonly'} ).val(file.name), $('', { 'type': 'text', 'class': 'description', 'name': 'attachments[' + attachmentId + '][description]', 'maxlength': 254, 'placeholder': $(inputEl).data('descriptionPlaceholder') } ).toggle(!eagerUpload), $(''+$(inputEl).data('fieldIsPublic')+':').attr({ 'class': 'ispublic-label' }) , $('', { 'type': 'checkbox', 'class': 'is_public_checkbox','value':1, 'name': 'attachments[' + attachmentId + '][is_public_checkbox]', checked:'checked' } ).toggle(!eagerUpload), $(' ').attr({ 'href': "#", 'class': 'remove-upload', 'data-containerid':id }).click(function(){ if(confirm($(inputEl).data('areYouSure'))){ removeFile(); if(!eagerUpload){ (function(e){ reload(e); })(fileSpan); } } }).toggle(!eagerUpload), $('
', { 'class': 'div_attachments', 'name': 'div_'+'attachments_' + attachmentId} ) ).appendTo(attachments_frame); if(eagerUpload) { ajaxUpload(file, attachmentId, fileSpan, inputEl); } return attachmentId; } return null; } function addFile(inputEl, file, eagerUpload) { var attachments_frame = '#attachments_fields'; if ($(attachments_frame).children().length < 30) { deleteallfiles = $(inputEl).data('deleteAllFiles'); var attachmentId = addFile.nextAttachmentId++; var fileSpan = $('', { 'id': 'attachments_' + attachmentId, 'class':'attachment' }); fileSpan.append( $('', { 'type': 'text', 'class': 'filename readonly', 'name': 'attachments[' + attachmentId + '][filename]', 'readonly': 'readonly'} ).val(file.name), $('', { 'type': 'text', 'class': 'description', 'name': 'attachments[' + attachmentId + '][description]', 'maxlength': 254, 'placeholder': $(inputEl).data('descriptionPlaceholder') } ).toggle(!eagerUpload), $(''+$(inputEl).data('fieldIsPublic')+':').attr({ 'class': 'ispublic-label' }) , $('', { 'type': 'checkbox', 'class': 'is_public_checkbox','value':1, 'name': 'attachments[' + attachmentId + '][is_public_checkbox]', checked:'checked' } ).toggle(!eagerUpload), $(' ').attr({ 'href': "#", 'class': 'remove-upload' }).click(function(){ if(confirm($(inputEl).data('areYouSure'))){ removeFile(); if(!eagerUpload){ (function(e){ reload(e); })(fileSpan); } } }).toggle(!eagerUpload), $('
', { 'class': 'div_attachments', 'name': 'div_'+'attachments_' + attachmentId} ) ).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'); fileSpan.find('input.is_public_checkbox, a').css('display', 'inline-block'); }) .fail(function(result) { progressSpan.text(result.statusText); if($("#network_issue")) { $("#network_issue").show(); } }).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 //modify by yutao 2015-5-14 当1个页面存在多个上传控件时此块代码存在bug 故改之 start var containerid=$(inputEl).data('containerid'); if(containerid==undefined){ var count=$('#attachments_fields>span').length; $('#upload_file_count').html(""+count+""+$(inputEl).data('fileCount')); if(count>=1){ var add_attachs=$('.add_attachment'); var delete_all=$('.remove_all'); if(delete_all.length<1){ add_attachs.append($(" ").attr({"href":"javascript:void(0)", 'class': 'remove_all',"onclick": "removeAll()"})); } } }else{ var count=$('#attachments_fields'+containerid+'>span').length; $('#upload_file_count'+containerid).html(""+count+""+$(inputEl).data('fileCount')); if(count>=1){ var add_attachs=$('.add_attachment').filter(function(index){ return $(this).data('containerid')==containerid; }); var delete_all=$('.remove_all').filter(function(index){ return $(this).data('containerid')==containerid; }); if(delete_all.length<1){ add_attachs.append($(" ").attr({ "href":"javascript:void(0)", 'class': 'remove_all', 'data-containerid': containerid, "onclick": "removeAll('"+containerid+"')" })); } } //modify by yutao 2015-5-14 当1个页面存在多个上传控件时此块代码存在bug 故改之 end } //gcm } var progressSpan = $('
').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 //modify by yutao 2015-5-14 当1个页面存在多个上传控件时此块代码存在bug 故改之 start function removeAll(containerid){ if(confirm(deleteallfiles)){ if(containerid==undefined){ $(".remove-upload").removeAttr("data-confirm"); $(".remove-upload").click(); }else{ var arr = $(".remove-upload").filter(function(){ return $(this).data('containerid')==containerid; }); arr.removeAttr("data-confirm"); arr.click(); } } // return false; } //modify by yutao 2015-5-14 当1个页面存在多个上传控件时此块代码存在bug 故改之 end //gcm function uploadBlob(blob, uploadUrl, attachmentId, options) { var actualOptions = $.extend({ loadstartEventHandler: $.noop, progressEventHandler: $.noop }, options); if(uploadUrl.indexOf('?') > 0){ uploadUrl = uploadUrl + '&attachment_id=' + attachmentId; }else{ 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]'}).hide(); $('#upload_file_count').html(""+count+""+$(inputEl).data('fileCount')); } } //clearedFileInput.insertAfter('#attachments_fields'); } function addInputFiles_board(inputEl, id) { // var clearedFileInput = $(inputEl).clone().val(''); if (inputEl.files) { // upload files using ajax uploadAndAttachFiles_board(inputEl.files, inputEl, id); // $(inputEl).remove(); } else { // browser not supporting the file API, upload on form submission var attachmentId; var aFilename = inputEl.value.split(/\/|\\/); attachmentId = addFile_board(inputEl, { name: aFilename[ aFilename.length - 1 ] }, false, id); if (attachmentId) { $(inputEl).attr({ name: 'attachments[' + attachmentId + '][file]'}).hide(); $('#upload_file_count').html(""+count+""+$(inputEl).data('fileCount')); } } //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 uploadAndAttachFiles_board(files, inputEl, id) { 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_board(inputEl, this, true, id);}); } } 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); $(function(){ $(".file_selector").each(function() { deleteallfiles = $(this).data('deleteAllFiles'); var containerid = $(this).data('containerid'); if (containerid == undefined)containerid = ''; var count = $('#attachments_fields' + containerid + '>span').length; if (count >= 1) { $('#upload_file_count' + containerid).html("" + count + "" + $(this).data('fileCount')); var add_attachs = $('.add_attachment').filter(function (index) { return $(this).data('containerid') == containerid; }); var delete_all = $('.remove_all').filter(function (index) { return $(this).data('containerid') == containerid; }); if (delete_all.length < 1) { add_attachs.append($(" ").attr({ "href": "javascript:void(0)", 'class': 'remove_all', 'data-containerid': containerid, "onclick": "removeAll('" + containerid + "')" })); } } }); });