X-Git-Url: http://git.roojs.org/?p=Pman.Core;a=blobdiff_plain;f=Pman.Download.js;h=2f16b24689413da76ec062818932f5ab201c7308;hp=1683be896f8a992c67aa476d9c7a9a2ae52552d3;hb=443623f47935eb52acd65a3ff0d84eab1fd5a98b;hpb=0b53fe172f40337a9b12b76287cab9e176803251 diff --git a/Pman.Download.js b/Pman.Download.js index 1683be89..2f16b246 100644 --- a/Pman.Download.js +++ b/Pman.Download.js @@ -8,6 +8,7 @@ var t = new Pman.Download({ url: baseURL + '/Images/Download/0/myfile.jpg', newWindow : false, params: { .... }, + doctype: 'pdf' success : function() { Roo.MessageBox.alert("File has downloaded"); } @@ -20,101 +21,157 @@ var t = new Pman.Download({ * @cfg {String} url Location to download from. * @cfg {String} method GET or POST (default GET), POST will create a form, and post that into the hidden frame. * @cfg {Boolean} newWindow (optional) download to new window - +* @cfg {String} doctype (optional) download PDF to new window +* @cfg {Boolean} limit (optional) limit for grid downloads. + + * @cfg {String} csvCols - use '*' to override grid coluns + * @cfg {String} csvTitles - use '*' to override grid coluns + + + +* @cfg {Function} success (optional) MAY fire on download completed (fails on attachments).. +* @cfg {Number} timeout (optional) in milliseconds before it gives up (default 30000 = 30s) +* @cfg {Roo.grid.Grid} grid (optional) if you want to just download a grid, (without renderers..) +* */ + Pman.Download = function(cfg) { - - if (cfg.newWindow) { - // as ie seems buggy... - window.open( cfg.url + '?' + Roo.urlEncode(cfg.params || {}), '_blank'); - return ; + + + + this.params = {}; + + Roo.apply(this, cfg); + + if (this.grid) { + this.buildFromGrid(); + Roo.log(this); } - this.createCsvFrame(); - var requested = 0; - function cb() - { - // requested++; // second request is real one.. - // if (requested < 2) { - // return; - //} - Roo.log('downloaded'); - var frame = this.csvFrame; - var success = true; - try { - var doc = Roo.isIE ? - frame.contentWindow.document : - (frame.contentDocument || window.frames[Pman.Download.csvFrame.id].document); - Roo.log(doc); - - if(doc && doc.body && doc.body.innerHTML.length){ - // alert(doc.body.innerHTML); - Roo.MessageBox.alert("Error download",doc.body.innerHTML); - success = false; - } - - Roo.log(doc.body.innerHTML); - - } - catch(e) { - Roo.log(e.toString()); - Roo.log(e); - } - - if (this.form) - { - this.form.remove(); - this.form= false; - } - Roo.EventManager.removeListener(frame, 'load', cb, this); - if (cfg.success && success) { - cfg.success(); - } - //Roo.get(frame).remove(); + if (this.newWindow && this.method == 'GET') { + // as ie seems buggy... + window.open( this.url + '?' + Roo.urlEncode(this.params || {}), '_blank'); + return ; - } - Roo.EventManager.on( this.csvFrame, 'load', cb, this); - cfg.method = cfg.method || 'GET'; + + + + //this.submit = false; + //this.createCsvFrame(); + + //var requested = 0; + + //Roo.EventManager.on( this.csvFrame, 'load', this.onLoad, this); + - if (cfg.method == 'GET') { + //--- simple method.. + this.method = this.method || 'GET'; + + if (this.method == 'GET' && !this.params) { + (function() { + + + this.createCsvFrame(); + //Roo.EventManager.on( this.csvFrame, 'load', this.onLoad, this); + this.submit = true; + this.csvFrame.src = cfg.url; + //this.cleanup.defer(cfg.timeout || 30000,this); + }).defer(100, this); - this.csvFrame.src = cfg.url; + return; } + + Roo.log("creating form?"); + this.form = new FormData(); + /* var b = Roo.get(document.body); this.form = b.createChild({ tag: 'form', - method : 'POST', - action : cfg.url, - target : this.csvFrame.id, + method : this.method, + action : this.url, + target : this.newWindow ? '_new' : this.csvFrame.id, enctype : 'multipart/form-data' - - - }); + **/ +// +// if(this.doctype == 'pdf'){ +// this.pdfEmbed = b.createChild({ +// tag: 'embed', +// src : this.url, +// pluginspage : 'http://www.adobe.com/products/acrobat/readstep2.html', +// alt: this.doctype +// }); +// } - for(var i in cfg.params) { - + //Roo.log(this.params); + this.params._get = 1; // always do a post request, with _get passed + for(var i in this.params) { + this.form.append(i, this.params[i]); + /* var el = this.form.createChild( { ns : 'html', tag : 'input', type: 'hidden', name : i, - value : cfg.params[i] + value : this.params[i] }); + */ } - + var req = new XMLHttpRequest(); + req.responseType = 'blob'; + + req.open('POST', this.url); + + var _t = this; + req.onload = function( ev ) + { + if (req.status == 200) { + Roo.log(ev); + var cd = req.getResponseHeader('Content-Disposition'); + + var filename = ''; + var matches = /filename[^;=\n]*=((['"]).*?\2|[^;\n]*)/.exec(cd); + if (matches != null && matches[1]) { + filename = matches[1].replace(/['"]/g, ''); + } + + var blob = new Blob([req.response], {type: req.responseType }); + + var a = document.createElement("a"); + a.style = "display: none"; + document.body.appendChild(a); + var url = window.URL.createObjectURL(blob); + a.href = url; + a.download = filename; + a.click(); + //release the reference to the file by revoking the Object URL + window.URL.revokeObjectURL(url); + + _t.success ? _t.success(ev) : ''; + } else { + _t.failure ? _t.failure(ev) : ''; + } + + } - this.form.dom.submit.defer(100,this.form.dom); + req.send(this.form); + /* + (function() { + this.submit = true; + this.form.dom.submit(); + this.cleanup.defer(this.timeout || 30000,this); + }).defer(100, this); + */ } @@ -130,10 +187,19 @@ Roo.apply(Pman.Download.prototype, { // private form : false, + limit : 9999, + + newWindow : false, + + method : 'GET', + + success : false, + failure : false, + // private.. + //used by simple GET method. createCsvFrame: function() { - if (this.csvFrame) { document.body.removeChild(this.csvFrame); } @@ -152,7 +218,132 @@ Roo.apply(Pman.Download.prototype, { document.frames[id].name = id; } + }, + /* not used as it didn't work.. + onLoad : function() + { + // requested++; // second request is real one.. + // if (requested < 2) { + // return; + //} // n + Roo.log('onload?'); + if (!this.submit) { + return false; + } + //return false; + + var frame = this.csvFrame; + var success = true; + try { + var doc = Roo.isIE ? + frame.contentWindow.document : + (frame.contentDocument || window.frames[Pman.Download.csvFrame.id].document); + + + if(doc && doc.body && doc.body.innerHTML.length){ + // alert(doc.body.innerHTML); + + Roo.MessageBox.alert("Download Error", doc.body.innerHTML); + success = false; + if (this.failure) { + this.failure(); + } + return true; + } + + Roo.log(doc.body.innerHTML); + + } + catch(e) { + Roo.log(e.toString()); + Roo.log(e); + } + if (this.success) { + this.success(); + } + // we can not actually do anything with the frame... as it may actually still be downloading.. + return true; + + this.cleanup(); + + // this will never fire.. see + // http://www.atalasoft.com/cs/blogs/jake/archive/2009/08/18/events-to-expect-when-dynamically-loading-iframes-in-javascript-take-2-thanks-firefox-3-5.aspx + if (this.success && success) { + + this.success(); + } + return false; + + + }, + */ + // private - clean up download elements. + cleanup :function() + { + /* Roo.log('cleanup?'); + if (this.form) { + this.form.remove(); + this.form= false; + + } + + if (this.csvFrame) { + Roo.EventManager.removeListener(this.csvFrame, 'load', this.onLoad, this); + Roo.get(this.csvFrame).remove(); + this.csvFrame= false; + } + */ + + }, + + buildFromGrid : function() + { + // get the params from beforeLoad + var ds = this.grid.ds; + ds.fireEvent('beforeload', ds, { + params : this.params + + }); + + if(ds.sortInfo && ds.remoteSort){ + var pn = ds.paramNames; + this.params[pn["sort"]] = ds.sortInfo.field; + this.params[pn["dir"]] = ds.sortInfo.direction; + } + if (ds.multiSort) { + var pn = ds.paramNames; + this.params[pn["multisort"]] = Roo.encode( { sort : ds.sortToggle, order: ds.sortOrder }); + } + + + + this.url = this.grid.ds.proxy.conn.url; + this.method = this.method || this.grid.ds.proxy.conn.method ; + var t = this; + // work out the cols + + if (this.csvCols) { + t.params.csvCols = this.csvCols; + t.params.csvTitles = this.csvTitles; + } else { + + Roo.each(this.grid.cm.config, function(c,i) { + t.params['csvCols['+i+']'] = c.dataIndex; + t.params['csvTitles['+i+']'] = c.header; + + }); + } + if (this.grid.loadMask) { + this.grid.loadMask.onLoad(); + } + this.params.limit = this.limit; + + // do it as a post, as args can get long.. + + this.method = 'POST'; + if (this.method == 'POST') { + this.params._get = 1; + } } - -}); \ No newline at end of file +});