mirror of
https://github.com/codeninjasllc/codecombat.git
synced 2024-12-01 03:16:56 -05:00
96 lines
3.5 KiB
CoffeeScript
96 lines
3.5 KiB
CoffeeScript
RootView = require 'views/core/RootView'
|
|
template = require 'templates/admin/analytics'
|
|
utils = require 'core/utils'
|
|
|
|
module.exports = class AnalyticsView extends RootView
|
|
id: 'admin-analytics-view'
|
|
template: template
|
|
|
|
constructor: (options) ->
|
|
super options
|
|
|
|
@supermodel.addRequestResource('active_classes', {
|
|
url: '/db/analytics_perday/-/active_classes'
|
|
method: 'POST'
|
|
success: (data) =>
|
|
@activeClassGroups = {}
|
|
dayEventsMap = {}
|
|
for activeClass in data
|
|
dayEventsMap[activeClass.day] ?= {}
|
|
dayEventsMap[activeClass.day]['Total'] = 0
|
|
for event, val of activeClass.classes
|
|
@activeClassGroups[event] = true
|
|
dayEventsMap[activeClass.day][event] = val
|
|
dayEventsMap[activeClass.day]['Total'] += val
|
|
@activeClassGroups = Object.keys(@activeClassGroups)
|
|
@activeClassGroups.push 'Total'
|
|
for day of dayEventsMap
|
|
for event in @activeClassGroups
|
|
dayEventsMap[day][event] ?= 0
|
|
@activeClasses = []
|
|
for day of dayEventsMap
|
|
data = day: day, groups: []
|
|
for group in @activeClassGroups
|
|
data.groups.push(dayEventsMap[day][group] ? 0)
|
|
@activeClasses.push data
|
|
@activeClasses.sort (a, b) -> b.day.localeCompare(a.day)
|
|
@render?()
|
|
}, 0).load()
|
|
|
|
@supermodel.addRequestResource('active_users', {
|
|
url: '/db/analytics_perday/-/active_users'
|
|
method: 'POST'
|
|
success: (data) =>
|
|
@activeUsers = data
|
|
@activeUsers.sort (a, b) -> b.day.localeCompare(a.day)
|
|
@render?()
|
|
}, 0).load()
|
|
|
|
@supermodel.addRequestResource('recurring_revenue', {
|
|
url: '/db/analytics_perday/-/recurring_revenue'
|
|
method: 'POST'
|
|
success: (data) =>
|
|
@revenueGroups = {}
|
|
dayGroupCountMap = {}
|
|
for dailyRevenue in data
|
|
dayGroupCountMap[dailyRevenue.day] ?= {}
|
|
dayGroupCountMap[dailyRevenue.day]['Daily'] = 0
|
|
for group, val of dailyRevenue.groups
|
|
@revenueGroups[group] = true
|
|
dayGroupCountMap[dailyRevenue.day][group] = val
|
|
dayGroupCountMap[dailyRevenue.day]['Daily'] += val
|
|
@revenueGroups = Object.keys(@revenueGroups)
|
|
@revenueGroups.push 'Daily'
|
|
@revenueGroups.push 'Monthly'
|
|
for day of dayGroupCountMap
|
|
for group in @revenueGroups
|
|
dayGroupCountMap[day][group] ?= 0
|
|
@revenue = []
|
|
for day of dayGroupCountMap
|
|
data = day: day, groups: []
|
|
for group in @revenueGroups
|
|
data.groups.push(dayGroupCountMap[day][group] ? 0)
|
|
@revenue.push data
|
|
@revenue.sort (a, b) -> b.day.localeCompare(a.day)
|
|
monthlyValues = []
|
|
|
|
return unless @revenue.length > 0
|
|
|
|
for i in [@revenue.length-1..0]
|
|
dailyTotal = @revenue[i].groups[@revenue[i].groups.length - 2]
|
|
monthlyValues.push(dailyTotal)
|
|
monthlyValues.shift() if monthlyValues.length > 30
|
|
if monthlyValues.length is 30
|
|
monthlyIndex = @revenue[i].groups.length - 1
|
|
@revenue[i].groups[monthlyIndex] = _.reduce(monthlyValues, (s, num) -> s + num)
|
|
@render?()
|
|
}, 0).load()
|
|
|
|
getRenderData: ->
|
|
context = super()
|
|
context.activeClasses = @activeClasses ? []
|
|
context.activeClassGroups = @activeClassGroups ? {}
|
|
context.activeUsers = @activeUsers ? []
|
|
context.revenue = @revenue ? []
|
|
context.revenueGroups = @revenueGroups ? {}
|
|
context
|