codecombat/app/views/editor/campaign/CampaignAnalyticsModal.coffee
Matt Lott d532d9fe6e Add date picker to campaign editor analytics
Only for overall campaign editor analytics.  Still need to add date
pickers to individual level views.
Moving campaign editor analytics to its own modal to support reloading
with new dates.
The date picker widget works poorly, but you can type in dates if
necessary.
Also moving analytics button up into the top right header, with a
little stats glyph icon.
2015-01-16 15:44:28 -08:00

101 lines
3.6 KiB
CoffeeScript

template = require 'templates/editor/campaign/campaign-analytics-modal'
utils = require 'core/utils'
ModalView = require 'views/core/ModalView'
# TODO: jquery-ui datepicker doesn't work well in this view
# TODO: the date format handling is confusing (yyyy-mm-dd <=> yyyymmdd)
module.exports = class CampaignAnalyticsModal extends ModalView
id: 'campaign-analytics-modal'
template: template
plain: true
events:
'click #reload-button': 'onClickReloadButton'
constructor: (options, @campaignHandle, @campaignCompletions) ->
super options
@getCampaignAnalytics() unless @campaignCompletions?.levels?
getRenderData: ->
c = super()
c.campaignCompletions = @campaignCompletions
c
afterRender: ->
super()
$("#input-startday").datepicker dateFormat: "yy-mm-dd"
$("#input-endday").datepicker dateFormat: "yy-mm-dd"
onClickReloadButton: () =>
startDay = $('#input-startday').val()
endDay = $('#input-endday').val()
delete @campaignCompletions.levels
@render()
@getCampaignAnalytics startDay, endDay
getCampaignAnalytics: (startDay, endDay) =>
# Fetch campaign analytics, unless dates given
startDay = startDay.replace(/-/g, '') if startDay?
endDay = endDay.replace(/-/g, '') if endDay?
startDay ?= utils.getUTCDay -14
endDay ?= utils.getUTCDay -1
success = (data) =>
return if @destroyed
mapFn = (item) ->
item.completionRate = (item.finished / item.started * 100).toFixed(2)
item
@campaignCompletions.levels = _.map data, mapFn, @
sortedLevels = _.cloneDeep @campaignCompletions.levels
sortedLevels = _.filter sortedLevels, ((a) -> a.finished >= 10), @
sortedLevels.sort (a, b) -> b.completionRate - a.completionRate
@campaignCompletions.top3 = _.pluck sortedLevels[0..2], 'level'
sortedLevels.sort (a, b) -> a.completionRate - b.completionRate
@campaignCompletions.bottom3 = _.pluck sortedLevels[0..2], 'level'
@campaignCompletions.startDay = "#{startDay[0..3]}-#{startDay[4..5]}-#{startDay[6..7]}"
@campaignCompletions.endDay = "#{endDay[0..3]}-#{endDay[4..5]}-#{endDay[6..7]}"
@getCampaignAveragePlaytimes startDay, endDay
# TODO: Why do we need this url dash?
request = @supermodel.addRequestResource 'campaign_completions', {
url: '/db/analytics_perday/-/campaign_completions'
data: {startDay: startDay, endDay: endDay, slug: @campaignHandle}
method: 'POST'
success: success
}, 0
request.load()
getCampaignAveragePlaytimes: (startDay, endDay) =>
# Fetch level average playtimes
success = (data) =>
return if @destroyed
levelAverages = {}
for item in data
levelAverages[item.level] ?= []
levelAverages[item.level].push item.average
for level in @campaignCompletions.levels
if levelAverages[level.level]
if levelAverages[level.level].length > 0
total = _.reduce levelAverages[level.level], ((sum, num) -> sum + num)
level.averagePlaytime = (total / levelAverages[level.level].length).toFixed(2)
else
level.averagePlaytime = 0.0
@render()
startDay ?= utils.getUTCDay -14
startDay = "#{startDay[0..3]}-#{startDay[4..5]}-#{startDay[6..7]}"
endDay ?= utils.getUTCDay -1
endDay = "#{endDay[0..3]}-#{endDay[4..5]}-#{endDay[6..7]}"
levelSlugs = _.pluck @campaignCompletions.levels, 'level'
request = @supermodel.addRequestResource 'playtime_averages', {
url: '/db/level/-/playtime_averages'
data: {startDay: startDay, endDay: endDay, slugs: levelSlugs}
method: 'POST'
success: success
}, 0
request.load()