: str_replace(): Passing null to parameter #2 ($replace) of type array|string is deprecated in
* @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;
changeclipboard : function() { this.update(); }
pattern : 'ctrl+v shift+insert'
this.getstate = function(dst) {
if (Array.isArray(dst)) {
dst = this.fm.file(dst[0]);
return this.fm.clipboard().length && dst.mime == 'directory' && dst.write ? 0 : -1;
this.exec = function(select, cOpts) {
dst = select ? this.files(select)[0] : fm.cwd(),
cut = cnt ? files[0].cut : false,
cmd = opts._cmd? opts._cmd : (cut? 'move' : 'copy'),
error = 'err' + cmd.charAt(0).toUpperCase() + cmd.substr(1),
error && fm.error(error);
fm.unlockfiles({files : jQuery.map(files, function(f) { return f.hash; })});
return files.length && fm._commands.duplicate
? fm.exec('duplicate', files)
: jQuery.Deferred().resolve();
paste = function(files) {
var dfrd = jQuery.Deferred(),
intersect = function(files, names) {
jQuery.inArray(files[i].name, names) !== -1 && ret.unshift(i);
confirm = function(ndx) {
last = ndx == existed.length-1;
title : fm.i18n(cmd + 'Files'),
text : ['errExists', file.name, cmd === 'restore'? 'confirmRest' : 'confirmRepl'],
callback : function(all) {
callback : function(all) {
files[existed[i]].remove = true;
files[existed[ndx]].remove = true;
callback : function(all) {
files[existed[i]].rename = true;
files[existed[ndx]].rename = true;
valid = function(names) {
var exists = {}, existedArr;
if (Array.isArray(names)) {
if (typeof names[0] == 'string') {
// elFinder <= 2.1.6 command `is` results
existed = intersect(files, names);
jQuery.each(names, function(i, v) {
existed = intersect(files, jQuery.map(exists, function(h, n) { return n; }));
jQuery.each(files, function(i, file) {
hashes[exists[file.name]] = file.name;
existed = jQuery.map(names, function(n) {
if (typeof n === 'string') {
// support to >=2.1.11 plugin Normalizer, Sanitizer
existedArr = existedArr.concat(n);
existed = existed.concat(existedArr);
existed = intersect(files, existed);
existed.length ? confirm(0) : paste(files);
paste = function(selFiles) {
files = jQuery.grep(selFiles, function(file) {
return !file.remove ? true : false;
targets = jQuery.map(files, function(f) { return f.hash; });
reqData = {cmd : 'paste', dst : dst.hash, targets : targets, cut : cut ? 1 : 0, renames : renames, hashes : hashes, suffix : fm.options.backupSuffix};
reqData.src = files[0].phash;
notify : {type : cmd, cnt : cnt},
toast : opts.noToast? {} : {
inbuffer : {msg: fm.i18n(['complete', fm.i18n('cmd' + cmd)]), action: {
added = data.added && data.added.length? data.added : null;
jQuery.each(files, function(i, f) {
srcHash = function(name) {
jQuery.each(added, function(i, f) {
if (Object.keys(dsts).length) {
jQuery.each(dsts, function(dst, targets) {
data : {cmd : 'paste', dst : dst, targets : targets, cut : 1},
notify : {type : 'undo', cnt : targets.length}
return jQuery.when.apply(null, reqs);
notify : {type : 'redo', cnt : cnt}
fm.unlockfiles({files : files});
if (!fm.isCommandEnabled(self.name, dst.hash) || !files.length) {
if (!fm.option('copyOverwrite', dst.hash)) {
internames = jQuery.map(files, function(f) { return f.name; });
dst.hash == fm.cwd().hash
? valid(jQuery.map(fm.files(), function(file) { return file.phash == dst.hash ? {hash: file.hash, name: file.name} : null; }))
data : {cmd : 'ls', target : dst.hash, intersect : internames},
notify : {type : 'prepare', cnt : 1, hideCnt : true},
parents, fparents, cutDfrd;
if (!cnt || !dst || dst.mime != 'directory') {
return dfrd.reject([error, files[0].name, 'errPerm']);
parents = fm.parents(dst.hash);
jQuery.each(files, function(i, file) {
return !dfrd.reject([error, file.name, 'errPerm']);
if (cut && file.locked) {
return !dfrd.reject(['errLocked', file.name]);
if (jQuery.inArray(file.hash, parents) !== -1) {
return !dfrd.reject(['errCopyInItself', file.name]);
if (file.mime && file.mime !== 'directory' && ! fm.uploadMimeCheck(file.mime, dst.hash)) {
return !dfrd.reject([error, file.name, 'errUploadMime']);
fparents = fm.parents(file.hash);
if (jQuery.inArray(dst.hash, fparents) !== -1) {
if (jQuery.grep(fparents, function(h) { var d = fm.file(h); return d.phash == dst.hash && d.name == file.name ? true : false; }).length) {
return !dfrd.reject(['errReplByChild', file.name]);
if (file.phash == dst.hash) {
if (dfrd.state() === 'rejected') {
cutDfrd = jQuery.Deferred();
if (cut && self.options.moveConfirm) {
text : fm.i18n('confirmMove', dst.i18 || dst.name),
cutDfrd.done(function() {
dfrd.resolve(pr && pr.undo? pr : void(0));