Add achievements to clan details view

This commit is contained in:
Matt Lott 2015-04-03 11:05:37 -07:00
parent f0bee3fd98
commit dfff871c58
3 changed files with 62 additions and 22 deletions
app
templates/clans
views/clans
server/clans

View file

@ -4,10 +4,15 @@ block content
if clan
h1= clan.get('name')
if owner
span.spr.spl.small (owner
a(href="/user/#{clan.get('ownerID')}")= owner.get('name')
| )
if owner
p
span.spr Owner:
a(href="/user/#{clan.get('ownerID')}")= owner.get('name')
if stats.averageLevel
p Average level: #{stats.averageLevel}
if stats.totalAchievements
p Total achievements earned: #{stats.totalAchievements}
div
if isOwner
button.btn.btn-sm.btn-warning.delete-clan-btn Delete Clan
@ -23,6 +28,7 @@ block content
tr
th Name
th Level
th Achievements
th
tbody
each member in members
@ -30,10 +36,11 @@ block content
td
a(href="/user/#{member.id}")= member.get('name') || 'Anoner'
td= member.level()
if isOwner && member.id !== clan.get('ownerID')
td
button.btn.btn-sm.btn-warning.remove-member-btn(data-id="#{member.id}") Remove Member
else
td
td
if memberAchievementsMap && memberAchievementsMap[member.id]
| #{memberAchievementsMap[member.id].length}
td
if isOwner && member.id !== clan.get('ownerID')
button.btn.btn-sm.btn-warning.remove-member-btn(data-id="#{member.id}") Remove Member
button.btn.btn-sm Load More

View file

@ -4,6 +4,7 @@ RootView = require 'views/core/RootView'
template = require 'templates/clans/clan-details'
CocoCollection = require 'collections/CocoCollection'
Clan = require 'models/Clan'
EarnedAchievement = require 'models/EarnedAchievement'
User = require 'models/User'
# TODO: Message for clan not found
@ -30,12 +31,16 @@ module.exports = class ClanDetailsView extends RootView
context = super()
context.clan = @clan
context.owner = @owner
context.members = @members.models
context.memberAchievementsMap = @memberAchievementsMap
context.members = @members?.models
context.isOwner = @clan.get('ownerID') is me.id
context.isMember = @clanID in me.get('clans')
context.isMember = @clanID in (me.get('clans') ? [])
context.stats = @stats
context
initData: ->
@stats = {}
@clan = new Clan _id: @clanID
@listenTo @clan, 'sync', => @render?()
@listenToOnce @clan, 'sync', =>
@ -43,11 +48,31 @@ module.exports = class ClanDetailsView extends RootView
@listenTo @owner, 'sync', => @render?()
@supermodel.loadModel @owner, 'owner', cache: false
@supermodel.loadModel @clan, 'clan', cache: false
@members = new CocoCollection([], { url: "/db/clan/#{clanID}/members", model: User, comparator:'_id' })
@listenTo @members, 'sync', => @render?()
@members = new CocoCollection([], { url: "/db/clan/#{@clanID}/members", model: User, comparator:'_id' })
@listenTo @members, 'sync', =>
@stats.averageLevel = Math.round(@members.reduce(((sum, member) -> sum + member.level()), 0) / @members.length)
@render?()
@supermodel.loadCollection(@members, 'members', {cache: false})
@memberAchievements = new CocoCollection([], { url: "/db/clan/#{@clanID}/member_achievements", model: EarnedAchievement, comparator:'_id' })
@listenTo @memberAchievements, 'sync', =>
@stats.totalAchievements = @memberAchievements.models.length
@memberAchievementsMap = {}
for achievement in @memberAchievements.models
user = achievement.get('user')
@memberAchievementsMap[user] ?= []
@memberAchievementsMap[user].push achievement
@render?()
@supermodel.loadCollection(@memberAchievements, 'member_achievements', {cache: false})
@listenTo me, 'sync', => @render?()
refreshData: ->
me.fetch cache: false
@members.fetch cache: false
@memberAchievements.fetch cache: false
onDeleteClan: (e) ->
return @openModalView(new AuthModal()) if me.isAnonymous()
options =
@ -67,9 +92,7 @@ module.exports = class ClanDetailsView extends RootView
method: 'PUT'
error: (model, response, options) =>
console.error 'Error joining clan', response
success: (model, response, options) =>
me.fetch cache: false
@members.fetch cache: false
success: (model, response, options) => @refreshData()
@supermodel.addRequestResource( 'join_clan', options).load()
onLeaveClan: (e) ->
@ -78,9 +101,7 @@ module.exports = class ClanDetailsView extends RootView
method: 'PUT'
error: (model, response, options) =>
console.error 'Error leaving clan', response
success: (model, response, options) =>
me.fetch cache: false
@members.fetch cache: false
success: (model, response, options) => @refreshData()
@supermodel.addRequestResource( 'leave_clan', options).load()
onRemoveMember: (e) ->
@ -90,8 +111,7 @@ module.exports = class ClanDetailsView extends RootView
method: 'PUT'
error: (model, response, options) =>
console.error 'Error removing clan member', response
success: (model, response, options) =>
@members.fetch cache: false
success: (model, response, options) => @refreshData()
@supermodel.addRequestResource( 'remove_member', options).load()
else
console.error "No member ID attached to remove button."

View file

@ -2,6 +2,7 @@ async = require 'async'
mongoose = require 'mongoose'
Handler = require '../commons/Handler'
Clan = require './Clan'
EarnedAchievement = require '../achievements/EarnedAchievement'
User = require '../users/User'
UserHandler = require '../users/user_handler'
@ -44,6 +45,7 @@ ClanHandler = class ClanHandler extends Handler
getByRelationship: (req, res, args...) ->
return @joinClan(req, res, args[0]) if args[1] is 'join'
return @leaveClan(req, res, args[0]) if args[1] is 'leave'
return @getMemberAchievements(req, res, args[0]) if args[1] is 'member_achievements'
return @getMembers(req, res, args[0]) if args[1] is 'members'
return @removeMember(req, res, args[0], args[2]) if args.length is 3 and args[1] is 'remove'
super(arguments...)
@ -77,8 +79,19 @@ ClanHandler = class ClanHandler extends Handler
return @sendDatabaseError(res, err) if err
@sendSuccess(res)
getMemberAchievements: (req, res, clanID) ->
# TODO: add tests
Clan.findById clanID, (err, clans) =>
return @sendDatabaseError(res, err) if err
memberIDs = _.map clans.get('members') ? [], (memberID) -> memberID.toHexString()
EarnedAchievement.find {user: {$in: memberIDs}}, (err, documents) =>
return @sendDatabaseError(res, err) if err?
cleandocs = (@formatEntity(req, doc) for doc in documents)
@sendSuccess(res, cleandocs)
getMembers: (req, res, clanID) ->
return @sendForbiddenError(res) unless req.user
# TODO: add tests
return @sendForbiddenError(res) unless req.user? and not req.user.isAnonymous()
clanIDs = req.user.get('clans') ? []
Clan.findById clanID, (err, clans) =>
return @sendDatabaseError(res, err) if err