Add stats to course details page
This commit is contained in:
parent
cbaac98556
commit
238ea49090
2 changed files with 49 additions and 21 deletions
app
|
@ -80,21 +80,28 @@ mixin progress-summary-stats
|
||||||
td
|
td
|
||||||
if courseInstance
|
if courseInstance
|
||||||
div #{courseInstance.get('members').length}
|
div #{courseInstance.get('members').length}
|
||||||
tr
|
if instanceStats
|
||||||
td Average level play time:
|
tr
|
||||||
td TODO
|
td Average level play time:
|
||||||
tr
|
if instanceStats.averageLevelPlaytime > 0
|
||||||
td Total play time:
|
td= moment.duration(instanceStats.averageLevelPlaytime, "seconds").humanize()
|
||||||
td TODO
|
else
|
||||||
tr
|
td 0
|
||||||
td Average levels completed:
|
tr
|
||||||
td TODO
|
td Total play time:
|
||||||
tr
|
if instanceStats.totalPlayTime > 0
|
||||||
td Total levels completed:
|
td= moment.duration(instanceStats.totalPlayTime, "seconds").humanize()
|
||||||
td TODO
|
else
|
||||||
tr
|
td 0
|
||||||
td Furthest level completed:
|
tr
|
||||||
td TODO
|
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
|
mixin progress-summary-concepts
|
||||||
h3 Concepts Covered
|
h3 Concepts Covered
|
||||||
|
@ -160,9 +167,9 @@ mixin progress-members
|
||||||
mixin progress-members-individual(memberID)
|
mixin progress-members-individual(memberID)
|
||||||
- var name = memberUserMap[memberID] ? memberUserMap[memberID].get('name') : 'Anoner'
|
- var name = memberUserMap[memberID] ? memberUserMap[memberID].get('name') : 'Anoner'
|
||||||
a(href="/user/#{memberID}")= name || 'Anoner'
|
a(href="/user/#{memberID}")= name || 'Anoner'
|
||||||
div TODO: levels completed
|
if memberStats && memberStats[memberID]
|
||||||
div TODO: total time played
|
div #{memberStats[memberID].totalLevelsCompleted} levels
|
||||||
div TODO: last played
|
div Played #{moment.duration(memberStats[memberID].totalPlayTime, "seconds").humanize()}
|
||||||
|
|
||||||
mixin progress-members-concepts(memberID)
|
mixin progress-members-concepts(memberID)
|
||||||
if course && userLevelStateMap[memberID]
|
if course && userLevelStateMap[memberID]
|
||||||
|
|
|
@ -42,8 +42,10 @@ module.exports = class CourseDetailsView extends RootView
|
||||||
context.course = @course if @course?.loaded
|
context.course = @course if @course?.loaded
|
||||||
context.courseInstance = @courseInstance if @courseInstance?.loaded
|
context.courseInstance = @courseInstance if @courseInstance?.loaded
|
||||||
context.courseInstances = @courseInstances?.models ? []
|
context.courseInstances = @courseInstances?.models ? []
|
||||||
|
context.instanceStats = @instanceStats
|
||||||
context.levelConceptMap = @levelConceptMap ? {}
|
context.levelConceptMap = @levelConceptMap ? {}
|
||||||
context.memberSort = @memberSort
|
context.memberSort = @memberSort
|
||||||
|
context.memberStats = @memberStats
|
||||||
context.memberUserMap = @memberUserMap ? {}
|
context.memberUserMap = @memberUserMap ? {}
|
||||||
context.noCourseInstance = @noCourseInstance
|
context.noCourseInstance = @noCourseInstance
|
||||||
context.noCourseInstanceSelected = @noCourseInstanceSelected
|
context.noCourseInstanceSelected = @noCourseInstanceSelected
|
||||||
|
@ -118,17 +120,36 @@ module.exports = class CourseDetailsView extends RootView
|
||||||
|
|
||||||
onLevelSessionsSync: ->
|
onLevelSessionsSync: ->
|
||||||
# console.log 'onLevelSessionsSync'
|
# console.log 'onLevelSessionsSync'
|
||||||
|
@instanceStats = averageLevelsCompleted: 0, furthestLevelCompleted: '', totalLevelsCompleted: 0, totalPlayTime: 0
|
||||||
|
@memberStats = {}
|
||||||
@userConceptStateMap = {}
|
@userConceptStateMap = {}
|
||||||
@userLevelStateMap = {}
|
@userLevelStateMap = {}
|
||||||
|
levelStateMap = {}
|
||||||
for levelSession in @levelSessions.models
|
for levelSession in @levelSessions.models
|
||||||
userID = levelSession.get('creator')
|
userID = levelSession.get('creator')
|
||||||
levelID = levelSession.get('level').original
|
levelID = levelSession.get('level').original
|
||||||
@userConceptStateMap[userID] ?= {}
|
|
||||||
@userLevelStateMap[userID] ?= {}
|
|
||||||
state = if levelSession.get('state')?.complete then 'complete' else 'started'
|
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]
|
for concept of @levelConceptMap[levelID]
|
||||||
@userConceptStateMap[userID][concept] = state
|
@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 = {}
|
@conceptsCompleted = {}
|
||||||
for userID, conceptStateMap of @userConceptStateMap
|
for userID, conceptStateMap of @userConceptStateMap
|
||||||
for concept, state of conceptStateMap
|
for concept, state of conceptStateMap
|
||||||
|
|
Reference in a new issue