2014-12-23 09:42:24 -05:00
|
|
|
CocoView = require 'views/core/CocoView'
|
2014-12-29 15:46:14 -05:00
|
|
|
Level = require 'models/Level'
|
2015-01-05 18:40:26 -05:00
|
|
|
LevelSession = require 'models/LevelSession'
|
|
|
|
ModelModal = require 'views/modal/ModelModal'
|
|
|
|
User = require 'models/User'
|
2015-01-07 17:49:21 -05:00
|
|
|
utils = require 'core/utils'
|
2014-12-23 09:42:24 -05:00
|
|
|
|
|
|
|
module.exports = class CampaignLevelView extends CocoView
|
|
|
|
id: 'campaign-level-view'
|
|
|
|
template: require 'templates/editor/campaign/campaign-level-view'
|
2014-12-29 15:46:14 -05:00
|
|
|
|
2014-12-23 09:42:24 -05:00
|
|
|
events:
|
|
|
|
'click .close': 'onClickClose'
|
2015-01-21 19:03:50 -05:00
|
|
|
'click #reload-button': 'onClickReloadButton'
|
2015-01-05 18:40:26 -05:00
|
|
|
'dblclick .recent-session': 'onDblClickRecentSession'
|
2014-12-29 15:46:14 -05:00
|
|
|
|
2014-12-23 09:42:24 -05:00
|
|
|
constructor: (options, @level) ->
|
|
|
|
super(options)
|
2014-12-29 15:46:14 -05:00
|
|
|
@fullLevel = new Level _id: @level.id
|
|
|
|
@fullLevel.fetch()
|
|
|
|
@listenToOnce @fullLevel, 'sync', => @render?()
|
|
|
|
|
2014-12-31 14:49:17 -05:00
|
|
|
@levelSlug = @level.get('slug')
|
2015-01-21 19:03:50 -05:00
|
|
|
@getAnalytics()
|
2014-12-31 14:49:17 -05:00
|
|
|
|
2014-12-23 09:42:24 -05:00
|
|
|
getRenderData: ->
|
|
|
|
c = super()
|
2014-12-29 15:46:14 -05:00
|
|
|
c.level = if @fullLevel.loaded then @fullLevel else @level
|
2015-01-21 19:03:50 -05:00
|
|
|
c.analytics = @analytics
|
2014-12-23 09:42:24 -05:00
|
|
|
c
|
|
|
|
|
2015-01-21 19:03:50 -05:00
|
|
|
afterRender: ->
|
|
|
|
super()
|
|
|
|
$("#input-startday").datepicker dateFormat: "yy-mm-dd"
|
|
|
|
$("#input-endday").datepicker dateFormat: "yy-mm-dd"
|
|
|
|
|
2014-12-23 09:42:24 -05:00
|
|
|
onClickClose: ->
|
2014-12-29 15:46:14 -05:00
|
|
|
@$el.addClass('hidden')
|
|
|
|
@trigger 'hidden'
|
2014-12-31 14:49:17 -05:00
|
|
|
|
2015-01-21 19:03:50 -05:00
|
|
|
onClickReloadButton: () =>
|
|
|
|
startDay = $('#input-startday').val()
|
|
|
|
endDay = $('#input-endday').val()
|
|
|
|
@getAnalytics startDay, endDay
|
|
|
|
|
2015-01-05 18:40:26 -05:00
|
|
|
onDblClickRecentSession: (e) ->
|
|
|
|
# Admin view of players' code
|
|
|
|
return unless me.isAdmin()
|
|
|
|
row = $(e.target).parent()
|
|
|
|
player = new User _id: row.data 'player-id'
|
|
|
|
session = new LevelSession _id: row.data 'session-id'
|
|
|
|
@openModalView new ModelModal models: [session, player]
|
|
|
|
|
2015-01-21 19:03:50 -05:00
|
|
|
getAnalytics: (startDay, endDay) =>
|
|
|
|
if startDay?
|
|
|
|
startDayDashed = startDay
|
|
|
|
startDay = startDay.replace(/-/g, '')
|
|
|
|
else
|
|
|
|
startDay = utils.getUTCDay -14
|
|
|
|
startDayDashed = "#{startDay[0..3]}-#{startDay[4..5]}-#{startDay[6..7]}"
|
|
|
|
if endDay?
|
|
|
|
endDayDashed = endDay
|
|
|
|
endDay = endDay.replace(/-/g, '')
|
|
|
|
else
|
|
|
|
endDay = utils.getUTCDay -1
|
|
|
|
endDayDashed = "#{endDay[0..3]}-#{endDay[4..5]}-#{endDay[6..7]}"
|
|
|
|
|
|
|
|
@analytics =
|
|
|
|
startDay: startDayDashed
|
|
|
|
endDay: endDayDashed
|
|
|
|
commonProblems:
|
|
|
|
levels: []
|
|
|
|
loading: true
|
|
|
|
levelCompletions:
|
|
|
|
levels: []
|
|
|
|
loading: true
|
|
|
|
levelHelps:
|
|
|
|
levels: []
|
|
|
|
loading: true
|
|
|
|
levelPlaytimes:
|
|
|
|
levels: []
|
|
|
|
loading: true
|
|
|
|
recentSessions:
|
|
|
|
levels: []
|
|
|
|
loading: true
|
|
|
|
@render()
|
|
|
|
|
|
|
|
@getCommonLevelProblems startDayDashed, endDayDashed, () =>
|
|
|
|
@analytics.commonProblems.loading = false
|
|
|
|
@render()
|
|
|
|
@getLevelCompletions startDay, endDay, () =>
|
|
|
|
@analytics.levelCompletions.loading = false
|
|
|
|
@render()
|
|
|
|
@getLevelHelps startDay, endDay, () =>
|
|
|
|
@analytics.levelHelps.loading = false
|
|
|
|
@render()
|
|
|
|
@getLevelPlaytimes startDayDashed, endDayDashed, () =>
|
|
|
|
@analytics.levelPlaytimes.loading = false
|
|
|
|
@render()
|
|
|
|
@getRecentSessions () =>
|
|
|
|
@analytics.recentSessions.loading = false
|
|
|
|
@render()
|
2015-01-05 16:42:14 -05:00
|
|
|
|
2015-01-21 19:03:50 -05:00
|
|
|
getCommonLevelProblems: (startDay, endDay, doneCallback) ->
|
2015-01-05 16:42:14 -05:00
|
|
|
success = (data) =>
|
2015-01-21 19:03:50 -05:00
|
|
|
return doneCallback() if @destroyed
|
|
|
|
@analytics.commonProblems.levels = data
|
|
|
|
doneCallback()
|
2015-01-05 16:42:14 -05:00
|
|
|
|
|
|
|
# TODO: Why do we need this url dash?
|
|
|
|
request = @supermodel.addRequestResource 'common_problems', {
|
|
|
|
url: '/db/user_code_problem/-/common_problems'
|
2015-01-21 19:03:50 -05:00
|
|
|
data: {startDay: startDay, endDay: endDay, slug: @levelSlug}
|
2015-01-05 16:42:14 -05:00
|
|
|
method: 'POST'
|
|
|
|
success: success
|
|
|
|
}, 0
|
|
|
|
request.load()
|
|
|
|
|
2015-01-21 19:03:50 -05:00
|
|
|
getLevelCompletions: (startDay, endDay, doneCallback) ->
|
2014-12-31 14:49:17 -05:00
|
|
|
success = (data) =>
|
2015-01-21 19:03:50 -05:00
|
|
|
return doneCallback() if @destroyed
|
2014-12-31 14:49:17 -05:00
|
|
|
data.sort (a, b) -> if a.created < b.created then 1 else -1
|
|
|
|
mapFn = (item) ->
|
|
|
|
item.rate = (item.finished / item.started * 100).toFixed(2)
|
|
|
|
item
|
2015-01-21 19:03:50 -05:00
|
|
|
@analytics.levelCompletions.levels = _.map data, mapFn, @
|
|
|
|
doneCallback()
|
2014-12-31 14:49:17 -05:00
|
|
|
|
|
|
|
request = @supermodel.addRequestResource 'level_completions', {
|
2015-01-14 14:09:01 -05:00
|
|
|
url: '/db/analytics_perday/-/level_completions'
|
2015-01-21 19:03:50 -05:00
|
|
|
data: {startDay: startDay, endDay: endDay, slug: @levelSlug}
|
2014-12-31 14:49:17 -05:00
|
|
|
method: 'POST'
|
|
|
|
success: success
|
|
|
|
}, 0
|
|
|
|
request.load()
|
2014-12-31 15:25:18 -05:00
|
|
|
|
2015-01-21 19:03:50 -05:00
|
|
|
getLevelHelps: (startDay, endDay, doneCallback) ->
|
2015-01-20 13:43:02 -05:00
|
|
|
success = (data) =>
|
2015-01-21 19:03:50 -05:00
|
|
|
return doneCallback() if @destroyed
|
|
|
|
@analytics.levelHelps.levels = data.sort (a, b) -> if a.day < b.day then 1 else -1
|
|
|
|
doneCallback()
|
2015-01-20 13:43:02 -05:00
|
|
|
|
|
|
|
request = @supermodel.addRequestResource 'level_helps', {
|
|
|
|
url: '/db/analytics_perday/-/level_helps'
|
2015-01-21 19:03:50 -05:00
|
|
|
data: {startDay: startDay, endDay: endDay, slugs: [@levelSlug]}
|
2015-01-20 13:43:02 -05:00
|
|
|
method: 'POST'
|
|
|
|
success: success
|
|
|
|
}, 0
|
|
|
|
request.load()
|
|
|
|
|
2015-01-21 19:03:50 -05:00
|
|
|
getLevelPlaytimes: (startDay, endDay, doneCallback) ->
|
2014-12-31 15:25:18 -05:00
|
|
|
success = (data) =>
|
2015-01-21 19:03:50 -05:00
|
|
|
return doneCallback() if @destroyed
|
|
|
|
@analytics.levelPlaytimes.levels = data.sort (a, b) -> if a.created < b.created then 1 else -1
|
|
|
|
doneCallback()
|
2015-01-07 17:49:21 -05:00
|
|
|
|
2014-12-31 15:25:18 -05:00
|
|
|
request = @supermodel.addRequestResource 'playtime_averages', {
|
|
|
|
url: '/db/level/-/playtime_averages'
|
2015-01-21 19:03:50 -05:00
|
|
|
data: {startDay: startDay, endDay: endDay, slugs: [@levelSlug]}
|
2014-12-31 15:25:18 -05:00
|
|
|
method: 'POST'
|
|
|
|
success: success
|
|
|
|
}, 0
|
|
|
|
request.load()
|
2015-01-05 18:40:26 -05:00
|
|
|
|
2015-01-21 19:03:50 -05:00
|
|
|
getRecentSessions: (doneCallback) ->
|
2015-01-07 17:49:21 -05:00
|
|
|
limit = 100
|
2015-01-05 18:40:26 -05:00
|
|
|
|
|
|
|
success = (data) =>
|
2015-01-21 19:03:50 -05:00
|
|
|
return doneCallback() if @destroyed
|
|
|
|
@analytics.recentSessions.levels = data
|
|
|
|
doneCallback()
|
2015-01-05 18:40:26 -05:00
|
|
|
|
|
|
|
# TODO: Why do we need this url dash?
|
|
|
|
request = @supermodel.addRequestResource 'level_sessions_recent', {
|
|
|
|
url: "/db/level_session/-/recent"
|
|
|
|
data: {slug: @levelSlug, limit: limit}
|
|
|
|
method: 'POST'
|
|
|
|
success: success
|
|
|
|
}, 0
|
|
|
|
request.load()
|