-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathjquery.sorter.js
130 lines (114 loc) · 5.54 KB
/
jquery.sorter.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
/* =========================================================
* jquery table sorter plugin *
* =========================================================
* Ivanenko Danil
* =========================================================
* Используется для сортировки html таблиц. Можно использовать для ajax сортировки данных в таблице.
* html таблица должна быть оформлена следующим образом:
* <table id="sortable">
* <tr>
* <th sortby="first_name">User</th>
* <th sortby="date">Date</th>
* <th>Price</th>
* </tr>
* ......
* В ячейках заголовка таблицы с параметром sortby будет отображена иконка сортировки. При клике на ячейке будет отправлен запрос следующего вида на сервер:
* http://server.com/somepage.html?sortby=first_name&sortorder=asc
*
* Пример использования:
* $("#sortable").tableSorter();
*
* Пример использования для ajax-сортировки, без перезагрузки страницы
* $("#sortable").tableSorter({
* callback: function(sortBy, sortOrder){
* $.getJSON(getDataURL, {
* parameter1 : 0,
* sortby: sortBy,
* sortorder: sortOrder
* }, some_Function_Redrawing_Your_Table_Body);
* }
* });
*
* Параметры плагина
* callback - функция, которая будет вызвана после перерисовки иконок в заголовке, страница не будет перезагружена. Функция должна принимать два параметра - sortby, sortorder
* saveUrlParams - true\false. Передавать другие параметры в URL на сервер, кроме sortby, sortorder или нет
* sorterDefaultClass - класс, используемый для отображения несортированного заголовка, по умолчанию "sorter"
* sorterAscClass - класс, используемый для отображения сортированного по возрастанию заголовка. По умолчанию "sorter-asc"
* sorterDescClass - класс, используемый для отображения сортированного по убыванию заголовка. По умолчанию "sorter-desc"
*
*/
(function($) {
getParameterByName = function(name) {
var match = RegExp('[?&]' + name + '=([^&]*)').exec(window.location.search);
return match && decodeURIComponent(match[1].replace(/\+/g, ' '));
},
removeURLParam = function (url, param)
{
var urlparts= url.split('?');
if (urlparts.length>=2)
{
var prefix= encodeURIComponent(param)+'=';
var pars= urlparts[1].split(/[&;]/g);
for (var i=pars.length; i-- > 0;)
if (pars[i].indexOf(prefix, 0)==0)
pars.splice(i, 1);
if (pars.length > 0)
return urlparts[0]+'?'+pars.join('&');
else
return urlparts[0];
}
else
return url;
},
$.fn.tableSorter = function( options ) {
// Establish our default settings
var settings = $.extend({
saveUrlParams: false,
callback: null,
sorterDefaultClass: "sorter",
sorterAscClass: "sorter-asc",
sorterDescClass: "sorter-desc"
}, options);
this.find("th").addClass("header");
this.find("[sortby]").append(' <i class="'+settings.sorterDefaultClass+'"></i>');
var sortBy = getParameterByName("sortby");
var sortOrder = getParameterByName("sortorder");
if(sortBy!=null){
var strIcon = '<i class="'+settings.sorterAscClass+'"></i>';
if(sortOrder==null)
sortOrder = "asc";
if(sortOrder=="desc")
strIcon = '<i class="'+settings.sorterDescClass+'"></i>';
this.find("[sortby="+sortBy+"]").find("i").replaceWith(strIcon);
this.find("[sortby="+sortBy+"]").attr("sortorder", sortOrder).addClass("sorted-column");
}
var sorter = this;
this.on("click", "[sortby]", function(){
var sortOrder = $(this).attr("sortorder");
var sortBy = $(this).attr("sortby");
sortOrder = (sortOrder=="asc" ? "desc" : "asc");
if ( $.isFunction( settings.callback ) ) {
var strIcon = '<i class="sorter-asc"></i>';
if(sortOrder=="desc")
strIcon = '<i class="sorter-desc"></i>';
sorter.find("[sortby]")
.removeClass("sorted-column")
.removeAttr("sortorder")
.find("i").replaceWith('<i class="sorter"></i>');
$(this).find("i").replaceWith(strIcon);
$(this).attr("sortorder", sortOrder).addClass("sorted-column");
settings.callback.call( this, sortBy, sortOrder );
return;
}
if(settings.saveUrlParams==true){
var url = removeURLParam(window.location.href, "sortby");
url = removeURLParam(url, "sortorder");
var start = url.indexOf("?")>0 ? '&': '?' ;
window.location = url + start+"sortby="+$(this).attr("sortby")+"&sortorder="+sortOrder;
} else {
var url = window.location.href.split("?")[0];
window.location = url + "?sortby="+$(this).attr("sortby")+"&sortorder="+sortOrder;
}
});
}
}(jQuery));