/**
* elFinder resources registry.
* Store shared data
*
* @type Object
* @author Dmitry (dio) Levashov
**/
elFinder.prototype.resources = {
'class' : {
hover : 'ui-state-hover',
active : 'ui-state-active',
disabled : 'ui-state-disabled',
draggable : 'ui-draggable',
droppable : 'ui-droppable',
adroppable : 'elfinder-droppable-active',
cwdfile : 'elfinder-cwd-file',
cwd : 'elfinder-cwd',
tree : 'elfinder-tree',
treeroot : 'elfinder-navbar-root',
navdir : 'elfinder-navbar-dir',
navdirwrap : 'elfinder-navbar-dir-wrapper',
navarrow : 'elfinder-navbar-arrow',
navsubtree : 'elfinder-navbar-subtree',
navcollapse : 'elfinder-navbar-collapsed',
navexpand : 'elfinder-navbar-expanded',
treedir : 'elfinder-tree-dir',
placedir : 'elfinder-place-dir',
searchbtn : 'elfinder-button-search',
editing : 'elfinder-to-editing',
preventback : 'elfinder-prevent-back',
tabstab : 'ui-state-default ui-tabs-tab ui-corner-top ui-tab',
tabsactive : 'ui-tabs-active ui-state-active'
},
tpl : {
perms : '<span class="elfinder-perms"></span>',
lock : '<span class="elfinder-lock"></span>',
symlink : '<span class="elfinder-symlink"></span>',
navicon : '<span class="elfinder-nav-icon"></span>',
navspinner : '<span class="elfinder-spinner elfinder-navbar-spinner"></span>',
navdir : '<div class="elfinder-navbar-wrapper{root}"><span id="{id}" class="ui-corner-all elfinder-navbar-dir {cssclass}"{title}><span class="elfinder-navbar-arrow"></span><span class="elfinder-navbar-icon" {style}></span>{symlink}{permissions}{name}</span><div class="elfinder-navbar-subtree" style="display:none"></div></div>',
placedir : '<div class="elfinder-navbar-wrapper"><span id="{id}" class="ui-corner-all elfinder-navbar-dir {cssclass}"{title}><span class="elfinder-navbar-arrow"></span><span class="elfinder-navbar-icon" {style}></span>{symlink}{permissions}{name}</span><div class="elfinder-navbar-subtree" style="display:none"></div></div>'
},
// mimes.text will be overwritten with connector config if `textMimes` is included in initial response
// @see php/elFInder.class.php `public static $textMimes`
mimes : {
text : [
'application/dash+xml',
'application/docbook+xml',
'application/javascript',
'application/json',
'application/plt',
'application/sat',
'application/sql',
'application/step',
'application/vnd.hp-hpgl',
'application/x-awk',
'application/x-config',
'application/x-csh',
'application/x-empty',
'application/x-mpegurl',
'application/x-perl',
'application/x-php',
'application/x-web-config',
'application/xhtml+xml',
'application/xml',
'audio/x-mp3-playlist',
'image/cgm',
'image/svg+xml',
'image/vnd.dxf',
'model/iges'
]
},
mixin : {
make : function() {
"use strict";
var self = this,
fm = this.fm,
cmd = this.name,
req = this.requestCmd || cmd,
wz = fm.getUI('workzone'),
org = (this.origin && this.origin === 'navbar')? 'tree' : 'cwd',
tree = (org === 'tree'),
find = tree? 'navHash2Elm' : 'cwdHash2Elm',
tarea= (! tree && fm.storage('view') != 'list'),
sel = fm.selected(),
move = this.move || false,
empty= wz.hasClass('elfinder-cwd-wrapper-empty'),
unselect = function() {
requestAnimationFrame(function() {
input && input.trigger('blur');
});
},
rest = function(){
if (!overlay.is(':hidden')) {
overlay.elfinderoverlay('hide').off('click close', cancel);
}
if (nnode) {
pnode.removeClass('ui-front')
.css('position', '')
.off('unselect.'+fm.namespace, unselect);
if (tarea) {
nnode && nnode.css('max-height', '');
} else if (!tree) {
pnode.css('width', '')
.parent('td').css('overflow', '');
}
}
}, colwidth,
dfrd = jQuery.Deferred()
.fail(function(error) {
dstCls && dst.attr('class', dstCls);
empty && wz.addClass('elfinder-cwd-wrapper-empty');
if (sel) {
move && fm.trigger('unlockfiles', {files: sel});
fm.clipboard([]);
fm.trigger('selectfiles', { files: sel });
}
error && fm.error(error);
})
.always(function() {
rest();
cleanup();
fm.enable().unbind('open', openCallback).trigger('resMixinMake');
}),
id = 'tmp_'+parseInt(Math.random()*100000),
phash = this.data && this.data.target? this.data.target : (tree? fm.file(sel[0]).hash : fm.cwd().hash),
date = new Date(),
file = {
hash : id,
phash : phash,
name : fm.uniqueName(this.prefix, phash),
mime : this.mime,
read : true,
write : true,
date : 'Today '+date.getHours()+':'+date.getMinutes(),
move : move
},
dum = fm.getUI(org).trigger('create.'+fm.namespace, file),
data = this.data || {},
node = fm[find](id),
nnode, pnode,
overlay = fm.getUI('overlay'),
cleanup = function() {
if (node && node.length) {
input.off();
node.hide();
fm.unselectfiles({files : [id]}).unbind('resize', resize);
requestAnimationFrame(function() {
if (tree) {
node.closest('.elfinder-navbar-wrapper').remove();
} else {
node.remove();
}
});
}
},
cancel = function(e) {
if (!overlay.is(':hidden')) {
pnode.css('z-index', '');
}
if (! inError) {
cleanup();
dfrd.reject();
if (e) {
e.stopPropagation();
e.preventDefault();
}
}
},
input = jQuery(tarea? '<textarea></textarea>' : '<input type="text"/>')
.on('keyup text', function(){
if (tarea) {
this.style.height = '1px';
this.style.height = this.scrollHeight + 'px';
} else if (colwidth) {
this.style.width = colwidth + 'px';
if (this.scrollWidth > colwidth) {
this.style.width = this.scrollWidth + 10 + 'px';
}
}
})
.on('keydown', function(e) {
e.stopImmediatePropagation();
if (e.keyCode == jQuery.ui.keyCode.ESCAPE) {
dfrd.reject();
} else if (e.keyCode == jQuery.ui.keyCode.ENTER) {
e.preventDefault();
input.trigger('blur');
}
})
.on('mousedown click dblclick', function(e) {
e.stopPropagation();
if (e.type === 'dblclick') {
e.preventDefault();
}
})
.on('blur', function() {
var name = jQuery.trim(input.val()),
parent = input.parent(),
valid = true,
cut;
if (!overlay.is(':hidden')) {
pnode.css('z-index', '');
}
if (name === '') {
return cancel();
}
if (!inError && parent.length) {
if (fm.options.validName && fm.options.validName.test) {
try {
valid = fm.options.validName.test(name);
} catch(e) {
valid = false;
}
}
if (!name || name === '.' || name === '..' || !valid) {
inError = true;
fm.error(file.mime === 'directory'? 'errInvDirname' : 'errInvName', {modal: true, close: function(){setTimeout(select, 120);}});
return false;
}
if (fm.fileByName(name, phash)) {
inError = true;
fm.error(['errExists', name], {modal: true, close: function(){setTimeout(select, 120);}});
return false;
}
cut = (sel && move)? fm.exec('cut', sel) : null;
jQuery.when(cut)
.done(function() {
var toast = {},
nextAct = {};
rest();
input.hide().before(jQuery('<span>').text(name));
fm.lockfiles({files : [id]});
fm.request({
data : Object.assign({cmd : req, name : name, target : phash}, data || {}),
notify : {type : req, cnt : 1},
preventFail : true,
syncOnFail : true,
navigate : {toast : toast},
})
.fail(function(error) {
fm.unlockfiles({files : [id]});
inError = true;
input.show().prev().remove();
fm.error(error, {
modal: true,
cl