/**
* @class elFinder command "sort"
* Change sort files rule
*
* @author Dmitry (dio) Levashov
**/
elFinder.prototype.commands.sort = function() {
"use strict";
var self = this,
fm = self.fm,
setVar = function() {
self.variants = [];
jQuery.each(fm.sortRules, function(name, value) {
if (fm.sorters[name]) {
var arr = (name === fm.sortType)? (fm.sortOrder === 'asc'? 'n' : 's') : '';
self.variants.push([name, (arr? '' : '') + ' ' + fm.i18n('sort'+name)]);
}
});
self.variants.push('|');
self.variants.push([
'stick',
(fm.sortStickFolders? '' : '') + ' ' + fm.i18n('sortFoldersFirst')
]);
if (fm.ui.tree && fm.options.sortAlsoTreeview !== null) {
self.variants.push('|');
self.variants.push([
'tree',
(fm.sortAlsoTreeview? '' : '') + ' ' + fm.i18n('sortAlsoTreeview')
]);
}
updateContextmenu();
},
updateContextmenu = function() {
var cm = fm.getUI('contextmenu'),
icon, sub;
if (cm.is(':visible')) {
icon = cm.find('span.elfinder-button-icon-sort');
sub = icon.siblings('div.elfinder-contextmenu-sub');
sub.find('span.ui-icon').remove();
sub.children('div.elfinder-contextsubmenu-item').each(function() {
var tgt = jQuery(this).children('span'),
name = tgt.text().trim(),
arr;
if (name === (i18Name.stick || (i18Name.stick = fm.i18n('sortFoldersFirst')))) {
if (fm.sortStickFolders) {
tgt.prepend('');
}
} else if (name === (i18Name.tree || (i18Name.tree = fm.i18n('sortAlsoTreeview')))) {
if (fm.sortAlsoTreeview) {
tgt.prepend('');
}
} else if (name === (i18Name[fm.sortType] || (i18Name[fm.sortType] = fm.i18n('sort' + fm.sortType)))) {
arr = fm.sortOrder === 'asc'? 'n' : 's';
tgt.prepend('');
}
});
}
},
i18Name = {};
/**
* Command options
*
* @type Object
*/
this.options = {ui : 'sortbutton'};
this.keepContextmenu = true;
fm.bind('sortchange', setVar)
.bind('sorterupdate', function() {
setVar();
fm.getUI().children('.elfinder-button-sort-menu').children('.elfinder-button-menu-item').each(function() {
var tgt = jQuery(this),
rel = tgt.attr('rel');
tgt.toggle(!!(! rel || fm.sorters[rel]));
});
})
.bind('cwdrender', function() {
var cols = jQuery(fm.cwd).find('div.elfinder-cwd-wrapper-list table');
if (cols.length) {
jQuery.each(fm.sortRules, function(name, value) {
var td = cols.find('thead tr td.elfinder-cwd-view-th-'+name);
if (td.length) {
var current = ( name == fm.sortType),
sort = {
type : name,
order : current ? fm.sortOrder == 'asc' ? 'desc' : 'asc' : fm.sortOrder
},arr;
if (current) {
td.addClass('ui-state-active');
arr = fm.sortOrder == 'asc' ? 'n' : 's';
jQuery('').appendTo(td);
}
jQuery(td).on('click', function(e){
if (! jQuery(this).data('dragging')) {
e.stopPropagation();
if (! fm.getUI('cwd').data('longtap')) {
fm.exec('sort', [], sort);
}
}
})
.on('mouseenter mouseleave', function(e) {
jQuery(this).toggleClass('ui-state-hover', e.type === 'mouseenter');
});
}
});
}
});
this.getstate = function() {
return 0;
};
this.exec = function(hashes, cOpt) {
var fm = this.fm,
sortopt = jQuery.isPlainObject(cOpt)? cOpt : (function() {
cOpt += '';
var sOpts = {};
if (cOpt === 'stick') {
sOpts.stick = !fm.sortStickFolders;
} else if (cOpt === 'tree') {
sOpts.tree = !fm.sortAlsoTreeview;
} else if (fm.sorters[cOpt]) {
if (fm.sortType === cOpt) {
sOpts.order = fm.sortOrder === 'asc'? 'desc' : 'asc';
} else {
sOpts.type = cOpt;
}
}
return sOpts;
})(),
sort = Object.assign({
type : fm.sortType,
order : fm.sortOrder,
stick : fm.sortStickFolders,
tree : fm.sortAlsoTreeview
}, sortopt);
return fm.lazy(function() {
fm.setSort(sort.type, sort.order, sort.stick, sort.tree);
this.resolve();
});
};
};