Add ClassroomView, incomplete

This commit is contained in:
Scott Erickson 2015-11-30 14:14:27 -05:00
parent d255802e38
commit 0c45e3f96c
7 changed files with 165 additions and 4 deletions

View file

@ -70,7 +70,8 @@ module.exports = class CocoRouter extends Backbone.Router
'courses/teachers': go('courses/TeacherCoursesView')
'courses/purchase': go('courses/PurchaseCoursesView')
'courses/enroll(/:courseID)': go('courses/CourseEnrollView')
'courses/:courseID(/:courseInstanceID)': go('courses/CourseDetailsView')
'courses/:classroomID': go('courses/ClassroomView')
'courses/:courseID/:courseInstanceID': go('courses/CourseDetailsView')
'db/*path': 'routeToServer'
'demo(/*subpath)': go('DemoView')

View file

@ -13,8 +13,10 @@ module.exports = class Campaign extends CocoModel
statsForSessions: (sessions) ->
# common code for crunching stats for a user's progress on a campaign/course
return null unless sessions
stats = {}
sessions = _.sortBy sessions.models, (s) -> s.get('changed')
sessions = sessions.models or sessions
sessions = _.sortBy sessions, (s) -> s.get('changed')
levels = _.values(@get('levels'))
levels = (level for level in levels when not _.contains(level.type, 'ladder'))
levelOriginals = _.pluck(levels, 'original')
@ -31,6 +33,6 @@ module.exports = class Campaign extends CocoModel
first: _.first(levels)
arena: _.find _.values(@get('levels')), (level) -> _.contains(level.type, 'ladder')
}
sum = (nums) -> _.reduce(nums, (s, num) -> s + num)
sum = (nums) -> _.reduce(nums, (s, num) -> s + num) or 0
stats.playtime = sum((session.get('playtime') or 0 for session in sessions))
return stats

View file

@ -0,0 +1,7 @@
#classroom-view
#main-button-area
.btn
margin-left: 10px
.progress
margin-bottom: 5px

View file

@ -0,0 +1,61 @@
extends /templates/base
block content
- var isOwner = view.classroom.get('ownerID') === me.id;
if isOwner
a(href="/courses/teachers") Back to my classrooms
else
a(href="/courses") Back to my courses
h1
span.spr= view.classroom.get('name')
if isOwner
a#edit-class-details-link
small Edit class details
if view.classroom.get('description')
p= view.classroom.get('description')
// TODO: Add classroom statistics (grab from CourseDetailsView)
h1
| Students
.pull-right#main-button-area
button.btn.btn-success Add Students
button.btn.btn-warning Activate Licenses
a.btn.btn-warning(href="/courses/purchase?from-classroom="+view.classroom.id) Purchase Licenses
hr
for user in view.users.models
h2= view.makeDisplayName(user)
- var lastPlayedString = view.makeLastPlayedString(user);
if lastPlayedString
p Last Played: #{lastPlayedString}
- var paidFor = user.get('coursePrepaidID');
for courseInstance in view.courseInstances.models
- var inCourse = _.contains(courseInstance.get('members'), user.id);
- var course = view.courses.get(courseInstance.get('courseID'));
- var campaign = view.campaigns.get(course.get('campaignID'));
- var stats = campaign.statsForSessions(courseInstance.sessionsByUser[user.id] || []);
if !(course.get('free') || paidFor)
- continue;
.row
.col-sm-3.col-sm-offset-1= campaign.get('fullName')
.col-sm-7
if inCourse
.progress
.progress-bar(style='width:'+stats.levels.pctDone)
else if paidFor
button.btn.btn-info.btn-sm Enable
if !paidFor
.text-center
p
em Activate a license to enable more courses for this student.
p
button.btn.btn-info.btn-sm Activate
hr

View file

@ -11,7 +11,10 @@ block content
p Thank you for your purchase! You can now assign #{view.numberOfStudents} more students to paid courses.
p.text-center
a(href="/courses/teachers") Return to course management.
if view.fromClassroom
a(href="/courses/"+view.fromClassroom) Return to classroom
else
a(href="/courses/teachers") Return to course management.
else

View file

@ -0,0 +1,86 @@
Campaign = require 'models/Campaign'
CocoCollection = require 'collections/CocoCollection'
Course = require 'models/Course'
CourseInstance = require 'models/CourseInstance'
Classroom = require 'models/Classroom'
LevelSession = require 'models/LevelSession'
RootView = require 'views/core/RootView'
template = require 'templates/courses/classroom-view'
User = require 'models/User'
utils = require 'core/utils'
Prepaid = require 'models/Prepaid'
ClassroomSettingsModal = require 'views/courses/ClassroomSettingsModal'
module.exports = class ClassroomView extends RootView
id: 'classroom-view'
template: template
events:
'click #edit-class-details-link': 'onClickEditClassDetailsLink'
initialize: (options, classroomID) ->
@classroom = new Classroom({_id: classroomID})
@supermodel.loadModel @classroom, 'classroom'
@courses = new CocoCollection([], { url: "/db/course", model: Course})
@courses.comparator = '_id'
@supermodel.loadCollection(@courses, 'courses')
@campaigns = new CocoCollection([], { url: "/db/campaign", model: Campaign })
@courses.comparator = '_id'
@supermodel.loadCollection(@campaigns, 'campaigns', { data: { type: 'course' }})
@courseInstances = new CocoCollection([], { url: "/db/course_instance", model: CourseInstance})
@courseInstances.comparator = 'courseID'
@supermodel.loadCollection(@courseInstances, 'course_instances', { data: { classroomID: classroomID } })
@users = new CocoCollection([], { url: "/db/classroom/#{classroomID}/members", model: User })
@users.comparator = (user) =>
@makeDisplayName(user).toLowerCase()
@supermodel.loadCollection(@users, 'users')
@listenToOnce @courseInstances, 'sync', @onCourseInstancesSync
onCourseInstancesSync: ->
@sessions = new CocoCollection([], { model: LevelSession })
for courseInstance in @courseInstances.models
sessions = new CocoCollection([], { url: "/db/course_instance/#{courseInstance.id}/level_sessions", model: LevelSession })
@supermodel.loadCollection(sessions, 'sessions')
courseInstance.sessions = sessions
sessions.courseInstance = courseInstance
@listenToOnce sessions, 'sync', (sessions) ->
@sessions.add(sessions.slice())
sessions.courseInstance.sessionsByUser = sessions.groupBy('creator')
onLoaded: ->
userSessions = @sessions.groupBy('creator')
for user in @users.models
user.sessions = new CocoCollection(userSessions[user.id], { model: LevelSession })
user.sessions.comparator = 'changed'
user.sessions.sort()
for courseInstance in @courseInstances.models
courseID = courseInstance.get('courseID')
course = @courses.get(courseID)
campaignID = course.get('campaignID')
campaign = @campaigns.get(campaignID)
courseInstance.sessions.campaign = campaign
super()
onClickEditClassDetailsLink: ->
modal = new ClassroomSettingsModal({classroom: @classroom})
@openModalView(modal)
@listenToOnce modal, 'hidden', @render
makeDisplayName: (user) ->
name = user.get('name')
return name if name
name = _.filter([user.get('firstName'), user.get('lastName')]).join('')
return name if name
email = user.get('email')
return email if email
return ''
makeLastPlayedString: (user) ->
session = user.sessions.last()
return '' if not session
campaign = session.collection.campaign
levelOriginal = session.get('level').original
campaignLevel = campaign.get('levels')[levelOriginal]
return "#{campaign.get('fullName')}, #{campaignLevel.name}"

View file

@ -15,6 +15,7 @@ module.exports = class PurchaseCoursesView extends RootView
initialize: (options) ->
@listenTo stripeHandler, 'received-token', @onStripeReceivedToken
@fromClassroom = utils.getQueryVariable('from-classroom')
super(options)
events: