diff --git a/test/spec/filtersSpec.js b/test/spec/filtersSpec.js new file mode 100644 index 0000000000..b6d426ccc1 --- /dev/null +++ b/test/spec/filtersSpec.js @@ -0,0 +1,30 @@ +'use strict'; + +describe('Custom Filters', function() { + var filter + , orderBySpy = sinon.spy(); + + beforeEach(function() { + module(function($provide) { + $provide.value('orderByFilter', orderBySpy); + }); + inject(function($rootScope, $filter) { + filter = $filter; + }); + }); + + describe('conditionalOrderBy', function() { + describe('when the predicate is true', function() { + it('delegates the arguments to the orderBy filter', function() { + filter('conditionalOrderBy')('array', true, 'sortPredicate', 'reverseOrder'); + expect(orderBySpy).to.have.been.calledWith('array','sortPredicate','reverseOrder'); + }); + }); + + describe('when the predicate is false', function() { + it('returns the initial array', function() { + expect(filter('conditionalOrderBy')([1,2,3], false)).to.eql([1,2,3]); + }); + }); + }); +}); diff --git a/website/public/js/filters/filters.js b/website/public/js/filters/filters.js index 5064566b1e..7064a03cde 100644 --- a/website/public/js/filters/filters.js +++ b/website/public/js/filters/filters.js @@ -21,3 +21,11 @@ angular.module('habitrpg') (gp > 999) ? (gp / Math.pow(10, 3)).toFixed(1) + "k" : gp; } }) + .filter('conditionalOrderBy', function($filter) { + return function (array, predicate, sortPredicate, reverseOrder) { + if (predicate) { + return $filter('orderBy')(array, sortPredicate, reverseOrder); + } + return array; + }; + }); diff --git a/website/views/shared/tasks/task.jade b/website/views/shared/tasks/task.jade index 37e0cc69c6..2b725a0497 100644 --- a/website/views/shared/tasks/task.jade +++ b/website/views/shared/tasks/task.jade @@ -1,4 +1,4 @@ -li(bindonce='list', id='task-{{::task.id}}', ng-repeat='task in obj[list.type+"s"] | orderBy:(list.view=="dated" ? "date" : nil)', class='task {{Shared.taskClasses(task, user.filters, user.preferences.dayStart, user.lastCron, list.showCompleted, main)}}', ng-click='spell && (list.type != "reward") && castEnd(task, "task", $event)', ng-class='{"cast-target":spell && (list.type != "reward"), "locked-task":obj._locked === true}', popover-trigger='mouseenter', data-popover-html="{{task.notes | markdown}}", popover-placement="top", popover-append-to-body='{{::modal ? "false":"true"}}', ng-show='shouldShow(task, list, user.preferences)') +li(bindonce='list', id='task-{{::task.id}}', ng-repeat='task in obj[list.type+"s"] | conditionalOrderBy: list.view=="dated":"date"', class='task {{Shared.taskClasses(task, user.filters, user.preferences.dayStart, user.lastCron, list.showCompleted, main)}}', ng-click='spell && (list.type != "reward") && castEnd(task, "task", $event)', ng-class='{"cast-target":spell && (list.type != "reward"), "locked-task":obj._locked === true}', popover-trigger='mouseenter', data-popover-html="{{task.notes | markdown}}", popover-placement="top", popover-append-to-body='{{::modal ? "false":"true"}}', ng-show='shouldShow(task, list, user.preferences)') // right-hand side control buttons .task-meta-controls