From 744d8a678049fa271fa740b3f4b7e0d8505c7e43 Mon Sep 17 00:00:00 2001 From: Cole Gleason Date: Sat, 4 Jan 2014 20:05:20 -0600 Subject: [PATCH] When a user leaves a group, remove them from all group challenges --- public/js/controllers/groupsCtrl.js | 32 ++++++++++++++++++++++------ src/controllers/groups.js | 33 +++++++++++++++++++++++++++++ views/options/social/group.jade | 2 +- views/options/social/index.jade | 2 +- 4 files changed, 60 insertions(+), 9 deletions(-) diff --git a/public/js/controllers/groupsCtrl.js b/public/js/controllers/groupsCtrl.js index 7db888ccc3..8edb73809e 100644 --- a/public/js/controllers/groupsCtrl.js +++ b/public/js/controllers/groupsCtrl.js @@ -192,8 +192,8 @@ habitrpg.controller("GroupsCtrl", ['$scope', '$rootScope', 'Groups', '$http', 'A }]) - .controller("GuildsCtrl", ['$scope', 'Groups', 'User', '$rootScope', '$state', '$location', - function($scope, Groups, User, $rootScope, $state, $location) { + .controller("GuildsCtrl", ['$scope', 'Groups', 'User', '$rootScope', '$state', '$location', '$compile', + function($scope, Groups, User, $rootScope, $state, $location, $compile) { $scope.groups = { guilds: Groups.myGuilds(), "public": Groups.publicGuilds() @@ -238,11 +238,12 @@ habitrpg.controller("GroupsCtrl", ['$scope', '$rootScope', 'Groups', '$http', 'A }) } - $scope.leave = function(group){ - if (confirm("Are you sure you want to leave this guild?") !== true) { - return; - } - Groups.Group.leave({gid: group._id}, undefined, function(){ + $scope.leave = function(keep) { + if (keep == 'cancel') { + $scope.selectedChal = undefined; + } else { + var group = $scope.selectedGroup; + Groups.Group.leave({gid: group._id, keep:keep}, undefined, function(){ $scope.groups.guilds.splice(_.indexOf($scope.groups.guilds, group), 1); // remove user from group members if guild is public so that he can re-join it immediately if(group.privacy == 'public' || !group.privacy){ //public guilds with only some fields fetched @@ -256,6 +257,23 @@ habitrpg.controller("GroupsCtrl", ['$scope', '$rootScope', 'Groups', '$http', 'A $state.go('options.social.guilds'); }); } + $scope.popoverEl.popover('destroy'); + } + + $scope.clickLeave = function(group, $event){ + $scope.selectedGroup = group; + $scope.popoverEl = $($event.target); + var html = $compile( + 'Remove Tasks
\nKeep Tasks
\nCancel
' + )($scope); + $scope.popoverEl.popover('destroy').popover({ + html: true, + placement: 'top', + trigger: 'manual', + title: 'Leaving group challenges and...', + content: html + }).popover('show'); + } $scope.reject = function(guild){ var i = _.findIndex(User.user.invitations.guilds, {id:guild.id}); diff --git a/src/controllers/groups.js b/src/controllers/groups.js index 94a4b6e343..f2d8faa36f 100644 --- a/src/controllers/groups.js +++ b/src/controllers/groups.js @@ -6,6 +6,7 @@ var async = require('async'); var shared = require('habitrpg-shared'); var User = require('./../models/user').model; var Group = require('./../models/group').model; +var Challenge = require('./../models/challenge').model; var api = module.exports; /* @@ -283,6 +284,8 @@ api.join = function(req, res) { api.leave = function(req, res, next) { var user = res.locals.user, group = res.locals.group; + // When removing the user from challenges, should we keep the tasks? + var keep = (/^remove-all/i).test(req.query.keep) ? 'remove-all' : 'keep-all'; async.parallel([ // Remove active quest from user if they're leaving the party function(cb){ @@ -290,6 +293,36 @@ api.leave = function(req, res, next) { user.party.quest = Group.cleanQuestProgress(); user.save(cb); }, + // Remove user from group challenges + function(cb){ + async.waterfall([ + // Find relevant challenges + function(cb) { + Challenge.find({$and:[ + {_id: {$in: user.challenges}}, // Challenges I am in + {group: group._id}, // that belong to the group I am leaving + ]}, cb); + }, + function(challenges, cb) { + // Update each challenge + Challenge.update({_id:{$in: _.pluck(challenges, '_id')}}, + {$pull:{members:user._id}}, + {multi: true}, function(err) { + if (err) return cb(err); + cb(null, challenges); + }); + }, + function(challenges, cb) { + // Unlink the challenge tasks from user + async.waterfall(challenges.map(function(chal) { + return function(cb) { + user.unlink({cid:chal._id, keep:keep}, function(err){ + if (err) return cb(err); + cb(null); + }); + }}), cb); + }], cb); + }, function(cb){ var update = {$pull:{members:user._id}}; if (group.type == 'party' && group.quest.key){ diff --git a/views/options/social/group.jade b/views/options/social/group.jade index b1217e0006..a839e8e09d 100644 --- a/views/options/social/group.jade +++ b/views/options/social/group.jade @@ -150,7 +150,7 @@ a.pull-right.gem-wallet(popover-trigger='mouseenter', popover-title='Guild Bank' input.btn(type='submit', value='Invite') - a.btn.btn-danger(data-id='{{group.id}}', ng-click='leave(group)') Leave + a.btn.btn-danger(data-id='{{group.id}}', ng-click='clickLeave(group, $event)') Leave .span8 div.blah-options(ng-show='group._editing') diff --git a/views/options/social/index.jade b/views/options/social/index.jade index 51d1742dff..44039bcc61 100644 --- a/views/options/social/index.jade +++ b/views/options/social/index.jade @@ -37,7 +37,7 @@ script(type='text/ng-template', id='partials/options.social.guilds.public.html') li {{group.memberCount}} member(s) li // join / leave - a.btn.btn-small.btn-danger(ng-show='group._isMember', ng-click='leave(group)') + a.btn.btn-small.btn-danger(ng-show='group._isMember', ng-click='clickLeave(group, $event)') i.icon-ban-circle | Leave a.btn.btn-small.btn-success(ng-hide='group._isMember', ng-click='join(group)')