mirror of
https://github.com/codeninjasllc/codecombat.git
synced 2025-04-07 10:34:46 -04:00
Add achievements to clan details view
This commit is contained in:
parent
f0bee3fd98
commit
dfff871c58
3 changed files with 62 additions and 22 deletions
|
@ -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
|
||||
|
|
|
@ -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."
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Add table
Reference in a new issue