2015-09-10 10:37:32 -07:00
app = require ' core/application '
RootView = require ' views/core/RootView '
2015-11-03 16:41:06 -08:00
template = require ' templates/courses/courses-view '
2016-04-27 16:25:10 -07:00
AuthModal = require ' views/core/AuthModal '
CreateAccountModal = require ' views/core/CreateAccountModal '
2015-11-23 11:52:15 -06:00
ChangeCourseLanguageModal = require ' views/courses/ChangeCourseLanguageModal '
2015-11-29 18:41:57 -05:00
ChooseLanguageModal = require ' views/courses/ChooseLanguageModal '
2016-05-11 14:39:26 -07:00
JoinClassModal = require ' views/courses/JoinClassModal '
2015-11-21 11:38:34 -08:00
CourseInstance = require ' models/CourseInstance '
2015-11-22 00:08:46 -08:00
CocoCollection = require ' collections/CocoCollection '
Course = require ' models/Course '
Classroom = require ' models/Classroom '
2016-03-30 16:20:37 -07:00
Classrooms = require ' collections/Classrooms '
2015-11-22 00:08:46 -08:00
LevelSession = require ' models/LevelSession '
2015-11-23 08:46:08 -08:00
Campaign = require ' models/Campaign '
2015-11-29 18:13:23 -05:00
utils = require ' core/utils '
2015-11-23 08:46:08 -08:00
# TODO: Test everything
2015-10-12 16:25:23 -07:00
2015-08-29 07:15:35 -07:00
module.exports = class CoursesView extends RootView
id: ' courses-view '
template: template
2015-11-21 11:38:34 -08:00
events:
' click # log-in-btn ' : ' onClickLogInButton '
2016-04-27 16:25:10 -07:00
' click # start-new-game-btn ' : ' openSignUpModal '
2015-11-23 08:46:08 -08:00
' click # join-class-btn ' : ' onClickJoinClassButton '
' submit # join-class-form ' : ' onSubmitJoinClassForm '
2015-11-23 11:52:15 -06:00
' click # change-language-link ' : ' onClickChangeLanguageLink '
2015-12-04 12:08:08 -08:00
2015-11-22 00:08:46 -08:00
initialize: ->
@courseInstances = new CocoCollection ( [ ] , { url: " /db/user/ #{ me . id } /course_instances " , model: CourseInstance } )
@courseInstances.comparator = (ci) -> return ci . get ( ' classroomID ' ) + ci . get ( ' courseID ' )
2015-11-29 15:25:59 -05:00
@ listenToOnce @ courseInstances , ' sync ' , @ onCourseInstancesLoaded
2016-01-25 16:52:14 -08:00
@ supermodel . loadCollection ( @ courseInstances )
2015-11-22 00:08:46 -08:00
@classrooms = new CocoCollection ( [ ] , { url: " /db/classroom " , model: Classroom } )
2016-01-25 16:52:14 -08:00
@ supermodel . loadCollection ( @ classrooms , { data: { memberID: me . id } } )
2016-03-30 16:20:37 -07:00
@ownedClassrooms = new Classrooms ( )
@ ownedClassrooms . fetchMine ( { data: { project: ' _id ' } } )
@ supermodel . trackCollection ( @ ownedClassrooms )
2015-11-22 00:08:46 -08:00
@courses = new CocoCollection ( [ ] , { url: " /db/course " , model: Course } )
2016-01-25 16:52:14 -08:00
@ supermodel . loadCollection ( @ courses )
2015-11-23 08:46:08 -08:00
2015-11-29 15:25:59 -05:00
onCourseInstancesLoaded: ->
map = { }
2015-11-23 08:46:08 -08:00
for courseInstance in @ courseInstances . models
2015-11-29 15:25:59 -05:00
courseID = courseInstance . get ( ' courseID ' )
if map [ courseID ]
courseInstance.sessions = map [ courseID ]
continue
map [ courseID ] = courseInstance.sessions = new CocoCollection ( [ ] , {
url: courseInstance . url ( ) + ' /my-course-level-sessions ' ,
2015-12-04 12:08:08 -08:00
model: LevelSession
2015-11-29 15:25:59 -05:00
} )
courseInstance.sessions.comparator = ' changed '
2016-01-25 16:52:14 -08:00
@ supermodel . loadCollection ( courseInstance . sessions , { data: { project: ' state.complete level.original playtime changed ' } } )
2015-12-04 12:08:08 -08:00
2016-04-13 09:54:24 -07:00
hocCourseInstance = @ courseInstances . findWhere ( { hourOfCode: true } )
if hocCourseInstance
@ courseInstances . remove ( hocCourseInstance )
2015-12-04 12:08:08 -08:00
2015-11-29 18:13:23 -05:00
onLoaded: ->
2015-11-29 18:20:38 -05:00
super ( )
2016-03-30 16:20:37 -07:00
if utils . getQueryVariable ( ' _cc ' , false ) and not me . isAnonymous ( )
2015-11-29 18:13:23 -05:00
@ joinClass ( )
2015-11-29 15:25:59 -05:00
2015-11-21 11:38:34 -08:00
onClickLogInButton: ->
2016-04-27 16:25:10 -07:00
modal = new AuthModal ( )
2015-11-21 11:38:34 -08:00
@ openModalView ( modal )
2015-12-04 12:08:08 -08:00
application . tracker ? . trackEvent ' Started Student Login ' , category: ' Courses '
2015-11-21 11:38:34 -08:00
openSignUpModal: ->
2016-05-10 12:41:50 -07:00
modal = new CreateAccountModal ( { initialValues: { classCode: utils . getQueryVariable ( ' _cc ' , " " ) } } )
2015-11-21 11:38:34 -08:00
@ openModalView ( modal )
2015-12-04 12:08:08 -08:00
application . tracker ? . trackEvent ' Started Student Signup ' , category: ' Courses '
2015-11-21 11:38:34 -08:00
2015-11-23 08:46:08 -08:00
onSubmitJoinClassForm: (e) ->
e . preventDefault ( )
@ joinClass ( )
2015-12-04 12:08:08 -08:00
2015-11-23 08:46:08 -08:00
onClickJoinClassButton: (e) ->
@ joinClass ( )
joinClass: ->
2015-11-29 18:13:23 -05:00
return if @ state
2015-11-23 08:46:08 -08:00
@state = ' enrolling '
2015-11-29 18:13:23 -05:00
@errorMessage = null
@classCode = @ $ ( ' # class-code-input ' ) . val ( ) or utils . getQueryVariable ( ' _cc ' , false )
if not @ classCode
@state = null
@errorMessage = ' Please enter a code. '
@ renderSelectors ' # join-class-form '
return
@ renderSelectors ' # join-class-form '
2016-05-20 14:52:04 -07:00
if me . get ( ' emailVerified ' ) or me . isStudent ( )
2016-05-11 14:39:26 -07:00
newClassroom = new Classroom ( )
jqxhr = newClassroom . joinWithCode ( @ classCode )
@ listenTo newClassroom , ' join:success ' , -> @ onJoinClassroomSuccess ( newClassroom )
@ listenTo newClassroom , ' join:error ' , -> @ onJoinClassroomError ( newClassroom , jqxhr )
else
modal = new JoinClassModal ( { @ classCode } )
@ openModalView modal
@ listenTo modal , ' join:success ' , @ onJoinClassroomSuccess
@ listenTo modal , ' join:error ' , @ onJoinClassroomError
2016-05-23 10:26:34 -07:00
@ listenTo modal , ' hidden ' , ->
@state = null
@ renderSelectors ' # join-class-form '
2015-11-23 08:46:08 -08:00
onJoinClassroomError: (classroom, jqxhr, options) ->
2015-11-29 18:13:23 -05:00
@state = null
2015-12-04 12:08:08 -08:00
application . tracker ? . trackEvent ' Failed to join classroom with code ' , category: ' Courses ' , status: jqxhr . status
2015-11-23 08:46:08 -08:00
if jqxhr . status is 422
@errorMessage = ' Please enter a code. '
else if jqxhr . status is 404
@errorMessage = ' Code not found. '
else
@errorMessage = " #{ jqxhr . responseText } "
2015-12-04 12:08:08 -08:00
@ renderSelectors ' # join-class-form '
2015-11-23 08:46:08 -08:00
2016-04-07 14:55:42 -07:00
onJoinClassroomSuccess: (newClassroom, data, options) ->
2016-05-11 14:39:26 -07:00
@state = null
2015-11-23 08:46:08 -08:00
application . tracker ? . trackEvent ' Joined classroom ' , {
2015-12-04 12:08:08 -08:00
category: ' Courses '
classCode: @ classCode
classroomID: newClassroom . id
2015-11-23 08:46:08 -08:00
classroomName: newClassroom . get ( ' name ' )
ownerID: newClassroom . get ( ' ownerID ' )
}
@ classrooms . add ( newClassroom )
@ render ( )
2015-11-29 18:13:23 -05:00
@classroomJustAdded = newClassroom . id
2015-12-04 12:08:08 -08:00
2015-11-23 08:46:08 -08:00
classroomCourseInstances = new CocoCollection ( [ ] , { url: " /db/course_instance " , model: CourseInstance } )
2015-11-29 18:13:23 -05:00
classroomCourseInstances . fetch ( { data: { classroomID: newClassroom . id } } )
2015-11-23 08:46:08 -08:00
@ listenToOnce classroomCourseInstances , ' sync ' , ->
2016-05-13 10:55:22 -07:00
# TODO: Smoother system for joining a classroom and course instances, without requiring page reload,
# and showing which class was just joined.
document . location.search = ' ' # Using document.location.reload() causes an infinite loop of reloading
2016-04-07 14:55:42 -07:00
2015-11-23 11:52:15 -06:00
onClickChangeLanguageLink: ->
2015-12-04 12:08:08 -08:00
application . tracker ? . trackEvent ' Student clicked change language ' , category: ' Courses '
2015-11-23 11:52:15 -06:00
modal = new ChangeCourseLanguageModal ( )
2015-11-29 18:25:57 -05:00
@ openModalView ( modal )
2015-12-04 12:08:08 -08:00
modal . once ' hidden ' , @ render , @