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,167 +20,158 @@ describe('Challenges Controller', function() {
ctrl = $controller('ChallengesCtrl', {$scope: scope, User: {user: user}}); ctrl = $controller('ChallengesCtrl', {$scope: scope, User: {user: user}});
challenges = Challenges; challenges = Challenges;
groups = Groups; groups = Groups;
}); });
}); });
describe('challenge filters', function() { describe('filterChallenges', function() {
var ownMem, ownNotMem, notOwnMem, notOwnNotMem; var ownMem, ownNotMem, notOwnMem, notOwnNotMem;
beforeEach(function() { beforeEach(function() {
//There are four types of challenges ownMem = new challenges.Challenge({
name: 'test',
description: 'You are the owner and member',
habits: [],
dailys: [],
todos: [],
rewards: [],
leader: user._id,
group: "test",
timestamp: +(new Date),
members: [user],
official: false,
_isMember: true
});
// You are the owner and a member ownNotMem = new challenges.Challenge({
ownMem = new challenges.Challenge({ name: 'test',
name: 'test', description: 'You are the owner, but not a member',
description: 'test', habits: [],
habits: [], dailys: [],
dailys: [], todos: [],
todos: [], rewards: [],
rewards: [], leader: user._id,
leader: user._id, group: "test",
group: "test", timestamp: +(new Date),
timestamp: +(new Date), members: [],
members: [user], official: false,
official: false, _isMember: false
_isMember: true });
notOwnMem = new challenges.Challenge({
name: 'test',
description: 'Not owner but a member',
habits: [],
dailys: [],
todos: [],
rewards: [],
leader: {_id:"test"},
group: "test",
timestamp: +(new Date),
members: [user],
official: false,
_isMember: true
});
notOwnNotMem = new challenges.Challenge({
name: 'test',
description: 'Not owner or member',
habits: [],
dailys: [],
todos: [],
rewards: [],
leader: {_id:"test"},
group: "test",
timestamp: +(new Date),
members: [],
official: false,
_isMember: false
});
scope.search = {
group: _.transform(groups, function(m,g){m[g._id]=true;})
};
}); });
// You are the owner but not a member it('displays challenges that match membership: either and owner: either', function() {
ownNotMem = new challenges.Challenge({ scope.search._isMember = 'either';
name: 'test', scope.search._isOwner = 'either';
description: 'test', expect(scope.filterChallenges(ownMem)).to.eql(true);
habits: [], expect(scope.filterChallenges(ownNotMem)).to.eql(true);
dailys: [], expect(scope.filterChallenges(notOwnMem)).to.eql(true);
todos: [], expect(scope.filterChallenges(notOwnNotMem)).to.eql(true);
rewards: [],
leader: user._id,
group: "test",
timestamp: +(new Date),
members: [],
official: false,
_isMember: false
}); });
// You are not the owner but you are a member it('displays challenges that match membership: either and owner: true', function() {
notOwnMem = new challenges.Challenge({ scope.search._isMember = 'either';
name: 'test', scope.search._isOwner = true;
description: 'test', expect(scope.filterChallenges(ownMem)).to.eql(true);
habits: [], expect(scope.filterChallenges(ownNotMem)).to.eql(true);
dailys: [], expect(scope.filterChallenges(notOwnMem)).to.eql(false);
todos: [], expect(scope.filterChallenges(notOwnNotMem)).to.eql(false);
rewards: [],
leader: {_id:"test"},
group: "test",
timestamp: +(new Date),
members: [user],
official: false,
_isMember: true
}); });
// You are not the owner or a member it('displays challenges that match membership: either and owner: false', function() {
notOwnNotMem = new challenges.Challenge({ scope.search._isMember = 'either';
name: 'test', scope.search._isOwner = false;
description: 'test', expect(scope.filterChallenges(ownMem)).to.eql(false);
habits: [], expect(scope.filterChallenges(ownNotMem)).to.eql(false);
dailys: [], expect(scope.filterChallenges(notOwnMem)).to.eql(true);
todos: [], expect(scope.filterChallenges(notOwnNotMem)).to.eql(true);
rewards: [],
leader: {_id:"test"},
group: "test",
timestamp: +(new Date),
members: [],
official: false,
_isMember: false
}); });
scope.search = { it('displays challenges that match membership: true and owner: either', function() {
group: _.transform(groups, function(m,g){m[g._id]=true;}) scope.search._isMember = true;
}; 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);
});
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);
});
it('displays challenges that match membership: false and owner: either', function() {
scope.search._isMember = false;
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);
});
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);
});
}); });
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);
});
it('displays challenges that match membership: either and owner: true', function() {
scope.search._isMember = undefined;
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);
});
it('displays challenges that match membership: either and owner: false', function() {
scope.search._isMember = undefined;
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);
});
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);
});
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);
});
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);
});
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);
});
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);
});
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);
});
});//End of Describe Challenge Filters
}); });

View File

@@ -19,7 +19,9 @@ habitrpg.controller("ChallengesCtrl", ['$rootScope','$scope', 'Shared', 'User',
$scope.challenges = challenges; $scope.challenges = challenges;
$scope.groupsFilter = _.uniq(_.pluck(challenges, 'group'), function(g){return g._id}); $scope.groupsFilter = _.uniq(_.pluck(challenges, 'group'), function(g){return g._id});
$scope.search = { $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 // 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){ $scope.filterChallenges = function(chal){
if (!$scope.search) return true;
if (!$scope.search) return true; return _shouldShowChallenge(chal);
//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;
} }
$scope.$watch('newChallenge.group', function(gid){ $scope.$watch('newChallenge.group', function(gid){
@@ -300,4 +280,14 @@ habitrpg.controller("ChallengesCtrl", ['$rootScope','$scope', 'Shared', 'User',
$scope.shouldShow = function(task, list, prefs){ $scope.shouldShow = function(task, list, prefs){
return true; 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') h4=env.t('membership')
.radio .radio
label 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') =env.t('participating')
.radio .radio
label 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') =env.t('notParticipating')
.radio .radio
label 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') =env.t('either')
h4=env.t('challengedOwnedFilterHeader') h4=env.t('challengedOwnedFilterHeader')
.radio .radio
label 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') =env.t('challengedOwnedFilter')
.radio .radio
label 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') =env.t('challengedNotOwnedFilter')
.radio .radio
label 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') =env.t('challengedEitherOwnedFilter')
.col-md-10 .col-md-10
a.btn.btn-info#back-to-challenges(ng-show="cid", ui-sref='options.social.challenges', ui-sref-opts='{reload: true}') a.btn.btn-info#back-to-challenges(ng-show="cid", ui-sref='options.social.challenges', ui-sref-opts='{reload: true}')