Skip to content

Commit

Permalink
Update buttons when sorting programmatically
Browse files Browse the repository at this point in the history
  • Loading branch information
javve committed Feb 3, 2014
1 parent 29f8cce commit 6123880
Show file tree
Hide file tree
Showing 2 changed files with 42 additions and 19 deletions.
48 changes: 29 additions & 19 deletions src/sort.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,9 @@ var naturalSort = require('natural-sort'),
getAttribute = require('get-attribute');

module.exports = function(list) {
var sortButtons, options, valueName;

list.sortFunction = list.sortFunction || function(itemA, itemB) {
return naturalSort(itemA.values()[valueName], itemB.values()[valueName], options);
list.sortFunction = list.sortFunction || function(itemA, itemB, options) {
options.desc = options.order == "desc" ? true : false; // Natural sort uses this format
return naturalSort(itemA.values()[options.valueName], itemB.values()[options.valueName], options);
};

var buttons = {
Expand All @@ -19,16 +18,16 @@ module.exports = function(list) {
classes(buttons.els[i]).remove('desc');
}
},
getOrder: function(btn, options) {
getOrder: function(btn) {
var predefinedOrder = getAttribute(btn, 'data-order');
if (predefinedOrder == "asc" || predefinedOrder == "desc") {
options.order = predefinedOrder;
return predefinedOrder;
} else if (classes(btn).has('desc')) {
options.order = "asc";
return "asc";
} else if (classes(btn).has('asc')) {
options.order = "desc";
return "desc";
} else {
options.order = "asc";
return "asc";
}
},
getInSensitive: function(btn, options) {
Expand All @@ -39,31 +38,42 @@ module.exports = function(list) {
options.insensitive = false;
}
},
setOrder: function(btn, options) {
classes(btn).add(options.order);
setOrder: function(options) {
for (var i = 0, il = buttons.els.length; i < il; i++) {
var btn = buttons.els[i];
if (getAttribute(btn, 'data-sort') !== options.valueName) {
continue;
}
var predefinedOrder = getAttribute(btn, 'data-order');
if (predefinedOrder == "asc" || predefinedOrder == "desc") {
if (predefinedOrder == options.order) {
classes(btn).add(options.order);
}
} else {
classes(btn).add(options.order);
}
}
}
};
var sort = function() {
list.trigger('sortStart');
options = {},
valueName = "";
options = {};

var target = arguments[0].currentTarget || arguments[0].srcElement || undefined;

if (target) {
valueName = getAttribute(target, 'data-sort');
options.valueName = getAttribute(target, 'data-sort');
buttons.getInSensitive(target, options);
buttons.getOrder(target, options);
buttons.clear();
buttons.setOrder(target, options);
options.order = buttons.getOrder(target);
} else {
valueName = arguments[0];
options = arguments[1] || options;
options.valueName = arguments[0];
options.order = options.order || "asc";
options.insensitive = (typeof options.insensitive == "undefined") ? true : options.insensitive;
}
buttons.clear();
buttons.setOrder(options);

options.desc = options.order == "desc" ? true : false;
options.sortFunction = options.sortFunction || list.sortFunction;
list.items.sort(function(a, b) {
return options.sortFunction(a, b, options);
Expand Down
13 changes: 13 additions & 0 deletions test/test.buttons.js
Original file line number Diff line number Diff line change
Expand Up @@ -156,6 +156,19 @@ describe('Button', function() {
expect($('#sort3').hasClass('desc')).to.be(false);
fireClick($('#sort2')[0]);
});

it('buttons should change class when sorting programmatically', function(done) {
list.on('sortComplete', function() {
expect($('#sort1').hasClass('asc')).to.be(true);
expect($('#sort1').hasClass('desc')).to.be(false);
expect($('#sort2').hasClass('asc')).to.be(true);
expect($('#sort2').hasClass('desc')).to.be(false);
expect($('#sort3').hasClass('asc')).to.be(false);
expect($('#sort3').hasClass('desc')).to.be(false);
done();
});
list.sort('name', { order: "asc" });
})
});


Expand Down

0 comments on commit 6123880

Please sign in to comment.