mirror of
https://github.com/codeninjasllc/codecombat.git
synced 2024-11-24 08:08:15 -05:00
a0212da789
* Add alert explaining when a user joins a course, and links directly to the course * Add header to My Courses list * Have My Courses list sorted by classroom creation then course creation
93 lines
3.4 KiB
CoffeeScript
93 lines
3.4 KiB
CoffeeScript
app = require 'core/application'
|
|
AuthModal = require 'views/core/AuthModal'
|
|
CocoCollection = require 'collections/CocoCollection'
|
|
Course = require 'models/Course'
|
|
Classroom = require 'models/Classroom'
|
|
User = require 'models/User'
|
|
CourseInstance = require 'models/CourseInstance'
|
|
RootView = require 'views/core/RootView'
|
|
template = require 'templates/courses/student-courses-view'
|
|
utils = require 'core/utils'
|
|
|
|
# TODO: Implement join class
|
|
# TODO: Implement course instance links
|
|
|
|
module.exports = class StudentCoursesView extends RootView
|
|
id: 'student-courses-view'
|
|
template: template
|
|
|
|
events:
|
|
'click #join-class-btn': 'onClickJoinClassButton'
|
|
|
|
constructor: (options) ->
|
|
super(options)
|
|
@courseInstances = new CocoCollection([], { url: "/db/user/#{me.id}/course_instances", model: CourseInstance})
|
|
@courseInstances.comparator = (ci) -> return ci.get('classroomID') + ci.get('courseID')
|
|
@supermodel.loadCollection(@courseInstances, 'course_instances')
|
|
@classrooms = new CocoCollection([], { url: "/db/classroom", model: Classroom })
|
|
@supermodel.loadCollection(@classrooms, 'classrooms', { data: {memberID: me.id} })
|
|
@courses = new CocoCollection([], { url: "/db/course", model: Course})
|
|
@supermodel.loadCollection(@courses, 'courses')
|
|
|
|
onLoaded: ->
|
|
if (@classCode = utils.getQueryVariable('_cc', false)) and not me.isAnonymous()
|
|
@joinClass()
|
|
super()
|
|
|
|
onClickJoinClassButton: (e) ->
|
|
return @openModalView new AuthModal() if me.isAnonymous()
|
|
@classCode = @$('#classroom-code-input').val()
|
|
@joinClass()
|
|
|
|
joinClass: () ->
|
|
@state = 'enrolling'
|
|
@renderSelectors '#join-classroom-form'
|
|
$.ajax({
|
|
method: 'POST'
|
|
url: '/db/classroom/-/members'
|
|
data: code: @classCode
|
|
context: @
|
|
success: @onJoinClassroomSuccess
|
|
error: (jqxhr, textStatus, errorThrown) ->
|
|
application.tracker?.trackEvent 'Failed to join classroom with code', status: textStatus
|
|
@state = 'unknown_error'
|
|
if jqxhr.status is 422
|
|
@stateMessage = 'Please enter a code.'
|
|
else if jqxhr.status is 404
|
|
@stateMessage = 'Code not found.'
|
|
else
|
|
@stateMessage = "#{jqxhr.responseText}"
|
|
@renderSelectors '#join-classroom-form'
|
|
})
|
|
|
|
onJoinClassroomSuccess: (data, textStatus, jqxhr) ->
|
|
classroom = new Classroom(data)
|
|
application.tracker?.trackEvent 'Joined classroom', {
|
|
classroomID: classroom.id,
|
|
classroomName: classroom.get('name')
|
|
ownerID: classroom.get('ownerID')
|
|
}
|
|
@classrooms.add(classroom)
|
|
@render()
|
|
|
|
classroomCourseInstances = new CocoCollection([], { url: "/db/course_instance", model: CourseInstance })
|
|
classroomCourseInstances.fetch({ data: {classroomID: classroom.id} })
|
|
@listenToOnce classroomCourseInstances, 'sync', ->
|
|
|
|
# join any course instances in the classroom which are free to join
|
|
jqxhrs = []
|
|
for courseInstance in classroomCourseInstances.models
|
|
course = @courses.get(courseInstance.get('courseID'))
|
|
if course.get('free')
|
|
jqxhrs.push $.ajax({
|
|
method: 'POST'
|
|
url: _.result(courseInstance, 'url') + '/members'
|
|
data: { userID: me.id }
|
|
context: @
|
|
success: (data) ->
|
|
@courseInstances.add(data)
|
|
@courseInstances.get(data._id).justJoined = true
|
|
})
|
|
$.when(jqxhrs...).done =>
|
|
@state = ''
|
|
@render()
|