2015-11-04 13:54:40 -05:00
|
|
|
extends /templates/base
|
|
|
|
|
|
|
|
block content
|
2015-11-10 14:20:35 -05:00
|
|
|
|
|
|
|
//- NOTE: do not localize / i18n
|
|
|
|
|
2015-11-04 13:54:40 -05:00
|
|
|
if me.isAdmin()
|
|
|
|
.container-fluid
|
|
|
|
.row
|
2015-11-06 17:11:36 -05:00
|
|
|
.col-md-5.big-stat.active-classes
|
|
|
|
if activeClasses.length > 0
|
2016-02-16 12:23:38 -05:00
|
|
|
div.description Monthly Active Classes
|
2015-11-06 17:11:36 -05:00
|
|
|
div.count= activeClasses[0].groups[activeClasses[0].groups.length - 1]
|
2015-11-08 20:00:24 -05:00
|
|
|
.col-md-5.big-stat.recurring-revenue
|
|
|
|
if revenue.length > 0
|
2016-02-16 12:23:38 -05:00
|
|
|
div.description Monthly Recurring Revenue
|
2015-11-08 20:00:24 -05:00
|
|
|
div.count $#{Math.round((revenue[0].groups[revenue[0].groups.length - 1]) / 100)}
|
2016-02-16 12:23:38 -05:00
|
|
|
.col-md-5.big-stat.classroom-active-users
|
2015-11-04 13:54:40 -05:00
|
|
|
if activeUsers.length > 0
|
2016-02-16 12:23:38 -05:00
|
|
|
- var classroomBigMAU = 0;
|
|
|
|
each count, event in activeUsers[0].events
|
|
|
|
if event.indexOf('MAU classroom') >= 0
|
|
|
|
- classroomBigMAU += count;
|
|
|
|
div.description Classroom Monthly Active Users
|
|
|
|
div.count= classroomBigMAU
|
|
|
|
.col-md-5.big-stat.campaign-active-users
|
|
|
|
if activeUsers.length > 0
|
|
|
|
- var campaignBigMAU = 0;
|
|
|
|
each count, event in activeUsers[0].events
|
|
|
|
if event.indexOf('MAU campaign') >= 0
|
|
|
|
- campaignBigMAU += count;
|
|
|
|
div.description Campaign Monthly Active Users
|
|
|
|
div.count= campaignBigMAU
|
2015-11-04 13:54:40 -05:00
|
|
|
|
2015-11-10 14:20:35 -05:00
|
|
|
h3 KPI 60 days
|
|
|
|
.kpi-recent-chart.line-chart-container
|
|
|
|
|
2016-02-06 17:02:44 -05:00
|
|
|
h3 KPI 365 days
|
2015-11-10 14:20:35 -05:00
|
|
|
.kpi-chart.line-chart-container
|
|
|
|
|
2016-02-16 12:23:38 -05:00
|
|
|
h1 Table of Contents
|
|
|
|
b Graphs
|
|
|
|
div
|
|
|
|
a(href='#active-classes-graph') Active Classes
|
|
|
|
div
|
|
|
|
a(href='#recurring-revenue-graph') Recurring Revenue
|
|
|
|
div
|
|
|
|
a(href='#classroom-daus-graph') Classroom Daily Active Users
|
|
|
|
div
|
|
|
|
a(href='#classroom-maus-graph') Classroom Monthly Active Users
|
|
|
|
div
|
|
|
|
a(href='#campaign-daus-graph') Campaign Daily Active Users
|
|
|
|
div
|
|
|
|
a(href='#campaign-maus-graph') Campaign Monthly Active Users
|
|
|
|
div
|
2016-02-19 12:32:17 -05:00
|
|
|
a(href='#campaign-vs-classroom-paid-maus-recent-graph') Campaign vs Classroom Paid Monthly Active Users (90 days)
|
2016-02-16 12:23:38 -05:00
|
|
|
div
|
2016-02-19 12:32:17 -05:00
|
|
|
a(href='#campaign-vs-classroom-paid-maus-graph') Campaign vs Classroom Paid Monthly Active Users (365 days)
|
|
|
|
div
|
|
|
|
a(href='#enrollments-graph') Enrollments Issued and Redeemed
|
2016-02-16 12:23:38 -05:00
|
|
|
b Tables
|
|
|
|
div
|
|
|
|
a(href='#furthest-courses-table') Furthest Course
|
|
|
|
div
|
|
|
|
a(href='#school-counts-table') School Counts
|
|
|
|
div
|
|
|
|
a(href='#active-classes-table') Active Classes
|
|
|
|
div
|
|
|
|
a(href='#recurring-revenue-table') Recurring Revenue
|
|
|
|
div
|
|
|
|
a(href='#active-users-table') Active Users
|
|
|
|
div
|
|
|
|
a(href='#enrollments-table') Enrollments
|
|
|
|
|
|
|
|
h3#active-classes-graph Active Classes 90 days
|
2016-02-18 12:14:36 -05:00
|
|
|
.small Active class: 12+ students in a classroom, with 6+ who played in last 30 days. Played == 'Started Level' analytics event.
|
2016-02-05 12:40:05 -05:00
|
|
|
.small Paid student: user.coursePrepaidID set and prepaid.properties.trialRequestID NOT set
|
|
|
|
.small Trial student: user.coursePrepaidID set and prepaid.properties.trialRequestID set
|
|
|
|
.small Paid class: at least one paid student in the classroom
|
|
|
|
.small Trial class: not paid, at least one trial student in classroom
|
|
|
|
.small Free class: not paid, not trial
|
2015-11-10 14:20:35 -05:00
|
|
|
.active-classes-chart.line-chart-container
|
|
|
|
|
2016-02-16 12:23:38 -05:00
|
|
|
h3#recurring-revenue-graph Recurring Revenue 90 days
|
2015-11-10 14:20:35 -05:00
|
|
|
.recurring-revenue-chart.line-chart-container
|
|
|
|
|
2016-02-16 12:23:38 -05:00
|
|
|
h3#classroom-daus-graph Classroom Daily Active Users 90 days
|
|
|
|
.small Paid student: user.coursePrepaidID set and prepaid.properties.trialRequestID NOT set
|
|
|
|
.small Trial student: user.coursePrepaidID set and prepaid.properties.trialRequestID set
|
|
|
|
.small Free student: not paid, not trial
|
|
|
|
.classroom-daily-active-users-chart.line-chart-container
|
|
|
|
|
|
|
|
h3#classroom-maus-graph Classroom Monthly Active Users 90 days
|
|
|
|
.classroom-monthly-active-users-chart.line-chart-container
|
|
|
|
|
|
|
|
h3#campaign-daus-graph Campaign Daily Active Users 90 days
|
|
|
|
.small Paid user: had monthly or yearly sub on given day
|
|
|
|
.small Free user: not paid
|
|
|
|
.campaign-daily-active-users-chart.line-chart-container
|
|
|
|
|
|
|
|
h3#campaign-maus-graph Campaign Monthly Active Users 90 days
|
|
|
|
.campaign-monthly-active-users-chart.line-chart-container
|
|
|
|
|
2016-02-19 12:32:17 -05:00
|
|
|
h3#campaign-vs-classroom-paid-maus-recent-graph Campaign vs Classroom Paid Monthly Active Users 90 days
|
|
|
|
.campaign-vs-classroom-monthly-active-users-recent-chart.line-chart-container
|
|
|
|
|
|
|
|
h3#campaign-vs-classroom-paid-maus-graph Campaign vs Classroom Paid Monthly Active Users 365 days
|
|
|
|
.small TODO: aggregate active user data from last year
|
2016-02-16 12:23:38 -05:00
|
|
|
.campaign-vs-classroom-monthly-active-users-chart.line-chart-container
|
2015-11-10 14:20:35 -05:00
|
|
|
|
2016-02-19 12:32:17 -05:00
|
|
|
h3#enrollments-graph Enrollments Issued and Redeemed 90 days
|
2016-02-06 17:02:44 -05:00
|
|
|
.paid-courses-chart.line-chart-container
|
|
|
|
|
2016-02-16 12:23:38 -05:00
|
|
|
h3#furthest-courses-table Furthest Course
|
2016-01-26 17:36:40 -05:00
|
|
|
.small Teacher: owner of a course instance
|
|
|
|
.small Student: member of a course instance (assigned to course)
|
|
|
|
.small For course instances created in last #{view.furthestCourseDayRange} days, not Single Player, hourOfCode != true
|
|
|
|
.small Counts are not summed. I.e. a student or teacher only contributes to the count of one course.
|
|
|
|
if view.teacherCourseDistribution
|
|
|
|
table.table.table-striped.table-condensed
|
|
|
|
tr
|
|
|
|
th Course
|
|
|
|
th Teachers
|
|
|
|
th Students
|
|
|
|
th Avg students per teacher
|
|
|
|
each count, courseIndex in view.teacherCourseDistribution
|
|
|
|
tr
|
|
|
|
td= view.courses.models[courseIndex].get('name')
|
|
|
|
td= count
|
|
|
|
td= view.studentCourseDistribution[courseIndex] || 0
|
|
|
|
td= Math.round((view.studentCourseDistribution[courseIndex] || 0) / count)
|
|
|
|
else
|
|
|
|
div Loading ...
|
|
|
|
|
2016-02-16 12:23:38 -05:00
|
|
|
h3#school-counts-table School Counts
|
2016-02-04 20:31:25 -05:00
|
|
|
.small Only including schools with #{view.minSchoolCount}+ counts
|
|
|
|
if view.schoolCounts
|
|
|
|
table.table.table-striped.table-condensed
|
|
|
|
tr
|
|
|
|
th
|
|
|
|
th School Name
|
|
|
|
th User Count
|
|
|
|
each val, i in view.schoolCounts
|
|
|
|
tr
|
|
|
|
td= i + 1
|
|
|
|
td= val.schoolName
|
|
|
|
td= val.count
|
|
|
|
else
|
|
|
|
div Loading ...
|
|
|
|
|
2016-02-16 12:23:38 -05:00
|
|
|
h1#active-classes-table Active Classes
|
2015-11-06 17:11:36 -05:00
|
|
|
table.table.table-striped.table-condensed
|
|
|
|
tr
|
|
|
|
th Day
|
|
|
|
for group in activeClassGroups
|
|
|
|
th= group.replace('Active classes', '')
|
|
|
|
each activeClass in activeClasses
|
|
|
|
tr
|
|
|
|
td= activeClass.day
|
|
|
|
each val in activeClass.groups
|
|
|
|
td= val
|
|
|
|
|
2016-02-16 12:23:38 -05:00
|
|
|
h1#recurring-revenue-table Recurring Revenue
|
2015-11-08 20:00:24 -05:00
|
|
|
table.table.table-striped.table-condensed
|
|
|
|
tr
|
|
|
|
th Day
|
|
|
|
for group in revenueGroups
|
2016-02-17 16:01:01 -05:00
|
|
|
th= group.replace('DRR ', 'Daily ')
|
2015-11-08 20:00:24 -05:00
|
|
|
each entry in revenue
|
|
|
|
tr
|
|
|
|
td= entry.day
|
|
|
|
each val in entry.groups
|
|
|
|
td $#{(val / 100).toFixed(2)}
|
|
|
|
|
2016-02-16 12:23:38 -05:00
|
|
|
h1#active-users-table Active Users
|
|
|
|
if activeUsers.length > 0
|
|
|
|
- var eventNames = [];
|
|
|
|
each count, event in activeUsers[0].events
|
|
|
|
- eventNames.push(event)
|
2016-02-19 12:32:17 -05:00
|
|
|
- eventNames.sort(function (a, b) {
|
|
|
|
- if (a.indexOf('campaign') == b.indexOf('campaign') || a.indexOf('classroom') == b.indexOf('classroom')) {
|
|
|
|
- return a.localeCompare(b);
|
|
|
|
- }
|
|
|
|
- else if (a.indexOf('campaign') > b.indexOf('campaign')) {
|
|
|
|
- return 1;
|
|
|
|
- }
|
|
|
|
- else {
|
|
|
|
- return -1;
|
|
|
|
- }
|
|
|
|
- });
|
2016-02-16 12:23:38 -05:00
|
|
|
table.table.table-striped.table-condensed
|
2015-11-04 13:54:40 -05:00
|
|
|
tr
|
2016-02-16 12:23:38 -05:00
|
|
|
th(style='min-width:85px;') Day
|
|
|
|
each eventName in eventNames
|
|
|
|
th= eventName
|
|
|
|
th DAU Campaign Total
|
|
|
|
th DAU Classroom Total
|
|
|
|
each activeUser in activeUsers
|
|
|
|
tr
|
|
|
|
td= activeUser.day
|
|
|
|
- var dauCampaignTotal = 0
|
|
|
|
- var dauClassroomTotal = 0
|
|
|
|
each eventName in eventNames
|
|
|
|
td= activeUser.events[eventName] || 0
|
|
|
|
if eventName.indexOf('DAU campaign') >= 0
|
|
|
|
- dauCampaignTotal += (activeUser.events[eventName] || 0);
|
|
|
|
else if eventName.indexOf('DAU classroom') >= 0
|
|
|
|
- dauClassroomTotal += (activeUser.events[eventName] || 0);
|
|
|
|
td= dauCampaignTotal
|
|
|
|
td= dauClassroomTotal
|
2016-02-06 17:02:44 -05:00
|
|
|
|
2016-02-16 12:23:38 -05:00
|
|
|
h1#enrollments-table Enrollments
|
2016-02-06 17:02:44 -05:00
|
|
|
table.table.table-striped.table-condensed
|
|
|
|
tr
|
|
|
|
th Day
|
|
|
|
th Paid Enrollments Issued
|
|
|
|
th Paid Enrollments Redeemed
|
|
|
|
th Trial Enrollments Issued
|
|
|
|
th Trial Enrollments Redeemed
|
|
|
|
each day in enrollmentDays
|
|
|
|
tr
|
|
|
|
td= day
|
|
|
|
if dayEnrollmentsMap[day]
|
|
|
|
td= dayEnrollmentsMap[day].paidIssued || 0
|
|
|
|
td= dayEnrollmentsMap[day].paidRedeemed || 0
|
|
|
|
td= dayEnrollmentsMap[day].trialIssued || 0
|
|
|
|
td= dayEnrollmentsMap[day].trialRedeemed || 0
|
|
|
|
else
|
|
|
|
td 0
|
|
|
|
td 0
|
|
|
|
td 0
|
|
|
|
td 0
|