Skip to content

Commit 4fca27a

Browse files
authored
Merge pull request #18 from qlux/master
Allow per-column sort functions
2 parents 4a8cb94 + 9322bc7 commit 4fca27a

File tree

2 files changed

+33
-6
lines changed

2 files changed

+33
-6
lines changed

README.md

+1
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ $("div#id").jstree({
6060
* `valueClassPrefix`: a prefix to add to the valueClass to use as a class on this cell
6161
* `wideValueClass`: the attribute on the node to use as a class on this cell - added to the <div>
6262
* `wideValueClassPrefix`: a prefix to add to the wideValueClass to use as a class on this cell
63+
* `sort`: a function to sort the column when the header is clicked - does not replace the default sorting function used for the first column
6364
* `resizable`: true/false if the columns should be resizable. Defaults to false.
6465
* `draggable`: true/false if the columns should be draggable (requires jQuery UI with sortable plugin). Defaults to false.
6566
* `stateful`: true/false. If true, then whenever a column width is resized, it will store it in html5 localStorage, if available. Defaults to false.

jstreetable.js

+32-6
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@
3131
SPECIAL_TITLE = "_DATA_", LEVELINDENT = 24, styled = false, TABLECELLID_PREFIX = "jstable_",TABLECELLID_POSTFIX = "_col",
3232
MINCOLWIDTH = 10,
3333
findDataCell = function (from,id) {
34-
return from.find("div["+NODE_DATA_ATTR+'="'+id+'"]');
34+
return from.find("div["+NODE_DATA_ATTR+'="'+ escapeId(id) +'"]');
3535
},
3636
isClickedSep = false, toResize = null, oldMouseX = 0, newMouseX = 0;
3737

@@ -148,6 +148,7 @@
148148
draggable : s.draggable,
149149
stateful: s.stateful,
150150
indent: 0,
151+
sortFn: [],
151152
sortOrder: 'text',
152153
sortAsc: true,
153154
fixedHeader: s.fixedHeader !== false,
@@ -160,6 +161,10 @@
160161
}, cols = gs.columns, treecol = 0;
161162
// find which column our tree shuld go in
162163
for (i=0;i<s.columns.length;i++) {
164+
//Save sort function
165+
if (i!==0 && s.columns[i].sort) {
166+
gs.sortFn[s.columns[i].value] = s.columns[i].sort;
167+
}
163168
if (s.columns[i].tree) {
164169
// save which column it was
165170
treecol = i;
@@ -244,17 +249,38 @@
244249
var bigger;
245250

246251
if (gs.sortOrder==='text') {
247-
bigger = (defaultSort(a, b) === 1);
252+
bigger = defaultSort(a, b);
248253
} else {
249254
var nodeA = this.get_node(a);
250255
var nodeB = this.get_node(b);
251-
bigger = nodeA.data[gs.sortOrder] > nodeB.data[gs.sortOrder];
256+
var valueA = nodeA.data[gs.sortOrder];
257+
var valueB = nodeB.data[gs.sortOrder];
258+
if(valueA && valueB){
259+
if(gs.sortFn[gs.sortOrder]){
260+
bigger = gs.sortFn[gs.sortOrder](valueA, valueB, nodeA, nodeB);
261+
}else{
262+
// Default sorting
263+
bigger = (valueA > valueB ? 1 : -1);
264+
}
265+
}else{
266+
// undefined is second
267+
if(valueA){
268+
bigger = 1;
269+
}else if(valueB){
270+
bigger = -1;
271+
}else{
272+
// Compare two nodes without values
273+
bigger = defaultSort(a, b);
274+
}
275+
}
252276
}
253277

254-
if (gs.sortAsc===false)
255-
bigger = !bigger;
278+
if (gs.sortAsc===false){
279+
bigger = -bigger;
256280

257-
return bigger ? 1 : -1;
281+
}
282+
283+
return bigger;
258284
};
259285

260286
// sortable columns when jQuery UI is available

0 commit comments

Comments
 (0)