Fix /courses initial implementation

This commit is contained in:
Scott Erickson 2015-11-29 13:27:40 -05:00
parent 33599c8632
commit ea0c274a3c
6 changed files with 60 additions and 42 deletions
app
models
styles
templates/courses
views/courses
server/campaigns

View file

@ -1,6 +1,7 @@
CocoModel = require './CocoModel'
schema = require 'schemas/models/campaign.schema'
Level = require 'models/Level'
CocoCollection = require 'collections/CocoCollection'
module.exports = class Campaign extends CocoModel
@className: 'Campaign'

View file

@ -393,3 +393,7 @@ body > iframe[src^="https://apis.google.com"]
top: 0
left: 0
pointer-events: none
// TODO: update Bootstrap, remove this
.text-uppercase
text-transform: uppercase

View file

@ -1,4 +1,8 @@
#courses-view
#site-content-area
padding-left: 150px
padding-right: 150px
h1
margin-bottom: 30px
@ -14,11 +18,15 @@
margin: 0 auto
hr
border-top: 1px solid lightgrey
border-top: 1px solid grey
margin: 5px 0
h2
margin-top: 5px
.text-uppercase
margin-top: 40px
h3
margin-top: 20px
.course-instance-entry
padding-left: 40px
padding-left: 40px
padding-right: 200px

View file

@ -28,9 +28,8 @@ block content
else
- var showHOCComplete = false;
if view.hocCourseInstance
- var campaign = view.campaigns.get(view.hocCourseInstance.get('CampaignID'));
- showHOCComplete = campaign.sessions.allDone();
if false && view.hocCourseInstance
- showHOCComplete = view.hocCourseInstance.sessions.allDone();
.text-center
if !showHOCComplete
@ -44,28 +43,31 @@ block content
li Learn even more programming!
a.btn.btn-lg.btn-success(href="/play")
if view.hocCourseInstance
h2 Saved Games
if false && view.hocCourseInstance
h3 Saved Games
hr
.course-instance-entry
h2
h3
span.spr Hour of Code: Course 1
span.spr= (me.get('aceConfig') || {}).language === 'python' ? 'Python' : 'JavaScript'
small
a#change-language-link change language
+course-instance-body(hocCourseInstance)
+course-instance-body(view.hocCourseInstance)
.clearfix
if view.classrooms.size()
h2 My Classes
for classroom in view.classrooms
h3.text-uppercase My Classes
hr
for classroom in view.classrooms.models
- var classroomClass = classroom.justAdded ? 'just-added' : '';
if classroom.justAdded
.text-center.text-info Class successfully added!
//- sigh
div(class=classroomClass)
h2
h3
span.spr= classroom.get('name')
span.spr (#{(view.hocCourseInstance.get('aceConfig') || {}).language === 'python' ? 'Python' : 'JavaScript'})
a(href="/courses/classroom/"+classroom.id) view class
@ -73,54 +75,56 @@ block content
- var courseInstances = view.courseInstances.where({classroomID: classroom.id});
for courseInstance in courseInstances
.course-instance-body
.course-instance-entry
- var course = view.courses.get(courseInstance.get('courseID'));
h2
h3
span.spr= course.get('name')
small
// TODO: where do we show list of levels?
a(href="/courses/classrooms/"+classroom.id) view levels
+course-instance-body(hocCourseInstance)
+course-instance-body(courseInstance)
.clearfix
h2 Join A Class
form#join-class-form.form-inline
.form-group
h3.text-uppercase Join A Class
hr
form#join-class-form.form-inline
.help-block
em Ask your teacher if you have a CodeCombat class code! If so, enter it below:
input#class-code-input.form-control
input#join-class-button(type="submit" value="Join")
if view.state === 'enrolling'
.progress.progress-striped.active
.progress-bar(style="width: 100%") Joining class
if view.state === 'unknown_error'
.alert.alert-danger= view.stateMessage
.form-group
input#class-code-input.form-control(placeholder="<Enter Class Code>")
input#join-class-button.btn.btn-default(type="submit" value="Join")
if view.state === 'enrolling'
.progress.progress-striped.active
.progress-bar(style="width: 100%") Joining class
if view.state === 'unknown_error'
.alert.alert-danger= view.stateMessage
#begin-hoc-area.hide
h2.text-center(data-i18n="common.loading")
h3.text-center(data-i18n="common.loading")
.progress.progress-striped.active
.progress-bar(style="width: 100%")
mixin course-instance-body(courseInstance)
- var course = view.courses.get(courseInstance.get('courseID'));
- var campaign = view.campaigns.get(course.get('CampaignID'));
- var levels = view.campaigns.levelsCollection();
if campaign.sessions.allDone()
- var campaign = view.campaigns.get(course.get('campaignID'));
- var levels = campaign.levelsCollection();
if courseInstance.sessions.allDone()
.text-success
span.glyphicon.glyphicon-ok
span.spl Course Complete!
.pull-right
if campaign.sessions.allDone()
if courseInstance.sessions.allDone()
- var arenaLevel = sessions.findWhere({ type: 'course-ladder' });
- var arenaURL = "/play/ladder/"+arenaLevel.get('slug')+"/course/"+courseInstance.id;
a.btn.btn-warning.btn-lg(href=arenaURL)
| Play Arena
else if campaign.sessions.size()
- var lastSession = campaign.sessions.last();
else if courseInstance.sessions.size()
- var lastSession = courseInstance.sessions.last();
- var lastLevel = levels.findWhere({original: lastSession.get('level').original});
- var levelURL = "/play/level/"+lastLevel.get('slug')+"?course="+courseInstance.get('courseID')+"&course-instance="+courseInstance.id;
a.btn.btn-success.btn-lg(href=levelURL)

View file

@ -33,15 +33,14 @@ module.exports = class CoursesView extends RootView
@supermodel.loadCollection(@classrooms, 'classrooms', { data: {memberID: me.id} })
@courses = new CocoCollection([], { url: "/db/course", model: Course})
@supermodel.loadCollection(@courses, 'courses')
@campaigns = new CocoCollection([], { url: "/db/campaigns", model: Campaign })
# TODO: fetch only course campaigns
@supermodel.loadCollection(@courses, 'courses')
@campaigns = new CocoCollection([], { url: "/db/campaign", model: Campaign })
@supermodel.loadCollection(@campaigns, 'campaigns', { data: { type: 'course' }})
onLoaded: ->
for courseInstance in @courseInstances.models
# TODO: fetch sessions for given course instance
# TODO: make sure we only fetch one per courseID
courseInstance.sessions = new CocoCollection([], { url: '???' })
courseInstance.sessions = new CocoCollection([], { url: '???', model: LevelSession })
courseInstance.sessions.allDone = ->
# TODO: should return if all non-arena courses are complete

View file

@ -46,6 +46,8 @@ CampaignHandler = class CampaignHandler extends Handler
query = i18nCoverage: {$exists: true}
if req.query.project
projection[field] = 1 for field in req.query.project.split(',')
if req.query.type
query.type = req.query.type
q = @modelClass.find query, projection
q.exec (err, documents) =>
return @sendDatabaseError(res, err) if err