mirror of
https://github.com/HabitRPG/habitica.git
synced 2025-12-19 07:37:25 +01:00
challenges: pass down if user is member of group (group._isMember) for
performance. some bug fixes
This commit is contained in:
@@ -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'
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -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) {
|
||||||
|
|||||||
@@ -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){
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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}}
|
||||||
|
|||||||
Reference in New Issue
Block a user