/** * @class elFinder command "download". * Download selected files. * Only for new api * * @author Dmitry (dio) Levashov, dio@std42.ru **/ elFinder.prototype.commands.zipdl = function() {}; elFinder.prototype.commands.download = function() { "use strict"; var self = this, fm = this.fm, czipdl = null, zipOn = false, mixed = false, dlntf = false, cpath = window.location.pathname || '/', filter = function(hashes, inExec) { var volumeid, mixedCmd; if (czipdl !== null) { if (fm.searchStatus.state > 1) { mixed = fm.searchStatus.mixed; } else if (fm.leafRoots[fm.cwd().hash]) { volumeid = fm.cwd().volumeid; jQuery.each(hashes, function(i, h) { if (h.indexOf(volumeid) !== 0) { mixed = true; return false; } }); } zipOn = (fm.isCommandEnabled('zipdl', hashes[0])); } if (mixed) { mixedCmd = czipdl? 'zipdl' : 'download'; hashes = jQuery.grep(hashes, function(h) { var f = fm.file(h), res = (! f || (! czipdl && f.mime === 'directory') || ! fm.isCommandEnabled(mixedCmd, h))? false : true; if (f && inExec && ! res) { fm.cwdHash2Elm(f.hash).trigger('unselect'); } return res; }); if (! hashes.length) { return []; } } else { if (!fm.isCommandEnabled('download', hashes[0])) { return []; } } return jQuery.grep(self.files(hashes), function(f) { var res = (! f.read || (! zipOn && f.mime == 'directory')) ? false : true; if (inExec && ! res) { fm.cwdHash2Elm(f.hash).trigger('unselect'); } return res; }); }; this.linkedCmds = ['zipdl']; this.shortcuts = [{ pattern : 'shift+enter' }]; this.getstate = function(select) { var sel = this.hashes(select), cnt = sel.length, maxReq = this.options.maxRequests || 10, mixed = false, croot = ''; if (cnt < 1) { return -1; } cnt = filter(sel).length; return (cnt && (zipOn || (cnt <= maxReq && ((!fm.UA.IE && !fm.UA.Mobile) || cnt == 1))) ? 0 : -1); }; fm.bind('contextmenu', function(e){ var fm = self.fm, helper = null, targets, file, link, getExtra = function(file) { var link = file.url || fm.url(file.hash); return { icon: 'link', node: jQuery('') .attr({href: link, target: '_blank', title: fm.i18n('link')}) .text(file.name) .on('mousedown click touchstart touchmove touchend contextmenu', function(e){ e.stopPropagation(); }) .on('dragstart', function(e) { var dt = e.dataTransfer || e.originalEvent.dataTransfer || null; helper = null; if (dt) { var icon = function(f) { var mime = f.mime, i, tmb = fm.tmb(f); i = '
'; if (tmb) { i = jQuery(i).addClass(tmb.className).css('background-image', "url('"+tmb.url+"')").get(0).outerHTML; } return i; }; dt.effectAllowed = 'copyLink'; if (dt.setDragImage) { helper = jQuery('
').append(icon(file)).appendTo(jQuery(document.body)); dt.setDragImage(helper.get(0), 50, 47); } if (!fm.UA.IE) { dt.setData('elfinderfrom', window.location.href + file.phash); dt.setData('elfinderfrom:' + dt.getData('elfinderfrom'), ''); } } }) .on('dragend', function(e) { helper && helper.remove(); }) }; }; self.extra = null; if (e.data) { targets = e.data.targets || []; if (targets.length === 1 && (file = fm.file(targets[0])) && file.mime !== 'directory') { if (file.url != '1') { self.extra = getExtra(file); } else { // Get URL ondemand var node; self.extra = { icon: 'link', node: jQuery('') .attr({href: '#', title: fm.i18n('getLink'), draggable: 'false'}) .text(file.name) .on('click touchstart', function(e){ if (e.type === 'touchstart' && e.originalEvent.touches.length > 1) { return; } var parent = node.parent(); e.stopPropagation(); e.preventDefault(); parent.removeClass('ui-state-disabled').addClass('elfinder-button-icon-spinner'); fm.request({ data : {cmd : 'url', target : file.hash}, preventDefault : true }) .always(function(data) { parent.removeClass('elfinder-button-icon-spinner'); if (data.url) { var rfile = fm.file(file.hash); rfile.url = data.url; node.replaceWith(getExtra(file).node); } else { parent.addClass('ui-state-disabled'); } }); }) }; node = self.extra.node; node.ready(function(){ requestAnimationFrame(function(){ node.parent().addClass('ui-state-disabled').css('pointer-events', 'auto'); }); }); } } } }).one('open', function() { if (fm.api >= 2.1012) { czipdl = fm.getCommand('zipdl'); } dlntf = fm.cookieEnabled && fm.api > 2.1038 && !fm.isCORS; }); this.exec = function(select) { var hashes = this.hashes(select), fm = this.fm, base = fm.options.url, files = filter(hashes, true), dfrd = jQuery.Deferred(), iframes = '', cdata = '', targets = {}, i, url, linkdl = false, getTask = function(hashes) { return function() { var dfd = jQuery.Deferred(), root = fm.file(fm.root(hashes[0])), single = (hashes.length === 1), volName = root? (root.i18 || root.name) : null, dir, dlName, phash; if (single) { if (dir = fm.file(hashes[0])) { dlName = (dir.i18 || dir.name); } } else { jQuery.each(hashes, function() { var d = fm.file(this); if (d && (!phash || phash === d.phash)) { phash = d.phash; } else { phash = null; return false; } }); if (phash && (dir = fm.file(phash))) { dlName = (dir.i18 || dir.name) + '-' + hashes.length; } } if (dlName) { volName = dlName; } volName && (volName = ' (' + volName + ')'); fm.request({ data : {cmd : 'zipdl', targets : hashes}, notify : {type : 'zipdl', cnt : 1, hideCnt : true, msg : fm.i18n('ntfzipdl') + volName}, cancel : true, eachCancel : true, preventDefault : true }).done(function(e) { var zipdl, dialog, btn = {}, dllink, form, iframe, m, uniq = 'dlw' + (+new Date()), zipdlFn = function(url) { dllink = jQuery('') .attr('href', url) .attr('download', fm.escape(dlName)) .on('click', function() { dfd.resolve(); dialog && dialog.elfinderdialog('destroy'); }); if (linkdl) { dllink.attr('target', '_blank') .append(''+fm.escape(dlName)); btn[fm.i18n('btnCancel')] = function() { dialog.elfinderdialog('destroy'); }; dialog = self.fmDialog(dllink, { title: fm.i18n('link'), buttons: btn, width: '200px', destroyOnClose: true, close: function() { (dfd.state() !== 'resolved') && dfd.resolve(); } }); } else { click(dllink.hide().appendTo('body').get(0)); dllink.remove(); } }; if (e.error) { fm.error(e.error); dfd.resolve(); } else if (e.zipdl) { zipdl = e.zipdl; if (dlName) { m = fm.splitFileExtention(zipdl.name || ''); dlName += m[1]? ('.' + m[1]) : '.zip'; } else { dlName = zipdl.name; } if (html5dl || linkdl) { url = fm.options.url + (fm.options.url.indexOf('?') === -1 ? '?' : '&') + 'cmd=zipdl&download=1'; jQuery.each([hashes[0], zipdl.file, dlName, zipdl.mime], function(key, val) { url += '&targets%5B%5D='+encodeURIComponent(val); }); jQuery.each(fm.customData, function(key, val) { url += '&'+encodeURIComponent(key)+'='+encodeURIComponent(val); }); url += '&'+encodeURIComponent(dlName); if (fm.hasParrotHeaders()) { fm.getBinaryByUrl({url: url}, function(blob) { if (blob instanceof Blob) { url = (window.URL || window.webkitURL).createObjectURL(blob); zipdlFn(url); } else { fm.error(['errUploadTransfer', fm.i18n('kindZIP')]); } }); } else { zipdlFn(url); } } else { form = jQuery('
') .append('') .append(''); jQuery.each([hashes[0], zipdl.file, dlName, zipdl.mime], function(key, val) { form.append(''); }); jQuery.each(fm.customData, function(key, val) { form.append(''); }); form.attr('target', uniq).appendTo('body'); iframe = jQuery(''; } } } link.remove(); jQuery(iframes) .appendTo('body') .ready(function() { setTimeout(function() { jQuery(iframes).each(function() { jQuery('#' + jQuery(this).attr('id')).remove(); }); }, 20000 + (10000 * i)); // give 20 sec + 10 sec for each file to be saved }); fm.trigger('download', {files : files}); dfrd.resolve(); }); fileCnt = files.length; urls = []; for (i = 0; i < files.length; i++) { fm.openUrl(files[i].hash, true, function(v) { v && urls.push(v); if (--fileCnt < 1) { getUrlDfrd.resolve(urls); } }); } return dfrd; } }; };