Merge remote-tracking branch 'refs/remotes/codecombat/master'
Before Width: | Height: | Size: 33 KiB After Width: | Height: | Size: 33 KiB |
Before Width: | Height: | Size: 24 KiB After Width: | Height: | Size: 24 KiB |
Before Width: | Height: | Size: 27 KiB After Width: | Height: | Size: 27 KiB |
Before Width: | Height: | Size: 38 KiB After Width: | Height: | Size: 38 KiB |
BIN
app/assets/images/pages/home/game-dev-1.png
Normal file
After Width: | Height: | Size: 26 KiB |
Before Width: | Height: | Size: 34 KiB After Width: | Height: | Size: 34 KiB |
BIN
app/assets/images/pages/home/web-dev-1.png
Normal file
After Width: | Height: | Size: 20 KiB |
|
@ -79,6 +79,11 @@ module.exports = class LevelLoader extends CocoClass
|
|||
@listenToOnce @level, 'sync', @onLevelLoaded
|
||||
|
||||
reportLoadError: ->
|
||||
window.tracker?.trackEvent 'LevelLoadError',
|
||||
category: 'Error',
|
||||
levelSlug: @work?.level?.slug,
|
||||
unloaded: JSON.stringify(@supermodel.report().map (m) -> _.result(m.model, 'url'))
|
||||
|
||||
return if me.isAdmin() or /dev=true/.test(window.location?.href ? '') or reportedLoadErrorAlready
|
||||
reportedLoadErrorAlready = true
|
||||
context = email: me.get('email')
|
||||
|
|
|
@ -71,7 +71,7 @@
|
|||
curriculum: "Total curriculum hours:"
|
||||
ffa: "Free for all students"
|
||||
lesson_time: "Lesson time:"
|
||||
coming_soon: "Coming this fall!"
|
||||
coming_soon: "More coming soon!" # {change}
|
||||
courses_available_in: "Courses are available in JavaScript, Python, and Java (coming soon!)"
|
||||
boast: "Boasts riddles that are complex enough to fascinate gamers and coders alike."
|
||||
winning: "A winning combination of RPG gameplay and programming homework that pulls off making kid-friendly education legitimately enjoyable."
|
||||
|
|
|
@ -309,6 +309,8 @@ class CocoModel extends Backbone.Model
|
|||
sum = 0
|
||||
data ?= $.extend true, {}, @attributes
|
||||
schema ?= @schema() or {}
|
||||
if schema.oneOf # get populating the Programmable component config to work
|
||||
schema = _.find(schema.oneOf, {type: 'object'})
|
||||
addedI18N = false
|
||||
if schema.properties?.i18n and _.isPlainObject(data) and not data.i18n?
|
||||
data.i18n = {'-':{'-':'-'}} # mongoose doesn't work with empty objects
|
||||
|
@ -318,7 +320,11 @@ class CocoModel extends Backbone.Model
|
|||
if _.isPlainObject data
|
||||
for key, value of data
|
||||
numChanged = 0
|
||||
numChanged = @populateI18N(value, childSchema, path+'/'+key) if childSchema = schema.properties?[key]
|
||||
childSchema = schema.properties?[key]
|
||||
if not childSchema and _.isObject(schema.additionalProperties)
|
||||
childSchema = schema.additionalProperties
|
||||
if childSchema
|
||||
numChanged = @populateI18N(value, childSchema, path+'/'+key)
|
||||
if numChanged and not path # should only do this for the root object
|
||||
@set key, value
|
||||
sum += numChanged
|
||||
|
|
|
@ -164,7 +164,6 @@
|
|||
content: " "
|
||||
display: inline-block
|
||||
position: relative
|
||||
left: -49px
|
||||
width: 49px
|
||||
top: -30px
|
||||
height: 38px
|
||||
|
@ -172,6 +171,20 @@
|
|||
|
||||
background-image: url(data:image/png;base64,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)
|
||||
|
||||
.ace_gutter-cell.entry-point:not(.next-entry-point):after
|
||||
opacity: 0.5
|
||||
|
||||
.ace_gutter-cell.entry-point.entry-point-indent-0:after
|
||||
left: -25px
|
||||
.ace_gutter-cell.entry-point.entry-point-indent-4:after
|
||||
left: 5px
|
||||
.ace_gutter-cell.entry-point.entry-point-indent-8:after
|
||||
left: 33px
|
||||
.ace_gutter-cell.entry-point.entry-point-indent-12:after
|
||||
left: 61px
|
||||
.ace_gutter-cell.entry-point.entry-point-indent-16:after
|
||||
left: 89px
|
||||
|
||||
.ace_gutter-cell.ace_error
|
||||
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAABx0RVh0U29mdHdhcmUAQWRvYmUgRmlyZXdvcmtzIENTM5jWRgMAAAAVdEVYdENyZWF0aW9uIFRpbWUAMi8xNy8wOCCcqlgAAAQRdEVYdFhNTDpjb20uYWRvYmUueG1wADw/eHBhY2tldCBiZWdpbj0iICAgIiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+Cjx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDQuMS1jMDM0IDQ2LjI3Mjk3NiwgU2F0IEphbiAyNyAyMDA3IDIyOjExOjQxICAgICAgICAiPgogICA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgICAgICAgICB4bWxuczp4YXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iPgogICAgICAgICA8eGFwOkNyZWF0b3JUb29sPkFkb2JlIEZpcmV3b3JrcyBDUzM8L3hhcDpDcmVhdG9yVG9vbD4KICAgICAgICAgPHhhcDpDcmVhdGVEYXRlPjIwMDgtMDItMTdUMDI6MzY6NDVaPC94YXA6Q3JlYXRlRGF0ZT4KICAgICAgICAgPHhhcDpNb2RpZnlEYXRlPjIwMDgtMDMtMjRUMTk6MDA6NDJaPC94YXA6TW9kaWZ5RGF0ZT4KICAgICAgPC9yZGY6RGVzY3JpcHRpb24+CiAgICAgIDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiCiAgICAgICAgICAgIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyI+CiAgICAgICAgIDxkYzpmb3JtYXQ+aW1hZ2UvcG5nPC9kYzpmb3JtYXQ+CiAgICAgIDwvcmRmOkRlc2NyaXB0aW9uPgogICA8L3JkZjpSREY+CjwveDp4bXBtZXRhPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUdUmQAAAD5SURBVDiNpZMxagMxEEWfgiCXcB3IbXwD7zbaM0nNyjdIl1O4Dk7pbsslEFbEZFKsJsiJrGDy4YM0M//zRyAoINAJyB8cS43RwwIdMFrvaeE8DADxXqQ3Jstn6GaQ5L3M0GQxsyaZoJtA3r2XCS6o+FkvZkdOIG/eywl+UVHrqcYm4BNIjb1rPdXYBTivj3gVtZ5q/p8gAfPhcLOBamzKcW41UI1dgA/qez4bU6muUE0zwVYEgKeKkWruEnTHENg4R8pFZblCyY1zHEMgQTQAe9gB8cE5XkO4GhugmIk76L+z+Wzy6FzT4CWLXf5MF8upSdMB4gC9Xr4AiezTJHGxdq0AAAAASUVORK5CYII=)
|
||||
|
||||
|
@ -179,9 +192,6 @@
|
|||
.ace_gutter-cell.ace_info
|
||||
background-image: none
|
||||
|
||||
.ace_gutter-cell.entry-point:not(.next-entry-point):after
|
||||
opacity: 0.5
|
||||
|
||||
.ace_marker-layer
|
||||
.ace_bracket
|
||||
// Override faint gray
|
||||
|
|
|
@ -122,12 +122,13 @@ block content
|
|||
li(class=(activeTab === "#enrollment-status-tab" ? 'active' : ''))
|
||||
a.course-progress-tab-btn(href='#enrollment-status-tab')
|
||||
.small-details.text-center(data-i18n='teacher.enrollment_status')
|
||||
- var courses = view.classroom.get('courses').map(function(c) { return view.courses.get(c._id); });
|
||||
if _.find(courses, function(c) { return /dev/.test(c.get('slug')); })
|
||||
.tab-spacer
|
||||
li(class=(activeTab === "#student-projects-tab" ? 'active' : ''))
|
||||
a.course-progress-tab-btn(href='#student-projects-tab')
|
||||
.small-details.text-center(data-i18n='teacher.projects')
|
||||
// TODO: Move projects into course progress tab
|
||||
//- var courses = view.classroom.get('courses').map(function(c) { return view.courses.get(c._id); });
|
||||
//if _.find(courses, function(c) { return /dev/.test(c.get('slug')); })
|
||||
// .tab-spacer
|
||||
// li(class=(activeTab === "#student-projects-tab" ? 'active' : ''))
|
||||
// a.course-progress-tab-btn(href='#student-projects-tab')
|
||||
// .small-details.text-center(data-i18n='teacher.projects')
|
||||
.tab-filler
|
||||
|
||||
.tab-content
|
||||
|
|
|
@ -232,7 +232,6 @@ block content
|
|||
span#semester-duration
|
||||
#courses-row.row
|
||||
- var conceptsSeen = {};
|
||||
- var lastScreenshot = "";
|
||||
for course, courseIndex in view.courses.models
|
||||
.col-md-3.col-sm-4
|
||||
.media.course-details(data-course-slug=course.get('slug'))
|
||||
|
@ -256,19 +255,16 @@ block content
|
|||
span.spr ,
|
||||
- total += 1;
|
||||
span(data-i18n="concepts." + concept)
|
||||
img.media-object(src="/images/pages/home/course"+(courseIndex+1)+".png")
|
||||
- lastScreenshot = course.get('screenshot');
|
||||
img.media-object(src="/images/pages/home/" + course.get('slug') + ".png")
|
||||
h6.course-duration
|
||||
span.spr(data-i18n="new_home.lesson_time")
|
||||
span.course-hours= course.get('duration') || 0
|
||||
span.spl.unit(data-i18n="units.hours")
|
||||
for upcomingCourse in ['Computer Science 6', 'Computer Science 7', 'Computer Science 8']
|
||||
.col-md-3.col-sm-4
|
||||
.media.disabled
|
||||
.media-body
|
||||
h6.course-name= upcomingCourse + ':'
|
||||
p.small(data-i18n="new_home.coming_soon")
|
||||
img.media-object(src="/images/pages/home/inprogress.png")
|
||||
.col-md-3.col-sm-4
|
||||
.media.disabled
|
||||
.media-body
|
||||
p.small(data-i18n="new_home.coming_soon")
|
||||
img.media-object(src="/images/pages/home/inprogress.png")
|
||||
|
||||
.clearfix
|
||||
.text-center
|
||||
|
|
|
@ -131,9 +131,33 @@ module.exports = class NewHomeView extends RootView
|
|||
|
||||
onChangeSchoolLevelDropdown: (e) ->
|
||||
levels =
|
||||
elementary: {'introduction-to-computer-science': '2-4', 'computer-science-6': '24-30', 'computer-science-7': '30-40', 'computer-science-8': '30-40', default: '16-25', total: '150-215 hours (about two and a half years)'}
|
||||
middle: {'introduction-to-computer-science': '1-3', 'computer-science-6': '12-14', 'computer-science-7': '14-16', 'computer-science-8': '14-16', default: '8-12', total: '75-100 hours (about one and a half years)'}
|
||||
high: {'introduction-to-computer-science': '1', 'computer-science-6': '10-12', 'computer-science-7': '12-16', 'computer-science-8': '12-16', default: '8-10', total: '65-85 hours (about one year)'}
|
||||
elementary:
|
||||
'introduction-to-computer-science': '2-4'
|
||||
'game-dev-1': '2-3'
|
||||
'web-dev-1': '2-3'
|
||||
'computer-science-6': '24-30'
|
||||
'computer-science-7': '30-40'
|
||||
'computer-science-8': '30-40'
|
||||
default: '16-25'
|
||||
total: '150-215 hours (about two and a half years)'
|
||||
middle:
|
||||
'introduction-to-computer-science': '1-3'
|
||||
'game-dev-1': '1-3'
|
||||
'web-dev-1': '1-3'
|
||||
'computer-science-6': '12-14'
|
||||
'computer-science-7': '14-16'
|
||||
'computer-science-8': '14-16'
|
||||
default: '8-12'
|
||||
total: '75-100 hours (about one and a half years)'
|
||||
high:
|
||||
'introduction-to-computer-science': '1'
|
||||
'game-dev-1': '1-2'
|
||||
'web-dev-1': '1-2'
|
||||
'computer-science-6': '10-12'
|
||||
'computer-science-7': '12-16'
|
||||
'computer-science-8': '12-16'
|
||||
default: '8-10'
|
||||
total: '65-85 hours (about one year)'
|
||||
level = if e then $(e.target).val() else 'middle'
|
||||
@$el.find('#courses-row .course-details').each ->
|
||||
slug = $(@).data('course-slug')
|
||||
|
|
|
@ -2,6 +2,7 @@ RootView = require 'views/core/RootView'
|
|||
template = require 'templates/editor/level/edit'
|
||||
Level = require 'models/Level'
|
||||
LevelSystem = require 'models/LevelSystem'
|
||||
LevelComponent = require 'models/LevelComponent'
|
||||
World = require 'lib/world/world'
|
||||
DocumentFiles = require 'collections/DocumentFiles'
|
||||
LevelLoader = require 'lib/LevelLoader'
|
||||
|
@ -217,6 +218,19 @@ module.exports = class LevelEditView extends RootView
|
|||
|
||||
onPopulateI18N: ->
|
||||
@level.populateI18N()
|
||||
|
||||
levelComponentMap = _(currentView.supermodel.getModels(LevelComponent))
|
||||
.map((c) -> [c.get('original'), c])
|
||||
.object()
|
||||
.value()
|
||||
|
||||
for thang, thangIndex in @level.get('thangs')
|
||||
for thangComponent, thangComponentIndex in thang.components
|
||||
component = levelComponentMap[thangComponent.original]
|
||||
configSchema = component.get('configSchema')
|
||||
path = "/thangs/#{thangIndex}/components/#{thangComponentIndex}/config"
|
||||
@level.populateI18N(thangComponent.config, configSchema, path)
|
||||
|
||||
f = -> document.location.reload()
|
||||
setTimeout(f, 2000)
|
||||
|
||||
|
|
|
@ -1113,6 +1113,7 @@ module.exports = class SpellView extends CocoView
|
|||
for line, index in lines
|
||||
session.removeGutterDecoration index, 'entry-point'
|
||||
session.removeGutterDecoration index, 'next-entry-point'
|
||||
session.removeGutterDecoration index, "entry-point-indent-#{i}" for i in [0, 4, 8, 12, 16]
|
||||
|
||||
lineHasComment = @singleLineCommentRegex().test line
|
||||
lineHasCode = line.trim()[0] and not @singleLineCommentOnlyRegex().test line
|
||||
|
@ -1146,6 +1147,13 @@ module.exports = class SpellView extends CocoView
|
|||
session.addGutterDecoration index, 'next-entry-point'
|
||||
seenAnEntryPoint = true
|
||||
|
||||
# Shift pointer right based on current indentation
|
||||
# TODO: tabs probably need different horizontal offsets than spaces
|
||||
indent = 0
|
||||
indent++ while /\s/.test(line[indent])
|
||||
indent = Math.min(16, Math.floor(indent / 4) * 4)
|
||||
session.addGutterDecoration index, "entry-point-indent-#{indent}"
|
||||
|
||||
previousLine = line
|
||||
previousLineHadComment = lineHasComment
|
||||
previousLineHadCode = lineHasCode
|
||||
|
|
|
@ -75,7 +75,7 @@ var courses =
|
|||
description: "Learn the basics of web development in this introductory HTML & CSS course.",
|
||||
duration: NumberInt(1),
|
||||
free: false,
|
||||
releasePhase: 'beta'
|
||||
releasePhase: 'released'
|
||||
},
|
||||
{
|
||||
name: "CS: Web Development 2",
|
||||
|
|