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