mirror of
https://github.com/lrsjng/h5ai.git
synced 2025-03-22 13:30:05 +01:00
Improves sort extension.
This commit is contained in:
parent
f5bef0072a
commit
aef4facdb3
@ -3,7 +3,6 @@ modulejs.define('ext/sort', ['_', '$', 'core/settings', 'core/resource', 'core/e
|
||||
|
||||
var settings = _.extend({
|
||||
enabled: false,
|
||||
order: 'na',
|
||||
column: 0,
|
||||
reverse: false,
|
||||
ignorecase: true,
|
||||
@ -12,18 +11,46 @@ modulejs.define('ext/sort', ['_', '$', 'core/settings', 'core/resource', 'core/e
|
||||
|
||||
storekey = 'sort.order',
|
||||
|
||||
type = function (item) {
|
||||
getType = function (item) {
|
||||
|
||||
var $item = $(item);
|
||||
|
||||
if ($item.hasClass('folder-parent')) {
|
||||
return 0;
|
||||
} else if ($item.hasClass('folder')) {
|
||||
}
|
||||
if ($item.hasClass('folder')) {
|
||||
return 1;
|
||||
}
|
||||
return 2;
|
||||
},
|
||||
|
||||
getName = function (item) {
|
||||
|
||||
return $(item).find('.label').text();
|
||||
},
|
||||
|
||||
getTime = function (item) {
|
||||
|
||||
return $(item).find('.date').data('time');
|
||||
},
|
||||
|
||||
getSize = function (item) {
|
||||
|
||||
return $(item).find('.size').data('bytes');
|
||||
},
|
||||
|
||||
columnGetters = {
|
||||
0: getName,
|
||||
1: getTime,
|
||||
2: getSize
|
||||
},
|
||||
|
||||
columnClasses = {
|
||||
0: 'label',
|
||||
1: 'date',
|
||||
2: 'size'
|
||||
},
|
||||
|
||||
// Natural Sort algorithm for Javascript - Version 0.7 - Released under MIT license
|
||||
// Author: Jim Palmer (based on chunking idea from Dave Koelle)
|
||||
//
|
||||
@ -36,8 +63,8 @@ modulejs.define('ext/sort', ['_', '$', 'core/settings', 'core/resource', 'core/e
|
||||
hre = /^0x[0-9a-f]+$/i,
|
||||
ore = /^0/,
|
||||
// convert all to strings strip whitespace
|
||||
x = ('' + val1).replace(sre, '') || '',
|
||||
y = ('' + val2).replace(sre, '') || '',
|
||||
x = ('' + val1).replace(sre, ''),
|
||||
y = ('' + val2).replace(sre, ''),
|
||||
// chunk/tokenize
|
||||
xN = x.replace(re, '\0$1\0').replace(/\0$/,'').replace(/^\0/,'').split('\0'),
|
||||
yN = y.replace(re, '\0$1\0').replace(/\0$/,'').replace(/^\0/,'').split('\0'),
|
||||
@ -73,13 +100,13 @@ modulejs.define('ext/sort', ['_', '$', 'core/settings', 'core/resource', 'core/e
|
||||
|
||||
var res, val1, val2;
|
||||
|
||||
res = type(item1) - type(item2);
|
||||
res = getType(item1) - getType(item2);
|
||||
if (res !== 0) {
|
||||
return res;
|
||||
}
|
||||
|
||||
val1 = getVal(item1);
|
||||
val2 = getVal(item2);
|
||||
val1 = '' + getVal(item1);
|
||||
val2 = '' + getVal(item2);
|
||||
|
||||
if (ignorecase) {
|
||||
val1 = val1.toLowerCase();
|
||||
@ -96,34 +123,24 @@ modulejs.define('ext/sort', ['_', '$', 'core/settings', 'core/resource', 'core/e
|
||||
};
|
||||
},
|
||||
|
||||
getName = function (item) {
|
||||
sortItems = function (column, reverse) {
|
||||
|
||||
return $(item).find('.label').text();
|
||||
},
|
||||
getTime = function (item) {
|
||||
var headers = $('#items li.header a'),
|
||||
header = $("#items li.header a." + columnClasses[column]),
|
||||
|
||||
return $(item).find('.date').data('time');
|
||||
},
|
||||
getSize = function (item) {
|
||||
fn = cmpFn(columnGetters[column], reverse, settings.ignorecase, settings.natural),
|
||||
|
||||
return $(item).find('.size').data('bytes');
|
||||
},
|
||||
current = $('#items .item'),
|
||||
sorted = $('#items .item').sort(fn);
|
||||
|
||||
$all, orders,
|
||||
store.put(storekey, {column: column, reverse: reverse});
|
||||
|
||||
sortBy = function (id) {
|
||||
headers.removeClass('ascending descending');
|
||||
header.addClass(reverse ? 'descending' : 'ascending');
|
||||
|
||||
var order = orders[id];
|
||||
|
||||
store.put(storekey, id);
|
||||
|
||||
$all.removeClass('ascending').removeClass('descending');
|
||||
order.head.addClass(order.clas);
|
||||
var current = $('#items .item');
|
||||
var sorted = $('#items .item').sort(order.fn);
|
||||
for (var i = 0, l = current.length; i < l; i += 1) {
|
||||
if (current[i] !== sorted[i]) {
|
||||
sorted.detach().sort(order.fn).appendTo('#items');
|
||||
sorted.detach().sort(fn).appendTo('#items');
|
||||
break;
|
||||
}
|
||||
}
|
||||
@ -131,7 +148,11 @@ modulejs.define('ext/sort', ['_', '$', 'core/settings', 'core/resource', 'core/e
|
||||
|
||||
onContentChanged = function (item) {
|
||||
|
||||
sortBy(store.get(storekey) || settings.order);
|
||||
var order = store.get(storekey),
|
||||
column = order.column || settings.column,
|
||||
reverse = order.reverse || settings.reverse;
|
||||
|
||||
sortItems(column, reverse);
|
||||
},
|
||||
|
||||
init = function () {
|
||||
@ -145,66 +166,26 @@ modulejs.define('ext/sort', ['_', '$', 'core/settings', 'core/resource', 'core/e
|
||||
$header = $('#items li.header'),
|
||||
$label = $header.find('a.label'),
|
||||
$date = $header.find('a.date'),
|
||||
$size = $header.find('a.size'),
|
||||
column = settings.column,
|
||||
reverse = settings.reverse,
|
||||
ignorecase = settings.ignorecase,
|
||||
natural = settings.natural;
|
||||
|
||||
$all = $header.find('a.label,a.date,a.size');
|
||||
orders = {
|
||||
na: {
|
||||
head: $label,
|
||||
clas: 'ascending',
|
||||
fn: cmpFn(getName, false, ignorecase, natural)
|
||||
},
|
||||
nd: {
|
||||
head: $label,
|
||||
clas: 'descending',
|
||||
fn: cmpFn(getName, true, ignorecase, natural)
|
||||
},
|
||||
da: {
|
||||
head: $date,
|
||||
clas: 'ascending',
|
||||
fn: cmpFn(getTime, false, ignorecase, natural)
|
||||
},
|
||||
dd: {
|
||||
head: $date,
|
||||
clas: 'descending',
|
||||
fn: cmpFn(getTime, true, ignorecase, natural)
|
||||
},
|
||||
sa: {
|
||||
head: $size,
|
||||
clas: 'ascending',
|
||||
fn: cmpFn(getSize, false, ignorecase, natural)
|
||||
},
|
||||
sd: {
|
||||
head: $size,
|
||||
clas: 'descending',
|
||||
fn: cmpFn(getSize, true, ignorecase, natural)
|
||||
}
|
||||
};
|
||||
|
||||
sortBy(store.get(storekey) || settings.order);
|
||||
$size = $header.find('a.size');
|
||||
|
||||
$label
|
||||
.append($ascending.clone()).append($descending.clone())
|
||||
.click(function (event) {
|
||||
sortBy('n' + ($label.hasClass('ascending') ? 'd' : 'a'));
|
||||
sortItems(0, $(this).hasClass('ascending'));
|
||||
event.preventDefault();
|
||||
});
|
||||
|
||||
$date
|
||||
.prepend($ascending.clone()).prepend($descending.clone())
|
||||
.click(function (event) {
|
||||
sortBy('d' + ($date.hasClass('ascending') ? 'd' : 'a'));
|
||||
sortItems(1, $(this).hasClass('ascending'));
|
||||
event.preventDefault();
|
||||
});
|
||||
|
||||
$size
|
||||
.prepend($ascending.clone()).prepend($descending.clone())
|
||||
.click(function (event) {
|
||||
sortBy('s' + ($size.hasClass('ascending') ? 'd' : 'a'));
|
||||
sortItems(2, $(this).hasClass('ascending'));
|
||||
event.preventDefault();
|
||||
});
|
||||
|
||||
|
@ -270,20 +270,16 @@ Options
|
||||
},
|
||||
|
||||
/*
|
||||
Default sort order is a two letter code. The first letter specifies
|
||||
the column: "n" for "Name", "d" for "Date" or "s" for "Size". The
|
||||
second letter specifies the sort order: "a" for "ascending" or "d"
|
||||
for "descending".
|
||||
Default sort order.
|
||||
"column" and "reverse" are locally stored.
|
||||
|
||||
- order: "na", "nd", "da", "dd", "sa" or "sd"
|
||||
- column: [NOT USED] 0 for "Name", 1 for "Date", 2 for "Size"
|
||||
- reverse: [NOT USED] false for ascending, true for descending
|
||||
- ignorecase: compare ignorecase
|
||||
- natural: use natural sort order
|
||||
- column: int, 0 for "Name", 1 for "Date", 2 for "Size"
|
||||
- reverse: boolean, false for ascending, true for descending
|
||||
- ignorecase: boolean, compare ignorecase
|
||||
- natural: boolean, use natural sort order
|
||||
*/
|
||||
"sort": {
|
||||
"enabled": true,
|
||||
"order": "na",
|
||||
"column": 0,
|
||||
"reverse": false,
|
||||
"ignorecase": true,
|
||||
|
Loading…
x
Reference in New Issue
Block a user