diff --git a/app/assets/images/pages/home/course2.png b/app/assets/images/pages/home/computer-science-2.png similarity index 100% rename from app/assets/images/pages/home/course2.png rename to app/assets/images/pages/home/computer-science-2.png diff --git a/app/assets/images/pages/home/course3.png b/app/assets/images/pages/home/computer-science-3.png similarity index 100% rename from app/assets/images/pages/home/course3.png rename to app/assets/images/pages/home/computer-science-3.png diff --git a/app/assets/images/pages/home/course4.png b/app/assets/images/pages/home/computer-science-4.png similarity index 100% rename from app/assets/images/pages/home/course4.png rename to app/assets/images/pages/home/computer-science-4.png diff --git a/app/assets/images/pages/home/course5.png b/app/assets/images/pages/home/computer-science-5.png similarity index 100% rename from app/assets/images/pages/home/course5.png rename to app/assets/images/pages/home/computer-science-5.png diff --git a/app/assets/images/pages/home/game-dev-1.png b/app/assets/images/pages/home/game-dev-1.png new file mode 100644 index 000000000..4fe0b8f96 Binary files /dev/null and b/app/assets/images/pages/home/game-dev-1.png differ diff --git a/app/assets/images/pages/home/course1.png b/app/assets/images/pages/home/introduction-to-computer-science.png similarity index 100% rename from app/assets/images/pages/home/course1.png rename to app/assets/images/pages/home/introduction-to-computer-science.png diff --git a/app/assets/images/pages/home/web-dev-1.png b/app/assets/images/pages/home/web-dev-1.png new file mode 100644 index 000000000..29a561a73 Binary files /dev/null and b/app/assets/images/pages/home/web-dev-1.png differ diff --git a/app/lib/LevelLoader.coffee b/app/lib/LevelLoader.coffee index e35af2996..2b3dc9249 100644 --- a/app/lib/LevelLoader.coffee +++ b/app/lib/LevelLoader.coffee @@ -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') diff --git a/app/locale/en.coffee b/app/locale/en.coffee index c23b87ee9..0d1469950 100644 --- a/app/locale/en.coffee +++ b/app/locale/en.coffee @@ -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." diff --git a/app/models/CocoModel.coffee b/app/models/CocoModel.coffee index 90310d5de..8441d2bc0 100644 --- a/app/models/CocoModel.coffee +++ b/app/models/CocoModel.coffee @@ -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 diff --git a/app/styles/play/level/tome/spell.sass b/app/styles/play/level/tome/spell.sass index cc49b2e07..b3928a4b3 100644 --- a/app/styles/play/level/tome/spell.sass +++ b/app/styles/play/level/tome/spell.sass @@ -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 diff --git a/app/templates/courses/teacher-class-view.jade b/app/templates/courses/teacher-class-view.jade index 37cbb69e0..ad32438aa 100644 --- a/app/templates/courses/teacher-class-view.jade +++ b/app/templates/courses/teacher-class-view.jade @@ -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 diff --git a/app/templates/new-home-view.jade b/app/templates/new-home-view.jade index 6f7c77ec8..302fc9d9b 100644 --- a/app/templates/new-home-view.jade +++ b/app/templates/new-home-view.jade @@ -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 diff --git a/app/views/NewHomeView.coffee b/app/views/NewHomeView.coffee index 3c222881f..68fcd7918 100644 --- a/app/views/NewHomeView.coffee +++ b/app/views/NewHomeView.coffee @@ -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') diff --git a/app/views/editor/level/LevelEditView.coffee b/app/views/editor/level/LevelEditView.coffee index 0f9b0d216..230d18a94 100644 --- a/app/views/editor/level/LevelEditView.coffee +++ b/app/views/editor/level/LevelEditView.coffee @@ -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) diff --git a/app/views/play/level/tome/SpellView.coffee b/app/views/play/level/tome/SpellView.coffee index b4cc1d44b..f3a759558 100644 --- a/app/views/play/level/tome/SpellView.coffee +++ b/app/views/play/level/tome/SpellView.coffee @@ -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 diff --git a/scripts/mongodb/updateCourses.js b/scripts/mongodb/updateCourses.js index 414b1dfd8..593e301d8 100644 --- a/scripts/mongodb/updateCourses.js +++ b/scripts/mongodb/updateCourses.js @@ -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",