mirror of
https://github.com/Studio-42/elFinder
synced 2026-06-08 12:37:09 +00:00
233 lines
5.2 KiB
JavaScript
233 lines
5.2 KiB
JavaScript
"use strict";
|
|
/**
|
|
* @class elFinder command "paste"
|
|
* Paste filesfrom clipboard into directory.
|
|
* If files pasted in its parent directory - files duplicates will created
|
|
*
|
|
* @author Dmitry (dio) Levashov
|
|
**/
|
|
elFinder.prototype.commands.paste = function() {
|
|
|
|
this.updateOnSelect = false;
|
|
|
|
this.handlers = {
|
|
changeclipboard : function() { this.update(); }
|
|
}
|
|
|
|
this.shortcuts = [{
|
|
pattern : 'ctrl+v shift+insert'
|
|
}];
|
|
|
|
this.getstate = function(dst) {
|
|
if (this._disabled) {
|
|
return -1;
|
|
}
|
|
if (dst) {
|
|
if ($.isArray(dst)) {
|
|
if (dst.length != 1) {
|
|
return -1;
|
|
}
|
|
dst = this.fm.file(dst[0]);
|
|
}
|
|
} else {
|
|
dst = this.fm.cwd();
|
|
}
|
|
|
|
return this.fm.clipboard().length && dst.mime == 'directory' && dst.write ? 0 : -1;
|
|
}
|
|
|
|
this.exec = function(dst) {
|
|
var self = this,
|
|
fm = self.fm,
|
|
dst = dst ? this.files(dst)[0] : fm.cwd(),
|
|
files = fm.clipboard(),
|
|
cnt = files.length,
|
|
cut = cnt ? files[0].cut : false,
|
|
error = cut ? 'errMove' : 'errCopy',
|
|
fpaste = [],
|
|
fcopy = [],
|
|
dfrd = $.Deferred()
|
|
.fail(function(error) {
|
|
error && fm.error(error);
|
|
}),
|
|
copy = function(files) {
|
|
return files.length && fm._commands.duplicate
|
|
? fm.exec('duplicate', files)
|
|
: $.Deferred().resolve();
|
|
},
|
|
paste = function(files) {
|
|
var dfrd = $.Deferred(),
|
|
existed = [],
|
|
intersect = function(files, names) {
|
|
var ret = [],
|
|
i = files.length;
|
|
|
|
while (i--) {
|
|
$.inArray(files[i].name, names) !== -1 && ret.unshift(i);
|
|
}
|
|
return ret;
|
|
},
|
|
confirm = function(ndx) {
|
|
var i = existed[ndx],
|
|
file = files[i],
|
|
last = ndx == existed.length-1;
|
|
|
|
if (!file) {
|
|
return;
|
|
}
|
|
|
|
fm.confirm({
|
|
title : fm.i18n(cut ? 'moveFiles' : 'copyFiles'),
|
|
text : fm.i18n(['errExists', file.name, 'confirmRepl']),
|
|
all : !last,
|
|
accept : {
|
|
label : 'btnYes',
|
|
callback : function(all) {
|
|
!last && !all
|
|
? confirm(++ndx)
|
|
: paste(files);
|
|
}
|
|
},
|
|
reject : {
|
|
label : 'btnNo',
|
|
callback : function(all) {
|
|
var i;
|
|
|
|
if (all) {
|
|
i = existed.length;
|
|
while (ndx < i--) {
|
|
files[existed[i]].remove = true
|
|
}
|
|
} else {
|
|
files[existed[ndx]].remove = true;
|
|
}
|
|
|
|
!last && !all
|
|
? confirm(++ndx)
|
|
: paste(files);
|
|
}
|
|
},
|
|
cancel : {
|
|
label : 'btnCancel',
|
|
callback : function() {
|
|
dfrd.resolve();
|
|
}
|
|
}
|
|
})
|
|
},
|
|
valid = function(names) {
|
|
existed = intersect(files, names);
|
|
existed.length ? confirm(0) : paste(files);
|
|
},
|
|
paste = function(files) {
|
|
var files = $.map(files, function(file) { return !file.remove ? file : null } ),
|
|
cnt = files.length,
|
|
groups = {},
|
|
args = [],
|
|
src;
|
|
|
|
if (!cnt) {
|
|
return dfrd.resolve();
|
|
}
|
|
|
|
src = files[0].phash;
|
|
files = $.map(files, function(f) { return f.hash});
|
|
|
|
fm.request({
|
|
data : {cmd : 'paste', dst : dst.hash, targets : files, cut : cut ? 1 : 0, src : src},
|
|
notify : {type : cut ? 'move' : 'copy', cnt : cnt}
|
|
})
|
|
.always(function() {
|
|
dfrd.resolve();
|
|
fm.unlockfiles({files : files});
|
|
});
|
|
}
|
|
;
|
|
|
|
if (self._disabled || !files.length) {
|
|
return dfrd.resolve();
|
|
}
|
|
|
|
|
|
if (fm.oldAPI) {
|
|
paste(files);
|
|
} else {
|
|
|
|
if (!fm.option('copyOverwrite')) {
|
|
paste(files);
|
|
} else {
|
|
|
|
dst.hash == fm.cwd().hash
|
|
? valid($.map(fm.files(), function(file) { return file.phash == dst.hash ? file.name : null }))
|
|
: fm.request({
|
|
data : {cmd : 'ls', target : dst.hash},
|
|
notify : {type : 'prepare', cnt : 1, hideCnt : true},
|
|
preventFail : true
|
|
})
|
|
.always(function(data) {
|
|
valid(data.list || [])
|
|
});
|
|
}
|
|
}
|
|
|
|
return dfrd;
|
|
},
|
|
parents, fparents;
|
|
|
|
|
|
if (!cnt || !dst || dst.mime != 'directory') {
|
|
return dfrd.reject();
|
|
}
|
|
|
|
if (!dst.write) {
|
|
return dfrd.reject([error, files[0].name, 'errPerm']);
|
|
}
|
|
|
|
parents = fm.parents(dst.hash);
|
|
|
|
$.each(files, function(i, file) {
|
|
if (!file.read) {
|
|
return !dfrd.reject([error, files[0].name, 'errPerm']);
|
|
}
|
|
|
|
if (cut && file.locked) {
|
|
return !dfrd.reject(['errLocked', file.name]);
|
|
}
|
|
|
|
if ($.inArray(file.hash, parents) !== -1) {
|
|
return !dfrd.reject(['errCopyInItself', file.name]);
|
|
}
|
|
|
|
fparents = fm.parents(file.hash);
|
|
fparents.pop();
|
|
if ($.inArray(dst.hash, fparents) !== -1) {
|
|
|
|
if ($.map(fparents, function(h) { var d = fm.file(h); return d.phash == dst.hash && d.name == file.name ? d : null }).length) {
|
|
return !dfrd.reject(['errReplByChild', file.name]);
|
|
}
|
|
}
|
|
|
|
if (file.phash == dst.hash) {
|
|
fcopy.push(file.hash);
|
|
} else {
|
|
fpaste.push({
|
|
hash : file.hash,
|
|
phash : file.phash,
|
|
name : file.name
|
|
});
|
|
}
|
|
});
|
|
|
|
if (dfrd.state() == 'rejected') {
|
|
return dfrd;
|
|
}
|
|
|
|
return $.when(
|
|
copy(fcopy),
|
|
paste(fpaste)
|
|
).always(function() {
|
|
cut && fm.clipboard([]);
|
|
});
|
|
}
|
|
|
|
} |