mirror of
https://github.com/codeninjasllc/codecombat.git
synced 2025-04-01 15:50:11 -04:00
Add ClassroomView, incomplete
This commit is contained in:
parent
d255802e38
commit
0c45e3f96c
7 changed files with 165 additions and 4 deletions
app
core
models
styles/courses
templates/courses
views/courses
|
@ -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')
|
||||
|
|
|
@ -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
|
7
app/styles/courses/classroom-view.sass
Normal file
7
app/styles/courses/classroom-view.sass
Normal file
|
@ -0,0 +1,7 @@
|
|||
#classroom-view
|
||||
#main-button-area
|
||||
.btn
|
||||
margin-left: 10px
|
||||
|
||||
.progress
|
||||
margin-bottom: 5px
|
61
app/templates/courses/classroom-view.jade
Normal file
61
app/templates/courses/classroom-view.jade
Normal 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
|
|
@ -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
|
||||
|
||||
|
|
86
app/views/courses/ClassroomView.coffee
Normal file
86
app/views/courses/ClassroomView.coffee
Normal 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}"
|
||||
|
|
@ -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:
|
||||
|
|
Loading…
Add table
Reference in a new issue