/* 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,btnId) { 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( $('').attr({ 'class': ' iconfont icon-fujian ml20mr20Color', 'aria-hidden': true }), $('', { 'type': 'text', 'class': 'upload_filename readonly hidden fl', 'name': 'attachments[' + attachmentId + '][filename]', 'readonly': 'readonly', 'style': 'border:none; white-space: nowrap; text-overflow:ellipsis;' }).val(file.name), $('').attr({ 'class': 'ml20 mr20' }).html(conver_size(file.size)), // $('', { // '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 fl', 'style': 'vertical-align:top;' }).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,btnId); } return attachmentId; } return null; } function addFile(inputEl, file, eagerUpload,btnId) { var attachments_frame = '#attachments_fields'; // $("#issue_confirm").attr('href', '#'); $('#issue_confirm').attr("disabled",true); $('#issue_confirm').css('background-color','#c1c1c1'); $('#issue_confirm').css('cursor','default'); if (true) { deleteallfiles = $(inputEl).data('deleteAllFiles'); var attachmentId = addFile.nextAttachmentId++; var fileSpan = $('', { 'id': 'attachments_' + attachmentId, 'class': 'attachment' }); fileSpan.append( $('').attr({ 'class': 'color-green iconfont icon-fujian mr5 fl mt8', 'aria-hidden': true }), $('', { 'type': 'text', 'class': 'upload_filename color-grey readonly hidden fl', 'name': 'attachments[' + attachmentId + '][filename]', 'readonly': 'readonly', 'style': 'border:none; white-space: nowrap;color:#676767; text-overflow:ellipsis;font-family: Consolas;' }).val(file.name), $('').attr({ 'class': 'mr10 color-grey fl mt3', 'style': 'vertical-align: middle;' }).html(conver_size(file.size)), // $('', { // '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 fl' }).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'); $('#attachments_fields').append("
"); // 计算文件名所占的size大小 中文1.8个size 其他1个size var len = file.name.length; var iSize = 0; for(var i = 0; i < len; i++){ var regex =/^[\u4E00-\u9FA5]+$/; var ch = file.name[i]; var judge = regex.test(ch); if(regex.test(ch)){ iSize += 1.9; }else{ iSize += 1; } } $("input[name='attachments[" + attachmentId + "][filename]']").attr("size", iSize); if (eagerUpload) { ajaxUpload(file, attachmentId, fileSpan, inputEl,btnId); } return attachmentId; } return null; } addFile.nextAttachmentId = 1; function addReviseFile(inputEl, file, eagerUpload,btnId) { var attachments_frame = '#revise_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($('').attr({ 'class': 'iconfont icon-fujian ml20mr20Color', 'aria-hidden': true }), $('', { 'type': 'text', 'class': 'upload_filename readonly hidden fl', 'name': 'attachments[' + attachmentId + '][filename]', 'readonly': 'readonly', 'style': 'border:none; white-space: nowrap; text-overflow:ellipsis;vertical-align:middle;' }).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 fl', 'style': 'vertical-align:top;' }).click(function() { if (confirm($(inputEl).data('areYouSure'))) { removeReviseFile(); if (!eagerUpload) { (function(e) { reload(e); })(fileSpan); } } }).toggle(!eagerUpload), $('
', { 'class': 'div_attachments', 'name': 'div_' + 'attachments_' + attachmentId }) ).appendTo('#revise_attachments_fields'); $("#uploadReviseBox").addClass('disable_link'); $("#choose_revise_attach").attr("onclick","return false;"); if (eagerUpload) { ajaxUpload(file, attachmentId, fileSpan, inputEl,btnId); } return attachmentId; } return null; } function ajaxUpload(file, attachmentId, fileSpan, inputEl,btnId) { //上传开始调用函数 function onLoadstart(e) { fileSpan.removeClass('ajax-waiting'); fileSpan.addClass('ajax-loading'); $('input:submit', $(this).parents('form')).attr('disabled', 'disabled'); $(".submit_form").attr("disabled",true).removeClass("task-btn-orange").css("pointer-events","none"); } //更改progressbar的值 function onProgress(e) { if (e.lengthComputable) { try{ this.progressbar('value', e.loaded * 100 / e.total); } catch (e){ } } } function actualUpload(file, attachmentId, fileSpan, inputEl,btnId) { ajaxUpload.uploading++; uploadBlob(file, $(inputEl).data('upload-path'), attachmentId, { loadstartEventHandler: onLoadstart.bind(progressSpan), progressEventHandler: onProgress.bind(progressSpan) }) .done(function(result) { try{ progressSpan.progressbar('value', 100).remove(); //上传完成就去掉该文件名后的进度条 } catch (e){ } 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(""); if ($("#network_issue")) { //在上传处都要给出一个network_issue的div用来显示错误 $("#network_issue").show(); } }).always(function() { ajaxUpload.uploading--; fileSpan.removeClass('ajax-loading'); var containerid = $(inputEl).data('containerid');//多个上传控件需要的容器id if(containerid == undefined ){ var count = 1;//同步上传参数为1,所以不需要去获取正在上传的文件就知道是1 // $('#upload_file_count').html("" + count + "" + $(inputEl).data('lebelFileUploding')); } else{ var count = 1; $('#upload_file_count' + containerid).html("" + count + "" + $(inputEl).data('lebelFileUploding')); } var form = fileSpan.parents('form'); if (form.queue('upload').length == 0 && ajaxUpload.uploading == 0) { //所有文件上传完毕,更改状态 $('input:submit', form).removeAttr('disabled'); $(".submit_form").removeAttr("disabled").addClass("task-btn-orange").css("pointer-events","auto"); $('#' + btnId).css('background-color', '#ff7500'); $('#'+btnId).attr("onclick",$('#'+btnId).attr("click-bf")).removeAttr("click-bf"); if(containerid == undefined ){ var count = $('#attachments_fields>span').length; // $('#upload_file_count').html("" + count + "" + $(inputEl).data('fileCount')); }else{ var count = $('#attachments_fields' + containerid + '>span').length; $('#upload_file_count'+containerid).html("" + count + "" + $(inputEl).data('fileCount')); } } 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'); $('#'+btnId).css('background-color','#c1c1c1'); $('#'+btnId).attr("click-bf",$('#'+btnId).attr("onclick")).removeAttr("onclick");//禁用a标签 if (containerid == undefined) { var count = $('#attachments_fields>span').length; // $('#upload_file_count').html("1" + $(inputEl).data('lebelFileUploding'));//目前肯定是穿一个文件 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("1" + $(inputEl).data('lebelFileUploding'));//目前肯定是穿一个文件 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 } //在插入文件名的后边插入div var progressSpan = $('
').insertAfter(fileSpan.find('input.upload_filename')); progressSpan.progressbar(); //将div处理成progress bar fileSpan.addClass('ajax-waiting'); //添加文件正在上传的状态 var containerid = $(inputEl).data('containerid');//多个上传控件需要的容器id if(containerid == undefined ){ //选择了多少个文件也要显示,因为有时候文件过大,一时半会传不完,但还是显示文件没有选择 var count = $('#attachments_fields>span').length; $('#upload_file_count').html("" + count + "" + '个文件被选择'); }else{ var count = $('#attachments_fields' + containerid + '>span').length; $('#upload_file_count'+containerid).html("" + count + "" + '个文件被选择'); } //最大的同步上传参数 var maxSyncUpload = 1 //$(inputEl).data('max-concurrent-uploads'); //如果没有指定同步上传参数 或者参数不对,或者需要上传的文件已经小于同步上传的个数,那么直接上传 if (maxSyncUpload == null || maxSyncUpload <= 0 || ajaxUpload.uploading < maxSyncUpload) actualUpload(file, attachmentId, fileSpan, inputEl,btnId); else //否则就进行队列上传 $(inputEl).parents('form').queue('upload', actualUpload.bind(this, file, attachmentId, fileSpan, inputEl,btnId)); } ajaxUpload.uploading = 0; function removeFile() { $(this).parent('span').remove(); return false; } function removeReviseFile() { $(this).parent('span').remove(); $("#uploadReviseBox").removeClass('disable_link'); $("#choose_revise_attach").attr("onclick","_file.click();"); 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 addReviseInputFiles(inputEl,btnId) { // var clearedFileInput = $(inputEl).clone().val(''); if (inputEl.files) { uploadAndAttachReviseFiles(inputEl.files, inputEl,btnId); // $(inputEl).remove(); } else { // browser not supporting the file API, upload on form submission var attachmentId; var aFilename = inputEl.value.split(/\/|\\/); var count = $('#attachments_fields>span').length; attachmentId = addReviseFile(inputEl, { name: aFilename[aFilename.length - 1] }, false); if (attachmentId) { $(inputEl).attr({ name: 'attachments[' + attachmentId + '][file]' }).hide(); if (count <= 0) count = 1; } } //clearedFileInput.insertAfter('#attachments_fields'); } function imageAddInputFiles(inputEl){ var extStart = inputEl.value.lastIndexOf("."); var ext = inputEl.value.substring(extStart,inputEl.value.length).toUpperCase(); if(ext != ".BMP" && ext!=".PNG" && ext != ".GIF" && ext != ".JPG" && ext != ".JPEG" ){ notice_box("图片仅支持BMP、JPG、GIF、PNG、JPEG格式"); return; } addInputFiles(inputEl) } function addInputFiles(inputEl,btnId) { // var clearedFileInput = $(inputEl).clone().val(''); if (inputEl.files) { // if(inputEl.files.length >= 5){ // alert('一次选择的文件不能超过5个') // return; // } // upload files using ajax uploadAndAttachFiles(inputEl.files, inputEl,btnId); // $(inputEl).remove(); } else { // browser not supporting the file API, upload on form submission var attachmentId; var aFilename = inputEl.value.split(/\/|\\/); var count = $('#attachments_fields>span').length; attachmentId = addFile(inputEl, { name: aFilename[aFilename.length - 1] }, false); if (attachmentId) { $(inputEl).attr({ name: 'attachments[' + attachmentId + '][file]' }).hide(); if (count <= 0) count = 1; $('#upload_file_count').html("" + count + "" + $(inputEl).data('fileCount')); } } //clearedFileInput.insertAfter('#attachments_fields'); } function addInputFiles_board(inputEl, id,btnId) { // var clearedFileInput = $(inputEl).clone().val(''); if (inputEl.files) { // if(inputEl.files.length >= 5){ // alert('一次选择的文件不能超过5个') // return; // } // upload files using ajax uploadAndAttachFiles_board(inputEl.files, inputEl, id,btnId); // $(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 uploadAndAttachReviseFiles(files, inputEl,btnId) { var maxFileSize = $(inputEl).data('max-file-size'); var maxFileSizeExceeded = $(inputEl).data('max-file-size-message'); var sizeExceeded = false; if(files.length > 1){ $("#hint_message").html("只能上传一个附件").show(); } else{ $("#hint_message").html("只能上传一个附件").hide(); $.each(files, function() { if (this.size && maxFileSize != null && this.size > parseInt(maxFileSize)) { sizeExceeded = true; } }); if (sizeExceeded) { notice_sure_box(maxFileSizeExceeded); } else { $.each(files, function() { addReviseFile(inputEl, this, true,btnId); }); } } } function uploadAndAttachFiles(files, inputEl,btnId) { 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) { notice_sure_box(maxFileSizeExceeded); } else { $.each(files, function() { addFile(inputEl, this, true,btnId); }); } } function uploadAndAttachFiles_board(files, inputEl, id,btnId) { 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) { notice_sure_box(maxFileSizeExceeded); } else { $.each(files, function() { addFile_board(inputEl, this, true, id,btnId); }); } } 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 + "')" })); } } }); }); //课程课件 function addInputFilesCourseSource(inputEl) { checkBox = arguments[1] == 'public' ? false : true; btnId = arguments[2]; // var clearedFileInput = $(inputEl).clone().val(''); if (inputEl.files) { // if(inputEl.files.length >= 5){ // alert('一次选择的文件不能超过5个') // return; // } // upload files using ajax uploadAndAttachFilesCourseSource(inputEl.files, inputEl,checkBox,btnId); // $(inputEl).remove(); } else { // browser not supporting the file API, upload on form submission var attachmentId; var aFilename = inputEl.value.split(/\/|\\/); var count = $('#attachments_fields>span').length; attachmentId = addFile(inputEl, { name: aFilename[aFilename.length - 1] }, false); if (attachmentId) { $(inputEl).attr({ name: 'attachments[' + attachmentId + '][file]' }).hide(); if (count <= 0) count = 1; // $('#upload_file_count').html("" + count + "" + $(inputEl).data('fileCount')); } } //clearedFileInput.insertAfter('#attachments_fields'); } function uploadAndAttachFilesCourseSource(files, inputEl,checkBox,btnId) { 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) { notice_sure_box(maxFileSizeExceeded); } else { $.each(files, function() { addFileCourseSource(inputEl, this, true,checkBox,btnId); }); } } function addFileCourseSource(inputEl, file, eagerUpload,checkBox,btnId) { 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' }); //alert(checkBox); if(checkBox){ fileSpan.append( $('', { 'type': 'text', 'class': 'upload_filename readonly fl', '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), $('
', { 'class': 'div_attachments', 'name': 'div_' + 'attachments_' + attachmentId }) ).appendTo('#attachments_fields'); }else { fileSpan.append( $('', { 'type': 'text', 'class': 'upload_filename readonly fl', '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 fl' }).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,btnId); } return attachmentId; } return null; } addFileCourseSource.nextAttachmentId = 1;