mirror of
https://github.com/galaxyproject/galaxy.git
synced 2026-09-24 16:30:27 +08:00
1 line
5.3 KiB
JavaScript
1 line
5.3 KiB
JavaScript
define("utils/uploadbox",[],function(){"use strict";!function(e){jQuery.event.props.push("dataTransfer");var r=function(r){var n=e.extend({error_default:"Please make sure the file is available.",error_server:"Upload request failed.",error_login:"Uploads require you to log in.",error_retry:"Waiting for server to resume..."},r);console.debug(n);var o=new XMLHttpRequest;o.open("POST",n.url,!0),o.setRequestHeader("Cache-Control","no-cache"),o.setRequestHeader("X-Requested-With","XMLHttpRequest"),o.setRequestHeader("Accept","application/json"),o.onreadystatechange=function(){if(o.readyState==o.DONE)if(-1!==[502,0].indexOf(o.status)&&n.warning)n.warning(n.error_retry);else if(o.status<200||o.status>299){var e=o.statusText;403==o.status?e=n.error_login:0==o.status?e=n.error_server:e||(e=n.error_default),n.error(e+" ("+o.status+")")}else{var r=null;if(o.responseText)try{r=jQuery.parseJSON(o.responseText)}catch(e){r=o.responseText}n.success(r)}},o.upload.addEventListener("progress",n.progress,!1),o.send(n.data)};e.uploadchunk=function(n){function o(n){n=n||0;var s=i.mozSlice||i.webkitSlice||i.slice;if(s){var d=Math.min(n+c,i.size),f=i.size;console.debug("Submitting chunk at "+n+" bytes...");var p=new FormData;p.append("session_id",l),p.append("session_start",n),p.append("session_chunk",s.bind(i)(n,d)),r({url:Galaxy.root+"api/uploads",data:p,success:function(r){var s=n+c;s<f?(u=t.attempts,o(s)):(console.debug("Upload completed."),a.payload.inputs=JSON.parse(a.payload.inputs),a.payload.inputs["files_0|file_data"]={session_id:l,name:i.name},a.payload.inputs=JSON.stringify(a.payload.inputs),e.ajax({url:Galaxy.root+"api/tools",method:"POST",data:a.payload,success:function(e){t.success(e)},error:function(e){var r=e&&e.responseJSON&&e.responseJSON.err_msg;t.error(r||t.error_tool)}}))},warning:function(e){--u>0?(console.debug("Retrying last chunk..."),t.warning(e),setTimeout(function(){return o(n)},t.timeout)):(console.debug(t.error_attempt),t.error(t.error_attempt))},error:function(e){console.debug(e),t.error(e)},progress:function(e){e.lengthComputable&&t.progress(Math.min(Math.round(100*(n+e.loaded)/i.size),100))}})}else t.error("Browser does not support chunked uploads.")}var t=e.extend({},{data:{},success:function(){},error:function(){},warning:function(){},progress:function(){},attempts:7e4,timeout:5e3,url:null,error_file:"File not provided.",error_attempt:"Maximum number of attempts reached.",error_tool:"Tool submission failed."},n),a=t.data;if(a.error_message)t.error(a.error_message);else{var s=a.files&&a.files[0];if(s){var i=s.file,u=t.attempts,l=t.session.id+"-"+(new Date).valueOf()+"-"+i.size,c=t.session.chunk_upload_size;console.debug("Starting chunked uploads [size="+c+"]."),o()}else t.error(t.error_file)}},e.uploadpost=function(n){var o=e.extend({},{data:{},success:function(){},error:function(){},progress:function(){},url:null,maxfilesize:2147483648,error_filesize:"File exceeds 2GB. Please use a FTP client."},n),t=o.data;if(t.error_message)o.error(t.error_message);else{var a=new FormData;for(var s in t.payload)a.append(s,t.payload[s]);var i=0;for(var u in t.files){var l=t.files[u];a.append(l.name,l.file,l.file.name),i+=l.file.size}i>o.maxfilesize?o.error(o.error_filesize):r({url:o.url,data:a,success:o.success,error:o.error,progress:function(e){e.lengthComputable&&o.progress(Math.round(100*e.loaded/e.total))}})}},e.fn.uploadinput=function(r){var n=this,o=this,t=e.extend({},{ondragover:function(){},ondragleave:function(){},onchange:function(){},multiple:!1},r),a=e('<input type="file" style="display: none" '+(t.multiple&&"multiple"||"")+"/>");return o.append(a.change(function(r){t.onchange(r.target.files),e(n).val("")})),o.on("drop",function(e){t.ondragleave(e),e.dataTransfer&&(t.onchange(e.dataTransfer.files),e.preventDefault())}),o.on("dragover",function(e){e.preventDefault(),t.ondragover(e)}),o.on("dragleave",function(e){e.stopPropagation(),t.ondragleave(e)}),{dialog:function(){a.trigger("click")}}},e.fn.uploadbox=function(r){function n(e){if(e&&e.length&&!c){var r=void 0;return _.each(e,function(e,r){"new"!==e.mode&&_.filter(s,function(r){return r.name===e.name&&r.size===e.size}).length&&(e.duplicate=!0)}),_.each(e,function(e){e.duplicate||(r=String(u++),s[r]=e,a.announce(r,s[r]),l++)}),r}}function o(e){s[e]&&(delete s[e],l--)}function t(){if(0==l||d)return d=!1,c=!1,void a.complete();c=!0;var r=-1;for(var n in s){r=n;break}var u=s[r];o(r);var f=e.uploadpost;u.chunk_mode&&i&&i.id&&i.chunk_upload_size&&i.chunk_upload_size>0&&(f=e.uploadchunk),f({url:a.url,data:a.initialize(r),session:i,success:function(e){a.success(r,e),t()},warning:function(e){a.warning(r,e)},error:function(e){a.error(r,e),t()},progress:function(e){a.progress(r,e)}})}var a=e.extend({},{dragover:function(){},dragleave:function(){},announce:function(e){},initialize:function(e){},progress:function(e,r){},success:function(e,r){},warning:function(e,r){},error:function(e,r){alert(r)},complete:function(){}},r),s={},i=null,u=0,l=0,c=!1,d=!1,f=e(this).uploadinput({multiple:!0,onchange:function(e){_.each(e,function(e){e.chunk_mode=!0}),n(e)},ondragover:r.ondragover,ondragleave:r.ondragleave});return{select:function(){f.dialog()},add:n,remove:o,start:function(e){i=e,c||(c=!0,t())},stop:function(){d=!0},reset:function(e){for(e in s)o(e)},configure:function(r){return a=e.extend({},a,r)},compatible:function(){return window.File&&window.FormData&&window.XMLHttpRequest&&window.FileList}}}}(jQuery)}); |