2016-01-19 18:42:20 -05:00
ModalView = require ' views/core/ModalView '
template = require ' templates/play/level/modal/course-victory-modal '
Achievements = require ' collections/Achievements '
Level = require ' models/Level '
Course = require ' models/Course '
ThangType = require ' models/ThangType '
ThangTypes = require ' collections/ThangTypes '
LevelSessions = require ' collections/LevelSessions '
EarnedAchievement = require ' models/EarnedAchievement '
LocalMongo = require ' lib/LocalMongo '
ProgressView = require ' ./ProgressView '
NewItemView = require ' ./NewItemView '
2016-04-13 12:54:24 -04:00
Classroom = require ' models/Classroom '
2016-04-13 19:32:39 -04:00
utils = require ' core/utils '
2016-01-19 18:42:20 -05:00
module.exports = class CourseVictoryModal extends ModalView
id: ' course-victory-modal '
template: template
closesOnClickOutside: false
2016-02-18 11:44:40 -05:00
2016-01-19 18:42:20 -05:00
initialize: (options) ->
@courseID = options . courseID
@courseInstanceID = options . courseInstanceID
@views = [ ]
@session = options . session
@level = options . level
@newItems = new ThangTypes ( )
@newHeroes = new ThangTypes ( )
2016-04-13 12:54:24 -04:00
2016-04-27 18:36:16 -04:00
if @ courseInstanceID
@classroom = new Classroom ( )
@ supermodel . trackRequest ( @ classroom . fetchForCourseInstance ( @ courseInstanceID ) )
2016-01-19 18:42:20 -05:00
@achievements = options . achievements
if not @ achievements
@achievements = new Achievements ( )
@ achievements . fetchRelatedToLevel ( @ session . get ( ' level ' ) . original )
@achievements = @ supermodel . loadCollection ( @ achievements , ' achievements ' ) . model
@ listenToOnce @ achievements , ' sync ' , @ onAchievementsLoaded
else
@ onAchievementsLoaded ( )
2016-02-18 11:44:40 -05:00
2016-01-19 18:42:20 -05:00
@ playSound ' victory '
2016-04-13 12:54:24 -04:00
@nextLevel = new Level ( )
2016-06-26 16:51:14 -04:00
@nextLevelRequest = @ supermodel . trackRequest ( @ nextLevel . fetchNextForCourse ( {
levelOriginalID: @ level . get ( ' original ' )
@ courseInstanceID
@ courseID
sessionID: @ session . id
} ) )
2016-02-18 11:44:40 -05:00
2016-01-19 18:42:20 -05:00
@course = options . course
if @ courseID and not @ course
@course = new Course ( ) . setURL " /db/course/ #{ @ courseID } "
2016-02-18 11:44:40 -05:00
@course = @ supermodel . loadModel ( @ course ) . model
2016-01-19 18:42:20 -05:00
if @ courseInstanceID
@levelSessions = new LevelSessions ( )
@ levelSessions . fetchForCourseInstance ( @ courseInstanceID )
2016-02-18 11:44:40 -05:00
@levelSessions = @ supermodel . loadCollection ( @ levelSessions , ' sessions ' , {
2016-01-19 18:42:20 -05:00
data: { project: ' state.complete level.original playtime changed ' }
} ) . model
2016-06-08 09:24:59 -04:00
window . tracker ? . trackEvent ' Play Level Victory Modal Loaded ' , category: ' Students ' , levelSlug: @ level . get ( ' slug ' ) , [ ' Mixpanel ' ]
2016-01-19 18:42:20 -05:00
2016-04-13 12:54:24 -04:00
onResourceLoadFailed: (e) ->
if e . resource . jqxhr is @ nextLevelRequest
return
super ( arguments . . . )
2016-02-18 11:44:40 -05:00
2016-01-19 18:42:20 -05:00
onAchievementsLoaded: ->
@achievements.models = _ . filter @ achievements . models , (m) -> not m . get ( ' query ' ) ? . ladderAchievementDifficulty # Don't show higher AI difficulty achievements
itemOriginals = [ ]
heroOriginals = [ ]
achievementIDs = [ ]
for achievement in @ achievements . models
rewards = achievement . get ( ' rewards ' ) or { }
heroOriginals . push rewards . heroes or [ ]
itemOriginals . push rewards . items or [ ]
achievement.completed = LocalMongo . matchesQuery ( @ session . attributes , achievement . get ( ' query ' ) )
achievementIDs . push ( achievement . id ) if achievement . completed
itemOriginals = _ . uniq _ . flatten itemOriginals
heroOriginals = _ . uniq _ . flatten heroOriginals
#project = ['original', 'rasterIcon', 'name', 'soundTriggers', 'i18n'] # This is what we need, but the PlayHeroesModal needs more, and so we load more to fill up the supermodel.
project = [ ' original ' , ' rasterIcon ' , ' name ' , ' slug ' , ' soundTriggers ' , ' featureImages ' , ' gems ' , ' heroClass ' , ' description ' , ' components ' , ' extendedName ' , ' unlockLevelName ' , ' i18n ' ]
for [ newThangTypeCollection , originals ] in [ [ @ newItems , itemOriginals ] , [ @ newHeroes , heroOriginals ] ]
for original in originals
thang= new ThangType ( )
thang.url = " /db/thang.type/ #{ original } /version "
thang.project = project
2016-02-18 11:44:40 -05:00
@ supermodel . loadModel ( thang )
2016-01-19 18:42:20 -05:00
newThangTypeCollection . add ( thang )
2016-02-18 11:44:40 -05:00
2016-01-19 18:42:20 -05:00
@newEarnedAchievements = [ ]
for achievement in @ achievements . models
continue unless achievement . completed
ea = new EarnedAchievement ( {
collection: achievement . get ( ' collection ' )
triggeredBy: @ session . id
achievement: achievement . id
} )
2016-04-15 13:58:52 -04:00
if me . isSessionless ( )
2016-04-08 15:59:10 -04:00
@ newEarnedAchievements . push ea
else
ea . save ( )
# Can't just add models to supermodel because each ea has the same url
ea.sr = @ supermodel . addSomethingResource ( ea . cid )
@ newEarnedAchievements . push ea
@ listenToOnce ea , ' sync ' , (model) ->
model . sr . markLoaded ( )
if _ . all ( ( ea . id for ea in @ newEarnedAchievements ) )
unless me . loading
@ supermodel . loadModel ( me , { cache: false } )
@ newEarnedAchievementsResource . markLoaded ( )
2016-04-15 13:58:52 -04:00
unless me . isSessionless ( )
2016-04-08 15:59:10 -04:00
# have to use a something resource because addModelResource doesn't handle models being upserted/fetched via POST like we're doing here
@newEarnedAchievementsResource = @ supermodel . addSomethingResource ( ' earned achievements ' ) if @ newEarnedAchievements . length
2016-01-19 18:42:20 -05:00
2016-02-18 11:44:40 -05:00
2016-01-19 18:42:20 -05:00
onLoaded: ->
super ( )
@views = [ ]
2016-02-18 11:44:40 -05:00
2016-01-19 18:42:20 -05:00
# TODO: Add main victory view
# TODO: Add level up view
# TODO: Add new hero view?
2016-02-18 11:44:40 -05:00
2016-01-19 18:42:20 -05:00
for newItem in @ newItems . models
@ views . push ( new NewItemView ( { item: newItem } ) )
2016-02-18 11:44:40 -05:00
2016-01-19 18:42:20 -05:00
progressView = new ProgressView ( {
level: @ level
nextLevel: @ nextLevel
course: @ course
2016-04-13 12:54:24 -04:00
classroom: @ classroom
2016-01-19 18:42:20 -05:00
levelSessions: @ levelSessions
} )
2016-02-18 11:44:40 -05:00
2016-01-19 18:42:20 -05:00
progressView . once ' done ' , @ onDone , @
progressView . once ' next-level ' , @ onNextLevel , @
for view in @ views
view . on ' continue ' , @ onViewContinue , @
@ views . push ( progressView )
2016-02-18 11:44:40 -05:00
2016-01-19 18:42:20 -05:00
@ showView ( _ . first ( @ views ) )
2016-02-18 11:44:40 -05:00
2016-01-19 18:42:20 -05:00
afterRender: ->
super ( )
@ showView ( @ currentView )
showView: (view) ->
return unless view
view . setElement ( @ $ ( ' .modal-content ' ) )
view . $el . attr ( ' id ' , view . id )
view . $el . addClass ( view . className )
view . render ( )
@currentView = view
onViewContinue: ->
index = _ . indexOf ( @ views , @ currentView )
@ showView ( @ views [ index + 1 ] )
onNextLevel: ->
2016-06-08 09:24:59 -04:00
window . tracker ? . trackEvent ' Play Level Victory Modal Next Level ' , category: ' Students ' , levelSlug: @ level . get ( ' slug ' ) , nextLevelSlug: @ nextLevel . get ( ' slug ' ) , [ ' Mixpanel ' ]
2016-04-15 13:58:52 -04:00
if me . isSessionless ( )
2016-04-13 19:32:39 -04:00
link = " /play/level/ #{ @ nextLevel . get ( ' slug ' ) } ?course= #{ @ courseID } &codeLanguage= #{ utils . getQueryVariable ( ' codeLanguage ' , ' python ' ) } "
2016-04-08 15:59:10 -04:00
else
link = " /play/level/ #{ @ nextLevel . get ( ' slug ' ) } ?course= #{ @ courseID } &course-instance= #{ @ courseInstanceID } "
2016-01-19 18:42:20 -05:00
application . router . navigate ( link , { trigger: true } )
onDone: ->
2016-06-08 09:24:59 -04:00
window . tracker ? . trackEvent ' Play Level Victory Modal Done ' , category: ' Students ' , levelSlug: @ level . get ( ' slug ' ) , [ ' Mixpanel ' ]
2016-04-15 13:58:52 -04:00
if me . isSessionless ( )
2016-04-08 15:59:10 -04:00
link = " /teachers/courses "
else
link = " /courses/ #{ @ courseID } / #{ @ courseInstanceID } "
2016-01-19 18:42:20 -05:00
application . router . navigate ( link , { trigger: true } )