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,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
|
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -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;
|
||||||
|
}
|
||||||
}]);
|
}]);
|
||||||
|
|||||||
@@ -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}')
|
||||||
|
|||||||
Reference in New Issue
Block a user