From 6bd893d4975e78b1f6a71110ee2403c67bcab2c0 Mon Sep 17 00:00:00 2001 From: Keith Holliday Date: Sun, 15 May 2016 09:44:23 -0500 Subject: [PATCH 01/11] Fixed join/leave button updates --- website/client/js/controllers/challengesCtrl.js | 3 +++ website/views/options/social/challenges.jade | 4 ++-- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/website/client/js/controllers/challengesCtrl.js b/website/client/js/controllers/challengesCtrl.js index ef919d590b..f92c00efaa 100644 --- a/website/client/js/controllers/challengesCtrl.js +++ b/website/client/js/controllers/challengesCtrl.js @@ -269,6 +269,7 @@ habitrpg.controller("ChallengesCtrl", ['$rootScope','$scope', 'Shared', 'User', $scope.join = function (challenge) { Challenges.joinChallenge(challenge._id) .then(function (response) { + User.user.challenges.push(challenge._id); _getChallenges() }); } @@ -279,6 +280,8 @@ habitrpg.controller("ChallengesCtrl", ['$rootScope','$scope', 'Shared', 'User', } else { Challenges.leaveChallenge($scope.selectedChal._id, keep) .then(function (response) { + var index = User.user.challenges.indexOf($scope.selectedChal._id); + delete User.user.challenges[index]; _getChallenges() }); } diff --git a/website/views/options/social/challenges.jade b/website/views/options/social/challenges.jade index a5e2fa16cf..41afe12235 100644 --- a/website/views/options/social/challenges.jade +++ b/website/views/options/social/challenges.jade @@ -199,10 +199,10 @@ script(type='text/ng-template', id='partials/options.social.challenges.html') p!=env.t('prizeValue', {gemcount: "{{challenge.prize}}", gemicon: ""}) li.bg-transparent // leave / join - a.btn.btn-sm.btn-danger(ng-show='::isUserMemberOf(challenge)', ng-click='clickLeave(challenge, $event)') + a.btn.btn-sm.btn-danger(ng-show='isUserMemberOf(challenge)', ng-click='clickLeave(challenge, $event)') span.glyphicon.glyphicon-ban-circle =env.t('leave') - a.btn.btn-sm.btn-success(ng-hide='::isUserMemberOf(challenge)', ng-click='join(challenge)') + a.btn.btn-sm.btn-success(ng-hide='isUserMemberOf(challenge)', ng-click='join(challenge)') span.glyphicon.glyphicon-ok =env.t('join') a.accordion-toggle(id="{{challenge._id}}" ng-click='toggle(challenge._id)') From 400e434f1c9ad1bb1b63cf93672ff3bd568ad976 Mon Sep 17 00:00:00 2001 From: Keith Holliday Date: Sun, 15 May 2016 09:50:30 -0500 Subject: [PATCH 02/11] Queried only user groups to be available when creating challenges --- website/client/js/controllers/challengesCtrl.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/website/client/js/controllers/challengesCtrl.js b/website/client/js/controllers/challengesCtrl.js index f92c00efaa..a91f8423d2 100644 --- a/website/client/js/controllers/challengesCtrl.js +++ b/website/client/js/controllers/challengesCtrl.js @@ -11,9 +11,10 @@ habitrpg.controller("ChallengesCtrl", ['$rootScope','$scope', 'Shared', 'User', // FIXME $scope.challenges needs to be resolved first (see app.js) $scope.groups = []; - Groups.Group.getGroups('party,publicGuilds,privateGuilds,tavern') + Groups.Group.getGroups('party,guilds') .then(function (response) { $scope.groups = response.data.data; + console.log($scope.groups) }); // override score() for tasks listed in challenges-editing pages, so that nothing happens From fcc02b16c6160b9815ce3580c48fad095a36252b Mon Sep 17 00:00:00 2001 From: Keith Holliday Date: Sun, 15 May 2016 10:03:34 -0500 Subject: [PATCH 03/11] Fixed bulk add tasks to challenge --- .../client/js/controllers/challengesCtrl.js | 26 +++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) diff --git a/website/client/js/controllers/challengesCtrl.js b/website/client/js/controllers/challengesCtrl.js index a91f8423d2..a58e842b70 100644 --- a/website/client/js/controllers/challengesCtrl.js +++ b/website/client/js/controllers/challengesCtrl.js @@ -14,7 +14,6 @@ habitrpg.controller("ChallengesCtrl", ['$rootScope','$scope', 'Shared', 'User', Groups.Group.getGroups('party,guilds') .then(function (response) { $scope.groups = response.data.data; - console.log($scope.groups) }); // override score() for tasks listed in challenges-editing pages, so that nothing happens @@ -240,7 +239,7 @@ habitrpg.controller("ChallengesCtrl", ['$rootScope','$scope', 'Shared', 'User', //------------------------------------------------------------ // Tasks //------------------------------------------------------------ - $scope.addTask = function(addTo, listDef, challenge) { + function addTask (addTo, listDef, challenge) { var task = Shared.taskDefaults({text: listDef.newTask, type: listDef.type}); //If the challenge has not been created, we bulk add tasks on save if (challenge._id) Tasks.createChallengeTasks(challenge._id, task); @@ -249,6 +248,21 @@ habitrpg.controller("ChallengesCtrl", ['$rootScope','$scope', 'Shared', 'User', delete listDef.newTask; }; + $scope.addTask = function(addTo, listDef, challenge) { + if (listDef.bulk) { + var tasks = listDef.newTask.split(/[\n\r]+/); + //Reverse the order of tasks so the tasks will appear in the order the user entered them + tasks.reverse(); + _.each(tasks, function(t) { + listDef.newTask = t; + addTask(addTo, listDef, challenge); + }); + listDef.bulk = false; + } else { + addTask(addTo, listDef, challenge); + } + } + $scope.removeTask = function(task, challenge) { if (!confirm(window.env.t('sureDelete', {taskType: window.env.t(task.type), taskText: task.text}))) return; Tasks.deleteTask(task._id); @@ -261,6 +275,14 @@ habitrpg.controller("ChallengesCtrl", ['$rootScope','$scope', 'Shared', 'User', // TODO persist } + $scope.toggleBulk = function(list) { + if (typeof list.bulk === 'undefined') { + list.bulk = false; + } + list.bulk = !list.bulk; + list.focus = true; + }; + /* -------------------------- Subscription From bda90fad68c6b6c4553e1b5c5fafd6dadca96752 Mon Sep 17 00:00:00 2001 From: Keith Holliday Date: Sun, 15 May 2016 10:14:29 -0500 Subject: [PATCH 04/11] Synced challenge tasks after leave and join. --- .../client/js/controllers/challengesCtrl.js | 14 +++++++++++-- website/client/js/services/userServices.js | 21 ++++++++++++------- 2 files changed, 25 insertions(+), 10 deletions(-) diff --git a/website/client/js/controllers/challengesCtrl.js b/website/client/js/controllers/challengesCtrl.js index a58e842b70..35e815f817 100644 --- a/website/client/js/controllers/challengesCtrl.js +++ b/website/client/js/controllers/challengesCtrl.js @@ -293,7 +293,12 @@ habitrpg.controller("ChallengesCtrl", ['$rootScope','$scope', 'Shared', 'User', Challenges.joinChallenge(challenge._id) .then(function (response) { User.user.challenges.push(challenge._id); - _getChallenges() + _getChallenges(); + return Tasks.getUserTasks(); + }) + .then(function (response) { + var tasks = response.data.data; + User.syncUserTasks(tasks); }); } @@ -305,7 +310,12 @@ habitrpg.controller("ChallengesCtrl", ['$rootScope','$scope', 'Shared', 'User', .then(function (response) { var index = User.user.challenges.indexOf($scope.selectedChal._id); delete User.user.challenges[index]; - _getChallenges() + _getChallenges(); + return Tasks.getUserTasks(); + }) + .then(function (response) { + var tasks = response.data.data; + User.syncUserTasks(tasks); }); } $scope.popoverEl.popover('destroy'); diff --git a/website/client/js/services/userServices.js b/website/client/js/services/userServices.js index 32540db6c4..80c9336ac7 100644 --- a/website/client/js/services/userServices.js +++ b/website/client/js/services/userServices.js @@ -45,6 +45,16 @@ angular.module('habitrpg') user._wrapped = false; + function syncUserTasks (tasks) { + user.habits = []; + user.todos = []; + user.dailys = []; + user.rewards = []; + tasks.forEach(function (element, index, array) { + user[element.type + 's'].push(element) + }); + } + function sync() { return $http({ method: "GET", @@ -84,14 +94,7 @@ angular.module('habitrpg') }) .then(function (response) { var tasks = response.data.data; - user.habits = []; - user.todos = []; - user.dailys = []; - user.rewards = []; - tasks.forEach(function (element, index, array) { - user[element.type + 's'].push(element) - }) - + syncUserTasks(tasks); save(); $rootScope.$emit('userSynced'); }); @@ -479,6 +482,8 @@ angular.module('habitrpg') return sync(); }, + syncUserTasks: syncUserTasks, + save: save, settings: settings From a7e71163c05dfd758b4ca124733b589f52cb4c55 Mon Sep 17 00:00:00 2001 From: Keith Holliday Date: Sun, 15 May 2016 10:52:44 -0500 Subject: [PATCH 05/11] Fixed default selected group --- website/client/js/controllers/challengesCtrl.js | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/website/client/js/controllers/challengesCtrl.js b/website/client/js/controllers/challengesCtrl.js index 35e815f817..fc81253a33 100644 --- a/website/client/js/controllers/challengesCtrl.js +++ b/website/client/js/controllers/challengesCtrl.js @@ -11,7 +11,7 @@ habitrpg.controller("ChallengesCtrl", ['$rootScope','$scope', 'Shared', 'User', // FIXME $scope.challenges needs to be resolved first (see app.js) $scope.groups = []; - Groups.Group.getGroups('party,guilds') + Groups.Group.getGroups('party,guilds,tavern') .then(function (response) { $scope.groups = response.data.data; }); @@ -40,7 +40,6 @@ habitrpg.controller("ChallengesCtrl", ['$rootScope','$scope', 'Shared', 'User', * Create */ $scope.create = function() { - //If the user has one filter selected, assume that the user wants to default to that group var defaultGroup; //Our filters contain all groups, but we only want groups that have atleast one challenge @@ -49,12 +48,12 @@ habitrpg.controller("ChallengesCtrl", ['$rootScope','$scope', 'Shared', 'User', var filterCount = 0; for ( var i = 0; i < len; i += 1 ) { - if ( $scope.search.group[groupsWithChallenges[i]] == true ) { + if ($scope.search.group[groupsWithChallenges[i]] === true) { filterCount += 1; defaultGroup = groupsWithChallenges[i]; } - if (filterCount > 1) { - defaultGroup = $scope.groups[0]._id + + if (filterCount > 1 && defaultGroup) { break; } } @@ -405,7 +404,7 @@ habitrpg.controller("ChallengesCtrl", ['$rootScope','$scope', 'Shared', 'User', $scope.groupsFilter = _.uniq(_.pluck($scope.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" }; From 21191fdc4529445c75df9d090bda2204b3545d16 Mon Sep 17 00:00:00 2001 From: Keith Holliday Date: Sun, 15 May 2016 11:19:58 -0500 Subject: [PATCH 06/11] Fixed challenge member info. Fixed challenge winner selection --- website/client/js/app.js | 21 ++++++++++++------- .../client/js/controllers/challengesCtrl.js | 2 +- .../client/js/services/challengeServices.js | 2 +- 3 files changed, 16 insertions(+), 9 deletions(-) diff --git a/website/client/js/app.js b/website/client/js/app.js index a128c2ce88..acfe15cdb0 100644 --- a/website/client/js/app.js +++ b/website/client/js/app.js @@ -184,8 +184,8 @@ window.habitrpg = angular.module('habitrpg', url: '/:cid', templateUrl: 'partials/options.social.challenges.detail.html', title: env.t('titleChallenges'), - controller: ['$scope', 'Challenges', '$stateParams', 'Tasks', - function ($scope, Challenges, $stateParams, Tasks) { + controller: ['$scope', 'Challenges', '$stateParams', 'Tasks', 'Members', + function ($scope, Challenges, $stateParams, Tasks, Members) { Challenges.getChallenge($stateParams.cid) .then(function (response) { $scope.obj = $scope.challenge = response.data.data; @@ -198,6 +198,11 @@ window.habitrpg = angular.module('habitrpg', if (!$scope.challenge[element.type + 's']) $scope.challenge[element.type + 's'] = []; $scope.challenge[element.type + 's'].push(element); }) + + return Members.getChallengeMembers($scope.challenge._id); + }) + .then(function (response) { + $scope.challenge.members = response.data.data; }); }] }) @@ -226,11 +231,13 @@ window.habitrpg = angular.module('habitrpg', url: '/:uid', templateUrl: 'partials/options.social.challenges.detail.member.html', title: env.t('titleChallenges'), - controller: ['$scope', 'Challenges', '$stateParams', - function($scope, Challenges, $stateParams){ - $scope.obj = Challenges.Challenge.getMember({cid:$stateParams.cid, uid:$stateParams.uid}, function(){ - $scope.obj._locked = true; - }); + controller: ['$scope', 'Members', '$stateParams', + function($scope, Members, $stateParams){ + Members.getChallengeMemberProgress($stateParams.cid, $stateParams.uid) + .then(function(response) { + $scope.obj = response.data.data; + $scope.obj._locked = true; + }); }] }) diff --git a/website/client/js/controllers/challengesCtrl.js b/website/client/js/controllers/challengesCtrl.js index fc81253a33..8e14e6255f 100644 --- a/website/client/js/controllers/challengesCtrl.js +++ b/website/client/js/controllers/challengesCtrl.js @@ -199,7 +199,7 @@ habitrpg.controller("ChallengesCtrl", ['$rootScope','$scope', 'Shared', 'User', if (!challenge.winner) return; if (!confirm(window.env.t('youSure'))) return; - Challenges.selectWinner(challenge._id, challenge.winner) + Challenges.selectChallengeWinner(challenge._id, challenge.winner) .then(function (response) { $scope.popoverEl.popover('destroy'); _backToChallenges(); diff --git a/website/client/js/services/challengeServices.js b/website/client/js/services/challengeServices.js index 257aa65fac..a577d5f759 100644 --- a/website/client/js/services/challengeServices.js +++ b/website/client/js/services/challengeServices.js @@ -76,7 +76,7 @@ angular.module('habitrpg') function selectChallengeWinner (challengeId, winnerId) { return $http({ method: 'POST', - url: apiV3Prefix + '/challenges/' + challengeId + 'selectWinner/' + winnerId, + url: apiV3Prefix + '/challenges/' + challengeId + '/selectWinner/' + winnerId, }); } From 2173719e436841ec9afb8b3794b9dd8cb7732859 Mon Sep 17 00:00:00 2001 From: Keith Holliday Date: Sun, 15 May 2016 11:32:47 -0500 Subject: [PATCH 07/11] Fixed deleting challenge tasks --- website/client/js/controllers/challengesCtrl.js | 3 ++- website/views/shared/tasks/meta_controls.jade | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/website/client/js/controllers/challengesCtrl.js b/website/client/js/controllers/challengesCtrl.js index 8e14e6255f..47b5c5dd6d 100644 --- a/website/client/js/controllers/challengesCtrl.js +++ b/website/client/js/controllers/challengesCtrl.js @@ -264,7 +264,8 @@ habitrpg.controller("ChallengesCtrl", ['$rootScope','$scope', 'Shared', 'User', $scope.removeTask = function(task, challenge) { if (!confirm(window.env.t('sureDelete', {taskType: window.env.t(task.type), taskText: task.text}))) return; - Tasks.deleteTask(task._id); + //We only pass to the api if the challenge exists, otherwise, the tasks only exist on the client + if (challenge._id) Tasks.deleteTask(task._id); var index = challenge[task.type + 's'].indexOf(task); challenge[task.type + 's'].splice(index, 1); }; diff --git a/website/views/shared/tasks/meta_controls.jade b/website/views/shared/tasks/meta_controls.jade index c080e3deaa..3db265367a 100644 --- a/website/views/shared/tasks/meta_controls.jade +++ b/website/views/shared/tasks/meta_controls.jade @@ -43,7 +43,7 @@ span.glyphicon.glyphicon-bullhorn(tooltip=env.t('challenge')) |   // delete - a(ng-if='!task.challenge.id', ng-click='removeTask(task, $index)', tooltip=env.t('delete')) + a(ng-if='!task.challenge.id', ng-click='removeTask(task, obj)', tooltip=env.t('delete')) span.glyphicon.glyphicon-trash |   From f593add57658265391f9fefe91e02220e30b413c Mon Sep 17 00:00:00 2001 From: Keith Holliday Date: Sun, 15 May 2016 11:40:45 -0500 Subject: [PATCH 08/11] Fixed particiapting filter --- website/client/js/controllers/challengesCtrl.js | 2 +- website/views/options/social/challenges.jade | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/website/client/js/controllers/challengesCtrl.js b/website/client/js/controllers/challengesCtrl.js index 47b5c5dd6d..e5c6ae2a09 100644 --- a/website/client/js/controllers/challengesCtrl.js +++ b/website/client/js/controllers/challengesCtrl.js @@ -443,7 +443,7 @@ habitrpg.controller("ChallengesCtrl", ['$rootScope','$scope', 'Shared', 'User', 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); + var checkMember = $scope.search._isMember === 'either' || ($scope.isUserMemberOf(chal) === $scope.search._isMember); return groupSelected && checkOwner && checkMember; } diff --git a/website/views/options/social/challenges.jade b/website/views/options/social/challenges.jade index 41afe12235..ad95a7c992 100644 --- a/website/views/options/social/challenges.jade +++ b/website/views/options/social/challenges.jade @@ -178,7 +178,7 @@ script(type='text/ng-template', id='partials/options.social.challenges.html') // Challenges list .panel-group - .panel.panel-default(ng-repeat='challenge in challenges|filter:filterChallenges track by challenge._id ') + .panel.panel-default(ng-repeat='challenge in challenges | filter:filterChallenges track by challenge._id ') .panel-heading ul.pull-right.challenge-accordion-header-specs li.bg-transparent(ng-if='challenge.official') From 20642c9ddeb01a8ddbc055ece0a62a924aa94875 Mon Sep 17 00:00:00 2001 From: Keith Holliday Date: Sun, 15 May 2016 18:19:00 -0500 Subject: [PATCH 09/11] Fixed viewing user progress on challenge --- website/client/js/app.js | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/website/client/js/app.js b/website/client/js/app.js index acfe15cdb0..672ef32f09 100644 --- a/website/client/js/app.js +++ b/website/client/js/app.js @@ -236,6 +236,15 @@ window.habitrpg = angular.module('habitrpg', Members.getChallengeMemberProgress($stateParams.cid, $stateParams.uid) .then(function(response) { $scope.obj = response.data.data; + + $scope.obj.habits = []; + $scope.obj.todos = []; + $scope.obj.dailys = []; + $scope.obj.rewards = []; + $scope.obj.tasks.forEach(function (element, index, array) { + $scope.obj[element.type + 's'].push(element) + }); + $scope.obj._locked = true; }); }] From bb0be9a626be3cfbde506b1969c4411d3e49e329 Mon Sep 17 00:00:00 2001 From: Keith Holliday Date: Sun, 15 May 2016 18:57:15 -0500 Subject: [PATCH 10/11] Updated tests --- test/spec/controllers/challengesCtrlSpec.js | 14 ++++++++++---- test/spec/services/challengeServicesSpec.js | 2 +- website/client/js/controllers/challengesCtrl.js | 2 +- 3 files changed, 12 insertions(+), 6 deletions(-) diff --git a/test/spec/controllers/challengesCtrlSpec.js b/test/spec/controllers/challengesCtrlSpec.js index 495f1b020b..75d9759850 100644 --- a/test/spec/controllers/challengesCtrlSpec.js +++ b/test/spec/controllers/challengesCtrlSpec.js @@ -41,30 +41,36 @@ describe('Challenges Controller', function() { description: 'You are the owner and member', leader: user._id, members: [user], - _isMember: true + _isMember: true, + _id: 'ownMem-id', }); ownNotMem = specHelper.newChallenge({ description: 'You are the owner, but not a member', leader: user._id, members: [], - _isMember: false + _isMember: false, + _id: 'ownNotMem-id', }); notOwnMem = specHelper.newChallenge({ description: 'Not owner but a member', leader: {_id:"test"}, members: [user], - _isMember: true + _isMember: true, + _id: 'notOwnMem-id', }); notOwnNotMem = specHelper.newChallenge({ description: 'Not owner or member', leader: {_id:"test"}, members: [], - _isMember: false + _isMember: false, + _id: 'notOwnNotMem-id', }); + user.challenges = [ownMem._id, notOwnMem._id]; + scope.search = { group: _.transform(groups, function(m,g){m[g._id]=true;}) }; diff --git a/test/spec/services/challengeServicesSpec.js b/test/spec/services/challengeServicesSpec.js index abfe7c520a..9bed72db31 100644 --- a/test/spec/services/challengeServicesSpec.js +++ b/test/spec/services/challengeServicesSpec.js @@ -81,7 +81,7 @@ describe('challengeServices', function() { it('calls select challenge winner endpoint', function() { var challengeId = 1; var winnerId = 2; - $httpBackend.expectPOST(apiV3Prefix + '/challenges/' + challengeId + 'selectWinner/' + winnerId).respond({}); + $httpBackend.expectPOST(apiV3Prefix + '/challenges/' + challengeId + '/selectWinner/' + winnerId).respond({}); challenges.selectChallengeWinner(challengeId, winnerId); $httpBackend.flush(); }); diff --git a/website/client/js/controllers/challengesCtrl.js b/website/client/js/controllers/challengesCtrl.js index e5c6ae2a09..5a689ae7ca 100644 --- a/website/client/js/controllers/challengesCtrl.js +++ b/website/client/js/controllers/challengesCtrl.js @@ -53,7 +53,7 @@ habitrpg.controller("ChallengesCtrl", ['$rootScope','$scope', 'Shared', 'User', defaultGroup = groupsWithChallenges[i]; } - if (filterCount > 1 && defaultGroup) { + if (filterCount >= 1 && defaultGroup) { break; } } From 1187d77ba5bf08a6353fc3f31bb1b64b970262bf Mon Sep 17 00:00:00 2001 From: Keith Holliday Date: Mon, 16 May 2016 08:51:24 -0500 Subject: [PATCH 11/11] Added delete for saved challenge task --- website/views/shared/tasks/meta_controls.jade | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/website/views/shared/tasks/meta_controls.jade b/website/views/shared/tasks/meta_controls.jade index 3db265367a..3feaef0d87 100644 --- a/website/views/shared/tasks/meta_controls.jade +++ b/website/views/shared/tasks/meta_controls.jade @@ -43,7 +43,7 @@ span.glyphicon.glyphicon-bullhorn(tooltip=env.t('challenge')) |   // delete - a(ng-if='!task.challenge.id', ng-click='removeTask(task, obj)', tooltip=env.t('delete')) + a(ng-if='!task.challenge.id || obj.leader._id === User.user._id', ng-click='removeTask(task, obj)', tooltip=env.t('delete')) span.glyphicon.glyphicon-trash |