mirror of
https://github.com/codeninjasllc/codecombat.git
synced 2024-11-25 00:28:31 -05:00
75 lines
2.2 KiB
CoffeeScript
75 lines
2.2 KiB
CoffeeScript
CocoView = require 'views/core/CocoView'
|
|
template = require 'templates/play/modal/leaderboard-tab-view'
|
|
CocoCollection = require 'collections/CocoCollection'
|
|
LevelSession = require 'models/LevelSession'
|
|
|
|
class TopScoresCollection extends CocoCollection
|
|
url: ''
|
|
model: LevelSession
|
|
|
|
constructor: (@level, @scoreType, @timespan) ->
|
|
super()
|
|
@url = "/db/level/#{@level.get('original')}/top_scores/#{@scoreType}/#{@timespan}"
|
|
|
|
module.exports = class LeaderboardTabView extends CocoView
|
|
template: template
|
|
className: 'leaderboard-tab-view'
|
|
|
|
events:
|
|
'click tbody tr.viewable': 'onClickRow'
|
|
|
|
constructor: (options) ->
|
|
super options
|
|
@level = @options.level
|
|
@scoreType = @options.scoreType ? 'time'
|
|
@timespan = @options.timespan
|
|
|
|
destroy: ->
|
|
super()
|
|
|
|
getRenderData: ->
|
|
c = super()
|
|
c.scoreType = @scoreType
|
|
c.timespan = @timespan
|
|
c.topScores = @formatTopScores()
|
|
c.loading = not @sessions or @sessions.loading
|
|
c._ = _
|
|
c
|
|
|
|
afterRender: ->
|
|
super()
|
|
|
|
formatTopScores: ->
|
|
return [] unless @sessions?.models
|
|
rows = []
|
|
for s in @sessions.models
|
|
row = {}
|
|
score = _.find s.get('state').topScores, type: @scoreType
|
|
row.ago = moment(new Date(score.date)).fromNow()
|
|
row.score = @formatScore score
|
|
row.creatorName = s.get 'creatorName'
|
|
row.creator = s.get 'creator'
|
|
row.session = s.id
|
|
row.codeLanguage = s.get 'codeLanguage'
|
|
row.hero = s.get('heroConfig')?.thangType
|
|
row.inventory = s.get('heroConfig')?.inventory
|
|
rows.push row
|
|
rows
|
|
|
|
formatScore: (score) ->
|
|
switch score.type
|
|
when 'time' then -score.score.toFixed(2) + 's'
|
|
when 'damage-taken' then -Math.round score.score
|
|
when 'damage-dealt', 'gold-collected', 'difficulty' then Math.round score.score
|
|
else score.score
|
|
|
|
onShown: ->
|
|
return if @hasShown
|
|
@hasShown = true
|
|
topScores = new TopScoresCollection @level, @scoreType, @timespan
|
|
@sessions = @supermodel.loadCollection(topScores, 'sessions', null, 0).model
|
|
|
|
onClickRow: (e) ->
|
|
sessionID = $(e.target).closest('tr').data 'session-id'
|
|
url = "/play/level/#{@level.get('slug')}?session=#{sessionID}&observing=true"
|
|
window.open url, '_blank'
|