Merge branch 'master' into production

This commit is contained in:
Matt Lott 2016-02-24 16:50:39 -08:00
commit aa14e405f2
68 changed files with 1767 additions and 1093 deletions

Binary file not shown.

After

(image error) Size: 2.7 KiB

Binary file not shown.

After

(image error) Size: 2.7 KiB

Binary file not shown.

After

(image error) Size: 7.8 KiB

Binary file not shown.

Before

(image error) Size: 77 KiB

Binary file not shown.

After

(image error) Size: 1.2 MiB

Binary file not shown.

After

(image error) Size: 344 KiB

Binary file not shown.

After

(image error) Size: 455 KiB

Binary file not shown.

After

(image error) Size: 765 KiB

Binary file not shown.

After

(image error) Size: 6.5 KiB

Binary file not shown.

After

(image error) Size: 294 KiB

Binary file not shown.

After

(image error) Size: 1,018 KiB

Binary file not shown.

After

(image error) Size: 11 KiB

Binary file not shown.

After

(image error) Size: 7.9 KiB

Binary file not shown.

After

(image error) Size: 24 KiB

Binary file not shown.

After

(image error) Size: 12 KiB

Binary file not shown.

After

(image error) Size: 12 KiB

Binary file not shown.

After

(image error) Size: 90 KiB

Binary file not shown.

After

(image error) Size: 89 KiB

Binary file not shown.

After

(image error) Size: 144 KiB

Binary file not shown.

After

(image error) Size: 147 KiB

Binary file not shown.

After

(image error) Size: 192 KiB

View file

@ -83,8 +83,8 @@ module.exports.setErrorToProperty = setErrorToProperty = (el, property, message,
setErrorToField input, message, warning
module.exports.scrollToFirstError = ($el=$('body')) ->
$first = $el.find('.has-error, .alert-danger, .error-help-block, .has-warning, .alert-warning, .warning-help-block').first()
$('body').animate({ scrollTop: $first.offset().top - 20 }, 300)
$first = $el.find('.has-error, .alert-danger, .error-help-block, .has-warning, .alert-warning, .warning-help-block').filter(':visible').first()
$('html, body').animate({ scrollTop: $first.offset().top - 20 }, 300)
module.exports.clearFormAlerts = (el) ->
$('.has-error', el).removeClass('has-error')

View file

@ -25,7 +25,7 @@ module.exports = class LevelSetupManager extends CocoClass
loadLevel: ->
levelURL = "/db/level/#{@options.levelID}"
@level = new Level().setURL levelURL
@level = @supermodel.loadModel(@level, 'level').model
@level = @supermodel.loadModel(@level).model
if @level.loaded then @onLevelSync() else @listenToOnce @level, 'sync', @onLevelSync
loadSession: ->
@ -33,7 +33,7 @@ module.exports = class LevelSetupManager extends CocoClass
#sessionURL += "?team=#{@team}" if @options.team # TODO: figure out how to get the teams for multiplayer PVP hero style
sessionURL += "?course=#{@options.courseID}" if @options.courseID
@session = new LevelSession().setURL sessionURL
@session = @supermodel.loadModel(@session, 'level_session').model
@session = @supermodel.loadModel(@session).model
if @session.loaded then @onSessionSync() else @listenToOnce @session, 'sync', @onSessionSync
onLevelSync: ->

View file

@ -286,6 +286,7 @@ module.exports.thangNames = thangNames =
'Gom'
'Grek'
'Gror'
'Grue'
'Il\'Du\'duka'
'Makas'
'Mogadishu'

View file

@ -545,19 +545,11 @@
editor_config_behaviors_description: "Autocompletes brackets, braces, and quotes."
about:
why_codecombat: "Why CodeCombat?"
why_paragraph_1: "If you want to learn to program, you don't need lessons. You need to write a lot of code and have a great time doing it."
why_paragraph_2_prefix: "That's what programming is about. It's gotta be fun. Not fun like"
why_paragraph_2_italic: "yay a badge"
why_paragraph_2_center: "but fun like"
why_paragraph_2_italic_caps: "NO MOM I HAVE TO FINISH THE LEVEL!"
why_paragraph_2_suffix: "That's why CodeCombat is a multiplayer game, not a gamified lesson course. We won't stop until you can't stop--but this time, that's a good thing."
why_paragraph_3: "If you're going to get addicted to some game, get addicted to this one and become one of the wizards of the tech age."
press_title: "Bloggers/Press"
press_paragraph_1_prefix: "Want to write about us? Feel free to download and use all of the resources included in our"
press_paragraph_1_link: "press packet"
press_paragraph_1_suffix: ". All logos and images may be used without contacting us directly."
team: "Team"
mission_title: "Our mission: make programming accessible to every student on Earth."
mission_description_1: "Programming is magic. It's the ability to create things from pure imagination. We started CodeCombat to give learners the feeling of wizardly power at their fingertips by using typed code."
mission_description_2: "As it turns out, that enables them to learn faster too. WAY faster. It's like having a conversation instead of reading a manual. We want to bring that conversation to every school and to every student, because everyone should have the chance to learn the magic of programming."
team_title: "Meet the CodeCombat team"
team_values: "We value open and respectful dialog, where the best idea wins. Our decisions are grounded in customer research and our process is focused on delivering tangible results for them. Everyone is hands-on, from our CEO to our Github contributors, because we value growth and learning in our team."
nick_title: "Cofounder, CEO"
nick_blurb: "Motivation Guru"
matt_title: "Cofounder, CTO"
@ -582,6 +574,49 @@
jose_blurb: "Taking Off"
carlos_title: "Region Manager, Brazil"
carlos_blurb: "Celery Man"
community_title: "...and our open-source community"
community_subtitle: "Over 450 contributors have helped build CodeCombat, with more joining every week!"
community_description_1: "CodeCombat is a community project, with hundreds of players volunteering to create levels, contribute to our code to add features, fix bugs, playtest, and even translate the game into 50 languages so far. Employees, contributors and the site gain by sharing ideas and pooling effort, as does the open source community in general. The site is built on numerous open source projects, and we are open sourced to give back to the community and provide code-curious players a familiar project to explore and experiment with. Anyone can join the CodeCombat community! Check out our "
community_description_link: "contribute page "
community_description_2: "for more info."
story_title: "Our story so far"
story_subtitle: "Since 2013, CodeCombat has grown from a mere set of sketches to a living, thriving game."
story_statistic_1a: "5,000,000+"
story_statistic_1b: "total players"
story_statistic_2a: "Weve been translated into over 50 languages — our players hail from"
story_statistic_2b: "200+ countries"
story_statistic_3a: "Together, they have written"
story_statistic_3b: "1 billion lines of code and counting"
story_statistic_3c: "across six different programming languages"
story_long_way_1: "Though we've come a long way..."
story_sketch_caption: "Nick's very first sketch depicting a programming game in action."
story_long_way_2: "we still have much to do before we complete our quest, so..."
jobs_title: "Come work with us and help write CodeCombat history!"
jobs_subtitle: """Don't see a good fit but interested in keeping in touch? See our "Create Your Own" listing."""
jobs_benefits: "Employee Benefits"
jobs_benefit_1: "Competitive salary and options"
jobs_benefit_2: "15 day minimum vacation policy, excluding company holidays"
jobs_benefit_3: "Work from home flexibility"
jobs_benefit_4: "Unlimited sick/personal days"
jobs_benefit_5: "Professional development and continuing education support"
jobs_benefit_6: "Medical/dental/vision insurance"
jobs_custom_title: "Create Your Own"
jobs_custom_description: "Are you passionate about CodeCombat but don't see a job listed that matches your qualifications? Write us and show how you think you can contribute to our team. We'd love to hear from you!"
jobs_custom_contact_1: "Send us a note at "
jobs_custom_contact_2: "introducing yourself and we might get in touch in the future!"
contact_title: "Press & Contact"
contact_subtitle: "Need more information? Get in touch with us at "
screenshots_title: "Game Screenshots"
screenshots_hint: "(click to view full size)"
downloads_title: "Download Assets & Information"
about_codecombat: "About CodeCombat"
logo: "Logo"
screenshots: "Screenshots"
character_art: "Character Art"
download_all: "Download All"
location_title: "We're located in downtown SF:"
teachers:
who_for_title: "Who is CodeCombat for?"

View file

@ -1,36 +1,327 @@
@import "app/styles/bootstrap/variables"
@import "app/styles/mixins"
@import "app/styles/style-flat"
#about-view
@import "bootstrap/variables"
overflow: hidden
.team-column
#nav-container
min-height: 55px
nav
background: $gold
&.affix
z-index: 1
position: fixed
top: 0
width: 100%
ul
margin-top: 5px
padding-left: 0
ul.thumbnails
margin-left: 40px
padding: 0
list-style: none
li
list-style-type: none
height: 22pt
display: inline-block
margin: 10px 18px 0 18px
a
color: white
text-transform: uppercase
text-decoration: none
li.active
.label
padding-left: 0
padding-right: 0
padding-bottom: 0
margin-left: 0.6em
margin-right: 0.6em
border-bottom: 4px solid white
border-radius: 0
#jumbotron
background-color: $navy
background-image: url("/images/pages/about/codebackground_zoom_compressed.png")
background-size: cover
background-repeat: no-repeat
img.img-thumbnail
background-color: transparent
&:hover
background-color: rgba(200, 244, 255, 0.2)
float: left
width: 80px
height: 80px
margin: 0px 10px 22px 0px
h1
color: white
margin-top: 100px
.team_name
font-size: 20px
margin-top: 0
h2
color: white
margin-bottom: 100px
.team_bio
width: 150px
float: left
.responsive-side-margins, h3, h4, p
max-width: 460px
margin-left: auto
margin-right: auto
@media (min-width: $screen-sm-min)
max-width: inherit
div
font-size: 12px
line-height: 14px
padding-bottom: 5px
h3
margin-top: 60px
@media (min-width: $screen-sm-min)
margin-top: 150px
#about-container
@media (min-width: $screen-sm-min)
margin-top: 85px
background-color: white
#mission-text
margin-top: 30px
@media (min-width: $screen-sm-min)
margin-top: 45px
#mission-graphic, #community-graphic
padding: 30px 40px
position: relative
min-height: 320px
@media (min-width: $screen-sm-min)
min-height: 250px
h2
color: white
width: 50%
#mission-graphic
margin-top: 30px
@media (min-width: $screen-sm-min)
margin-top: 45px
background: $navy
h2
float: right
img
position: absolute
bottom: 0
left: 0
#mission-graphic-filler
background: $navy
height: 100%
width: 2000px
position: absolute
right: 100%
top: 0
#team
ul
text-align: center
margin-top: 40px
padding: 0
li
width: 200px
height: 230px
list-style: none
display: inline-block
text-align: center
color: black
small
display: block
white-space: nowrap
.img-thumbnail
border-radius: 50%
padding: 0
background-color: $burgandy
border: 5px solid $gold
// #community
// margin-top: 100px
#community-row-1
#community-avatars
width: 90%
margin: 20px 5%
#community-row-2
margin-top: 35px
@media (min-width: $screen-sm-min)
margin-top: 70px
#community-graphic
background: $burgandy
img
position: absolute
right: 0
bottom: 0
#community-graphic-filler
background: $burgandy
height: 100%
width: 2000px
position: absolute
left: 100%
top: 0
#story
// margin-top: 150px
font-family: $headline-font
font-variant: normal
#story-graphic-1
max-width: 580px
margin-top: 50px
@media (min-width: $screen-sm-min)
margin-top: 80px
margin-left: auto
margin-right: auto
.media-heading
color: $burgandy
#story-graphic-2
//TODO: Fix left-margin of this
margin-top: 50px
@media (min-width: $screen-sm-min)
margin-top: 80px
margin-left: auto
margin-right: auto
max-width: 390px
.media-heading
color: $forest
#story-graphic-3
margin-top: 50px
@media (min-width: $screen-sm-min)
margin-top: 80px
p
margin-top: 30px
img
margin-top: 20px
#story-bracketed-text
width: 100%
max-width: 640px
margin: 0 auto
.text-h1
display: inline-block
margin: auto 0
color: $navy
width: 80%
vertical-align: bottom
img
margin: auto 0
#left-bracket
width: 10%
display: inline-block
#right-bracket
width: 10%
display: inline-block
#story-languages
margin-top: 50px
#language-icons
display: inline-block
padding-left: auto
padding-right: auto
#story-graphic-4
margin-left: auto
margin-right: auto
margin-top: 50px
@media (min-width: $screen-sm-min)
margin-top: 150px
p
margin-top: 20px
figure
img
display: block
margin: 0 auto
#jobs
// margin-top: 50px
// @media (min-width: $screen-sm-min)
// margin-top: 100px
#jobs-row
#benefits, .job-listing
margin-top: 65px
border: thin solid $navy
border-radius: 8px
padding: 50px
width: 370px
height: 420px
margin-left: auto
margin-right: auto
h5
text-align: center
color: inherit
li
padding-bottom: 7px
#benefits
color: white
background: $navy
ul
margin-top: 20px
.job-listing
color: $navy
background: white
// centering hack
position: relative
.label
text-transform: uppercase
color: grey
a.job-link
width: 170px
bottom: 45px
// centering hack
position: absolute
left: 50%
margin-left: -85px
p
margin-top: 15px
#files
padding: 30px 0
margin-top: 50px
border: thin solid gray
border-radius: 8px
.label
color: black
display: block
#screenshots
text-align: center
#screenshot-grid
img
display: inline-block
margin: 6.5px
#downloads-container
position: relative
height: 250px
#downloads
//TODO: How do I center this in small view?
margin: 20px auto 0
width: 260px
ul
width: 260px
margin-top: 10px
margin-bottom: 20px
margin-left: -25px
a
color: black
#download-button
margin: 0 auto
color: $navy
.glyphicon-download-alt
margin-right: 15px
vertical-align: middle
font-size: 1.5em
#screenshot-lightbox
.modal-dialog
width: auto
max-width: 1024px
#location
margin-top: 75px
margin-bottom: 100px
text-align: center
p b
margin-top: 40px
a
color: inherit
text-decoration: underline
iframe
border: 2px solid lightgray
.anchor::before
content: ""
display: block
height: 55px
margin: -55px 0 0 0

View file

@ -1,205 +1,6 @@
@import "app/styles/bootstrap/variables"
@import "app/styles/mixins"
// TODO: Move flat style into probably several files and Bootstrap variables
// Variables
$headline-font: 'Arvo', serif
$body-font: 'Open Sans', sans-serif
$burgandy: #7D0101
$gold: #F2BE19
$navy: #0E4C60
$forest: #20572B
.style-flat
background: white
// Fonts
h1, h2, h3, h4, h5, h6
// Unsetting game styles
font-variant: normal
color: black
margin: 0
h1
font-family: $headline-font
font-weight: normal
font-size: 46px
line-height: 62px
h2
font-family: $body-font
font-weight: lighter
font-size: 30px
line-height: 42px
h3
font-family: $headline-font
font-weight: normal
font-size: 33px
line-height: 45px
h4
font-family: $body-font
font-weight: lighter
font-size: 22px
line-height: 32px
h5
font-family: $headline-font
font-weight: bold
font-size: 20px
line-height: 31px
h6
font-family: $body-font
font-weight: bold
font-size: 14px
line-height: 20px
p
margin: 0 0 14px
.small
font-weight: normal
font-size: 14px
line-height: 20px
font-family: $body-font
font-size: 18px
line-height: 29px
blockquote
border: none
&:before
font-family: "Monaco"
content: "\201C"
position: absolute
left: 0px
top: 20px
font-size: 40px
opacity: 0.5
// Navbar
.navbar
background: white
margin-bottom: 0
white-space: nowrap // prevent home icon from going under brand
a.navbar-brand
#logo-img
width: 230px
height: 65px
margin-right: 10px
color: $burgandy
&:hover
color: white
background: $burgandy
.glyphicon-home
position: relative
top: 3px
.navbar-toggle
color: black
margin: 30px 25px 0
.nav > li > a
// TODO: Move this to bootstrap variables for navbars
font-weight: bold
font-family: $body-font
font-size: 16px
padding: 38px 15px 37px
color: $burgandy
text-shadow: 0 0 0
&:hover
background: $burgandy
color: white
#language-dropdown-wrapper
display: inline-block
padding: 30px 10px
width: 100%
@media (max-width: $screen-sm-min)
.nav > li > a
padding: 10px 20px
#language-dropdown-wrapper
display: inline-block
padding: 10px 10px
.language-dropdown
width: 150px
.img-circle
border: $gold 8px solid
width: 98px
height: 98px // Includes the border
.user-level
position: absolute
top: 76px
right: 42px
color: $gold
text-shadow: 1px 1px black, -1px -1px 0 black, 1px -1px 0 black, -1px 1px 0 black
// Buttons
.btn
border: none
border-radius: 5px
font-family: $body-font
font-weight: normal
background-image: none // overrides legacy buttons
.btn-primary, .btn-navy
background-color: $navy
color: white
.btn-primary-alt, .btn-navy-alt
background-color: white
border: 1px solid $navy
color: $navy
.btn-forest
background-color: $forest
color: white
.btn-forest-alt
background-color: white
border: 1px solid $forest
color: $forest
.btn-gold
background-color: $gold
color: white
.btn-gold-alt
background-color: white
border: 1px solid $gold
color: $gold
.btn-lg
font-size: 18px
// Classes
.text-navy
color: $navy
.bg-navy
background-color: $navy
color: white
h1, h2, h3, h4, h5, h6, a
color: white
a.btn-primary-alt
color: $navy
@import "app/styles/style-flat"
#new-home-view
@ -464,40 +265,3 @@ $forest: #20572B
img
margin-bottom: 20px
#footer
background-image: url("/images/pages/home/footer_background.png")
height: 229px
margin: -22px auto 0
color: white
@media (max-width: $screen-sm-min)
background-color: #201a15
background-image: none
height: auto
ul
margin: 30px
li:first-child
border-bottom: 1px solid white
margin-bottom: 10px
a
color: white
#final-footer
position: absolute
left: 0
right: 0
height: 60px
color: white
background-color: #463a2c
@media (max-width: $screen-sm-min)
position: inherit
padding: 20px
height: auto
a
color: white
img
width: 150px
margin: 0 10px

View file

@ -1,27 +1,32 @@
#request-quote-view
#site-content-area
//TODO: Maybe this should go in style-flat
margin: 50px 10px 100px
.section
margin-top: 80px
margin-bottom: 50px
.form-group
label
margin-bottom: 2px
margin-bottom: 0
.row
margin: 10px 0
label.checkbox
font-weight: normal
.help-block
margin: 0
margin: -4px 0 2px
p
margin: 0 0 20px
hr
margin: 30px 0
.checkbox, .checkbox-inline
margin: 0
#anything-else-row
margin: 50px 0 20px
input
margin-top: 8px
#other-education-level-input
label
display: inline-block
display: inline-block
width: 200px
margin-left: 5px

239
app/styles/style-flat.sass Normal file
View file

@ -0,0 +1,239 @@
@import "app/styles/bootstrap/variables"
@import "app/styles/mixins"
// TODO: Move flat style into probably several files and Bootstrap variables
// Variables
$headline-font: 'Arvo', serif
$body-font: 'Open Sans', sans-serif
$burgandy: #7D0101
$gold: #F2BE19
$navy: #0E4C60
$forest: #20572B
.style-flat
background: white
// Fonts
h1, h2, h3, h4, h5, h6
// Unsetting game styles
font-variant: normal
color: black
margin: 0
h1, .text-h1
font-family: $headline-font
font-weight: normal
font-size: 46px
line-height: 62px
h2, .text-h2
font-family: $body-font
font-weight: lighter
font-size: 30px
line-height: 42px
h3, .text-h3
font-family: $headline-font
font-weight: normal
font-size: 33px
line-height: 45px
h4, .text-h4
font-family: $body-font
font-weight: lighter
font-size: 22px
line-height: 32px
h5, .text-h5
font-family: $headline-font
font-weight: bold
font-size: 20px
line-height: 31px
h6, .text-h6
font-family: $body-font
font-weight: bold
font-size: 14px
line-height: 20px
p
margin: 0 0 14px
.small
font-weight: normal
font-size: 14px
line-height: 20px
font-family: $body-font
font-size: 18px
line-height: 29px
blockquote
border: none
&:before
font-family: "Monaco"
content: "\201C"
position: absolute
left: 0px
top: 20px
font-size: 40px
opacity: 0.5
// Navbar
.navbar
background: white
margin-bottom: 0
white-space: nowrap // prevent home icon from going under brand
a.navbar-brand
#logo-img
width: 230px
height: 65px
margin-right: 10px
color: $burgandy
&:hover
color: white
background: $burgandy
.glyphicon-home
position: relative
top: 3px
.navbar-toggle
color: black
margin: 30px 25px 0
.nav > li > a
// TODO: Move this to bootstrap variables for navbars
font-weight: bold
font-family: $body-font
font-size: 16px
padding: 38px 15px 37px
color: $burgandy
text-shadow: 0 0 0
&:hover
background: $burgandy
color: white
#language-dropdown-wrapper
display: inline-block
padding: 30px 10px
width: 100%
@media (max-width: $screen-sm-min)
.nav > li > a
padding: 10px 20px
#language-dropdown-wrapper
display: inline-block
padding: 10px 10px
.language-dropdown
width: 150px
.img-circle
border: $gold 8px solid
width: 98px
height: 98px // Includes the border
.user-level
position: absolute
top: 76px
right: 42px
color: $gold
text-shadow: 1px 1px black, -1px -1px 0 black, 1px -1px 0 black, -1px 1px 0 black
// Buttons
.btn
border: none
border-radius: 5px
font-family: $body-font
font-weight: normal
background-image: none // overrides legacy buttons
.btn-primary, .btn-navy
background-color: $navy
color: white
.btn-primary-alt, .btn-navy-alt
background-color: white
border: 1px solid $navy
color: $navy
.btn-forest
background-color: $forest
color: white
.btn-forest-alt
background-color: white
border: 1px solid $forest
color: $forest
.btn-gold
background-color: $gold
color: white
.btn-gold-alt
background-color: white
border: 1px solid $gold
color: $gold
.btn-lg
font-size: 18px
// Classes
.text-navy
color: $navy
.bg-navy
background-color: $navy
color: white
h1, h2, h3, h4, h5, h6, a
color: white
a.btn-primary-alt
color: $navy
#footer
background-image: url("/images/pages/home/footer_background.png")
height: 229px
margin: -22px auto 0
color: white
@media (max-width: $screen-sm-min)
background-color: #201a15
background-image: none
height: auto
ul
margin: 30px
li:first-child
border-bottom: 1px solid white
margin-bottom: 10px
a
color: white
#final-footer
position: absolute
left: 0
right: 0
height: 60px
color: white
background-color: #463a2c
@media (max-width: $screen-sm-min)
position: inherit
padding: 20px
height: auto
a
color: white
img
width: 150px
margin: 0 10px

View file

@ -1,188 +1,441 @@
extends /templates/base
extends /templates/base-flat
block content
img(src="/images/pages/about/coco_comic.jpg")
.style-flat(data-spy="scroll", data-target="#nav-container")
.container-fluid#jumbotron
.container
.row
//TODO: Size these correctly
.col-xs-10
h1 If you want to learn to program, you need to write (a lot of) code.
.row
.col-xs-8
h2 At CodeCombat, our job is to make sure you're doing that with a smile on your face.
.col-sm-6
#nav-container
nav#fixed-nav.nav.navbar
.container-fluid.text-center
ul.center-block
li.active
a(href="#mission")#mission-link
small.label(data-i18n="about.mission_link")
| Mission
li
a(href="#team")#team-link
small.label(data-i18n="about.team_link")
| Team
li
a(href="#community")#community-link
small.label(data-i18n="about.community_link")
| Community
li
a(href="#story")#story-link
small.label(data-i18n="about.story_link")
| Story
li
a(href="#jobs")#jobs-link
small.label(data-i18n="about.jobs_link")
| Careers
li
a(href="#contact")#contact-link
small.label(data-i18n="about.contact_link")
| Press
h2(data-i18n="about.why_codecombat")
| Why CodeCombat?
p(data-i18n="about.why_paragraph_1")
| If you want to learn to program, you don't need lessons.
| You need to write a lot of code and have a great time doing it.
p
span(data-i18n="about.why_paragraph_2_prefix")
| That's what programming is about. It's gotta be fun.
| Not fun like
span
i(data-i18n="about.why_paragraph_2_italic")
| yay a badge
span
span(data-i18n="about.why_paragraph_2_center")
| but fun like
span
i(data-i18n="about.why_paragraph_2_italic_caps")
| NO MOM I HAVE TO FINISH THE LEVEL!
span
span(data-i18n="about.why_paragraph_2_suffix")
| That's why CodeCombat is a multiplayer game,
| not a gamified lesson course. We won't stop
| until you can't stop--but this time, that's a good thing.
p(data-i18n="about.why_paragraph_3")
| If you're going to get addicted to some game,
| get addicted to this one and become one of the wizards of the tech age.
h2(data-i18n="about.press_title")
| Bloggers/Press
p
span.spr(data-i18n="about.press_paragraph_1_prefix")
| Want to write about us? Feel free to download and use all of the resources included in our
a(href="https://s3.amazonaws.com/CodeCombatMisc/press_packet.zip", data-i18n="about.press_paragraph_1_link") press packet
span(data-i18n="about.press_paragraph_1_suffix")
| . All logos and images may be used without contacting us directly.
h2(data-i18n="nav.contact")
| Contact
p
span CodeCombat Inc.
br
span 360 3rd St Suite 700 (Livefyre)
br
span San Francisco, CA 94107
br
a(href='mailto:team@codecombat.com') team@codecombat.com
if me.get('preferredLanguage') == 'pt-BR'
span CodeCombat, Brazil
br
span Rua 1814 Militão Chaves
br
span Natal, Brazil, RN 59064-500
ul.col-sm-6.team-column
ul.thumbnails
li.row
h2(data-i18n="about.team") Team
#about-container.container
#mission.anchor.row
.col-sm-6#mission-graphic.responsive-side-margins
img(src="/images/pages/about/globe_white.png")
h2(data-i18n="about.mission_title")
| Our mission: make programming accessible to every student on Earth.
#mission-graphic-filler
.col-sm-5.col-sm-offset-1
#mission-text.responsive-side-margins
p(data-i18n="about.mission_description_1")
| Programming is magic. It's the ability to create things from pure imagination. We started CodeCombat to give learners the feeling of wizardly power at their fingertips by using typed code.
p(data-i18n="about.mission_description_2")
| As it turns out, that enables them to learn faster too. WAY faster. It's like having a conversation instead of reading a manual. We want to bring that conversation to every school and to every student, because everyone should have the chance to learn the magic of programming.
#team.anchor
.text-center
h3(data-i18n="about.team_title")
| Meet the CodeCombat team
h4.responsive-side-margins(data-i18n="about.team_values")
| We value open and respectful dialog, where the best idea wins. Our decisions are grounded in customer research and our process is focused on delivering tangible results for them. Everyone is hands-on, from our CEO to our Github contributors, because we value growth and learning in our team.
ul
// Full time
a(href="http://www.nickwinter.net")
li
a(href="http://www.nickwinter.net" rel="external")
img(src="/images/pages/about/nick_small.png").img-thumbnail
.team_bio
h4.team_name
a(href="http://www.nickwinter.net") Nick Winter
div(data-i18n="about.nick_title")
div(data-i18n="about.nick_blurb")
.team-bio
h6.label.team-name
a(href="http://www.nickwinter.net" rel="external") Nick Winter
small(data-i18n="about.nick_title")
small(data-i18n="about.nick_blurb")
a(href="http://www.mattlott.com/")
li
a(href="http://www.mattlott.com/" rel="external")
img(src="/images/pages/about/matt_small.png").img-thumbnail
.team_bio
h4.team_name
a(href="http://www.mattlott.com/") Matt Lott
div(data-i18n="about.matt_title")
div(data-i18n="about.matt_blurb")
.team-bio
h6.label.team-name
a(href="http://www.mattlott.com/" rel="external") Matt Lott
small(data-i18n="about.matt_title")
small(data-i18n="about.matt_blurb")
li.row
a(href="http://cat.zdh.com/")
li
a(href="http://cat.zdh.com/" rel="external")
img(src="/images/pages/about/cat_small.png").img-thumbnail
.team_bio
h4.team_name
a(href="http://cat.zdh.com/") Catherine Weresow
div(data-i18n="about.cat_title")
div(data-i18n="about.cat_blurb")
.team-bio
h6.label.team-name
a(href="http://cat.zdh.com/" rel="external") Catherine Weresow
small(data-i18n="about.cat_title")
small(data-i18n="about.cat_blurb")
li
img(src="/images/pages/about/scott_small.png").img-thumbnail
.team_bio
h4.team_name Scott Erickson
div(data-i18n="about.scott_title")
div(data-i18n="about.scott_blurb")
li.row
.team-bio
h6.label.team-name Scott Erickson
small(data-i18n="about.scott_title")
small(data-i18n="about.scott_blurb")
li
img(src="/images/pages/about/maka_small.png").img-thumbnail
.team_bio
h4.team_name Michael 'Maka' Gradin
div(data-i18n="about.maka_title")
div(data-i18n="about.maka_blurb")
.team-bio
h6.label.team-name Michael 'Maka' Gradin
small(data-i18n="about.maka_title")
small(data-i18n="about.maka_blurb")
a(href="http://basicer.com/")
a(href="http://basicer.com/" rel="external")
li
a(href="http://basicer.com/" rel="external")
img(src="/images/pages/about/rob_small.png").img-thumbnail
.team_bio
h4.team_name
a(href="http://basicer.com/") Rob Blanckaert
div(data-i18n="about.rob_title")
div(data-i18n="about.rob_blurb")
li.row
.team-bio
h6.label.team-name
a(href="http://basicer.com/" rel="external") Rob Blanckaert
small(data-i18n="about.rob_title")
small(data-i18n="about.rob_blurb")
li
img(src="/images/pages/about/josh_c_small.png").img-thumbnail
.team_bio
h4.team_name Josh Callebaut
div(data-i18n="about.josh_c_title")
div(data-i18n="about.josh_c_blurb")
.team-bio
h6.label.team-name Josh Callebaut
small(data-i18n="about.josh_c_title")
small(data-i18n="about.josh_c_blurb")
a(href="http://robinyang.com/")
a(href="http://robinyang.com/" rel="external")
li
a(href="http://robinyang.com/" rel="external")
img(src="/images/pages/about/robin_small.png").img-thumbnail
.team_bio
h4.team_name
a(href="http://robinyang.com/") Robin Yang
div(data-i18n="about.robin_title")
div(data-i18n="about.robin_blurb")
.team-bio
h6.label.team-name
a(href="http://robinyang.com/" rel="external") Robin Yang
small(data-i18n="about.robin_title")
small(data-i18n="about.robin_blurb")
// Part time / contract
li.row
a(href="http://floor.is/lava/")
li
a(href="http://floor.is/lava/" rel="external")
img(src="/images/pages/about/josh_small.png").img-thumbnail
.team_bio
h4.team_name
a(href="http://floor.is/lava/") Josh Lee
div(data-i18n="about.josh_title")
div(data-i18n="about.josh_blurb")
.team-bio
h6.label.team-name
a(href="http://floor.is/lava/" rel="external") Josh Lee
small(data-i18n="about.josh_title")
small(data-i18n="about.josh_blurb")
a(href="https://soundcloud.com/taking-off")
li
a(href="https://soundcloud.com/taking-off" rel="external")
img(src="/images/pages/about/jose_small.png").img-thumbnail
.team_bio
h4.team_name
a(href="https://soundcloud.com/taking-off") Jose Antonini
div(data-i18n="about.jose_title")
div(data-i18n="about.jose_blurb")
.team-bio
h6.label.team-name
a(href="https://soundcloud.com/taking-off" rel="external") Jose Antonini
small(data-i18n="about.jose_title")
small(data-i18n="about.jose_blurb")
li.row
a(href="http://retrostylegames.com/")
li
a(href="http://retrostylegames.com/" rel="external")
img(src="/images/pages/about/pavel_small.png").img-thumbnail
.team_bio
h4.team_name
a(href="http://retrostylegames.com/") Pavel Konstantinov
div(data-i18n="about.retrostyle_title")
div(data-i18n="about.retrostyle_blurb")
.team-bio
h6.label.team-name
a(href="http://retrostylegames.com/" rel="external") Pavel Konstantinov
small(data-i18n="about.retrostyle_title")
small(data-i18n="about.retrostyle_blurb")
a(href="http://retrostylegames.com/")
li
a(href="http://retrostylegames.com/" rel="external")
img(src="/images/pages/about/oleg_small.png").img-thumbnail
.team_bio
h4.team_name
a(href="http://retrostylegames.com/") Oleg Ulyanickiy
div(data-i18n="about.retrostyle_title")
div(data-i18n="about.retrostyle_blurb")
li.row
.team-bio
h6.label.team-name
a(href="http://retrostylegames.com/" rel="external") Oleg Ulyanickiy
small(data-i18n="about.retrostyle_title")
small(data-i18n="about.retrostyle_blurb")
li
img(src="/images/pages/about/carlos_small.png").img-thumbnail
.team_bio
h4.team_name Carlos Maia
div(data-i18n="about.carlos_title")
div(data-i18n="about.carlos_blurb")
.team-bio
h6.label.team-name Carlos Maia
small(data-i18n="about.carlos_title")
small(data-i18n="about.carlos_blurb")
#community.anchor
#community-row-1.row.text-center
.col-sm-12
.text-center
h3(data-i18n="about.community_title")
| ...and our open-source community
h4(data-i18n="about.community_subtitle")
| Over 450 contributors have helped build CodeCombat, with more joining every week!
img(src="/images/pages/about/github_avatars.png")#community-avatars
#community-row-2.row
.col-sm-5
p.responsive-side-margins
span(data-i18n="about.community_description_1")
| CodeCombat is a community project, with hundreds of players volunteering to create levels, contribute to our code to add features, fix bugs, playtest, and even translate the game into 50 languages so far. Employees, contributors and the site gain by sharing ideas and pooling effort, as does the open source community in general. The site is built on numerous open source projects, and we are open sourced to give back to the community and provide code-curious players a familiar project to explore and experiment with. Anyone can join the CodeCombat community! Check out our
a(href="/contribute")
span(data-i18n="about.community_description_link")
| contribute page
span(data-i18n="about.community_description_2")
| for more info.
.col-sm-6.col-sm-offset-1#community-graphic.responsive-side-margins
h2 Over 450 contributors have lent their support and time to this project.
img(src="/images/pages/about/github.png")
#community-graphic-filler
#story.anchor
.text-center
h3(data-i18n="about.story_title")
| Our story so far
h4.responsive-side-margins(data-i18n="about.story_subtitle")
| Since 2013, CodeCombat has grown from a mere set of sketches to a living, thriving game.
.row
#story-graphic-1.col-lg-6
.media
.pull-left
img.media-object#story-image-1(src="/images/pages/about/Character_Silouhette.png")
.media-body
.media-heading.text-h1
span(data-i18n="about.story_statistic_1a")
| 5,000,000+
br
span(data-i18n="about.story_statistic_1b")
| total players
p.text-h5 have started their programming journey through CodeCombat
.col-lg-5.col-lg-offset-1
#story-graphic-2
.media
p.text-h5(data-i18n="about.story_statistic_2a")
| Weve been translated into over 50 languages — our players hail from
.pull-right
img(src="/images/pages/about/globe_green.png")
.media-body
.media-heading.text-h1(data-i18n="about.story_statistic_2b")
| 200+ countries
#story-graphic-3.text-center
p
div.text-h5(data-i18n="about.story_statistic_3a")
| Together, they have written
#story-bracketed-text
div#left-bracket
img(src="/images/pages/about/bracket_left.png")
div.text-h1(data-i18n="about.story_statistic_3b")
| 1 billion lines of code and counting
div#right-bracket
img(src="/images/pages/about/bracket_right.png")
#story-languages
.text-center
.text-h5(data-i18n="about.story_statistic_3c")
| across six different programming languages
#language-icons.text-center
img.hidden-xs(src="/images/pages/about/Languages.png")
img.hidden-sm.hidden-md.hidden-lg(src="/images/pages/about/Languages_group1.png")
img.hidden-sm.hidden-md.hidden-lg(src="/images/pages/about/Languages_group2.png")
#story-graphic-4.text-center
p
div.text-h5(data-i18n="about.story_long_way_1")
| Though we've come a long way...
figure
img(src="/images/pages/about/sketch.png")
figcaption
small(data-i18n="about.story_sketch_caption")
| Nick's very first sketch depicting a programming game in action.
p
.text-h5(data-i18n="about.story_long_way_2")
| we still have much to do before we complete our quest, so...
#jobs.anchor
.text-center
h3(data-i18n="about.jobs_title")
| Come work with us and help write CodeCombat history!
h4(data-i18n="about.jobs_subtitle")
| Don't see a good fit but interested in keeping in touch? See our "Create Your Own" listing.
#jobs-row.row
.col-sm-6.col-md-5.col-md-offset-1.col-lg-4.col-lg-offset-0
#benefits
h5(data-i18n="about.jobs_benefits")
| Employee Benefits
ul
li.small(data-i18n="about.jobs_benefit_1")
| Competitive salary and options
li.small(data-i18n="about.jobs_benefit_2")
| 15 day minimum vacation policy, excluding company holidays
li.small(data-i18n="about.jobs_benefit_3")
| Work from home flexibility
li.small(data-i18n="about.jobs_benefit_4")
| Unlimited sick/personal days
li.small(data-i18n="about.jobs_benefit_5")
| Professional development and continuing education support
li.small(data-i18n="about.jobs_benefit_6")
| Medical/dental/vision insurance
.col-sm-6.col-md-5.col-lg-4
.job-listing
h5 Software Engineer, iOS
.text-center
small.label
| San Francisco • Fulltime
p.small Want to write the first iPad app for CodeCombat? Were looking for a product-focused engineer to translate our core gameplay and educational tools into an experience that feels like it was born on the iPad.
a.job-link.btn.btn-lg.btn-navy(href="https://jobs.lever.co/codecombat/eb190007-7195-49ee-a322-893b0d1cdcb4" rel="external")
| Learn More
.col-sm-6.col-md-5.col-md-offset-1.col-lg-4.col-lg-offset-0
.job-listing
h5 Head of Sales
.text-center
small.label
| San Francisco • Fulltime
p.small School districts are scrambling to offer computer science classes to all their students as a core subject. They have had no solution, because they can't afford to hire enough programming teachers until now.
a.job-link.btn.btn-lg.btn-navy(href="https://jobs.lever.co/codecombat/2d0194ed-7c69-4aab-b1f9-363ca4b9f04b" rel="external")
| Learn More
.col-sm-6.col-md-5.col-lg-4
.job-listing
h5 Sales Representative
.text-center
small.label
| San Francisco • Fulltime
p.small School districts are scrambling to offer computer science classes to all their students as a core subject. They have had no solution, because they can't afford to hire enough programming teachers until now.
a.job-link.btn.btn-lg.btn-navy(href="https://jobs.lever.co/codecombat/3f6ff123-16ce-4ecb-aba3-dcf4e8927c47" rel="external")
| Learn More
.col-sm-6.col-md-5.col-md-offset-1.col-lg-4.col-lg-offset-0
.job-listing
h5(data-i18n="about.jobs_custom_title")
| Create Your Own
p.small(data-i18n="about.jobs_custom_description")
| Are you passionate about CodeCombat but don't see a job listed that matches your qualifications? Write us and show how you think you can contribute to our team. We'd love to hear from you!
p.small
span(data-i18n="about.jobs_custom_contact_1")
| Send us a note at
a(href="mailto:team@codecombat.com")
| team@codecombat.com
span(data-i18n="about.jobs_custom_contact_2")
| introducing yourself and we might get in touch in the future!
#contact.anchor
.text-center
h3(data-i18n="about.contact_title")
| Press & Contact
h4(data-i18n="about.contact_subtitle")
| Need more information? Get in touch with us at
a(href="mailto:team@codecombat.com") team@codecombat.com
#files
.row
.col-md-6.col-lg-8
#screenshots
span.label(data-i18n="about.screenshots_title")
| Game Screenshots
.hidden-sm.hidden-md.hidden-lg
small(data-i18n="about.screenshots_hint")
| (click to view full size)
#screenshot-grid
a.screen-thumbnail(data-toggle="modal", data-target="#screenshot-lightbox", data-index='0')
img(src="/images/pages/about/screenshot_desert.png")
a.screen-thumbnail(data-toggle="modal", data-target="#screenshot-lightbox", data-index='1')
img(src="/images/pages/about/screenshot_forest.png")
a.screen-thumbnail(data-toggle="modal", data-target="#screenshot-lightbox", data-index='2')
img(src="/images/pages/about/screenshot_dungeon.png")
a.screen-thumbnail(data-toggle="modal", data-target="#screenshot-lightbox", data-index='3')
img(src="/images/pages/about/screenshot_glacier.png")
.clearfix.hidden-xs
small(data-i18n="about.screenshots_hint")
| (click to view full size)
.col-md-6.col-lg-4
#downloads-container
#downloads
.label(data-i18n="about.downloads_title")
| Download Assets & Information
ul
li
a.small(href="http://files.codecombat.com/presspack/AboutCodeCombat.pdf")
span(data-i18n="about.about_codecombat")
| About CodeCombat
| (.pdf)
li
a.small(href="http://files.codecombat.com/presspack/CodeCombat-Logo.ai")
span(data-i18n="about.logo")
| Logo
| (.ai)
li
a.small(href="http://files.codecombat.com/presspack/CodeCombat-Logo.png")
span(data-i18n="about.logo")
| Logo
| (.png)
li
a.small(href="http://files.codecombat.com/presspack/GameImages.zip")
span(data-i18n="about.screenshots")
| Screenshots
| (.zip)
li
a.small(href="http://files.codecombat.com/presspack/gameimages/CodeCombat_Splash.png")
span(data-i18n="about.character_art")
| Character Art
| (.png)
.text-center
a.btn.btn-lg.btn-primary-alt#download-button(href="http://files.codecombat.com/presspack/CodeCombat_PressPack.zip")
span.glyphicon.glyphicon-download-alt
span(data-i18n="about.download_all")
| Download All
#screenshot-lightbox.modal.fade(data-show="false")
.modal-dialog
.modal-content
#screenshot-carousel.carousel
ol.carousel-indicators
li(data-target=".screenshot-display", data-slide-to="0").active
li(data-target=".screenshot-display", data-slide-to="1")
li(data-target=".screenshot-display", data-slide-to="2")
li(data-target=".screenshot-display", data-slide-to="3")
.carousel-inner
.item.active
img#screenshot-desert(src="/images/pages/about/Desert.png")
.item
img#screenshot-forest(src="/images/pages/about/Forest.png")
.item
img#screenshot-dungeon(src="/images/pages/about/Dungeon.png")
.item
img#screenshot-glacier(src="/images/pages/about/Glacier.png")
a#carousel-left.left.carousel-control(href="#screenshot-carousel", role="button")
span.glyphicon.glyphicons-chevron-left.glyphicon-chevron-left(aria-hidden="true")
span.sr-only Previous
a#carousel-right.right.carousel-control(href="#screenshot-carousel", role="button")
span.glyphicon.glyphicons-chevron-right.glyphicon-chevron-right(aria-hidden="true")
span.sr-only Next
#location
.row
.col-sm-4.col-sm-offset-2
p
b CodeCombat Inc.
p 360 3rd St.
p Suite 700 (Livefyre)
p San Francisco, CA 94107
a(href="mailto:team@codecombat.com") team@codecombat.com
.col-sm-4
p
b(data-i18n="about.location_title")
| We're located in downtown SF:
iframe(width="370", height="280", frameBorder="2", src="https://www.google.com/maps/embed/v1/place?key=AIzaSyAIGQz3OMbv5YWivScUM86-zESjEgJR2Xo&q=360+3rd+St+Suite+700,+San+Francisco,+CA+94107")

View file

@ -20,11 +20,12 @@ block content
th Location
th Age / Level
th Students
th How Found / Notes
th Role
th Phone
th Status
tbody
- var numReviewed = 0
- var maxReviewedShown = 100
- var maxReviewedShown = 1000
each trialRequest in trialRequests
if trialRequest.get('status') !== 'submitted'
- numReviewed++
@ -42,7 +43,8 @@ block content
td= props.location || trialRequest.locationString()
td= props.age || trialRequest.educationLevelString()
td= props.numStudents
td= props.heardAbout || props.notes
td= props.role
td= props.phoneNumber
td.status-cell
if trialRequest.get('status') === 'submitted'
button.btn.btn-xs.btn-success.btn-approve(data-trial-request-id=trialRequest.id) Approve
@ -51,3 +53,10 @@ block content
span= trialRequest.get('prepaidCode')
else
span= trialRequest.get('status')
if props.heardAbout || props.notes
tr
td(colspan=2)
td(colspan=7)
strong #{trialRequest.nameString()} notes:
div= props.heardAbout || props.notes
td

View file

@ -0,0 +1,144 @@
.style-flat
block header
.container-fluid.text-center
.alert.alert-danger.lt-ie9
strong(data-i18n="home.no_ie") The CodeCombat game does not run in Internet Explorer 8 or older. Sorry!
if view.isIPadBrowser() || view.isMobile()
.alert.alert-danger.mobile
strong(data-i18n="home.no_mobile") CodeCombat gameplay was not designed for mobile devices and may not work!
else if view.isOldBrowser()
.alert.alert-danger.old-browser
strong(data-i18n="home.old_browser") Uh oh, your browser is too old to play CodeCombat. Sorry!
br
span(data-i18n="home.old_browser_suffix") You can try anyway, but it probably won't work.
nav.navbar.navbar-default
.container
.row
.col-md-3.col-sm-4
.navbar-header
button.navbar-toggle.collapsed(data-toggle='collapse', data-target='#navbar-collapse' aria-expanded='false')
span.sr-only Toggle navigation
span.icon-bar
span.icon-bar
span.icon-bar
a.navbar-brand(href="/")
img#logo-img(src="/images/pages/base/logo.png")
span.glyphicon.glyphicon-home
.col-md-9.col-sm-8
#navbar-collapse.collapse.navbar-collapse
ul.nav.navbar-nav.pull-left
li
a(href="/about") About
li
a(href="/courses") Courses
li
a(href="/courses/teachers") Teachers
li
a(href="https://discourse.codecombat.com/") Forum
if me.isAnonymous()
li
a#create-account-link.signup-button Create Account
li
a#login-link.login-button Login
else
li.dropdown
a.dropdown-toggle(href="#", data-toggle="dropdown" role="button" aroa-haspopup="true" aria-expanded="false")
span.spr My Account
ul.dropdown-menu
li.user-dropdown-header.text-center
span.user-level= me.level()
a(href="/user/#{me.getSlugOrID()}")
img.img-circle(src=me.getPhotoURL())
h5=me.displayName()
li
a(href="/user/#{me.getSlugOrID()}" data-i18n="nav.profile")
li
a(href="/account/settings", data-i18n="play.settings")
li
a(href="/account/payments", data-i18n="account.payments")
li
a(href="/account/subscription", data-i18n="account.subscription")
li
a(href="/account/prepaid", data-i18n="account.prepaid_codes") Prepaid Codes
li
a#logout-button(data-i18n="login.log_out")
li
#language-dropdown-wrapper
select.language-dropdown.form-control
block outer_content
#site-content-area
block content
p If this is showing, you dun goofed
block footer
#character-lineup.text-center
img(src="/images/pages/home/character_lineup.png")
.container-fluid
#footer.small
.container
.row
.col-sm-3
ul.list-unstyled
li
strong CodeCombat
li
a(href="/about") About
li
a(href="/Careers") Jobs
li
a(href="http://blog.codecombat.com/", data-i18n="nav.blog")
li
a(href="/legal") Legal
.col-sm-3
ul.list-unstyled
li
strong Schools
li
a(href="/courses/teachers") Teachers
li
a(href="https://sites.google.com/a/codecombat.com/teacher-guides/") Educator Wiki
li
a(href="/teachers/quote") Request a Quote
.col-sm-3
ul.list-unstyled
li
strong Get Involved
li
a(href='/community', data-i18n="nav.community")
li
a(href="/contribute") Contribute
li
a(href=view.forumLink(), data-i18n="nav.forum")
li
a(href="/play/ladder") Multiplayer
li
a(href="https://github.com/codecombat/codecombat") Open source (GitHub)
.col-sm-3
ul.list-unstyled
li
strong Support
li
a(href="https://discourse.codecombat.com/t/faq-check-before-posting/1027") FAQs
li
a(tabindex=-1, data-toggle="coco-modal", data-target="core/ContactModal", data-i18n="nav.contact")
li
a(href="https://www.facebook.com/codecombat", data-i18n="nav.facebook")
li
a(href="https://twitter.com/codecombat", data-i18n="nav.twitter")
#final-footer.small.text-center
| Copyright ©2016 CodeCombat. All Rights Reserved.
br.hidden-lg.hidden-md
img(src="/images/pages/base/logo.png" alt="CodeCombat")
br.hidden-lg.hidden-md
span.spr Need help? Email
a(href="mailto:team@codecombat.com") team@codecombat.com
span.spl and we'll get in touch!

View file

@ -1,73 +1,6 @@
.container-fluid.text-center
.alert.alert-danger.lt-ie9
strong(data-i18n="home.no_ie") The CodeCombat game does not run in Internet Explorer 8 or older. Sorry!
if view.isIPadBrowser() || view.isMobile()
.alert.alert-danger.mobile
strong(data-i18n="home.no_mobile") CodeCombat gameplay was not designed for mobile devices and may not work!
else if view.isOldBrowser()
.alert.alert-danger.old-browser
strong(data-i18n="home.old_browser") Uh oh, your browser is too old to play CodeCombat. Sorry!
br
span(data-i18n="home.old_browser_suffix") You can try anyway, but it probably won't work.
nav.navbar.navbar-default
.container
.row
.col-md-3.col-sm-4
.navbar-header
button.navbar-toggle.collapsed(data-toggle='collapse', data-target='#navbar-collapse' aria-expanded='false')
span.sr-only Toggle navigation
span.icon-bar
span.icon-bar
span.icon-bar
a.navbar-brand(href="/")
img#logo-img(src="/images/pages/base/logo.png")
span.glyphicon.glyphicon-home
.col-md-9.col-sm-8
#navbar-collapse.collapse.navbar-collapse
ul.nav.navbar-nav.pull-left
li
a(href="/about") About
li
a(href="/courses") Courses
li
a(href="/courses/teachers") Teachers
li
a(href="https://discourse.codecombat.com/") Forum
if me.isAnonymous()
li
a#create-account-link.signup-button Create Account
li
a#login-link.login-button Login
else
li.dropdown
a.dropdown-toggle(href="#", data-toggle="dropdown" role="button" aroa-haspopup="true" aria-expanded="false")
span.spr My Account
ul.dropdown-menu
li.user-dropdown-header.text-center
span.user-level= me.level()
a(href="/user/#{me.getSlugOrID()}")
img.img-circle(src=me.getPhotoURL())
h5=me.displayName()
li
a(href="/user/#{me.getSlugOrID()}" data-i18n="nav.profile")
li
a(href="/account/settings", data-i18n="play.settings")
li
a(href="/account/payments", data-i18n="account.payments")
li
a(href="/account/subscription", data-i18n="account.subscription")
li
a(href="/account/prepaid", data-i18n="account.prepaid_codes") Prepaid Codes
li
a#logout-button(data-i18n="login.log_out")
li
#language-dropdown-wrapper
select.language-dropdown.form-control
extends /templates/base-flat
block content
.container-fluid#jumbotron-container-fluid(class=view.jumbotron === 'student' ? 'alt-image' : '')
.container
.row
@ -318,71 +251,3 @@ nav.navbar.navbar-default
a.btn.btn-primary-alt.btn-lg(href="/courses/teachers") Create a Class
.text-center
img(src="/images/pages/home/character_lineup.png")
.container-fluid
#footer.small
.container
.row
.col-sm-3
ul.list-unstyled
li
strong CodeCombat
li
a(href="/about") About
li
a(href="/Careers") Jobs
li
a(href="http://blog.codecombat.com/", data-i18n="nav.blog")
li
a(href="/legal") Legal
.col-sm-3
ul.list-unstyled
li
strong Schools
li
a(href="/courses/teachers") Teachers
li
a(href="https://sites.google.com/a/codecombat.com/teacher-guides/") Educator Wiki
li
a(href="/teachers/quote") Request a Quote
.col-sm-3
ul.list-unstyled
li
strong Get Involved
li
a(href='/community', data-i18n="nav.community")
li
a(href="/contribute") Contribute
li
a(href=view.forumLink(), data-i18n="nav.forum")
li
a(href="/play/ladder") Multiplayer
li
a(href="https://github.com/codecombat/codecombat") Open source (GitHub)
.col-sm-3
ul.list-unstyled
li
strong Support
li
a(href="https://discourse.codecombat.com/t/faq-check-before-posting/1027") FAQs
li
a(tabindex=-1, data-toggle="coco-modal", data-target="core/ContactModal", data-i18n="nav.contact")
li
a(href="https://www.facebook.com/codecombat", data-i18n="nav.facebook")
li
a(href="https://twitter.com/codecombat", data-i18n="nav.twitter")
#final-footer.small.text-center
| Copyright ©2016 CodeCombat. All Rights Reserved.
br.hidden-lg.hidden-md
img(src="/images/pages/base/logo.png" alt="CodeCombat")
br.hidden-lg.hidden-md
span.spr Need help? Email
a(href="mailto:team@codecombat.com") team@codecombat.com
span.spl and we'll get in touch!

View file

@ -1,10 +1,12 @@
extends /templates/base
extends /templates/base-flat
block content
.container
form.form(class=view.trialRequest.isNew() ? '' : 'hide')
h1.text-center(data-i18n="teachers_quote.title")
p.text-center(data-i18n="teachers_quote.subtitle")
h2.text-center(data-i18n="teachers_quote.subtitle")
#form-teacher-info.section
.row
.col-sm-offset-2.col-sm-4
.form-group
@ -25,14 +27,14 @@ block content
label.control-label
span(data-i18n="teachers_quote.phone_number")
span.spl.text-muted(data-i18n="signup.optional")
.help-block
.help-block.small
em.text-info(data-i18n="teachers_quote.phone_number_help")
input.form-control(name="phoneNumber")
.col-sm-4
.form-group
label.control-label(data-i18n="teachers_quote.role_label")
.help-block
.help-block.small
em.text-info(data-i18n="teachers_quote.role_help")
select.form-control(name="role")
option
@ -43,10 +45,7 @@ block content
option(data-i18n="teachers_quote.superintendent", value="Superintendent")
option(data-i18n="teachers_quote.parent", value="Parent")
.row
.col-sm-offset-2.col-sm-8
hr
#form-school-info.section
.row
.col-sm-offset-2.col-sm-4
.form-group
@ -69,15 +68,12 @@ block content
label.control-labellabel.control-label(data-i18n="teachers_quote.country")
input.form-control(name="country")
.row
.col-sm-offset-2.col-sm-8
hr
#form-students-info.section
.row
.col-sm-offset-2.col-sm-5
.form-group
label.control-label(data-i18n="courses.number_students")
.help-block
.help-block.small
em.text-info(data-i18n="teachers_quote.num_students_help")
select.form-control(name="numStudents")
option
@ -94,7 +90,7 @@ block content
.row
.col-sm-offset-2.col-sm-4
label.control-label(data-i18n="teachers_quote.education_level_label")
.help-block
.help-block.small
em.text-info(data-i18n="teachers_quote.education_level_help")
.row
@ -106,19 +102,7 @@ block content
label.control-label.checkbox
input(type="checkbox" name="educationLevel" value="High")
span(data-i18n="teachers_quote.high_school")
.col-sm-6
// Other field uses custom logic, so no name field is included in either input.
// That way the forms library ignores it.
.checkbox-inline
label.control-label
input#other-education-level-checkbox(type="checkbox")
span(data-i18n="nav.other")
br
span(data-i18n="teachers_quote.please_explain")
input#other-education-level-input.form-control
.row
.col-sm-offset-2.col-sm-2
.col-sm-2
label.control-label.checkbox
input(type="checkbox" name="educationLevel" value="Middle")
span(data-i18n="teachers_quote.middle_school")
@ -127,7 +111,20 @@ block content
input(type="checkbox" name="educationLevel" value="College+")
span(data-i18n="teachers_quote.college_plus")
#anything-else-row.row
.row
.col-sm-offset-2.col-sm-6
// Other field uses custom logic, so no name field is included in either input.
// That way the forms library ignores it.
.form-group
label.control-label.checkbox
input#other-education-level-checkbox(type="checkbox")
span(data-i18n="nav.other")
|
span(data-i18n="teachers_quote.please_explain")
input#other-education-level-input.form-control
#anything-else-row.section
.row
.col-sm-offset-2.col-sm-8
label.control-label
span(data-i18n="teachers_quote.anything_else")
@ -136,7 +133,7 @@ block content
textarea.form-control(rows=8, name="notes")
#buttons-row.row.text-center
input#submit-request-btn.btn.btn-primary(type="submit" data-i18n="[value]common.send")
input#submit-request-btn.btn.btn-lg.btn-primary(type="submit" data-i18n="[value]common.send")
#form-submit-success.text-center(class=view.trialRequest.isNew() ? 'hide' : '')

View file

@ -6,3 +6,85 @@ module.exports = class AboutView extends RootView
template: template
logoutRedirectURL: false
events:
'click #mission-link': 'onClickMissionLink'
'click #team-link': 'onClickTeamLink'
'click #community-link': 'onClickCommunityLink'
'click #story-link': 'onClickStoryLink'
'click #jobs-link': 'onClickJobsLink'
'click #contact-link': 'onClickContactLink'
'click .screen-thumbnail': 'onClickScreenThumbnail'
'click #carousel-left': 'onLeftPressed'
'click #carousel-right': 'onRightPressed'
shortcuts:
'right': 'onRightPressed'
'left': 'onLeftPressed'
'esc': 'onEscapePressed'
afterRender: ->
super(arguments...)
@$('#fixed-nav').affix({
offset:
top: ->
$('#nav-container').offset().top
})
#TODO: Maybe cache top value between page resizes to save CPU
$('body').scrollspy(
target: '#nav-container'
offset: 150
)
@$('#screenshot-lightbox').modal()
@$('#screenshot-carousel').carousel({
interval: 0
keyboard: false
})
onClickMissionLink: (event) ->
event.preventDefault()
@scrollToLink('#mission')
onClickTeamLink: (event) ->
event.preventDefault()
@scrollToLink('#team')
onClickCommunityLink: (event) ->
event.preventDefault()
@scrollToLink('#community')
onClickStoryLink: (event) ->
event.preventDefault()
@scrollToLink('#story')
onClickJobsLink: (event) ->
event.preventDefault()
@scrollToLink('#jobs')
onClickContactLink: (event) ->
event.preventDefault()
@scrollToLink('#contact')
onRightPressed: (event) ->
if $('#screenshot-lightbox').data('bs.modal')?.isShown
event.preventDefault()
$('#screenshot-carousel').carousel('next')
onLeftPressed: (event) ->
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"))

View file

@ -41,16 +41,6 @@ module.exports = class HomeView extends RootView
afterInsert: ->
super(arguments...)
isOldBrowser: ->
if $.browser
majorVersion = $.browser.versionNumber
return true if $.browser.mozilla && majorVersion < 25
return true if $.browser.chrome && majorVersion < 31 # Noticed Gems in the Deep not loading with 30
return true if $.browser.safari && majorVersion < 6 # 6 might have problems with Aether, or maybe just old minors of 6: https://errorception.com/projects/51a79585ee207206390002a2/errors/547a202e1ead63ba4e4ac9fd
else
console.warn 'no more jquery browser version...'
return false
justPlaysCourses: ->
# This heuristic could be better, but currently we don't add to me.get('courseInstances') for single-player anonymous intro courses, so they have to beat a level without choosing a hero.
return me.get('stats')?.gamesCompleted and not me.get('heroConfig')

View file

@ -75,14 +75,5 @@ module.exports = class NewHomeView extends RootView
onClickTeacherButton: ->
@scrollToLink('.request-demo-row', 600)
isOldBrowser: ->
if $.browser
majorVersion = $.browser.versionNumber
return true if $.browser.mozilla && majorVersion < 25
return true if $.browser.chrome && majorVersion < 31 # Noticed Gems in the Deep not loading with 30
return true if $.browser.safari && majorVersion < 6 # 6 might have problems with Aether, or maybe just old minors of 6: https://errorception.com/projects/51a79585ee207206390002a2/errors/547a202e1ead63ba4e4ac9fd
else
console.warn 'no more jquery browser version...'
return false

View file

@ -105,6 +105,7 @@ module.exports = class RequestQuoteView extends RootView
.addClass('has-error')
.append($("<div class='help-block error-help-block'>#{userExists} <a id='email-exists-login-link'>#{logIn}</a>"))
@$('#submit-request-btn').text('Submit').attr('disabled', false)
forms.scrollToFirstError()
onClickEmailExistsLoginLink: ->
modal = new AuthModal({

View file

@ -14,7 +14,7 @@ module.exports = class AdministerUserModal extends ModalView
constructor: (options, @userHandle) ->
super(options)
@user = @supermodel.loadModel(new User({_id:@userHandle}), 'user', {cache: false}).model
@user = @supermodel.loadModel(new User({_id:@userHandle}), {cache: false}).model
options = {cache: false, url: '/stripe/coupons'}
options.success = (@coupons) =>
@couponsResource = @supermodel.addRequestResource('coupon', options)

View file

@ -30,7 +30,7 @@ module.exports = class TrialRequestsView extends RootView
-1
else
1
@trialRequests = new CocoCollection([], { url: '/db/trial.request?conditions[sort]=-created&conditions[limit]=500', model: TrialRequest, comparator: sortRequests })
@trialRequests = new CocoCollection([], { url: '/db/trial.request?conditions[sort]=-created&conditions[limit]=1000', model: TrialRequest, comparator: sortRequests })
@supermodel.loadCollection(@trialRequests, 'trial-requests', {cache: false})
getRenderData: ->

View file

@ -60,8 +60,8 @@ module.exports = class ClanDetailsView extends RootView
@listenTo @memberAchievements, 'sync', @onMemberAchievementsSync
@listenTo @memberSessions, 'sync', @onMemberSessionsSync
@supermodel.loadModel @campaigns, 'campaigns', cache: false
@supermodel.loadModel @clan, 'clan', cache: false
@supermodel.loadModel @campaigns, cache: false
@supermodel.loadModel @clan, cache: false
@supermodel.loadCollection(@members, 'members', {cache: false})
@supermodel.loadCollection(@memberAchievements, 'member_achievements', {cache: false})
@ -204,7 +204,7 @@ module.exports = class ClanDetailsView extends RootView
unless @owner?
@owner = new User _id: @clan.get('ownerID')
@listenTo @owner, 'sync', => @render?()
@supermodel.loadModel @owner, 'owner', cache: false
@supermodel.loadModel @owner, cache: false
if @clan.get("dashboardType") is "premium"
@supermodel.loadCollection(@memberSessions, 'member_sessions', {cache: false})
@render?()

View file

@ -13,7 +13,7 @@ module.exports = class LevelSessionCodeView extends CocoView
@session = options.session
@level = LevelSession.getReferencedModel(@session.get('level'), LevelSession.schema.properties.level)
@level.setProjection ['employerDescription', 'name', 'icon', 'banner', 'slug']
@supermodel.loadModel @level, 'level'
@supermodel.loadModel @level
getRenderData: ->
c = super()

View file

@ -17,7 +17,7 @@ module.exports = class UserView extends RootView
@user = me
@onLoaded()
@user = new User _id: @userID
@supermodel.loadModel @user, 'user', cache: false
@supermodel.loadModel @user, cache: false
getRenderData: ->
context = super()

View file

@ -172,4 +172,14 @@ module.exports = class RootView extends CocoView
res.success (model, response, options) ->
#console.log 'Saved language:', newLang
isOldBrowser: ->
if $.browser
majorVersion = $.browser.versionNumber
return true if $.browser.mozilla && majorVersion < 25
return true if $.browser.chrome && majorVersion < 31 # Noticed Gems in the Deep not loading with 30
return true if $.browser.safari && majorVersion < 6 # 6 might have problems with Aether, or maybe just old minors of 6: https://errorception.com/projects/51a79585ee207206390002a2/errors/547a202e1ead63ba4e4ac9fd
else
console.warn 'no more jquery browser version...'
return false
logoutRedirectURL: '/'

View file

@ -31,7 +31,7 @@ module.exports = class CourseDetailsView extends RootView
if @course.loaded
@onCourseSync()
else
@supermodel.loadModel @course, 'course'
@supermodel.loadModel @course
getRenderData: ->
context = super()
@ -67,7 +67,7 @@ module.exports = class CourseDetailsView extends RootView
if @campaign.loaded
@onCampaignSync()
else
@supermodel.loadModel @campaign, 'campaign'
@supermodel.loadModel @campaign
@render()
onCampaignSync: ->
@ -106,7 +106,7 @@ module.exports = class CourseDetailsView extends RootView
if @courseInstance.loaded
@onCourseInstanceSync()
else
@courseInstance = @supermodel.loadModel(@courseInstance, 'course_instance').model
@courseInstance = @supermodel.loadModel(@courseInstance).model
onCourseInstancesSync: ->
return if @destroyed
@ -128,14 +128,14 @@ module.exports = class CourseDetailsView extends RootView
# console.log 'onCourseInstanceSync'
if @courseInstance.get('classroomID')
@classroom = new Classroom({_id: @courseInstance.get('classroomID')})
@supermodel.loadModel @classroom, 'classroom'
@supermodel.loadModel @classroom
@singlePlayerMode = @courseInstance.get('name') is 'Single Player'
@teacherMode = @courseInstance.get('ownerID') is me.id and not @singlePlayerMode
@levelSessions = new CocoCollection([], { url: "/db/course_instance/#{@courseInstance.id}/level_sessions", model: LevelSession, comparator: '_id' })
@listenToOnce @levelSessions, 'sync', @onLevelSessionsSync
@supermodel.loadCollection @levelSessions, 'level_sessions', cache: false
@owner = new User({_id: @courseInstance.get('ownerID')})
@supermodel.loadModel @owner, 'user'
@supermodel.loadModel @owner
@render()
onLevelSessionsSync: ->
@ -192,7 +192,7 @@ module.exports = class CourseDetailsView extends RootView
if @nextCourseInstance
nextCourseID = @nextCourseInstance.get('courseID')
@nextCourse = @supermodel.getModel(Course, nextCourseID) or new Course _id: nextCourseID
@nextCourse = @supermodel.loadModel(@nextCourse, 'course').model
@nextCourse = @supermodel.loadModel(@nextCourse).model
else if @allCourses?.loaded
@nextCourse = _.find @allCourses.models, (course) => course.id > @course.id
else

View file

@ -46,7 +46,7 @@ module.exports = class HourOfCodeView extends RootView
if @lastSession
@lastLevel = new Level()
levelData = @lastSession.get('level')
@supermodel.loadModel(@lastLevel, 'level', {
@supermodel.loadModel(@lastLevel, {
url: "/db/level/#{levelData.original}/version/#{levelData.majorVersion}"
data: {
project: 'name,slug'

View file

@ -36,7 +36,7 @@ module.exports = class DeltaView extends CocoView
@[modelName] = options[modelName]
continue unless @[modelName] and options.loadModels
if not @[modelName].isLoaded
@[modelName] = @supermodel.loadModel(@[modelName], 'document').model
@[modelName] = @supermodel.loadModel(@[modelName]).model
@buildDeltas() if @supermodel.finished()

View file

@ -27,7 +27,7 @@ module.exports = class PatchModal extends ModalView
@originalSource = @targetModel.clone(false)
else
@originalSource = new @targetModel.constructor({_id:targetID})
@supermodel.loadModel @originalSource, 'source_document'
@supermodel.loadModel @originalSource
applyDelta: ->
@headModel = null

View file

@ -22,7 +22,7 @@ module.exports = class AchievementEditView extends RootView
super options
@achievement = new Achievement(_id: @achievementID)
@achievement.saveBackups = true
@supermodel.loadModel @achievement, 'achievement'
@supermodel.loadModel @achievement
@pushChangesToPreview = _.throttle(@pushChangesToPreview, 500)
onLoaded: ->

View file

@ -20,7 +20,7 @@ module.exports = class ArticleEditView extends RootView
super options
@article = new Article({_id: @articleID})
@article.saveBackups = true
@supermodel.loadModel @article, 'article'
@supermodel.loadModel @article
@pushChangesToPreview = _.throttle(@pushChangesToPreview, 500)
onLoaded: ->

View file

@ -32,7 +32,7 @@ module.exports = class CampaignEditorView extends RootView
constructor: (options, @campaignHandle) ->
super(options)
@campaign = new Campaign({_id:@campaignHandle})
@supermodel.loadModel(@campaign, 'campaign')
@supermodel.loadModel(@campaign)
@listenToOnce @campaign, 'sync', (model, response, jqXHR) ->
@campaign.set '_id', response._id
@campaign.url = -> '/db/campaign/' + @id
@ -72,7 +72,7 @@ module.exports = class CampaignEditorView extends RootView
thangType = new ThangType()
thangType.setProjection(thangTypeProject)
thangType.setURL("/db/thang.type/#{original}/version")
@supermodel.loadModel(thangType, 'thang')
@supermodel.loadModel(thangType)
onFundamentalLoaded: ->
# Load any levels which haven't been denormalized into our campaign.
@ -82,7 +82,7 @@ module.exports = class CampaignEditorView extends RootView
model = new Level({})
model.setProjection Campaign.denormalizedLevelProperties
model.setURL("/db/level/#{level.original}/version")
@levels.add @supermodel.loadModel(model, 'level').model
@levels.add @supermodel.loadModel(model).model
achievements = new RelatedAchievementsCollection level.original
achievements.setProjection achievementProject
@supermodel.loadCollection achievements, 'achievements'
@ -109,20 +109,20 @@ module.exports = class CampaignEditorView extends RootView
rewardObject.hero = reward
thangType = new ThangType({}, {project: thangTypeProject})
thangType.setURL("/db/thang.type/#{reward}/version")
@supermodel.loadModel(thangType, 'thang')
@supermodel.loadModel(thangType)
if rewardType is 'levels'
rewardObject.level = reward
if not @levels.findWhere({original: reward})
level = new Level({}, {project: Campaign.denormalizedLevelProperties})
level.setURL("/db/level/#{reward}/version")
@supermodel.loadModel(level, 'level')
@supermodel.loadModel(level)
if rewardType is 'items'
rewardObject.item = reward
thangType = new ThangType({}, {project: thangTypeProject})
thangType.setURL("/db/thang.type/#{reward}/version")
@supermodel.loadModel(thangType, 'thang')
@supermodel.loadModel(thangType)
rewards.push rewardObject
campaignLevel.rewards = rewards

View file

@ -71,7 +71,7 @@ module.exports = class ThangComponentsEditView extends CocoView
levelComponent = new LevelComponent(componentRef)
url = "/db/level.component/#{componentRef.original}/version/#{componentRef.majorVersion}"
levelComponent.setURL(url)
resource = @supermodel.loadModel levelComponent, 'component'
resource = @supermodel.loadModel levelComponent
continue unless resource.isLoading
@listenToOnce resource, 'loaded', ->
return if @handlingChange

View file

@ -30,7 +30,7 @@ module.exports = class SystemsTabView extends CocoView
for system in @buildDefaultSystems()
url = "/db/level.system/#{system.original}/version/#{system.majorVersion}"
ls = new LevelSystem().setURL(url)
@supermodel.loadModel(ls, 'system')
@supermodel.loadModel(ls)
afterRender: ->
@buildSystemsTreema()

View file

@ -30,7 +30,7 @@ module.exports = class VersionsModal extends ModalView
constructor: (options, @ID, @model) ->
super options
@original = new @model(_id: @ID)
@original = @supermodel.loadModel(@original, 'document').model
@original = @supermodel.loadModel(@original).model
@listenToOnce(@original, 'sync', @onViewSync)
onViewSync: ->

View file

@ -25,7 +25,7 @@ module.exports = class PollEditView extends RootView
loadPoll: ->
@poll = new Poll _id: @pollID
@poll.saveBackups = true
@supermodel.loadModel @poll, 'poll'
@supermodel.loadModel @poll
loadUserPollsRecord: ->
url = "/db/user.polls.record/-/user/#{me.id}"
@ -34,7 +34,7 @@ module.exports = class PollEditView extends RootView
return if @destroyed
@userPollsRecord.url = -> '/db/user.polls.record/' + @id
@listenToOnce @userPollsRecord, 'sync', onRecordSync
@userPollsRecord = @supermodel.loadModel(@userPollsRecord, 'user_polls_record').model
@userPollsRecord = @supermodel.loadModel(@userPollsRecord).model
onRecordSync.call @ if @userPollsRecord.loaded
onLoaded: ->

View file

@ -13,7 +13,7 @@ module.exports = class ThangTypeColorsTabView extends CocoView
constructor: (@thangType, options) ->
super options
@supermodel.loadModel @thangType, 'thang'
@supermodel.loadModel @thangType
@colorConfig = {hue: 0, saturation: 0.5, lightness: 0.5}
@spriteBuilder = new SpriteBuilder(@thangType) if @thangType.get('raw')
f = =>

View file

@ -174,7 +174,7 @@ module.exports = class ThangTypeEditView extends RootView
super options
@mockThang = $.extend(true, {}, @mockThang)
@thangType = new ThangType(_id: @thangTypeID)
@thangType = @supermodel.loadModel(@thangType, 'thang').model
@thangType = @supermodel.loadModel(@thangType).model
@thangType.saveBackups = true
@listenToOnce @thangType, 'sync', ->
@files = @supermodel.loadCollection(new DocumentFiles(@thangType), 'files').model

View file

@ -19,7 +19,7 @@ module.exports = class I18NEditModelView extends RootView
constructor: (options, @modelHandle) ->
super(options)
@model = new @modelClass(_id: @modelHandle)
@model = @supermodel.loadModel(@model, 'model').model
@model = @supermodel.loadModel(@model).model
@model.saveBackups = true
@selectedLanguage = me.get('preferredLanguage', true)

View file

@ -41,7 +41,7 @@ module.exports = class LadderView extends RootView
constructor: (options, @levelID, @leagueType, @leagueID) ->
super(options)
@level = @supermodel.loadModel(new Level(_id: @levelID), 'level').model
@level = @supermodel.loadModel(new Level(_id: @levelID)).model
@sessions = @supermodel.loadCollection(new LevelSessionsCollection(@levelID), 'your_sessions', {cache: false}).model
@teams = []
@loadLeague()
@ -51,8 +51,7 @@ module.exports = class LadderView extends RootView
@leagueID = @leagueType = null unless @leagueType in ['clan', 'course']
return unless @leagueID
modelClass = if @leagueType is 'clan' then Clan else CourseInstance
resourceString = if @leagueType is 'clan' then 'clans.clan' else 'courses.course'
@league = @supermodel.loadModel(new modelClass(_id: @leagueID), resourceString).model
@league = @supermodel.loadModel(new modelClass(_id: @leagueID)).model
if @leagueType is 'course'
if @league.loaded
@onCourseInstanceLoaded @league
@ -62,7 +61,7 @@ module.exports = class LadderView extends RootView
onCourseInstanceLoaded: (courseInstance) ->
return if @destroyed
course = new Course({_id: courseInstance.get('courseID')})
@course = @supermodel.loadModel(course, 'courses.course').model
@course = @supermodel.loadModel(course).model
@listenToOnce @course, 'sync', @render
onLoaded: ->

View file

@ -13,7 +13,7 @@ module.exports = class ModelModal extends ModalView
super options
@models = options.models
for model in @models when not model.loaded
@supermodel.loadModel model, 'source_document'
@supermodel.loadModel model
model.fetch cache: false
afterRender: ->

View file

@ -82,7 +82,7 @@ module.exports = class CampaignView extends RootView
@campaign = new Campaign({_id:@terrain})
@campaign.saveBackups = @editorMode
@campaign = @supermodel.loadModel(@campaign, 'campaign').model
@campaign = @supermodel.loadModel(@campaign).model
# Temporary attempt to make sure all earned rewards are accounted for. Figure out a better solution...
@earnedAchievements = new CocoCollection([], {url: '/db/earned_achievement', model:EarnedAchievement, project: ['earnedRewards']})
@ -442,11 +442,11 @@ module.exports = class CampaignView extends RootView
preloadLevel: (levelSlug) ->
levelURL = "/db/level/#{levelSlug}"
level = new Level().setURL levelURL
level = @supermodel.loadModel(level, 'level', null, 0).model
level = @supermodel.loadModel(level, null, 0).model
sessionURL = "/db/level/#{levelSlug}/session"
@preloadedSession = new LevelSession().setURL sessionURL
@listenToOnce @preloadedSession, 'sync', @onSessionPreloaded
@preloadedSession = @supermodel.loadModel(@preloadedSession, 'level_session', {cache: false}).model
@preloadedSession = @supermodel.loadModel(@preloadedSession, {cache: false}).model
@preloadedSession.levelSlug = levelSlug
onSessionPreloaded: (session) ->
@ -604,7 +604,7 @@ module.exports = class CampaignView extends RootView
continue if @supermodel.getModel url
fullHero = new ThangType()
fullHero.setURL url
@supermodel.loadModel fullHero, 'thang'
@supermodel.loadModel fullHero
updateVolume: (volume) ->
volume ?= me.get('volume') ? 1.0
@ -675,7 +675,7 @@ module.exports = class CampaignView extends RootView
else
console.log 'Poll will be ready in', (22 * 60 * 60 * 1000 - interval) / (60 * 60 * 1000), 'hours.'
@listenToOnce @userPollsRecord, 'sync', onRecordSync
@userPollsRecord = @supermodel.loadModel(@userPollsRecord, 'user_polls_record', null, 0).model
@userPollsRecord = @supermodel.loadModel(@userPollsRecord, null, 0).model
onRecordSync.call @ if @userPollsRecord.loaded
loadPoll: ->
@ -693,7 +693,7 @@ module.exports = class CampaignView extends RootView
delete @poll
@listenToOnce @poll, 'sync', onPollSync
@listenToOnce @poll, 'error', onPollError
@poll = @supermodel.loadModel(@poll, 'poll', null, 0).model
@poll = @supermodel.loadModel(@poll, null, 0).model
onPollSync.call @ if @poll.loaded
activatePoll: ->

View file

@ -41,13 +41,13 @@ module.exports = class CourseVictoryModal extends ModalView
@nextLevel = options.nextLevel
if (nextLevel = @level.get('nextLevel')) and not @nextLevel
@nextLevel = new Level().setURL "/db/level/#{nextLevel.original}/version/#{nextLevel.majorVersion}"
@nextLevel = @supermodel.loadModel(@nextLevel, 'level').model
@nextLevel = @supermodel.loadModel(@nextLevel).model
@campaign = new Campaign()
@course = options.course
if @courseID and not @course
@course = new Course().setURL "/db/course/#{@courseID}"
@course = @supermodel.loadModel(@course, 'course').model
@course = @supermodel.loadModel(@course).model
if @course.loading
@listenToOnce @course, 'sync', @onCourseLoaded
else
@ -65,7 +65,7 @@ module.exports = class CourseVictoryModal extends ModalView
onCourseLoaded: ->
@campaign.set('_id', @course.get('campaignID'))
@campaign = @supermodel.loadModel(@campaign, 'campaign').model
@campaign = @supermodel.loadModel(@campaign).model
onAchievementsLoaded: ->
@ -89,7 +89,7 @@ module.exports = class CourseVictoryModal extends ModalView
thang= new ThangType()
thang.url = "/db/thang.type/#{original}/version"
thang.project = project
@supermodel.loadModel(thang, 'thang')
@supermodel.loadModel(thang)
newThangTypeCollection.add(thang)
@newEarnedAchievements = []
@ -108,7 +108,7 @@ module.exports = class CourseVictoryModal extends ModalView
model.sr.markLoaded()
if _.all((ea.id for ea in @newEarnedAchievements))
unless me.loading
@supermodel.loadModel(me, 'user', {cache: false})
@supermodel.loadModel(me, {cache: false})
@newEarnedAchievementsResource.markLoaded()
@ -166,5 +166,3 @@ module.exports = class CourseVictoryModal extends ModalView
onDone: ->
link = "/courses/#{@courseID}/#{@courseInstanceID}"
application.router.navigate(link, {trigger: true})

View file

@ -66,10 +66,10 @@ module.exports = class HeroVictoryModal extends ModalView
if @level.get('type', true) is 'course'
if nextLevel = @level.get('nextLevel')
@nextLevel = new Level().setURL "/db/level/#{nextLevel.original}/version/#{nextLevel.majorVersion}"
@nextLevel = @supermodel.loadModel(@nextLevel, 'level').model
@nextLevel = @supermodel.loadModel(@nextLevel).model
if @courseID
@course = new Course().setURL "/db/course/#{@courseID}"
@course = @supermodel.loadModel(@course, 'course').model
@course = @supermodel.loadModel(@course).model
if @level.get('type', true) in ['course', 'course-ladder']
@saveReviewEventually = _.debounce(@saveReviewEventually, 2000)
@loadExistingFeedback()
@ -123,7 +123,7 @@ module.exports = class HeroVictoryModal extends ModalView
thangType.url = "/db/thang.type/#{thangTypeOriginal}/version"
#thangType.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.
thangType.project = ['original', 'rasterIcon', 'name', 'slug', 'soundTriggers', 'featureImages', 'gems', 'heroClass', 'description', 'components', 'extendedName', 'unlockLevelName', 'i18n']
@thangTypes[thangTypeOriginal] = @supermodel.loadModel(thangType, 'thang').model
@thangTypes[thangTypeOriginal] = @supermodel.loadModel(thangType).model
@newEarnedAchievements = []
hadOneCompleted = false

View file

@ -170,7 +170,7 @@ module.exports = class CastButtonView extends CocoView
url = "/db/level/#{@options.level.get('slug') or @options.level.id}/session"
url += "?team=#{if me.team is 'humans' then 'ogres' else 'humans'}"
mirrorSession = new LevelSession().setURL url
@mirrorSession = @supermodel.loadModel(mirrorSession, 'level_session', {cache: false}).model
@mirrorSession = @supermodel.loadModel(mirrorSession, {cache: false}).model
updateLadderSubmissionViews: ->
@removeSubView subview for key, subview of @subviews when subview instanceof LadderSubmissionView

View file

@ -21,7 +21,7 @@ module.exports = class LeaderboardModal extends ModalView
@levelSlug = @options.levelSlug
level = new Level({_id: @levelSlug})
level.project = ['name', 'i18n', 'scoreType', 'original']
@level = @supermodel.loadModel(level, 'level').model
@level = @supermodel.loadModel(level).model
getRenderData: (c) ->
c = super c

View file

@ -139,7 +139,7 @@ module.exports = class PlayHeroesModal extends ModalView
return fullHero
fullHero = new ThangType()
fullHero.setURL url
fullHero = (@supermodel.loadModel fullHero, 'thang').model
fullHero = (@supermodel.loadModel fullHero).model
fullHero
preloadHero: (heroIndex) ->

View file

@ -27,14 +27,14 @@ describe 'SuperModel', ->
it 'starts loading the model if it isn\'t already loading', ->
s = new SuperModel()
m = new User({_id: '12345'})
s.loadModel(m, 'user')
s.loadModel(m)
request = jasmine.Ajax.requests.mostRecent()
expect(request).toBeDefined()
it 'also loads collections', ->
s = new SuperModel()
c = new ComponentsCollection()
s.loadModel(c, 'collection')
s.loadModel(c)
request = jasmine.Ajax.requests.mostRecent()
expect(request).toBeDefined()
@ -44,7 +44,7 @@ describe 'SuperModel', ->
m = new User({_id: '12345'})
triggered = false
s.once 'loaded-all', -> triggered = true
s.loadModel(m, 'user')
s.loadModel(m)
request = jasmine.Ajax.requests.mostRecent()
request.respondWith({status: 200, responseText: '{}'})
_.defer ->