185 lines
5.2 KiB
JavaScript
185 lines
5.2 KiB
JavaScript
/**
|
|
* @class elFinder ui
|
|
* Display current folder path in statusbar.
|
|
* Click on folder name in path - open folder
|
|
*
|
|
* @author Dmitry (dio) Levashov
|
|
**/
|
|
jQuery.fn.elfinderpath = function(fm, options) {
|
|
"use strict";
|
|
return this.each(function() {
|
|
var query = '',
|
|
target = '',
|
|
mimes = [],
|
|
place = 'statusbar',
|
|
clHover= fm.res('class', 'hover'),
|
|
prefix = 'path' + (elFinder.prototype.uniqueid? elFinder.prototype.uniqueid : '') + '-',
|
|
wzbase = jQuery('<div class="ui-widget-header ui-helper-clearfix elfinder-workzone-path"></div>'),
|
|
path = jQuery(this).addClass('elfinder-path').html(' ')
|
|
.on('mousedown', 'span.elfinder-path-dir', function(e) {
|
|
var hash = jQuery(this).attr('id').substr(prefix.length);
|
|
e.preventDefault();
|
|
if (hash != fm.cwd().hash) {
|
|
jQuery(this).addClass(clHover);
|
|
if (query) {
|
|
fm.exec('search', query, { target: hash, mime: mimes.join(' ') });
|
|
} else {
|
|
fm.trigger('select', {selected : [hash]}).exec('open', hash);
|
|
}
|
|
}
|
|
})
|
|
.prependTo(fm.getUI('statusbar').show()),
|
|
roots = jQuery('<div class="elfinder-path-roots"></div>').on('click', function(e) {
|
|
e.stopPropagation();
|
|
e.preventDefault();
|
|
|
|
var roots = jQuery.map(fm.roots, function(h) { return fm.file(h); }),
|
|
raw = [];
|
|
|
|
jQuery.each(roots, function(i, f) {
|
|
if (! f.phash && fm.root(fm.cwd().hash, true) !== f.hash) {
|
|
raw.push({
|
|
label : fm.escape(f.i18 || f.name),
|
|
icon : 'home',
|
|
callback : function() { fm.exec('open', f.hash); },
|
|
options : {
|
|
iconClass : f.csscls || '',
|
|
iconImg : f.icon || ''
|
|
}
|
|
});
|
|
}
|
|
});
|
|
fm.trigger('contextmenu', {
|
|
raw: raw,
|
|
x: e.pageX,
|
|
y: e.pageY
|
|
});
|
|
}).append('<span class="elfinder-button-icon elfinder-button-icon-menu" ></span>').appendTo(wzbase),
|
|
render = function(cwd) {
|
|
var dirs = [],
|
|
names = [];
|
|
jQuery.each(fm.parents(cwd), function(i, hash) {
|
|
var c = (cwd === hash)? 'elfinder-path-dir elfinder-path-cwd' : 'elfinder-path-dir',
|
|
f = fm.file(hash),
|
|
name = fm.escape(f.i18 || f.name);
|
|
names.push(name);
|
|
dirs.push('<span id="'+prefix+hash+'" class="'+c+'" title="'+names.join(fm.option('separator'))+'">'+name+'</span>');
|
|
});
|
|
return dirs.join('<span class="elfinder-path-other">'+fm.option('separator')+'</span>');
|
|
},
|
|
toWorkzone = function() {
|
|
var prev;
|
|
path.children('span.elfinder-path-dir').attr('style', '');
|
|
prev = fm.direction === 'ltr'? jQuery('#'+prefix + fm.cwd().hash).prevAll('span.elfinder-path-dir:first') : jQuery();
|
|
path.scrollLeft(prev.length? prev.position().left : 0);
|
|
},
|
|
fit = function() {
|
|
if (fm.UA.CSS.flex) {
|
|
return;
|
|
}
|
|
var dirs = path.children('span.elfinder-path-dir'),
|
|
cnt = dirs.length,
|
|
m, bg = 0, ids;
|
|
|
|
if (place === 'workzone' || cnt < 2) {
|
|
dirs.attr('style', '');
|
|
return;
|
|
}
|
|
path.width(path.css('max-width'));
|
|
dirs.css({maxWidth: (100/cnt)+'%', display: 'inline-block'});
|
|
m = path.width() - 9;
|
|
path.children('span.elfinder-path-other').each(function() {
|
|
m -= jQuery(this).width();
|
|
});
|
|
ids = [];
|
|
dirs.each(function(i) {
|
|
var dir = jQuery(this),
|
|
w = dir.width();
|
|
m -= w;
|
|
if (w < this.scrollWidth) {
|
|
ids.push(i);
|
|
}
|
|
});
|
|
path.width('');
|
|
if (ids.length) {
|
|
if (m > 0) {
|
|
m = m / ids.length;
|
|
jQuery.each(ids, function(i, k) {
|
|
var d = jQuery(dirs[k]);
|
|
d.css('max-width', d.width() + m);
|
|
});
|
|
}
|
|
dirs.last().attr('style', '');
|
|
} else {
|
|
dirs.attr('style', '');
|
|
}
|
|
},
|
|
hasUiTree, hasUiStat;
|
|
|
|
fm.one('init', function() {
|
|
hasUiTree = fm.getUI('tree').length;
|
|
hasUiStat = fm.getUI('stat').length;
|
|
if (! hasUiTree && options.toWorkzoneWithoutNavbar) {
|
|
wzbase.append(path).insertBefore(fm.getUI('workzone'));
|
|
place = 'workzone';
|
|
fm.bind('open', toWorkzone)
|
|
.one('opendone', function() {
|
|
fm.getUI().trigger('resize');
|
|
});
|
|
}
|
|
})
|
|
.bind('open searchend parents', function() {
|
|
var dirs = [];
|
|
|
|
query = '';
|
|
target = '';
|
|
mimes = [];
|
|
|
|
path.html(render(fm.cwd().hash));
|
|
if (Object.keys(fm.roots).length > 1) {
|
|
path.css('margin', '');
|
|
roots.show();
|
|
} else {
|
|
path.css('margin', 0);
|
|
roots.hide();
|
|
}
|
|
!hasUiStat && fit();
|
|
})
|
|
.bind('searchstart', function(e) {
|
|
if (e.data) {
|
|
query = e.data.query || '';
|
|
target = e.data.target || '';
|
|
mimes = e.data.mimes || [];
|
|
}
|
|
})
|
|
.bind('search', function(e) {
|
|
var dirs = [],
|
|
html = '';
|
|
if (target) {
|
|
html = render(target);
|
|
} else {
|
|
html = fm.i18n('btnAll');
|
|
}
|
|
path.html('<span class="elfinder-path-other">'+fm.i18n('searcresult') + ': </span>' + html);
|
|
fit();
|
|
})
|
|
// on swipe to navbar show/hide
|
|
.bind('navbarshow navbarhide', function() {
|
|
var wz = fm.getUI('workzone');
|
|
if (this.type === 'navbarshow') {
|
|
fm.unbind('open', toWorkzone);
|
|
path.prependTo(fm.getUI('statusbar'));
|
|
wzbase.detach();
|
|
place = 'statusbar';
|
|
} else {
|
|
wzbase.append(path).insertBefore(wz);
|
|
place = 'workzone';
|
|
toWorkzone();
|
|
fm.bind('open', toWorkzone);
|
|
}
|
|
fm.trigger('uiresize');
|
|
})
|
|
.bind('resize uistatchange', fit);
|
|
});
|
|
};
|