Refactor challenges filter

This commit is contained in:
Blade Barringer
2015-06-13 19:41:41 -05:00
parent ddb28c0305
commit 6513527d8b
3 changed files with 160 additions and 179 deletions

View File

@@ -20,21 +20,17 @@ describe('Challenges Controller', function() {
ctrl = $controller('ChallengesCtrl', {$scope: scope, User: {user: user}});
challenges = Challenges;
groups = Groups;
});
});
describe('challenge filters', function() {
describe('filterChallenges', function() {
var ownMem, ownNotMem, notOwnMem, notOwnNotMem;
beforeEach(function() {
//There are four types of challenges
// You are the owner and a member
ownMem = new challenges.Challenge({
name: 'test',
description: 'test',
description: 'You are the owner and member',
habits: [],
dailys: [],
todos: [],
@@ -47,10 +43,9 @@ describe('Challenges Controller', function() {
_isMember: true
});
// You are the owner but not a member
ownNotMem = new challenges.Challenge({
name: 'test',
description: 'test',
description: 'You are the owner, but not a member',
habits: [],
dailys: [],
todos: [],
@@ -63,10 +58,9 @@ describe('Challenges Controller', function() {
_isMember: false
});
// You are not the owner but you are a member
notOwnMem = new challenges.Challenge({
name: 'test',
description: 'test',
description: 'Not owner but a member',
habits: [],
dailys: [],
todos: [],
@@ -79,10 +73,9 @@ describe('Challenges Controller', function() {
_isMember: true
});
// You are not the owner or a member
notOwnNotMem = new challenges.Challenge({
name: 'test',
description: 'test',
description: 'Not owner or member',
habits: [],
dailys: [],
todos: [],
@@ -101,86 +94,84 @@ describe('Challenges Controller', function() {
});
it('displays challenges that match membership: either and owner: either', function() {
scope.search._isMember = undefined;
scope.search._isOwner = undefined;
expect( scope.filterChallenges(ownMem) ).to.eql(true);
expect( scope.filterChallenges(ownNotMem) ).to.eql(true);
expect( scope.filterChallenges(notOwnMem) ).to.eql(true);
expect( scope.filterChallenges(notOwnNotMem) ).to.eql(true);
scope.search._isMember = 'either';
scope.search._isOwner = 'either';
expect(scope.filterChallenges(ownMem)).to.eql(true);
expect(scope.filterChallenges(ownNotMem)).to.eql(true);
expect(scope.filterChallenges(notOwnMem)).to.eql(true);
expect(scope.filterChallenges(notOwnNotMem)).to.eql(true);
});
it('displays challenges that match membership: either and owner: true', function() {
scope.search._isMember = undefined;
scope.search._isMember = 'either';
scope.search._isOwner = true;
expect( scope.filterChallenges(ownMem) ).to.eql(true);
expect( scope.filterChallenges(ownNotMem) ).to.eql(true);
expect( scope.filterChallenges(notOwnMem) ).to.eql(false);
expect( scope.filterChallenges(notOwnNotMem) ).to.eql(false);
expect(scope.filterChallenges(ownMem)).to.eql(true);
expect(scope.filterChallenges(ownNotMem)).to.eql(true);
expect(scope.filterChallenges(notOwnMem)).to.eql(false);
expect(scope.filterChallenges(notOwnNotMem)).to.eql(false);
});
it('displays challenges that match membership: either and owner: false', function() {
scope.search._isMember = undefined;
scope.search._isMember = 'either';
scope.search._isOwner = false;
expect( scope.filterChallenges(ownMem) ).to.eql(false);
expect( scope.filterChallenges(ownNotMem) ).to.eql(false);
expect( scope.filterChallenges(notOwnMem) ).to.eql(true);
expect( scope.filterChallenges(notOwnNotMem) ).to.eql(true);
expect(scope.filterChallenges(ownMem)).to.eql(false);
expect(scope.filterChallenges(ownNotMem)).to.eql(false);
expect(scope.filterChallenges(notOwnMem)).to.eql(true);
expect(scope.filterChallenges(notOwnNotMem)).to.eql(true);
});
it('displays challenges that match membership: true and owner: either', function() {
scope.search._isMember = true;
scope.search._isOwner = undefined;
expect( scope.filterChallenges(ownMem) ).to.eql(true);
expect( scope.filterChallenges(ownNotMem) ).to.eql(false);
expect( scope.filterChallenges(notOwnMem) ).to.eql(true);
expect( scope.filterChallenges(notOwnNotMem) ).to.eql(false);
scope.search._isOwner = 'either';
expect(scope.filterChallenges(ownMem)).to.eql(true);
expect(scope.filterChallenges(ownNotMem)).to.eql(false);
expect(scope.filterChallenges(notOwnMem)).to.eql(true);
expect(scope.filterChallenges(notOwnNotMem)).to.eql(false);
});
it('displays challenges that match membership: true and owner: true', function() {
scope.search._isMember = true;
scope.search._isOwner = true;
expect( scope.filterChallenges(ownMem) ).to.eql(true);
expect( scope.filterChallenges(ownNotMem) ).to.eql(false);
expect( scope.filterChallenges(notOwnMem) ).to.eql(false);
expect( scope.filterChallenges(notOwnNotMem) ).to.eql(false);
expect(scope.filterChallenges(ownMem)).to.eql(true);
expect(scope.filterChallenges(ownNotMem)).to.eql(false);
expect(scope.filterChallenges(notOwnMem)).to.eql(false);
expect(scope.filterChallenges(notOwnNotMem)).to.eql(false);
});
it('displays challenges that match membership: true and owner: false', function() {
scope.search._isMember = true;
scope.search._isOwner = false;
expect( scope.filterChallenges(ownMem) ).to.eql(false);
expect( scope.filterChallenges(ownNotMem) ).to.eql(false);
expect( scope.filterChallenges(notOwnMem) ).to.eql(true);
expect( scope.filterChallenges(notOwnNotMem) ).to.eql(false);
expect(scope.filterChallenges(ownMem)).to.eql(false);
expect(scope.filterChallenges(ownNotMem)).to.eql(false);
expect(scope.filterChallenges(notOwnMem)).to.eql(true);
expect(scope.filterChallenges(notOwnNotMem)).to.eql(false);
});
it('displays challenges that match membership: false and owner: either', function() {
scope.search._isMember = false;
scope.search._isOwner = undefined;
expect( scope.filterChallenges(ownMem) ).to.eql(false);
expect( scope.filterChallenges(ownNotMem) ).to.eql(true);
expect( scope.filterChallenges(notOwnMem) ).to.eql(false);
expect( scope.filterChallenges(notOwnNotMem) ).to.eql(true);
scope.search._isOwner = 'either';
expect(scope.filterChallenges(ownMem)).to.eql(false);
expect(scope.filterChallenges(ownNotMem)).to.eql(true);
expect(scope.filterChallenges(notOwnMem)).to.eql(false);
expect(scope.filterChallenges(notOwnNotMem)).to.eql(true);
});
it('displays challenges that match membership: false and owner: true', function() {
scope.search._isMember = false;
scope.search._isOwner = true;
expect( scope.filterChallenges(ownMem) ).to.eql(false);
expect( scope.filterChallenges(ownNotMem) ).to.eql(true);
expect( scope.filterChallenges(notOwnMem) ).to.eql(false);
expect( scope.filterChallenges(notOwnNotMem) ).to.eql(false);
expect(scope.filterChallenges(ownMem)).to.eql(false);
expect(scope.filterChallenges(ownNotMem)).to.eql(true);
expect(scope.filterChallenges(notOwnMem)).to.eql(false);
expect(scope.filterChallenges(notOwnNotMem)).to.eql(false);
});
it('displays challenges that match membership: false and owner: false', function() {
scope.search._isMember = false;
scope.search._isOwner = false;
expect( scope.filterChallenges(ownMem) ).to.eql(false);
expect( scope.filterChallenges(ownNotMem) ).to.eql(false);
expect( scope.filterChallenges(notOwnMem) ).to.eql(false);
expect( scope.filterChallenges(notOwnNotMem) ).to.eql(true);
expect(scope.filterChallenges(ownMem)).to.eql(false);
expect(scope.filterChallenges(ownNotMem)).to.eql(false);
expect(scope.filterChallenges(notOwnMem)).to.eql(false);
expect(scope.filterChallenges(notOwnNotMem)).to.eql(true);
});
});
});//End of Describe Challenge Filters
});

View File

@@ -19,7 +19,9 @@ habitrpg.controller("ChallengesCtrl", ['$rootScope','$scope', 'Shared', 'User',
$scope.challenges = challenges;
$scope.groupsFilter = _.uniq(_.pluck(challenges, 'group'), function(g){return g._id});
$scope.search = {
group: _.transform($scope.groups, function(m,g){m[g._id]=true;})
group: _.transform($scope.groups, function(m,g){m[g._id]=true;}),
_isMember: "either",
_isOwner: "either"
};
});
}
@@ -254,32 +256,10 @@ habitrpg.controller("ChallengesCtrl", ['$rootScope','$scope', 'Shared', 'User',
// Filtering
//------------------------------------------------------------
// $scope.$watch('search', function(search){
// if (!search) $scope.filteredChallenges = $scope.challenges;
// $scope.filteredChallenges = $filter('filter')($scope.challenges, function(chal) {
// return (search.group[chal.group._id] &&
// (typeof search._isMember == 'undefined' || search._isMember == chal._isMember));
// })
// })
// TODO probably better to use $watch above, to avoid this being calculated on every digest cycle
$scope.filterChallenges = function(chal){
if (!$scope.search) return true;
//Currently, all filters are andded together
//First we must filter by selected groups
var showChallenge = $scope.search.group[chal.group._id];
//Membership filters: Show if user has selected either or has selcted Owned and is owner
var userIsOwner = chal.leader._id == User.user.id;
showChallenge = showChallenge && (typeof $scope.search._isOwner === 'undefined' || userIsOwner === $scope.search._isOwner );
//Membership filters: Show if user has selected either or has selcted Participating and is a member
showChallenge = showChallenge && (typeof $scope.search._isMember === 'undefined' || $scope.search._isMember === chal._isMember);
return showChallenge;
return _shouldShowChallenge(chal);
}
$scope.$watch('newChallenge.group', function(gid){
@@ -300,4 +280,14 @@ habitrpg.controller("ChallengesCtrl", ['$rootScope','$scope', 'Shared', 'User',
$scope.shouldShow = function(task, list, prefs){
return true;
};
function _shouldShowChallenge(chal) {
var userIsOwner = chal.leader._id == User.user.id;
var groupSelected = $scope.search.group[chal.group._id];
var checkOwner = $scope.search._isOwner === 'either' || (userIsOwner === $scope.search._isOwner);
var checkMember = $scope.search._isMember === 'either' || (chal._isMember === $scope.search._isMember);
return groupSelected && checkOwner && checkMember;
}
}]);

View File

@@ -81,28 +81,28 @@ script(type='text/ng-template', id='partials/options.social.challenges.html')
h4=env.t('membership')
.radio
label
input(type='radio', name='search-participation-radio', ng-click='search._isMember = true')
input(type='radio', name='search-participation-radio', ng-model='search._isMember', ng-value='true', ng-change='filterChallenges')
=env.t('participating')
.radio
label
input(type='radio', name='search-participation-radio', ng-click='search._isMember = false')
input(type='radio', name='search-participation-radio', ng-model='search._isMember', ng-value='false', ng-change='filterChallenges')
=env.t('notParticipating')
.radio
label
input(type='radio', name='search-participation-radio', ng-click='search._isMember = undefined', checked='checked')
input(type='radio', name='search-participation-radio', ng-model='search._isMember', value='either', ng-change='filterChallenges')
=env.t('either')
h4=env.t('challengedOwnedFilterHeader')
.radio
label
input(type='radio', name='search-owner-radio', ng-click='search._isOwner = true')
input(type='radio', name='search-owner-radio', ng-model='search._isOwner', ng-value='true', ng-change='filterChallenges')
=env.t('challengedOwnedFilter')
.radio
label
input(type='radio', name='search-owner-radio', ng-click='search._isOwner = false')
input(type='radio', name='search-owner-radio', ng-model='search._isOwner', ng-value='false', ng-change='filterChallenges')
=env.t('challengedNotOwnedFilter')
.radio
label
input(type='radio', name='search-owner-radio', ng-click='search._isOwner = undefined', checked='checked')
input(type='radio', name='search-owner-radio', ng-model='search._isOwner', value='either', ng-change='filterChallenges', checked='checked')
=env.t('challengedEitherOwnedFilter')
.col-md-10
a.btn.btn-info#back-to-challenges(ng-show="cid", ui-sref='options.social.challenges', ui-sref-opts='{reload: true}')