mirror of
https://github.com/HabitRPG/habitica.git
synced 2025-12-18 15:17:25 +01:00
Refactor challenges filter
This commit is contained in:
@@ -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,8 +94,8 @@ describe('Challenges Controller', function() {
|
||||
});
|
||||
|
||||
it('displays challenges that match membership: either and owner: either', function() {
|
||||
scope.search._isMember = undefined;
|
||||
scope.search._isOwner = undefined;
|
||||
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);
|
||||
@@ -110,7 +103,7 @@ describe('Challenges Controller', function() {
|
||||
});
|
||||
|
||||
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);
|
||||
@@ -119,7 +112,7 @@ describe('Challenges Controller', function() {
|
||||
});
|
||||
|
||||
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);
|
||||
@@ -129,7 +122,7 @@ describe('Challenges Controller', function() {
|
||||
|
||||
it('displays challenges that match membership: true and owner: either', function() {
|
||||
scope.search._isMember = true;
|
||||
scope.search._isOwner = undefined;
|
||||
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);
|
||||
@@ -156,7 +149,7 @@ describe('Challenges Controller', function() {
|
||||
|
||||
it('displays challenges that match membership: false and owner: either', function() {
|
||||
scope.search._isMember = false;
|
||||
scope.search._isOwner = undefined;
|
||||
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);
|
||||
@@ -180,7 +173,5 @@ describe('Challenges Controller', function() {
|
||||
expect(scope.filterChallenges(notOwnMem)).to.eql(false);
|
||||
expect(scope.filterChallenges(notOwnNotMem)).to.eql(true);
|
||||
});
|
||||
|
||||
});//End of Describe Challenge Filters
|
||||
|
||||
});
|
||||
});
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}]);
|
||||
|
||||
@@ -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}')
|
||||
|
||||
Reference in New Issue
Block a user