mirror of
https://github.com/codeninjasllc/codecombat.git
synced 2025-04-07 10:34:46 -04:00
Add programming language to options in course instances
This commit is contained in:
parent
0da66bd468
commit
fa4355f946
8 changed files with 48 additions and 14 deletions
app
schemas/models
templates/courses
views/courses
server
|
@ -9,6 +9,8 @@ _.extend CourseInstanceSchema.properties,
|
|||
name: {type: 'string'}
|
||||
ownerID: c.objectId()
|
||||
prepaidID: c.objectId()
|
||||
aceConfig:
|
||||
language: {type: 'string', 'enum': ['python', 'javascript']}
|
||||
|
||||
c.extendBasicProperties CourseInstanceSchema, 'CourseInstance'
|
||||
|
||||
|
|
|
@ -320,13 +320,19 @@ mixin settings-dialog
|
|||
span ×
|
||||
h3.modal-title(data-i18n="courses.edit_settings1")
|
||||
.modal-body
|
||||
p
|
||||
strong(data-i18n="courses.title")
|
||||
p
|
||||
input.settings-name-input(type='text', value="#{courseInstance.get('name') || ''}")
|
||||
p
|
||||
strong(data-i18n="courses.description")
|
||||
p
|
||||
textarea.settings-description-input(rows=2)= courseInstance.get('description')
|
||||
.form
|
||||
.form-group
|
||||
label(data-i18n="courses.title")
|
||||
input.form-control.settings-name-input(type='text', value="#{courseInstance.get('name') || ''}")
|
||||
.form-group
|
||||
label(data-i18n="courses.description")
|
||||
textarea.form-control.settings-description-input(rows=2)= courseInstance.get('description')
|
||||
.form-group
|
||||
label(data-i18n="choose_hero.programming_language")
|
||||
select.form-control#programming-language-select
|
||||
- var aceConfig = view.courseInstance.get('aceConfig') || {};
|
||||
option(value="python", selected=aceConfig.language==='python') Python
|
||||
option(value="javascript", selected=aceConfig.language==='javascript') JavaScript
|
||||
|
||||
.modal-footer
|
||||
button.btn.btn-save-settings(data-i18n="common.save_changes")
|
||||
|
|
|
@ -36,6 +36,11 @@ block content
|
|||
option(value="#{course.id}")= course.get('name')
|
||||
if view.courses.size() > 1
|
||||
option(value="All Courses", data-i18n="courses.all_courses")
|
||||
.form-group
|
||||
label(data-i18n="choose_hero.programming_language")
|
||||
select.form-control#programming-language-select
|
||||
option(value="python", selected=view.selectedLanguage==='python') Python
|
||||
option(value="javascript", selected=view.selectedLanguage==='javascript') JavaScript
|
||||
|
||||
if view.price > 0
|
||||
h3
|
||||
|
|
|
@ -235,6 +235,9 @@ module.exports = class CourseDetailsView extends RootView
|
|||
description = $('.settings-description-input').val()
|
||||
console.log 'onClickSaveSettings', description
|
||||
@courseInstance.set('description', description)
|
||||
@courseInstance.set('aceConfig', {
|
||||
language: @$('#programming-language-select').val()
|
||||
})
|
||||
@courseInstance.patch()
|
||||
$('#settingsModal').modal('hide')
|
||||
|
||||
|
|
|
@ -16,6 +16,7 @@ module.exports = class CourseEnrollView extends RootView
|
|||
'change .class-name': 'onNameChange'
|
||||
'change .course-select': 'onChangeCourse'
|
||||
'change .input-seats': 'onSeatsChange'
|
||||
'change #programming-language-select': 'onChangeProgrammingLanguageSelect'
|
||||
|
||||
subscriptions:
|
||||
'stripe:received-token': 'onStripeReceivedToken'
|
||||
|
@ -24,6 +25,7 @@ module.exports = class CourseEnrollView extends RootView
|
|||
super options
|
||||
@courseID ?= options.courseID
|
||||
@seats = 20
|
||||
@selectedLanguage = 'python'
|
||||
|
||||
@courses = new CocoCollection([], { url: "/db/course", model: Course})
|
||||
@listenTo @courses, 'sync', @onCoursesLoaded
|
||||
|
@ -77,6 +79,9 @@ module.exports = class CourseEnrollView extends RootView
|
|||
onChangeCourse: (e) ->
|
||||
@selectedCourse = _.find @courses.models, (a) -> a.id is $(e.target).val()
|
||||
@renderNewPrice()
|
||||
|
||||
onChangeProgrammingLanguageSelect: (e) ->
|
||||
@selectedLanguage = @$('#programming-language-select').val()
|
||||
|
||||
onNameChange: (e) ->
|
||||
@className = $('.class-name').val()
|
||||
|
@ -93,6 +98,8 @@ module.exports = class CourseEnrollView extends RootView
|
|||
stripe:
|
||||
token: token
|
||||
timestamp: new Date().getTime()
|
||||
aceConfig: { language: @selectedLanguage }
|
||||
|
||||
data.courseID = @selectedCourse.id if @selectedCourse
|
||||
jqxhr = $.post('/db/course_instance/-/create', data)
|
||||
jqxhr.done (data, textStatus, jqXHR) =>
|
||||
|
|
|
@ -10,6 +10,7 @@ CourseInstanceSchema.statics.editableProperties = [
|
|||
'description'
|
||||
'members'
|
||||
'name'
|
||||
'aceConfig'
|
||||
]
|
||||
|
||||
CourseInstanceSchema.statics.jsonSchema = jsonSchema
|
||||
|
|
|
@ -50,6 +50,7 @@ CourseInstanceHandler = class CourseInstanceHandler extends Handler
|
|||
courseID = req.body.courseID
|
||||
# Optional
|
||||
name = req.body.name
|
||||
aceConfig = req.body.aceConfig or {}
|
||||
# Optional - as long as course(s) are all free
|
||||
stripeToken = req.body.stripe?.token
|
||||
|
||||
|
@ -66,23 +67,24 @@ CourseInstanceHandler = class CourseInstanceHandler extends Handler
|
|||
return @sendDatabaseError(res, err)
|
||||
|
||||
courseInstances = []
|
||||
makeCreateInstanceFn = (course, name, prepaid) =>
|
||||
makeCreateInstanceFn = (course, name, prepaid, aceConfig) =>
|
||||
(done) =>
|
||||
@createInstance req, course, name, prepaid, (err, newInstance)=>
|
||||
@createInstance req, course, name, prepaid, aceConfig, (err, newInstance)=>
|
||||
courseInstances.push newInstance unless err
|
||||
done(err)
|
||||
tasks = (makeCreateInstanceFn(course, name, prepaid) for course in courses)
|
||||
tasks = (makeCreateInstanceFn(course, name, prepaid, aceConfig) for course in courses)
|
||||
async.parallel tasks, (err, results) =>
|
||||
return @sendDatabaseError(res, err) if err
|
||||
@sendCreated(res, courseInstances)
|
||||
|
||||
createInstance: (req, course, name, prepaid, done) =>
|
||||
createInstance: (req, course, name, prepaid, aceConfig, done) =>
|
||||
courseInstance = new CourseInstance
|
||||
courseID: course.get('_id')
|
||||
members: [req.user.get('_id')]
|
||||
name: name
|
||||
ownerID: req.user.get('_id')
|
||||
prepaidID: prepaid.get('_id')
|
||||
aceConfig: aceConfig
|
||||
courseInstance.save (err, newInstance) =>
|
||||
done(err, newInstance)
|
||||
|
||||
|
|
|
@ -123,7 +123,15 @@ LevelHandler = class LevelHandler extends Handler
|
|||
Campaign.find { _id: { $in: campaignIDs }}, (err, campaigns) =>
|
||||
levelOriginals = (_.keys(c.get('levels')) for c in campaigns)
|
||||
levelOriginals = _.flatten(levelOriginals)
|
||||
if level.get('original').toString() in levelOriginals
|
||||
originalString = level.get('original').toString()
|
||||
if originalString in levelOriginals
|
||||
campaignStrings = (campaign.id.toString() for campaign in campaigns when campaign.get('levels')[originalString])
|
||||
courses = _.filter(courses, (course) -> course.get('campaignID').toString() in campaignStrings)
|
||||
courseStrings = (course.id.toString() for course in courses)
|
||||
courseInstances = _.filter(courseInstances, (courseInstance) -> courseInstance.get('courseID').toString() in courseStrings)
|
||||
aceConfigs = (ci.get('aceConfig') for ci in courseInstances)
|
||||
aceConfig = _.filter(aceConfigs)[0] or {}
|
||||
req.codeLanguage = aceConfig.language
|
||||
@createAndSaveNewSession(sessionQuery, req, res)
|
||||
else
|
||||
return @sendPaymentRequiredError(res, 'You must be in a course which includes this level to play it')
|
||||
|
@ -146,7 +154,7 @@ LevelHandler = class LevelHandler extends Handler
|
|||
access: 'write'
|
||||
}
|
||||
]
|
||||
initVals.codeLanguage = req.user.get('aceConfig')?.language ? 'python'
|
||||
initVals.codeLanguage = req.codeLanguage ? req.user.get('aceConfig')?.language ? 'python'
|
||||
session = new Session(initVals)
|
||||
|
||||
session.save (err) =>
|
||||
|
|
Loading…
Add table
Reference in a new issue