226 lines
5.2 KiB
JavaScript
226 lines
5.2 KiB
JavaScript
/**
|
|
* @class elFinder command "extract"
|
|
* Extract files from archive
|
|
*
|
|
* @author Dmitry (dio) Levashov
|
|
**/
|
|
elFinder.prototype.commands.extract = function() {
|
|
"use strict";
|
|
var self = this,
|
|
fm = self.fm,
|
|
mimes = [],
|
|
filter = function(files) {
|
|
var fres = true;
|
|
return jQuery.grep(files, function(file) {
|
|
fres = fres && file.read && jQuery.inArray(file.mime, mimes) !== -1 ? true : false;
|
|
return fres;
|
|
});
|
|
};
|
|
|
|
this.variants = [];
|
|
this.disableOnSearch = true;
|
|
|
|
// Update mimes list on open/reload
|
|
fm.bind('open reload', function() {
|
|
mimes = fm.option('archivers')['extract'] || [];
|
|
if (fm.api > 2) {
|
|
self.variants = [[{makedir: true}, fm.i18n('cmdmkdir')], [{}, fm.i18n('btnCwd')]];
|
|
} else {
|
|
self.variants = [[{}, fm.i18n('btnCwd')]];
|
|
}
|
|
self.change();
|
|
});
|
|
|
|
this.getstate = function(select) {
|
|
var sel = this.files(select),
|
|
cnt = sel.length,
|
|
cwdHash, cwdChk;
|
|
if (!cnt || filter(sel).length != cnt) {
|
|
return -1;
|
|
} else if (fm.searchStatus.state > 0) {
|
|
cwdHash = this.fm.cwd().hash;
|
|
jQuery.each(sel, function(i, file) {
|
|
cwdChk = (file.phash === cwdHash);
|
|
return cwdChk;
|
|
});
|
|
return cwdChk? 0 : -1;
|
|
} else {
|
|
return this.fm.cwd().write? 0 : -1;
|
|
}
|
|
};
|
|
|
|
this.exec = function(hashes, opts) {
|
|
var files = this.files(hashes),
|
|
dfrd = jQuery.Deferred(),
|
|
cnt = files.length,
|
|
makedir = opts && opts.makedir ? 1 : 0,
|
|
i, error,
|
|
decision,
|
|
|
|
overwriteAll = false,
|
|
omitAll = false,
|
|
mkdirAll = 0,
|
|
siblings = fm.files(files[0].phash),
|
|
|
|
names = [],
|
|
map = {};
|
|
|
|
jQuery.each(siblings, function(id, file) {
|
|
map[file.name] = file;
|
|
names.push(file.name);
|
|
});
|
|
|
|
var decide = function(decision) {
|
|
switch (decision) {
|
|
case 'overwrite_all' :
|
|
overwriteAll = true;
|
|
break;
|
|
case 'omit_all':
|
|
omitAll = true;
|
|
break;
|
|
}
|
|
};
|
|
|
|
var unpack = function(file) {
|
|
if (!(file.read && fm.file(file.phash).write)) {
|
|
error = ['errExtract', file.name, 'errPerm'];
|
|
fm.error(error);
|
|
dfrd.reject(error);
|
|
} else if (jQuery.inArray(file.mime, mimes) === -1) {
|
|
error = ['errExtract', file.name, 'errNoArchive'];
|
|
fm.error(error);
|
|
dfrd.reject(error);
|
|
} else {
|
|
fm.request({
|
|
data:{cmd:'extract', target:file.hash, makedir:makedir},
|
|
notify:{type:'extract', cnt:1},
|
|
syncOnFail:true,
|
|
navigate:{
|
|
toast : makedir? {
|
|
incwd : {msg: fm.i18n(['complete', fm.i18n('cmdextract')]), action: {cmd: 'open', msg: 'cmdopen'}},
|
|
inbuffer : {msg: fm.i18n(['complete', fm.i18n('cmdextract')]), action: {cmd: 'open', msg: 'cmdopen'}}
|
|
} : {
|
|
inbuffer : {msg: fm.i18n(['complete', fm.i18n('cmdextract')])}
|
|
}
|
|
}
|
|
})
|
|
.fail(function (error) {
|
|
if (dfrd.state() != 'rejected') {
|
|
dfrd.reject(error);
|
|
}
|
|
})
|
|
.done(function () {
|
|
});
|
|
}
|
|
};
|
|
|
|
var confirm = function(files, index) {
|
|
var file = files[index],
|
|
name = fm.splitFileExtention(file.name)[0],
|
|
existed = (jQuery.inArray(name, names) >= 0),
|
|
next = function(){
|
|
if((index+1) < cnt) {
|
|
confirm(files, index+1);
|
|
} else {
|
|
dfrd.resolve();
|
|
}
|
|
};
|
|
if (!makedir && existed && map[name].mime != 'directory') {
|
|
fm.confirm(
|
|
{
|
|
title : fm.i18n('ntfextract'),
|
|
text : ['errExists', name, 'confirmRepl'],
|
|
accept:{
|
|
label : 'btnYes',
|
|
callback:function (all) {
|
|
decision = all ? 'overwrite_all' : 'overwrite';
|
|
decide(decision);
|
|
if(!overwriteAll && !omitAll) {
|
|
if('overwrite' == decision) {
|
|
unpack(file);
|
|
}
|
|
if((index+1) < cnt) {
|
|
confirm(files, index+1);
|
|
} else {
|
|
dfrd.resolve();
|
|
}
|
|
} else if(overwriteAll) {
|
|
for (i = index; i < cnt; i++) {
|
|
unpack(files[i]);
|
|
}
|
|
dfrd.resolve();
|
|
}
|
|
}
|
|
},
|
|
reject : {
|
|
label : 'btnNo',
|
|
callback:function (all) {
|
|
decision = all ? 'omit_all' : 'omit';
|
|
decide(decision);
|
|
if(!overwriteAll && !omitAll && (index+1) < cnt) {
|
|
confirm(files, index+1);
|
|
} else if (omitAll) {
|
|
dfrd.resolve();
|
|
}
|
|
}
|
|
},
|
|
cancel : {
|
|
label : 'btnCancel',
|
|
callback:function () {
|
|
dfrd.resolve();
|
|
}
|
|
},
|
|
all : ((index+1) < cnt)
|
|
}
|
|
);
|
|
} else if (!makedir) {
|
|
if (mkdirAll == 0) {
|
|
fm.confirm({
|
|
title : fm.i18n('cmdextract'),
|
|
text : [fm.i18n('cmdextract')+' "'+file.name+'"', 'confirmRepl'],
|
|
accept:{
|
|
label : 'btnYes',
|
|
callback:function (all) {
|
|
all && (mkdirAll = 1);
|
|
unpack(file);
|
|
next();
|
|
}
|
|
},
|
|
reject : {
|
|
label : 'btnNo',
|
|
callback:function (all) {
|
|
all && (mkdirAll = -1);
|
|
next();
|
|
}
|
|
},
|
|
cancel : {
|
|
label : 'btnCancel',
|
|
callback:function () {
|
|
dfrd.resolve();
|
|
}
|
|
},
|
|
all : ((index+1) < cnt)
|
|
});
|
|
} else {
|
|
(mkdirAll > 0) && unpack(file);
|
|
next();
|
|
}
|
|
} else {
|
|
unpack(file);
|
|
next();
|
|
}
|
|
};
|
|
|
|
if (!(this.enabled() && cnt && mimes.length)) {
|
|
return dfrd.reject();
|
|
}
|
|
|
|
if(cnt > 0) {
|
|
confirm(files, 0);
|
|
}
|
|
|
|
return dfrd;
|
|
};
|
|
|
|
};
|