mirror of
https://github.com/codeninjasllc/codecombat.git
synced 2025-03-23 11:27:21 -04:00
Fix /courses initial implementation
This commit is contained in:
parent
33599c8632
commit
ea0c274a3c
6 changed files with 60 additions and 42 deletions
app
models
styles
templates/courses
views/courses
server/campaigns
|
@ -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'
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
|
@ -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)
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in a new issue