challenges: pass down if user is member of group (group._isMember) for

performance. some bug fixes
This commit is contained in:
Tyler Renelle
2013-10-29 12:26:13 -07:00
parent 219318b405
commit be657a76e0
5 changed files with 20 additions and 8 deletions

View File

@@ -77,7 +77,7 @@ window.habitrpg = angular.module('habitrpg',
controller: 'PartyCtrl' controller: 'PartyCtrl'
}) })
.state('options.groups.guilds', { .state('options.groups.guilds', {
url: '/party', url: '/guilds',
templateUrl: "partials/options.groups.guilds.html", templateUrl: "partials/options.groups.guilds.html",
controller: 'GuildsCtrl' controller: 'GuildsCtrl'
}) })

View File

@@ -18,7 +18,7 @@ habitrpg.controller("RootCtrl", ['$scope', '$rootScope', '$location', 'User', '$
// indexOf helper // indexOf helper
$scope.indexOf = function(haystack, needle){ $scope.indexOf = function(haystack, needle){
return ~haystack.indexOf(needle); return haystack && ~haystack.indexOf(needle);
} }
$scope.safeApply = function(fn) { $scope.safeApply = function(fn) {

View File

@@ -52,7 +52,6 @@ api.getGroups = function(req, res, next) {
var fields = req.query.fields && req.query.fields.replace(/\,/g, ' ') var fields = req.query.fields && req.query.fields.replace(/\,/g, ' ')
var challengeFields = 'name description'; // public challenge fields, request specific challenge for more details var challengeFields = 'name description'; // public challenge fields, request specific challenge for more details
// First get all groups
async.parallel({ async.parallel({
party: function(cb) { party: function(cb) {
@@ -64,6 +63,8 @@ api.getGroups = function(req, res, next) {
query.populate('members', sanitizeMemberFields(req.query['fields.members'], partyFields)); query.populate('members', sanitizeMemberFields(req.query['fields.members'], partyFields));
if (~fields.indexOf('challenges')) if (~fields.indexOf('challenges'))
query.populate('challenges', challengeFields); query.populate('challenges', challengeFields);
} else {
query.populate('members', partyFields);
} }
query.exec(function(err, group){ query.exec(function(err, group){
if (err) return cb(err); if (err) return cb(err);
@@ -82,6 +83,8 @@ api.getGroups = function(req, res, next) {
query.populate('members', sanitizeMemberFields(req.query['fields.members'], 'profile.name')); query.populate('members', sanitizeMemberFields(req.query['fields.members'], 'profile.name'));
if (~fields.indexOf('challenges')) if (~fields.indexOf('challenges'))
query.populate('challenges', challengeFields); query.populate('challenges', challengeFields);
} else {
query.populate('members', 'profile.name');
} }
query.exec(cb); query.exec(cb);
}, },
@@ -100,9 +103,17 @@ api.getGroups = function(req, res, next) {
"public": function(cb) { "public": function(cb) {
if (type && !~type.indexOf('public')) return cb(null, []); if (type && !~type.indexOf('public')) return cb(null, []);
Group.find({privacy: 'public'}) Group.find({privacy: 'public'})
.select('name description memberCount') .select('name description memberCount members')
.sort('-memberCount') .sort('-memberCount')
.exec(cb); .exec(function(err, groups){
if (err) return cb(err);
_.each(groups, function(g){
// To save some client-side performance, don't send down the full members arr, just send down temp var _isMember
if (~g.members.indexOf(user._id)) g._isMember = true;
g.members = undefined;
});
cb(null, groups);
});
} }
}, function(err, results){ }, function(err, results){

View File

@@ -69,6 +69,7 @@ GroupSchema.pre('save', function(next){
GroupSchema.methods.toJSON = function(){ GroupSchema.methods.toJSON = function(){
var doc = this.toObject(); var doc = this.toObject();
removeDuplicates(doc); removeDuplicates(doc);
doc._isMember = this._isMember;
return doc; return doc;
} }

View File

@@ -44,13 +44,13 @@ script(type='text/ng-template', id='partials/options.groups.guilds.html')
tr(ng-repeat='group in groups.public | filter:guildSearch') tr(ng-repeat='group in groups.public | filter:guildSearch')
td td
ul.pull-right.challenge-accordion-header-specs ul.pull-right.challenge-accordion-header-specs
li {{group.members.length}} member(s) li {{group.memberCount}} member(s)
li li
// join / leave // join / leave
a.btn.btn-small.btn-danger(ng-show='isMember(user, group)', ng-click='leave(group)') a.btn.btn-small.btn-danger(ng-show='group_.isMember', ng-click='leave(group)')
i.icon-ban-circle i.icon-ban-circle
| Leave | Leave
a.btn.btn-small.btn-success(ng-hide='isMember(user, group)', ng-click='join(group)') a.btn.btn-small.btn-success(ng-hide='group._isMember', ng-click='join(group)')
i.icon-ok i.icon-ok
| Join | Join
h4 {{group.name}} h4 {{group.name}}