codecombat/app/views/NewHomeView.coffee
phoenixeliot 3d705e5d70 Fix bugquest bugs
Fix link to /teachers/classes (fixes bugquest#20)

Fix edit button color/icon (bugquest#23)

Fix bugquest#34

Fix password input width (bugquest#33)

Center new pasword text

Fix teacher password reset endpoint (bugquest#4)

Refactor+use NewHomeView logic for user page button (Fixes bugquest#2)

Refactor teacher-password-reset endpoint

This makes it much easier to prevent collisions with other logic when PUTing new User attributes.

Add regression test for converting to teacher account

Fix email verified links, require login (fix bugquest#16)

Fix me having stale emailVerified value (Fixes bugquest#40)

Don't show JoinClassModal to students

Add paragraph to JoinClassModal (fixes bugquest#14)

Update change-password label text (fixes bugquest#30)

Fix prompting for login on Account Settings page (bugquest #10)

Show validation errors for teacher password reset (bugquest#36)

Show yellow progress dot in My Classes if anyone has started (bugquest#55)

Remove confusing text (bugquest#100)
2016-05-24 14:10:17 -07:00

173 lines
6.8 KiB
CoffeeScript

RootView = require 'views/core/RootView'
template = require 'templates/new-home-view'
CocoCollection = require 'collections/CocoCollection'
TrialRequest = require 'models/TrialRequest'
TrialRequests = require 'collections/TrialRequests'
Course = require 'models/Course'
utils = require 'core/utils'
storage = require 'core/storage'
{logoutUser, me} = require('core/auth')
# TODO: auto margin feature paragraphs
module.exports = class NewHomeView extends RootView
id: 'new-home-view'
className: 'style-flat'
template: template
events:
'click .play-btn': 'onClickPlayButton'
'change #school-level-dropdown': 'onChangeSchoolLevelDropdown'
'click .teacher-btn': 'onClickTeacherButton'
'click #learn-more-link': 'onClickLearnMoreLink'
'click .screen-thumbnail': 'onClickScreenThumbnail'
'click #carousel-left': 'onLeftPressed'
'click #carousel-right': 'onRightPressed'
'click .request-demo': 'onClickRequestDemo'
'click .join-class': 'onClickJoinClass'
'click .logout-btn': 'logoutAccount'
shortcuts:
'right': 'onRightPressed'
'left': 'onLeftPressed'
'esc': 'onEscapePressed'
initialize: (options) ->
@courses = new CocoCollection [], {url: "/db/course", model: Course}
@supermodel.loadCollection(@courses, 'courses')
@variation ?= me.getHomepageGroup()
window.tracker?.trackEvent 'Homepage Loaded', category: 'Homepage'
if me.isTeacher()
@trialRequests = new TrialRequests()
@trialRequests.fetchOwn()
@supermodel.loadCollection(@trialRequests)
isHourOfCodeWeek = false # Temporary: default to /hoc flow during the main event week
if isHourOfCodeWeek and (@isNewPlayer() or (me.justPlaysCourses() and me.isAnonymous()))
# Go/return straight to playing single-player HoC course on Play click
@playURL = '/hoc?go=true'
@alternatePlayURL = '/play'
@alternatePlayText = 'home.play_campaign_version'
else if me.justPlaysCourses()
# Save players who might be in a classroom from getting into the campaign
@playURL = '/courses'
@alternatePlayURL = '/play'
@alternatePlayText = 'home.play_campaign_version'
else
@playURL = '/play'
onLoaded: ->
@trialRequest = @trialRequests.first() if @trialRequests?.size()
@isTeacherWithDemo = @trialRequest and @trialRequest.get('status') in ['approved', 'submitted']
@demoRequestURL = if me.isTeacher() then '/teachers/update-account' else '/teachers/demo'
super()
onClickPlayButton: (e) ->
@playSound 'menu-button-click'
e.preventDefault()
e.stopImmediatePropagation()
window.tracker?.trackEvent 'Homepage Click Play', category: 'Homepage'
application.router.navigate @playURL, trigger: true
#window.open @playURL, '_blank'
onClickRequestDemo: (e) ->
@playSound 'menu-button-click'
e.preventDefault()
e.stopImmediatePropagation()
window.tracker?.trackEvent 'Homepage Submit Jumbo Form', category: 'Homepage'
obj = storage.load('request-quote-form')
obj ?= {}
obj.role = @$('#request-form-role').val()
obj.numStudents = @$('#request-form-range').val()
storage.save('request-quote-form', obj)
application.router.navigate "/teachers/demo", trigger: true
onClickJoinClass: (e) ->
@playSound 'menu-button-click'
e.preventDefault()
e.stopImmediatePropagation()
window.tracker?.trackEvent 'Homepage Click Join Class', category: 'Homepage'
application.router.navigate "/courses", trigger: true
afterRender: ->
@onChangeSchoolLevelDropdown()
@$('#screenshot-lightbox').modal()
@$('#screenshot-carousel').carousel({
interval: 0
keyboard: false
})
$(window).on 'resize', @fitToPage
@fitToPage()
setTimeout(@fitToPage, 0)
super()
destroy: ->
$(window).off 'resize', @fitToPage
super()
logoutAccount: ->
Backbone.Mediator.publish("auth:logging-out", {})
logoutUser()
onChangeSchoolLevelDropdown: (e) ->
levels =
elementary: {'introduction-to-computer-science': '2-4', 'computer-science-5': '15-20', default: '10-15', total: '50-70 hours (about one year)'}
middle: {'introduction-to-computer-science': '1-3', 'computer-science-5': '7-10', default: '5-8', total: '25-35 hours (about one semester)'}
high: {'introduction-to-computer-science': '1', 'computer-science-5': '6-9', default: '5-6', total: '22-28 hours (about one semester)'}
level = if e then $(e.target).val() else 'middle'
@$el.find('#courses-row .course-details').each ->
slug = $(@).data('course-slug')
duration = levels[level][slug] or levels[level].default
$(@).find('.course-duration .course-hours').text duration
$(@).find('.course-duration .unit').text($.i18n.t(if duration is '1' then 'units.hour' else 'units.hours'))
@$el.find('#semester-duration').text levels[level].total
isNewPlayer: ->
not me.get('stats')?.gamesCompleted and not me.get('heroConfig')
onClickLearnMoreLink: ->
window.tracker?.trackEvent 'Homepage Click Learn More', category: 'Homepage'
@scrollToLink('#classroom-in-box-container')
onClickTeacherButton: ->
if me.isTeacher()
window.tracker?.trackEvent 'Homepage Click Teacher Button (logged in)', category: 'Homepage'
application.router.navigate('/teachers', { trigger: true })
else
window.tracker?.trackEvent 'Homepage Click Teacher Button', category: 'Homepage'
@scrollToLink('.request-demo-row', 600)
onRightPressed: (event) ->
# Special handling, otherwise after you click the control, keyboard presses move the slide twice
return if event.type is 'keydown' and $(document.activeElement).is('.carousel-control')
if $('#screenshot-lightbox').data('bs.modal')?.isShown
event.preventDefault()
$('#screenshot-carousel').carousel('next')
onLeftPressed: (event) ->
return if event.type is 'keydown' and $(document.activeElement).is('.carousel-control')
if $('#screenshot-lightbox').data('bs.modal')?.isShown
event.preventDefault()
$('#screenshot-carousel').carousel('prev')
onEscapePressed: (event) ->
if $('#screenshot-lightbox').data('bs.modal')?.isShown
event.preventDefault()
$('#screenshot-lightbox').modal('hide')
onClickScreenThumbnail: (event) ->
unless $('#screenshot-lightbox').data('bs.modal')?.isShown
event.preventDefault()
# Modal opening happens automatically from bootstrap
$('#screenshot-carousel').carousel($(event.currentTarget).data("index"))
fitToPage: =>
windowHeight = $(window).height()
linkBox = @$("#learn-more-link").parent()
linkOffset = linkBox.offset()
adjustment = windowHeight - (linkOffset.top + linkBox.height())
target = @$('.top-spacer').first()
newOffset = parseInt(target.css('height') || 0) + adjustment
newOffset = Math.min(Math.max(0, newOffset), 170)
target.css(height: "#{newOffset}px")