Add stats to course details page

This commit is contained in:
Matt Lott 2015-09-24 07:28:43 -07:00
parent cbaac98556
commit 238ea49090
2 changed files with 49 additions and 21 deletions
app
templates/courses
views/courses

View file

@ -80,21 +80,28 @@ mixin progress-summary-stats
td
if courseInstance
div #{courseInstance.get('members').length}
tr
td Average level play time:
td TODO
tr
td Total play time:
td TODO
tr
td Average levels completed:
td TODO
tr
td Total levels completed:
td TODO
tr
td Furthest level completed:
td TODO
if instanceStats
tr
td Average level play time:
if instanceStats.averageLevelPlaytime > 0
td= moment.duration(instanceStats.averageLevelPlaytime, "seconds").humanize()
else
td 0
tr
td Total play time:
if instanceStats.totalPlayTime > 0
td= moment.duration(instanceStats.totalPlayTime, "seconds").humanize()
else
td 0
tr
td Average levels completed:
td #{instanceStats.averageLevelsCompleted.toFixed(2)}
tr
td Total levels completed:
td= instanceStats.totalLevelsCompleted
tr
td Furthest level completed:
td= instanceStats.furthestLevelCompleted.replace('Course: ', '')
mixin progress-summary-concepts
h3 Concepts Covered
@ -160,9 +167,9 @@ mixin progress-members
mixin progress-members-individual(memberID)
- var name = memberUserMap[memberID] ? memberUserMap[memberID].get('name') : 'Anoner'
a(href="/user/#{memberID}")= name || 'Anoner'
div TODO: levels completed
div TODO: total time played
div TODO: last played
if memberStats && memberStats[memberID]
div #{memberStats[memberID].totalLevelsCompleted} levels
div Played #{moment.duration(memberStats[memberID].totalPlayTime, "seconds").humanize()}
mixin progress-members-concepts(memberID)
if course && userLevelStateMap[memberID]

View file

@ -42,8 +42,10 @@ module.exports = class CourseDetailsView extends RootView
context.course = @course if @course?.loaded
context.courseInstance = @courseInstance if @courseInstance?.loaded
context.courseInstances = @courseInstances?.models ? []
context.instanceStats = @instanceStats
context.levelConceptMap = @levelConceptMap ? {}
context.memberSort = @memberSort
context.memberStats = @memberStats
context.memberUserMap = @memberUserMap ? {}
context.noCourseInstance = @noCourseInstance
context.noCourseInstanceSelected = @noCourseInstanceSelected
@ -118,17 +120,36 @@ module.exports = class CourseDetailsView extends RootView
onLevelSessionsSync: ->
# console.log 'onLevelSessionsSync'
@instanceStats = averageLevelsCompleted: 0, furthestLevelCompleted: '', totalLevelsCompleted: 0, totalPlayTime: 0
@memberStats = {}
@userConceptStateMap = {}
@userLevelStateMap = {}
levelStateMap = {}
for levelSession in @levelSessions.models
userID = levelSession.get('creator')
levelID = levelSession.get('level').original
@userConceptStateMap[userID] ?= {}
@userLevelStateMap[userID] ?= {}
state = if levelSession.get('state')?.complete then 'complete' else 'started'
@userLevelStateMap[userID][levelID] = state
levelStateMap[levelID] = state
@instanceStats.totalLevelsCompleted++ if state is 'complete'
@instanceStats.totalPlayTime += levelSession.get('playtime')
@memberStats[userID] ?= totalLevelsCompleted: 0, totalPlayTime: 0
@memberStats[userID].totalLevelsCompleted++ if state is 'complete'
@memberStats[userID].totalPlayTime += levelSession.get('playtime')
@userConceptStateMap[userID] ?= {}
for concept of @levelConceptMap[levelID]
@userConceptStateMap[userID][concept] = state
@userLevelStateMap[userID] ?= {}
@userLevelStateMap[userID][levelID] = state
if @courseInstance.get('members').length > 0
@instanceStats.averageLevelsCompleted = @instanceStats.totalLevelsCompleted / @courseInstance.get('members').length
for levelID, level of @campaign.get('levels')
@instanceStats.furthestLevelCompleted = level.name if levelStateMap[levelID] is 'complete'
@conceptsCompleted = {}
for userID, conceptStateMap of @userConceptStateMap
for concept, state of conceptStateMap