From 8435789691d0188d3452ff692a8548d686a0106f Mon Sep 17 00:00:00 2001 From: Robin Yang Date: Wed, 24 Aug 2016 14:02:03 -0700 Subject: [PATCH 01/17] Change programming language listing on About page --- app/assets/images/pages/about/new_languages.png | Bin 0 -> 55878 bytes .../images/pages/about/new_languages_xs.png | Bin 0 -> 55764 bytes app/templates/about.jade | 7 +++---- 3 files changed, 3 insertions(+), 4 deletions(-) create mode 100644 app/assets/images/pages/about/new_languages.png create mode 100644 app/assets/images/pages/about/new_languages_xs.png diff --git a/app/assets/images/pages/about/new_languages.png b/app/assets/images/pages/about/new_languages.png new file mode 100644 index 0000000000000000000000000000000000000000..99a8c99dc9083d0b1dfe17055d598b796838e067 GIT binary patch literal 55878 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 literal 0 HcmV?d00001 diff --git a/app/assets/images/pages/about/new_languages_xs.png b/app/assets/images/pages/about/new_languages_xs.png new file mode 100644 index 0000000000000000000000000000000000000000..7aa21cb7cc5ac746d1f7303ce967696c6f7144b5 GIT binary patch literal 55764 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 ZBeqytqHsY^P2`K`Qj}GNR!f@%{SVQ?4)_27 literal 0 HcmV?d00001 diff --git a/app/templates/about.jade b/app/templates/about.jade index 0eaf9e3d4..8b19747c5 100644 --- a/app/templates/about.jade +++ b/app/templates/about.jade @@ -247,10 +247,9 @@ block content #story-languages .text-center .text-h5(data-i18n="about.story_statistic_3c") - #language-icons.text-center(title="CoffeeScript, JavaScript, Python, Java, Lua") - 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") + #language-icons.text-center(title="JavaScript, Python, HTML, CSS, jQuery, Bootstrap") + img.hidden-xs(src="/images/pages/about/new_languages.png") + img.hidden-sm.hidden-md.hidden-lg(src="/images/pages/about/new_languages_xs.png") #story-graphic-4.text-center p From 18e985a845d4233efd87056f3db37015538108aa Mon Sep 17 00:00:00 2001 From: Josh Callebaut Date: Wed, 24 Aug 2016 14:35:26 -0700 Subject: [PATCH 02/17] No longer display star on adventurer levels and make all adventurer levels purple --- app/templates/play/campaign-view.jade | 2 +- app/views/play/CampaignView.coffee | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/app/templates/play/campaign-view.jade b/app/templates/play/campaign-view.jade index 22ee2e483..816b767f3 100644 --- a/app/templates/play/campaign-view.jade +++ b/app/templates/play/campaign-view.jade @@ -41,7 +41,7 @@ if view.showAds() a(href=level.type == 'hero' ? '#' : level.disabled ? "/play" : "/play/#{level.levelPath || 'level'}/#{level.slug}", disabled=level.disabled, data-level-slug=level.slug, data-level-path=level.levelPath || 'level', data-level-name=level.name) if level.slug == 'lost-viking' img.star(src="/file/db/thang.type/5441c3144e9aeb727cc97111/portrait.png") - else if level.requiresSubscription + else if level.requiresSubscription && !level.adventurer img.star(src="/images/pages/play/star.png") if levelStatusMap[level.slug] === 'complete' img.banner(src="/images/pages/play/level-banner-complete.png") diff --git a/app/views/play/CampaignView.coffee b/app/views/play/CampaignView.coffee index bd5b8ab4c..a334c3e77 100644 --- a/app/views/play/CampaignView.coffee +++ b/app/views/play/CampaignView.coffee @@ -292,6 +292,8 @@ module.exports = class CampaignView extends RootView level.color = 'rgb(255, 80, 60)' if level.requiresSubscription level.color = 'rgb(80, 130, 200)' + if level.adventurer + level.color = 'rgb(200, 80, 200)' if unlocksHero = _.find(level.rewards, 'hero')?.hero level.unlocksHero = unlocksHero if level.unlocksHero From 76b1efdefbbf27469ce8c8e0a0dfaac27f748aba Mon Sep 17 00:00:00 2001 From: Matt Lott Date: Thu, 25 Aug 2016 10:21:36 -0700 Subject: [PATCH 03/17] Update Close lead creation when have NCES data --- scripts/addZenProspectLeadsToClose.js | 29 +++++++--- scripts/updateCloseIoLeads.js | 77 ++++++++++++++++++--------- 2 files changed, 75 insertions(+), 31 deletions(-) diff --git a/scripts/addZenProspectLeadsToClose.js b/scripts/addZenProspectLeadsToClose.js index ea2c2749d..1e9821b78 100644 --- a/scripts/addZenProspectLeadsToClose.js +++ b/scripts/addZenProspectLeadsToClose.js @@ -23,6 +23,8 @@ let zpMinActivityDate = new Date(); zpMinActivityDate.setUTCDate(zpMinActivityDate.getUTCDate() - 30); zpMinActivityDate = zpMinActivityDate.toISOString().substring(0, 10); +const closeParallelLimit = 100; + getZPContacts((err, emailContactMap) => { if (err) { console.log(err); @@ -33,7 +35,7 @@ getZPContacts((err, emailContactMap) => { const contact = emailContactMap[email]; tasks.push(createUpsertCloseLeadFn(contact)); } - async.parallel(tasks, (err, results) => { + async.parallelLimit(tasks, closeParallelLimit, (err, results) => { if (err) console.log(err); log("Script runtime: " + (new Date() - scriptStartTime)); }); @@ -127,26 +129,39 @@ function updateCloseLead(zpContact, existingLead, done) { } function createUpsertCloseLeadFn(zpContact) { + // New contact lead matching algorithm: + // 1. New contact email exists + // 2. New contact NCES school id exists + // 3. New contact NCES district id and no NCES school id + // 4. New contact school name and no NCES data + // 5. New contact district name and no NCES data return (done) => { // console.log(`DEBUG: createUpsertCloseLeadFn ${zpContact.organization} ${zpContact.email}`); - const query = `email:${zpContact.email}`; - const url = `https://${closeIoApiKey}:X@app.close.io/api/v1/lead/?query=${encodeURIComponent(query)}`; + let query = `email:${zpContact.email}`; + let url = `https://${closeIoApiKey}:X@app.close.io/api/v1/lead/?query=${encodeURIComponent(query)}`; request.get(url, (error, response, body) => { if (error) return done(error); const data = JSON.parse(body); if (data.total_results != 0) return done(); - const query = `name:${zpContact.organization}`; - const url = `https://${closeIoApiKey}:X@app.close.io/api/v1/lead/?query=${encodeURIComponent(query)}`; + + query = `name:${zpContact.organization}`; + if (zpContact.nces_school_id) { + query = `custom.demo_nces_id:"${zpContact.nces_school_id}"`; + } + else if (zpContact.nces_district_id) { + query = `custom.demo_nces_district_id:"${zpContact.nces_district_id}" custom.demo_nces_id:""`; + } + url = `https://${closeIoApiKey}:X@app.close.io/api/v1/lead/?query=${encodeURIComponent(query)}`; request.get(url, (error, response, body) => { if (error) return done(error); const data = JSON.parse(body); if (data.total_results === 0) { - console.log(`DEBUG: Creating lead for ${zpContact.organization} ${zpContact.email}`); + console.log(`DEBUG: Creating lead for ${zpContact.organization} ${zpContact.email} nces_district_id=${zpContact.nces_district_id} nces_school_id=${zpContact.nces_school_id}`); return createCloseLead(zpContact, done); } else { const existingLead = data.data[0]; - console.log(`DEBUG: Adding ${zpContact.organization} ${zpContact.email} to ${existingLead.id}`); + console.log(`DEBUG: Adding to ${existingLead.id} ${zpContact.organization} ${zpContact.email} nces_district_id=${zpContact.nces_district_id} nces_school_id=${zpContact.nces_school_id}`); return updateCloseLead(zpContact, existingLead, done); } }); diff --git a/scripts/updateCloseIoLeads.js b/scripts/updateCloseIoLeads.js index 2c79b09d1..a67f53bb2 100644 --- a/scripts/updateCloseIoLeads.js +++ b/scripts/updateCloseIoLeads.js @@ -14,7 +14,7 @@ if (process.argv.length !== 10) { // TODO: Reduce response data via _fields param // TODO: Assumes 1:1 contact:email relationship (Close.io supports multiple emails for a single contact) // TODO: Cleanup country/status lookup code -// TODO: parallelize update leads +// TODO: Handle trial requests as individual contacts to be imported, instead of batching them into leads immediately via CocoLead objects // Save as custom fields instead of user-specific lead notes (also saving nces_ props) const commonTrialProperties = ['organization', 'district', 'city', 'state', 'country']; @@ -59,6 +59,8 @@ const usSchoolStatuses = ['Auto Attempt 1', 'New US Schools Auto Attempt 1', 'Ne const emailDelayMinutes = 27; +const closeParallelLimit = 100; + const scriptStartTime = new Date(); const closeIoApiKey = process.argv[2]; // Automatic mails sent as API owners, first key assumed to be primary and gets 50% of the leads @@ -677,7 +679,7 @@ function updateExistingLead(lead, existingLead, userApiKeyMap, done) { newContact.lead_id = existingLead.id; tasks.push(createAddContactFn(newContact, lead, existingLead, userApiKeyMap)); } - async.parallel(tasks, (err, results) => { + async.parallelLimit(tasks, closeParallelLimit, (err, results) => { if (err) return done(err); // Add notes @@ -690,7 +692,7 @@ function updateExistingLead(lead, existingLead, userApiKeyMap, done) { for (const newNote of newNotes) { tasks.push(createAddNoteFn(existingLead.id, newNote)); } - async.parallel(tasks, (err, results) => { + async.parallelLimit(tasks, closeParallelLimit, (err, results) => { return done(err); }); }); @@ -721,7 +723,7 @@ function saveNewLead(lead, done) { for (const newNote of newNotes) { tasks.push(createAddNoteFn(existingLead.id, newNote)); } - async.parallel(tasks, (err, results) => { + async.parallelLimit(tasks, closeParallelLimit, (err, results) => { if (err) return done(err); // Send emails to new contacts @@ -733,7 +735,7 @@ function saveNewLead(lead, done) { tasks.push(createSendEmailFn(email.email, existingLead.id, contact.id, emailTemplate, postData.status)); } } - async.parallel(tasks, (err, results) => { + async.parallelLimit(tasks, closeParallelLimit, (err, results) => { return done(err); }); }); @@ -767,34 +769,61 @@ function createFindExistingLeadFn(email, name, existingLeads) { } function createUpdateLeadFn(lead, existingLeads, userApiKeyMap) { + // New contact lead matching algorithm: + // 1. New contact email exists + // 2. New contact NCES school id exists + // 3. New contact NCES district id and no NCES school id + // 4. New contact school name and no NCES data + // 5. New contact district name and no NCES data return (done) => { // console.log('DEBUG: updateLead', lead.name); - const query = `name:"${lead.name}"`; + + if (existingLeads[lead.name.toLowerCase()]) { + if (existingLeads[lead.name.toLowerCase()].length === 1) { + // console.log(`DEBUG: Using lead from email lookup: ${lead.name}`); + return updateExistingLead(lead, existingLeads[lead.name.toLowerCase()][0], userApiKeyMap, done); + } + console.error(`ERROR: ${existingLeads[lead.name.toLowerCase()].length} email leads found for ${lead.name}`); + return done(); + } + + let nces_district_id; + let nces_school_id; + for (const trial of lead.trialRequests) { + if (!trial.properties) continue; + if (trial.properties.nces_district_id) { + nces_district_id = trial.properties.nces_district_id; + if (trial.properties.nces_id) { + nces_district_id = trial.properties.nces_district_id; + nces_school_id = trial.properties.nces_id; + break; + } + } + } + // console.log(`DEBUG: updateLead district ${nces_district_id} school ${nces_school_id}`); + + let query = `name:"${lead.name}"`; + if (nces_school_id) { + query = `custom.demo_nces_id:"${nces_school_id}"`; + } + else if (nces_district_id) { + query = `custom.demo_nces_district_id:"${nces_district_id}" custom.demo_nces_id:""`; + } const url = `https://${closeIoApiKey}:X@app.close.io/api/v1/lead/?query=${encodeURIComponent(query)}`; request.get(url, (error, response, body) => { if (error) return done(error); try { const data = JSON.parse(body); - if (data.total_results === 0) { - if (existingLeads[lead.name.toLowerCase()]) { - if (existingLeads[lead.name.toLowerCase()].length === 1) { - // console.log(`DEBUG: Using lead from email lookup: ${lead.name}`); - return updateExistingLead(lead, existingLeads[lead.name.toLowerCase()][0], userApiKeyMap, done); - } - console.error(`ERROR: ${existingLeads[lead.name.toLowerCase()].length} email leads found for ${lead.name}`); - return done(); - } - return saveNewLead(lead, done); - } if (data.total_results > 1) { - console.error(`ERROR: ${data.total_results} leads found for ${lead.name}`); + console.error(`ERROR: ${data.total_results} leads found for ${lead.name} nces_district_id=${nces_district_id} nces_school_id=${nces_school_id}`); return done(); } - return updateExistingLead(lead, data.data[0], userApiKeyMap, done); + if (data.total_results === 1) { + return updateExistingLead(lead, data.data[0], userApiKeyMap, done); + } + return saveNewLead(lead, done); } catch (error) { - // console.log(url); console.log(`ERROR: updateLead ${error}`); - // console.log(body); return done(); } }); @@ -939,7 +968,7 @@ function updateLeads(leads, done) { for (const closeIoMailApiKey of closeIoMailApiKeys) { tasks.push(createGetUserFn(closeIoMailApiKey.apiKey)); } - async.parallel(tasks, (err, results) => { + async.parallelLimit(tasks, closeParallelLimit, (err, results) => { if (err) console.log(err); // Lookup existing leads via email to protect against direct lead name querying later // Querying via lead name is unreliable @@ -951,14 +980,14 @@ function updateLeads(leads, done) { tasks.push(createFindExistingLeadFn(email.toLowerCase(), name.toLowerCase(), existingLeads)); } } - async.parallel(tasks, (err, results) => { + async.parallelLimit(tasks, closeParallelLimit, (err, results) => { if (err) return done(err); const tasks = []; for (const name in leads) { if (leadsToSkip.indexOf(name) >= 0) continue; tasks.push(createUpdateLeadFn(leads[name], existingLeads, userApiKeyMap)); } - async.series(tasks, (err, results) => { + async.parallelLimit(tasks, closeParallelLimit, (err, results) => { return done(err); }); }); From ae82875c5719b689f663f2e3579737a9cc766786 Mon Sep 17 00:00:00 2001 From: Scott Erickson Date: Wed, 24 Aug 2016 15:46:35 -0700 Subject: [PATCH 04/17] Refactor post new level version handler, add failed save handling When a new version is created, the latest version is updated, then the new one is made. If making a new one fails (most commonly due to a name conflict), the latest version is left in a broken state. Set up the new middleware to revert changes to latest version in this case, and update the level handler to use the middleware. Also added warning logs if models do not have editableProperties or postEditableProperties set. --- server/commons/database.coffee | 8 +++- server/handlers/level_handler.coffee | 60 +----------------------- server/middleware/versions.coffee | 35 +++++++++----- server/models/Achievement.coffee | 1 + server/models/Campaign.coffee | 1 + server/models/Classroom.coffee | 1 + server/models/CodeLog.coffee | 1 + server/models/Level.coffee | 60 ++++++++++++++++++++++++ server/routes/index.coffee | 7 ++- spec/server/functional/level.spec.coffee | 33 ++++++++++++- 10 files changed, 131 insertions(+), 76 deletions(-) diff --git a/server/commons/database.coffee b/server/commons/database.coffee index 34b006744..218ec51f9 100644 --- a/server/commons/database.coffee +++ b/server/commons/database.coffee @@ -123,10 +123,14 @@ module.exports = if _.isEmpty(req.body) throw new errors.UnprocessableEntity('No input') - props = doc.schema.statics.editableProperties.slice() + if not doc.schema.statics.editableProperties + console.warn 'No editableProperties set for', doc.constructor.modelName + props = (doc.schema.statics.editableProperties or []).slice() if doc.isNew - props = props.concat doc.schema.statics.postEditableProperties + props = props.concat(doc.schema.statics.postEditableProperties or []) + if not doc.schema.statics.postEditableProperties + console.warn 'No postEditableProperties set for', doc.constructor.modelName if doc.schema.uses_coco_permissions and req.user isOwner = doc.getAccessForUserObjectId(req.user._id) is 'owner' diff --git a/server/handlers/level_handler.coffee b/server/handlers/level_handler.coffee index cd5b73dd6..7534c7840 100644 --- a/server/handlers/level_handler.coffee +++ b/server/handlers/level_handler.coffee @@ -16,64 +16,8 @@ Classroom = require '../models/Classroom' LevelHandler = class LevelHandler extends Handler modelClass: Level jsonSchema: require '../../app/schemas/models/level' - editableProperties: [ - 'description' - 'documentation' - 'background' - 'nextLevel' - 'scripts' - 'thangs' - 'systems' - 'victory' - 'name' - 'i18n' - 'icon' - 'goals' - 'type' - 'showsGuide' - 'banner' - 'employerDescription' - 'terrain' - 'i18nCoverage' - 'loadingTip' - 'requiresSubscription' - 'adventurer' - 'practice' - 'shareable' - 'adminOnly' - 'disableSpaces' - 'hidesSubmitUntilRun' - 'hidesPlayButton' - 'hidesRunShortcut' - 'hidesHUD' - 'hidesSay' - 'hidesCodeToolbar' - 'hidesRealTimePlayback' - 'backspaceThrottle' - 'lockDefaultCode' - 'moveRightLoopSnippet' - 'realTimeSpeedFactor' - 'autocompleteFontSizePx' - 'requiredCode' - 'suspectCode' - 'requiredGear' - 'restrictedGear' - 'allowedHeroes' - 'tasks' - 'helpVideos' - 'campaign' - 'campaignIndex' - 'replayable' - 'buildTime' - 'scoreTypes' - 'concepts' - 'picoCTFProblem' - 'practiceThresholdMinutes', - 'primerLanguage' - 'studentPlayInstructions' - ] - - postEditableProperties: ['name'] + editableProperties: Level.editableProperties + postEditableProperties: Level.postEditableProperties getByRelationship: (req, res, args...) -> return @getSession(req, res, args[0]) if args[1] is 'session' diff --git a/server/middleware/versions.coffee b/server/middleware/versions.coffee index cafdf18ed..a569f99be 100644 --- a/server/middleware/versions.coffee +++ b/server/middleware/versions.coffee @@ -9,62 +9,66 @@ mongoose = require 'mongoose' database = require '../commons/database' parse = require '../commons/parse' +# More info on database versioning: https://github.com/codecombat/codecombat/wiki/Versioning + module.exports = postNewVersion: (Model, options={}) -> wrap (req, res) -> + # Find the document which is getting a new version parent = yield database.getDocFromHandle(req, Model) if not parent throw new errors.NotFound('Parent not found.') - # TODO: Figure out a better way to do this + # Check permissions + # TODO: Figure out an encapsulated way to do this; it's more permissions than versioning if options.hasPermissionsOrTranslations permissions = options.hasPermissionsOrTranslations permissions = [permissions] if _.isString(permissions) permissions = ['admin'] if not _.isArray(permissions) hasPermission = _.any(req.user?.hasPermission(permission) for permission in permissions) + if Model.schema.uses_coco_permissions and not hasPermission + hasPermission = parent.hasPermissionsForMethod(req.user, req.method) if not (hasPermission or database.isJustFillingTranslations(req, parent)) throw new errors.Forbidden() + # Create the new version, a clone of the parent with POST data applied doc = database.initDoc(req, Model) ATTRIBUTES_NOT_INHERITED = ['_id', 'version', 'created', 'creator'] doc.set(_.omit(parent.toObject(), ATTRIBUTES_NOT_INHERITED)) - database.assignBody(req, doc, { unsetMissing: true }) - # Get latest version + # Get latest (minor or major) version. This may not be the same document (or same major version) as parent. + latestSelect = 'version index slug' major = req.body.version?.major original = parent.get('original') if _.isNumber(major) q1 = Model.findOne({original: original, 'version.isLatestMinor': true, 'version.major': major}) else q1 = Model.findOne({original: original, 'version.isLatestMajor': true}) - q1.select 'version' + q1.select latestSelect latest = yield q1.exec() + # Handle the case where no version is marked as latest, since making new + # versions is not atomic if not latest - # handle the case where no version is marked as latest, since making new - # versions is not atomic if _.isNumber(major) q2 = Model.findOne({original: original, 'version.major': major}) q2.sort({'version.minor': -1}) else q2 = Model.findOne() q2.sort({'version.major': -1, 'version.minor': -1}) - q2.select 'version' + q2.select(latestSelect) latest = yield q2.exec() if not latest throw new errors.NotFound('Previous version not found.') - # Transfer latest version + # Update the latest version, making it no longer the latest. This includes major = req.body.version?.major version = _.clone(latest.get('version')) wasLatestMajor = version.isLatestMajor version.isLatestMajor = false if _.isNumber(major) version.isLatestMinor = false - - conditions = {_id: latest._id} - - raw = yield Model.update(conditions, {version: version, $unset: {index: 1, slug: 1}}) + raw = yield latest.update({$set: {version: version}, $unset: {index: 1, slug: 1}}) if not raw.nModified console.error('Conditions', conditions) console.error('Doc', doc) @@ -89,7 +93,12 @@ module.exports = doc.set('parent', latest._id) - doc = yield doc.save() + try + doc = yield doc.save() + catch e + # Revert changes to latest doc made earlier, should set everything back to normal + yield latest.update({$set: _.pick(latest.toObject(), 'version', 'index', 'slug')}) + throw e editPath = req.headers['x-current-path'] docLink = "http://codecombat.com#{editPath}" diff --git a/server/models/Achievement.coffee b/server/models/Achievement.coffee index f2190f135..6d4322139 100644 --- a/server/models/Achievement.coffee +++ b/server/models/Achievement.coffee @@ -93,6 +93,7 @@ AchievementSchema.statics.editableProperties = [ 'i18nCoverage' 'hidden' ] +AchievementSchema.statics.postEditableProperties = [] AchievementSchema.statics.jsonSchema = require '../../app/schemas/models/achievement' diff --git a/server/models/Campaign.coffee b/server/models/Campaign.coffee index a5a8f0998..7a4a89217 100644 --- a/server/models/Campaign.coffee +++ b/server/models/Campaign.coffee @@ -56,5 +56,6 @@ CampaignSchema.statics.editableProperties = [ 'adjacentCampaigns' 'levels' ] +CampaignSchema.statics.postEditableProperties = [] module.exports = mongoose.model('campaign', CampaignSchema) diff --git a/server/models/Classroom.coffee b/server/models/Classroom.coffee index ae2495a54..69ed379d1 100644 --- a/server/models/Classroom.coffee +++ b/server/models/Classroom.coffee @@ -23,6 +23,7 @@ ClassroomSchema.statics.editableProperties = [ 'ageRangeMax' 'archived' ] +ClassroomSchema.statics.postEditableProperties = [] ClassroomSchema.statics.generateNewCode = (done) -> tryCode = -> diff --git a/server/models/CodeLog.coffee b/server/models/CodeLog.coffee index b51f10be1..9d542b4ce 100644 --- a/server/models/CodeLog.coffee +++ b/server/models/CodeLog.coffee @@ -28,6 +28,7 @@ CodeLogSchema.statics.editableProperties = [ 'log' 'created' ] +CodeLogSchema.statics.postEditableProperties = [] CodeLogSchema.statics.jsonSchema = require '../../app/schemas/models/codelog.schema' diff --git a/server/models/Level.coffee b/server/models/Level.coffee index 3b7764a07..1467b72e2 100644 --- a/server/models/Level.coffee +++ b/server/models/Level.coffee @@ -45,5 +45,65 @@ LevelSchema.plugin(plugins.TranslationCoveragePlugin) LevelSchema.post 'init', (doc) -> if _.isString(doc.get('nextLevel')) doc.set('nextLevel', undefined) + +LevelSchema.statics.postEditableProperties = ['name'] + +LevelSchema.statics.editableProperties = [ + 'description' + 'documentation' + 'background' + 'nextLevel' + 'scripts' + 'thangs' + 'systems' + 'victory' + 'name' + 'i18n' + 'icon' + 'goals' + 'type' + 'showsGuide' + 'banner' + 'employerDescription' + 'terrain' + 'i18nCoverage' + 'loadingTip' + 'requiresSubscription' + 'adventurer' + 'practice' + 'shareable' + 'adminOnly' + 'disableSpaces' + 'hidesSubmitUntilRun' + 'hidesPlayButton' + 'hidesRunShortcut' + 'hidesHUD' + 'hidesSay' + 'hidesCodeToolbar' + 'hidesRealTimePlayback' + 'backspaceThrottle' + 'lockDefaultCode' + 'moveRightLoopSnippet' + 'realTimeSpeedFactor' + 'autocompleteFontSizePx' + 'requiredCode' + 'suspectCode' + 'requiredGear' + 'restrictedGear' + 'allowedHeroes' + 'tasks' + 'helpVideos' + 'campaign' + 'campaignIndex' + 'replayable' + 'buildTime' + 'scoreTypes' + 'concepts' + 'picoCTFProblem' + 'practiceThresholdMinutes', + 'primerLanguage' + 'studentPlayInstructions' +] + module.exports = Level = mongoose.model('level', LevelSchema) diff --git a/server/routes/index.coffee b/server/routes/index.coffee index 434e3d568..b2ab4ba2e 100644 --- a/server/routes/index.coffee +++ b/server/routes/index.coffee @@ -96,7 +96,11 @@ module.exports.setup = (app) -> app.post('/db/course_instance/:handle/members', mw.auth.checkLoggedIn(), mw.courseInstances.addMembers) app.get('/db/course_instance/:handle/classroom', mw.auth.checkLoggedIn(), mw.courseInstances.fetchClassroom) app.get('/db/course_instance/:handle/course', mw.auth.checkLoggedIn(), mw.courseInstances.fetchCourse) - + + Level = require '../models/Level' + app.post('/db/level/:handle', mw.auth.checkLoggedIn(), mw.versions.postNewVersion(Level, { hasPermissionsOrTranslations: 'artisan' })) # TODO: add /new-version to route like Article has + app.get('/db/level/:handle/session', mw.auth.checkHasUser(), mw.levels.upsertSession) + app.put('/db/user/:handle', mw.users.resetEmailVerifiedFlag) app.delete('/db/user/:handle', mw.users.removeFromClassrooms) app.get('/db/user', mw.users.fetchByGPlusID, mw.users.fetchByFacebookID) @@ -104,7 +108,6 @@ module.exports.setup = (app) -> app.put('/db/user/-/remain-teacher', mw.users.remainTeacher) app.post('/db/user/:userID/request-verify-email', mw.users.sendVerificationEmail) app.post('/db/user/:userID/verify/:verificationCode', mw.users.verifyEmailAddress) # TODO: Finalize URL scheme - app.get('/db/level/:handle/session', mw.auth.checkHasUser(), mw.levels.upsertSession) app.get('/db/user/-/students', mw.auth.checkHasPermission(['admin']), mw.users.getStudents) app.get('/db/user/-/teachers', mw.auth.checkHasPermission(['admin']), mw.users.getTeachers) app.post('/db/user/:handle/signup-with-facebook', mw.users.signupWithFacebook) diff --git a/spec/server/functional/level.spec.coffee b/spec/server/functional/level.spec.coffee index 774956dc0..273468e95 100644 --- a/spec/server/functional/level.spec.coffee +++ b/spec/server/functional/level.spec.coffee @@ -52,9 +52,40 @@ describe 'POST /db/level/:handle', -> url = getURL("/db/level/#{@level.id}") [res, body] = yield request.postAsync({url: url, json: levelJSON}) - expect(res.statusCode).toBe(200) + expect(res.statusCode).toBe(201) + done() + + it 'does not break the target level if a name change would conflict with another level', utils.wrap (done) -> + yield utils.clearModels([Level, User]) + user = yield utils.initUser() + yield utils.loginUser(user) + yield utils.makeLevel({name: 'Taken Name'}) + level = yield utils.makeLevel({name: 'Another Level'}) + json = _.extend({}, level.toObject(), {name: 'Taken Name'}) + [res, body] = yield request.postAsync({url: utils.getURL("/db/level/#{level.id}"), json}) + expect(res.statusCode).toBe(409) + level = yield Level.findById(level.id) + # should be unchanged + expect(level.get('slug')).toBe('another-level') + expect(level.get('version').isLatestMinor).toBe(true) + expect(level.get('version').isLatestMajor).toBe(true) + expect(level.get('index')).toBeDefined() done() + it 'enforces permissions', -> + yield utils.clearModels([Level, User]) + user = yield utils.initUser() + yield utils.loginUser(user) + level = yield utils.makeLevel({description:'Original desc'}) + + otherUser = yield utils.initUser() + yield utils.loginUser(otherUser) + json = _.extend({}, level.toObject(), {description: 'Trollin'}) + [res, body] = yield request.postAsync({url: utils.getURL("/db/level/#{level.id}"), json}) + expect(res.statusCode).toBe(403) + level = yield Level.findById(level.id) + expect(level.get('description')).toBe('Original desc') + done() describe 'GET /db/level/:handle/session', -> From 9553238a64df00453a92574916be4db5948713a6 Mon Sep 17 00:00:00 2001 From: Matt Lott Date: Thu, 25 Aug 2016 10:39:48 -0700 Subject: [PATCH 05/17] :bug:Fix adjacent campaign map arrows --- app/views/play/CampaignView.coffee | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/views/play/CampaignView.coffee b/app/views/play/CampaignView.coffee index a334c3e77..b8954b459 100644 --- a/app/views/play/CampaignView.coffee +++ b/app/views/play/CampaignView.coffee @@ -198,7 +198,7 @@ module.exports = class CampaignView extends RootView context.adjacentCampaigns = _.filter _.values(_.cloneDeep(@campaign?.get('adjacentCampaigns') or {})), (ac) => if ac.showIfUnlocked and not @editorMode return false if _.isString(ac.showIfUnlocked) and ac.showIfUnlocked not in me.levels() - return false if _.isArray(ac.showIfUnlocked) and _.intersection(ac.showIfUnlocked, me.levels()).length < 0 + return false if _.isArray(ac.showIfUnlocked) and _.intersection(ac.showIfUnlocked, me.levels()).length <= 0 ac.name = utils.i18n ac, 'name' styles = [] styles.push "color: #{ac.color}" if ac.color @@ -231,7 +231,7 @@ module.exports = class CampaignView extends RootView if _.isString(ac.showIfUnlocked) _.find(@campaigns.models, id: acID)?.locked = false if ac.showIfUnlocked in me.levels() else if _.isArray(ac.showIfUnlocked) - _.find(@campaigns.models, id: acID)?.locked = false if _.intersection(ac.showIfUnlocked, me.levels()).length + _.find(@campaigns.models, id: acID)?.locked = false if _.intersection(ac.showIfUnlocked, me.levels()).length > 0 context From 53e68a79a67deed2fa0d7f1a37ef0f333f62165d Mon Sep 17 00:00:00 2001 From: Josh Callebaut Date: Thu, 25 Aug 2016 15:31:24 -0700 Subject: [PATCH 06/17] Add a page for tracking intro/guide issues --- app/core/Router.coffee | 1 + app/styles/artisans/level-guides-view.sass | 5 + app/templates/artisans/artisans-view.jade | 11 ++- app/templates/artisans/level-guides-view.jade | 36 +++++++ app/views/artisans/LevelGuidesView.coffee | 98 +++++++++++++++++++ 5 files changed, 147 insertions(+), 4 deletions(-) create mode 100644 app/styles/artisans/level-guides-view.sass create mode 100644 app/templates/artisans/level-guides-view.jade create mode 100644 app/views/artisans/LevelGuidesView.coffee diff --git a/app/core/Router.coffee b/app/core/Router.coffee index c083e408d..ddbda09fd 100644 --- a/app/core/Router.coffee +++ b/app/core/Router.coffee @@ -52,6 +52,7 @@ module.exports = class CocoRouter extends Backbone.Router 'artisans/solution-problems': go('artisans/SolutionProblemsView') 'artisans/thang-tasks': go('artisans/ThangTasksView') 'artisans/level-concepts': go('artisans/LevelConceptMap') + 'artisans/level-guides': go('artisans/LevelGuidesView') 'beta': go('HomeView') diff --git a/app/styles/artisans/level-guides-view.sass b/app/styles/artisans/level-guides-view.sass new file mode 100644 index 000000000..d1a2c1975 --- /dev/null +++ b/app/styles/artisans/level-guides-view.sass @@ -0,0 +1,5 @@ +#level-guides-view + .problem + color: red + .level-details + width: 15% \ No newline at end of file diff --git a/app/templates/artisans/artisans-view.jade b/app/templates/artisans/artisans-view.jade index 2f6321319..039e9bd5c 100644 --- a/app/templates/artisans/artisans-view.jade +++ b/app/templates/artisans/artisans-view.jade @@ -6,11 +6,14 @@ block content a(href='/artisans/thang-tasks') |Thang Tasks div - a(href="/artisans/level-tasks") + a(href='/artisans/level-tasks') |Level Tasks div - a(href="/artisans/solution-problems") + a(href='/artisans/solution-problems') |Solution Problems div - a(href="/artisans/level-concepts") - |Level Concept Map \ No newline at end of file + a(href='/artisans/level-concepts') + |Level Concept Map + div + a(href='/artisans/level-guides') + |Level Guides Overview \ No newline at end of file diff --git a/app/templates/artisans/level-guides-view.jade b/app/templates/artisans/level-guides-view.jade new file mode 100644 index 000000000..4de83eafe --- /dev/null +++ b/app/templates/artisans/level-guides-view.jade @@ -0,0 +1,36 @@ +// DNT +extends /templates/base + +block content + div + a(href='/artisans') + span.glyphicon.glyphicon-chevron-left + span Artisans Home + button#overview-button Show Overviews + br + button#intro-button Show Intros + table.table#level-table + for levelObj in (view.levels || []) + - var level = levelObj.level + tr + td.level-details + a(href='http://direct.codecombat.com/editor/level/'+level.get('slug') target="_blank")=level.get('name') + div + ul + for problem in levelObj.problems + li.problem=problem + td(style='width:90%') + .panel.panel-default + .panel-heading + h2.panel-title + a(data-toggle='collapse' href='#'+level.get('slug')+'-overview-collapse') Overview + .panel-collapse.collapse.overview(id=level.get('slug')+'-overview-collapse') + pre=levelObj.overview ? levelObj.overview.body : 'NOPE' + .panel.panel-default + .panel-heading + h2.panel-title + a(data-toggle='collapse' href='#'+level.get('slug')+'-intro-collapse') Intro + .panel-collapse.collapse.intro(id=level.get('slug')+'-intro-collapse') + pre=levelObj.intro ? levelObj.intro.body : 'NOPE' + + \ No newline at end of file diff --git a/app/views/artisans/LevelGuidesView.coffee b/app/views/artisans/LevelGuidesView.coffee new file mode 100644 index 000000000..e0d5b58f7 --- /dev/null +++ b/app/views/artisans/LevelGuidesView.coffee @@ -0,0 +1,98 @@ +RootView = require 'views/core/RootView' +template = require 'templates/artisans/level-guides-view' + +Campaigns = require 'collections/Campaigns' +Campaign = require 'models/Campaign' + +Levels = require 'collections/Levels' +Level = require 'models/Level' + +module.exports = class LevelGuidesView extends RootView + template: template + id: 'level-guides-view' + events: + 'click #overview-button': 'onOverviewButtonClicked' + 'click #intro-button': 'onIntroButtonClicked' + + excludedCampaigns = [ + 'pico-ctf', 'auditions' + ] + includedCampaigns = [ + 'intro', 'course-2', 'course-3', 'course-4', 'course-5', 'course-6', + 'web-dev-1', 'web-dev-2', + 'game-dev-1', 'game-dev-2' + ] + levels: [] + + onOverviewButtonClicked: (e) -> + @$(".overview").toggleClass("in") + onIntroButtonClicked: (e) -> + @$(".intro").toggleClass("in") + + initialize: () -> + + @campaigns = new Campaigns() + + @listenTo(@campaigns, 'sync', @onCampaignsLoaded) + @supermodel.trackRequest(@campaigns.fetch( + data: + project: 'name,slug,levels' + )) + onCampaignsLoaded: (campCollection) -> + for camp in campCollection.models + campaignSlug = camp.get 'slug' + continue if campaignSlug in excludedCampaigns + continue unless campaignSlug in includedCampaigns + levels = camp.get 'levels' + + levels = new Levels() + @listenTo(levels, "sync", @onLevelsLoaded) + levels.fetchForCampaign(campaignSlug) + #for key, level of levels + + onLevelsLoaded: (lvlCollection) -> + lvlCollection.models.reverse() + #console.log lvlCollection + for level in lvlCollection.models + #console.log level + levelSlug = level.get 'slug' + overview = _.find(level.get('documentation').specificArticles, name:"Overview") + intro = _.find(level.get('documentation').specificArticles, name:"Intro") + #if intro and overview + problems = [] + if not overview + problems.push "No Overview" + else + if not overview.i18n + problems.push "Overview doesn't have i18n field" + if not overview.body + problems.push "Overview doesn't have a body" + else + if level.get('campaign')?.indexOf('web') is -1 + jsIndex = overview.body.indexOf('```javascript') + pyIndex = overview.body.indexOf('```python') + if jsIndex is -1 and pyIndex isnt -1 or jsIndex isnt -1 and pyIndex is -1 + problems.push "Overview is missing a language example." + if not intro + problems.push "No Intro" + else + if not intro.i18n + problems.push "Intro doesn't have i18n field" + if not intro.body + problems.push "Intro doesn't have a body" + else + if intro.body.indexOf('file/db') is -1 + problems.push "Intro is missing image" + if level.get('campaign')?.indexOf('web') is -1 + jsIndex = intro.body.indexOf('```javascript') + pyIndex = intro.body.indexOf('```python') + if jsIndex is -1 and pyIndex isnt -1 or jsIndex isnt -1 and pyIndex is -1 + problems.push "Intro is missing a language example." + @levels.push + level: level + overview: overview + intro: intro + problems: problems + @levels.sort (a, b) -> + return b.problems.length - a.problems.length + @renderSelectors '#level-table' \ No newline at end of file From cb41100d2e3e5e1a44fadf59a70b75429f3233bd Mon Sep 17 00:00:00 2001 From: Josh Callebaut Date: Thu, 25 Aug 2016 15:37:49 -0700 Subject: [PATCH 07/17] Style-fix quotes and EOD newlines --- app/styles/artisans/level-guides-view.sass | 2 +- app/templates/artisans/artisans-view.jade | 2 +- app/templates/artisans/level-guides-view.jade | 2 -- app/views/artisans/LevelGuidesView.coffee | 30 +++++++++---------- 4 files changed, 17 insertions(+), 19 deletions(-) diff --git a/app/styles/artisans/level-guides-view.sass b/app/styles/artisans/level-guides-view.sass index d1a2c1975..8ac3b58db 100644 --- a/app/styles/artisans/level-guides-view.sass +++ b/app/styles/artisans/level-guides-view.sass @@ -2,4 +2,4 @@ .problem color: red .level-details - width: 15% \ No newline at end of file + width: 15% diff --git a/app/templates/artisans/artisans-view.jade b/app/templates/artisans/artisans-view.jade index 039e9bd5c..50f6d6073 100644 --- a/app/templates/artisans/artisans-view.jade +++ b/app/templates/artisans/artisans-view.jade @@ -16,4 +16,4 @@ block content |Level Concept Map div a(href='/artisans/level-guides') - |Level Guides Overview \ No newline at end of file + |Level Guides Overview diff --git a/app/templates/artisans/level-guides-view.jade b/app/templates/artisans/level-guides-view.jade index 4de83eafe..5178081f5 100644 --- a/app/templates/artisans/level-guides-view.jade +++ b/app/templates/artisans/level-guides-view.jade @@ -32,5 +32,3 @@ block content a(data-toggle='collapse' href='#'+level.get('slug')+'-intro-collapse') Intro .panel-collapse.collapse.intro(id=level.get('slug')+'-intro-collapse') pre=levelObj.intro ? levelObj.intro.body : 'NOPE' - - \ No newline at end of file diff --git a/app/views/artisans/LevelGuidesView.coffee b/app/views/artisans/LevelGuidesView.coffee index e0d5b58f7..3dd9bf752 100644 --- a/app/views/artisans/LevelGuidesView.coffee +++ b/app/views/artisans/LevelGuidesView.coffee @@ -25,9 +25,9 @@ module.exports = class LevelGuidesView extends RootView levels: [] onOverviewButtonClicked: (e) -> - @$(".overview").toggleClass("in") + @$('.overview').toggleClass('in') onIntroButtonClicked: (e) -> - @$(".intro").toggleClass("in") + @$('.intro').toggleClass('in') initialize: () -> @@ -46,7 +46,7 @@ module.exports = class LevelGuidesView extends RootView levels = camp.get 'levels' levels = new Levels() - @listenTo(levels, "sync", @onLevelsLoaded) + @listenTo(levels, 'sync', @onLevelsLoaded) levels.fetchForCampaign(campaignSlug) #for key, level of levels @@ -56,38 +56,38 @@ module.exports = class LevelGuidesView extends RootView for level in lvlCollection.models #console.log level levelSlug = level.get 'slug' - overview = _.find(level.get('documentation').specificArticles, name:"Overview") - intro = _.find(level.get('documentation').specificArticles, name:"Intro") + overview = _.find(level.get('documentation').specificArticles, name:'Overview') + intro = _.find(level.get('documentation').specificArticles, name:'Intro') #if intro and overview problems = [] if not overview - problems.push "No Overview" + problems.push 'No Overview' else if not overview.i18n - problems.push "Overview doesn't have i18n field" + problems.push 'Overview doesn't have i18n field' if not overview.body - problems.push "Overview doesn't have a body" + problems.push 'Overview doesn't have a body' else if level.get('campaign')?.indexOf('web') is -1 jsIndex = overview.body.indexOf('```javascript') pyIndex = overview.body.indexOf('```python') if jsIndex is -1 and pyIndex isnt -1 or jsIndex isnt -1 and pyIndex is -1 - problems.push "Overview is missing a language example." + problems.push 'Overview is missing a language example.' if not intro - problems.push "No Intro" + problems.push 'No Intro' else if not intro.i18n - problems.push "Intro doesn't have i18n field" + problems.push 'Intro doesn't have i18n field' if not intro.body - problems.push "Intro doesn't have a body" + problems.push 'Intro doesn't have a body' else if intro.body.indexOf('file/db') is -1 - problems.push "Intro is missing image" + problems.push 'Intro is missing image' if level.get('campaign')?.indexOf('web') is -1 jsIndex = intro.body.indexOf('```javascript') pyIndex = intro.body.indexOf('```python') if jsIndex is -1 and pyIndex isnt -1 or jsIndex isnt -1 and pyIndex is -1 - problems.push "Intro is missing a language example." + problems.push 'Intro is missing a language example.' @levels.push level: level overview: overview @@ -95,4 +95,4 @@ module.exports = class LevelGuidesView extends RootView problems: problems @levels.sort (a, b) -> return b.problems.length - a.problems.length - @renderSelectors '#level-table' \ No newline at end of file + @renderSelectors '#level-table' From ff00091408076c16722cf31b6fd3ddceaf9597ab Mon Sep 17 00:00:00 2001 From: Josh Callebaut Date: Thu, 25 Aug 2016 15:52:49 -0700 Subject: [PATCH 08/17] Tweaks based on CR from Rob --- app/templates/artisans/level-guides-view.jade | 28 ++++++++++--------- app/views/artisans/LevelGuidesView.coffee | 8 +++--- 2 files changed, 19 insertions(+), 17 deletions(-) diff --git a/app/templates/artisans/level-guides-view.jade b/app/templates/artisans/level-guides-view.jade index 5178081f5..bd64503d0 100644 --- a/app/templates/artisans/level-guides-view.jade +++ b/app/templates/artisans/level-guides-view.jade @@ -14,21 +14,23 @@ block content - var level = levelObj.level tr td.level-details - a(href='http://direct.codecombat.com/editor/level/'+level.get('slug') target="_blank")=level.get('name') + a(href='/editor/level/'+level.get('slug') target="_blank")=level.get('name') div ul for problem in levelObj.problems li.problem=problem td(style='width:90%') - .panel.panel-default - .panel-heading - h2.panel-title - a(data-toggle='collapse' href='#'+level.get('slug')+'-overview-collapse') Overview - .panel-collapse.collapse.overview(id=level.get('slug')+'-overview-collapse') - pre=levelObj.overview ? levelObj.overview.body : 'NOPE' - .panel.panel-default - .panel-heading - h2.panel-title - a(data-toggle='collapse' href='#'+level.get('slug')+'-intro-collapse') Intro - .panel-collapse.collapse.intro(id=level.get('slug')+'-intro-collapse') - pre=levelObj.intro ? levelObj.intro.body : 'NOPE' + if levelObj.overview + .panel.panel-default + .panel-heading + h2.panel-title + a(data-toggle='collapse' href='#'+level.get('slug')+'-overview-collapse') Overview + .panel-collapse.collapse.overview(id=level.get('slug')+'-overview-collapse') + pre=levelObj.overview.body + if levelObj.intro + .panel.panel-default + .panel-heading + h2.panel-title + a(data-toggle='collapse' href='#'+level.get('slug')+'-intro-collapse') Intro + .panel-collapse.collapse.intro(id=level.get('slug')+'-intro-collapse') + pre=levelObj.intro.body diff --git a/app/views/artisans/LevelGuidesView.coffee b/app/views/artisans/LevelGuidesView.coffee index 3dd9bf752..40e5b8fb2 100644 --- a/app/views/artisans/LevelGuidesView.coffee +++ b/app/views/artisans/LevelGuidesView.coffee @@ -64,9 +64,9 @@ module.exports = class LevelGuidesView extends RootView problems.push 'No Overview' else if not overview.i18n - problems.push 'Overview doesn't have i18n field' + problems.push 'Overview doesn\'t have i18n field' if not overview.body - problems.push 'Overview doesn't have a body' + problems.push 'Overview doesn\'t have a body' else if level.get('campaign')?.indexOf('web') is -1 jsIndex = overview.body.indexOf('```javascript') @@ -77,9 +77,9 @@ module.exports = class LevelGuidesView extends RootView problems.push 'No Intro' else if not intro.i18n - problems.push 'Intro doesn't have i18n field' + problems.push 'Intro doesn\'t have i18n field' if not intro.body - problems.push 'Intro doesn't have a body' + problems.push 'Intro doesn\'t have a body' else if intro.body.indexOf('file/db') is -1 problems.push 'Intro is missing image' From b8d4e513315dfefc73c948e51bb5743495e96446 Mon Sep 17 00:00:00 2001 From: Matt Lott Date: Fri, 26 Aug 2016 10:32:56 -0700 Subject: [PATCH 09/17] Add line endings and newlines for fuzzy autocompletes Closes #3351 --- app/views/play/level/tome/editor/snippets.coffee | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/app/views/play/level/tome/editor/snippets.coffee b/app/views/play/level/tome/editor/snippets.coffee index e76b79ce3..6329f79aa 100644 --- a/app/views/play/level/tome/editor/snippets.coffee +++ b/app/views/play/level/tome/editor/snippets.coffee @@ -136,7 +136,7 @@ module.exports = (SnippetManager, autoLineEndings) -> beginningOfLine = session.getLine(pos.row).substring(0,pos.column - prefix.length) unless (fullPrefixParts.length < 3 and /^(hero|self|this|@)$/.test(fullPrefixParts[0]) ) or /^\s*$/.test(beginningOfLine) - console.log "Bailing", fullPrefixParts, '|', prefix, '|', beginningOfLine, '|', pos.column - prefix.length + # console.log "DEBUG: autocomplete bailing", fullPrefixParts, '|', prefix, '|', beginningOfLine, '|', pos.column - prefix.length @completions = completions return callback null, completions @@ -195,10 +195,10 @@ getFullIdentifier = (doc, pos) -> scrubSnippet = (snippet, caption, line, input, pos, lang, autoLineEndings, captureReturn) -> # console.log "Snippets snippet=#{snippet} caption=#{caption} line=#{line} input=#{input} pos.column=#{pos.column} lang=#{lang}" fuzzScore = 0.1 + snippetLineBreaks = (snippet.match(lineBreak) || []).length # input will be replaced by snippet # trim snippet prefix and suffix if already in the document (line) if prefixStart = snippet.toLowerCase().indexOf(input.toLowerCase()) > -1 - snippetLines = (snippet.match(lineBreak) || []).length captionStart = snippet.indexOf caption # Calculate snippet prefixes and suffixes. E.g. full snippet might be: "self." + "moveLeft" + "()" @@ -243,14 +243,18 @@ scrubSnippet = (snippet, caption, line, input, pos, lang, autoLineEndings, captu # console.log 'Snippets atLineEnd', pos.column, lineSuffix.length, line.slice(pos.column + lineSuffix.length), line toLinePrefix = line.substring 0, linePrefixIndex if linePrefixIndex < 0 or linePrefixIndex >= 0 and not /[\(\)]/.test(toLinePrefix) and not /^[ \t]*(?:if\b|elif\b)/.test(toLinePrefix) - snippet += autoLineEndings[lang] if snippetLines is 0 and autoLineEndings[lang] - snippet += "\n" if snippetLines is 0 and not /\$\{/.test(snippet) + snippet += autoLineEndings[lang] if snippetLineBreaks is 0 and autoLineEndings[lang] + snippet += "\n" if snippetLineBreaks is 0 and not /\$\{/.test(snippet) if captureReturn and /^\s*$/.test(toLinePrefix) snippet = captureReturn + linePrefix + snippet # console.log "Snippets snippetPrefix=#{snippetPrefix} linePrefix=#{linePrefix} snippetSuffix=#{snippetSuffix} lineSuffix=#{lineSuffix} snippet=#{snippet} score=#{fuzzScore}" else + # Append automatic line ending and newline for simple scenario + if line.trim() is input + snippet += autoLineEndings[lang] if snippetLineBreaks is 0 and autoLineEndings[lang] + snippet += "\n" if snippetLineBreaks is 0 and not /\$\{/.test(snippet) fuzzScore += score snippet, input startsWith = (string, searchString, position) -> From a700a00c940fe2e75b2ecd97542d2758b5036246 Mon Sep 17 00:00:00 2001 From: Matt Lott Date: Fri, 26 Aug 2016 11:27:33 -0700 Subject: [PATCH 10/17] Autocomplete game. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit And don’t create duplicate entries for hero. autocompletes Closes #3883 --- .../play/level/tome/editor/autocomplete.coffee | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/app/views/play/level/tome/editor/autocomplete.coffee b/app/views/play/level/tome/editor/autocomplete.coffee index 562ffaec0..edb333c2b 100644 --- a/app/views/play/level/tome/editor/autocomplete.coffee +++ b/app/views/play/level/tome/editor/autocomplete.coffee @@ -321,14 +321,12 @@ module.exports = class Autocomplete attackEntry.content = attackEntry.content.replace '${1:enemy}', '"${1:Enemy Name}"' snippetEntries.push attackEntry - # Add copied hero. entries for most important ones that start with hero. - sortedEntries = _.sortBy snippetEntries, (entry) -> -1 * parseInt(entry.importance ? 0) - for entry in sortedEntries - if entry.content?.indexOf('hero.') is 0 - newEntry = _.cloneDeep(entry) - entry.name = "hero.#{newEntry.name}" - snippetEntries.push(newEntry) - break if snippetEntries.length - sortedEntries.length >= 10 + # Update 'hero.' and 'game.' entries to include their prefixes + for entry in snippetEntries + if entry.content?.indexOf('hero.') is 0 and entry.name?.indexOf('hero.') < 0 + entry.name = "hero.#{entry.name}" + else if entry.content?.indexOf('game.') is 0 and entry.name?.indexOf('game.') < 0 + entry.name = "game.#{entry.name}" if haveFindNearest and not haveFindNearestEnemy spellView.translateFindNearest() From d6d8d847228217885281fd4684792cc7569de557 Mon Sep 17 00:00:00 2001 From: Robin Yang Date: Fri, 26 Aug 2016 16:53:28 -0700 Subject: [PATCH 11/17] Update formatting on CS2 Guide --- app/assets/markdown/cs2.md | 108 ++++++++++++++++++------------------- 1 file changed, 54 insertions(+), 54 deletions(-) diff --git a/app/assets/markdown/cs2.md b/app/assets/markdown/cs2.md index d88102aa9..06b10292e 100644 --- a/app/assets/markdown/cs2.md +++ b/app/assets/markdown/cs2.md @@ -68,10 +68,10 @@ Course 2 introduces more advanced programming concepts, so the progress through - Evaluate expressions ### Standards -**CCSS.Math.Practice.MP1** Make sense of problems and persevere in solving them. -**CCSS.Math.Practice.MP2** Reason abstractly and quantitatively. -**CCSS.Math.Practice.MP4** Model with mathematics. -**CCSS.Math.Practice.MP7** Look for and make use of structure. +**CCSS.Math.Practice.MP1** Make sense of problems and persevere in solving them. +**CCSS.Math.Practice.MP2** Reason abstractly and quantitatively. +**CCSS.Math.Practice.MP4** Model with mathematics. +**CCSS.Math.Practice.MP7** Look for and make use of structure. ### Instructive Activity: Conditionals (10 mins) #### Explain (2 mins) @@ -101,9 +101,9 @@ Identify some school or classroom rules, and write them on the board, e.g. - Stop talking when the teacher claps twice. Reformulate them in English to start with the word “If”, e.g. -- **If** you have a question, then raise your hand. -- **If** you’re late, then you get a detention. -- **If** the teacher claps twice, then stop talking. +- **If** you have a question, then raise your hand. +- **If** you’re late, then you get a detention. +- **If** the teacher claps twice, then stop talking. Now reformulate again using Python syntax, e.g. @@ -126,8 +126,8 @@ Label each of the parts of the conditionals: *keyword*, *expression*, *action*. Code is called code because we’re encoding our ideas into a language the computer can understand. You can use this three-step process of reformulating your ideas any time you’re writing code. As long as you know the syntax of the programming language, you know what the encoded idea should look like! #### Reflect (2 mins) -**Why do we need conditionals?** (Not all actions happen all the time) -**What is the part that comes between the if and the colon?** (an expression) +**Why do we need conditionals?** (Not all actions happen all the time) +**What is the part that comes between the if and the colon?** (an expression) **What’s important about expressions?** (They have to be True or False) @@ -168,10 +168,10 @@ These levels have two things going on at once. Students have to decide under whi - Define `else` as the opposite of `if`. ### Standards -**CCSS.Math.Practice.MP1** Make sense of problems and persevere in solving them. -**CCSS.Math.Practice.MP2** Reason abstractly and quantitatively. -**CCSS.Math.Practice.MP7** Look for and make use of structure. -**CCSS.Math.Practice.MP8** Look for and express regularity in repeated reasoning. +**CCSS.Math.Practice.MP1** Make sense of problems and persevere in solving them. +**CCSS.Math.Practice.MP2** Reason abstractly and quantitatively. +**CCSS.Math.Practice.MP7** Look for and make use of structure. +**CCSS.Math.Practice.MP8** Look for and express regularity in repeated reasoning. ### Instructive Activity: Conditionals (Else) (10 mins) @@ -215,9 +215,9 @@ if teacher.claps == 2: Label the parts of these conditionals: _keywords_ (`if` and `else`), _expression_, _actions_ #### Reflect (2 mins) -**What does else mean?** (if not) -**Why doesn’t else come with another expression?** (the expression is implied-- it’s the opposite of the if, or when the if is False) -**Do you always need an else?** (no, it depends on the situation) +**What does else mean?** (if not) +**Why doesn’t else come with another expression?** (the expression is implied-- it’s the opposite of the if, or when the if is False) +**Do you always need an else?** (no, it depends on the situation) ### Coding Time (30-45 mins) Allow the students to go through the game at their own pace, keeping notes about every level on paper or digital document. We recommend using following format, which you can also print out as templates: [Progress Journal [PDF]](http://files.codecombat.com/docs/resources/ProgressJournal.pdf) @@ -258,10 +258,10 @@ Serious coding starts now. Students will have to remember how to construct condi - Attend to indentation ### Standards -**CCSS.Math.Practice.MP1** Make sense of problems and persevere in solving them. -**CCSS.Math.Practice.MP2** Reason abstractly and quantitatively. -**CCSS.Math.Practice.MP6** Attend to precision. -**CCSS.Math.Practice.MP7** Look for and make use of structure. +**CCSS.Math.Practice.MP1** Make sense of problems and persevere in solving them. +**CCSS.Math.Practice.MP2** Reason abstractly and quantitatively. +**CCSS.Math.Practice.MP6** Attend to precision. +**CCSS.Math.Practice.MP7** Look for and make use of structure. ### Instructive Activity: Nested Conditionals (10 mins) @@ -289,9 +289,9 @@ When they have finished, trade papers with a partner. Read each other’s schedu Invite volunteers to share their finished schedules with the class. #### Reflect (2 mins) -**Why do we need nested conditionals?** (Because sometimes more than two different actions are possible) -**Why do we indent the second conditional by 4 spaces?** (To show that it is inside the first conditional.) -**What does it mean when an action is indented by 8 spaces?** (It depends on two expressions being True or False) +**Why do we need nested conditionals?** (Because sometimes more than two different actions are possible) +**Why do we indent the second conditional by 4 spaces?** (To show that it is inside the first conditional.) +**What does it mean when an action is indented by 8 spaces?** (It depends on two expressions being True or False) ### Coding Time (30-45 mins) Allow the students to go through the game at their own pace, keeping notes about every level on paper or digital document. We recommend using following format, which you can also print out as templates: [Progress Journal [PDF]](http://files.codecombat.com/docs/resources/ProgressJournal.pdf) @@ -334,9 +334,9 @@ These levels give students the chance to take some shortcuts. Just like loops ga - Call a function. ### Standards -**CCSS.Math.Practice.MP1** Make sense of problems and persevere in solving them. -**CCSS.Math.Practice.MP2** Reason abstractly and quantitatively. -**CCSS.Math.Practice.MP7** Look for and make use of structure. +**CCSS.Math.Practice.MP1** Make sense of problems and persevere in solving them. +**CCSS.Math.Practice.MP2** Reason abstractly and quantitatively. +**CCSS.Math.Practice.MP7** Look for and make use of structure. ### Instructive Activity: Functions (10 mins) #### Explain @@ -393,9 +393,9 @@ Then, play Simon Says by calling the functions, e.g. - Pogo! (Simon didn’t say) ### Reflect (2 mins) -**Why do functions make coding easier?** (Because you don’t have to say the complicated steps every time; you can just use the function name.) -**Why is it important to give your functions good names?** (So you can remember what they’re for later.) -**What does the keyword def stand for?** (define, or make) +**Why do functions make coding easier?** (Because you don’t have to say the complicated steps every time; you can just use the function name.) +**Why is it important to give your functions good names?** (So you can remember what they’re for later.) +**What does the keyword def stand for?** (define, or make) ### Coding Time (30-45 mins) Allow the students to go through the game at their own pace, keeping notes about every level on paper or digital document. We recommend using following format, which you can also print out as templates: [Progress Journal [PDF]](http://files.codecombat.com/docs/resources/ProgressJournal.pdf) @@ -435,9 +435,9 @@ Flags give the game a real-time element. Players may place flags on the game scr - Tell the difference between a property and a function. ### Standards -**CCSS.Math.Practice.MP1** Make sense of problems and persevere in solving them. -**CCSS.Math.Practice.MP2** Reason abstractly and quantitatively. -**CCSS.Math.Practice.MP4** Model with mathematics. +**CCSS.Math.Practice.MP1** Make sense of problems and persevere in solving them. +**CCSS.Math.Practice.MP2** Reason abstractly and quantitatively. +**CCSS.Math.Practice.MP4** Model with mathematics. ### Instructive Activity: Properties (10 mins) #### Explain (3 mins) @@ -470,10 +470,10 @@ When the syntax is correct, the queried student should should out the value of t Note that everyone has an age property, and the same way of accessing it, but the values of that property are not the same for everyone! #### Reflect (2 mins) -**What’s a property?** (Something about an object) -**How can you tell the difference between a function and a property?** Functions have parentheses (), properties do not. -**Can two objects have the same property?** (yes) -**Do two objects’ properties always have the same value?** (no) +**What’s a property?** (Something about an object) +**How can you tell the difference between a function and a property?** Functions have parentheses (), properties do not. +**Can two objects have the same property?** (yes) +**Do two objects’ properties always have the same value?** (no) ### Coding Time (30-45 mins) @@ -493,7 +493,7 @@ What was challenging: Circulate to assist. Draw students’ attention to the instructions and tips. Flags can be tricky for some students, so allow them to pair up to beat the levels. Each student should write their own code, but it’s ok for another student to place the flags for them. -###Written Reflection (5 mins) +### Written Reflection (5 mins) **How did you use properties today?** >I had to see where the flag was and the flag has a property called pos. Then inside that it has two more properties, x and y. You use a dot to get inside the object, or inside the property. @@ -502,7 +502,7 @@ Circulate to assist. Draw students’ attention to the instructions and tips. Fl ##### Module 10 ## Review and Synthesis -###Summary +### Summary Read the instructions! Remember the hints! Sit and think about how to solve the problem and how you’ll be able to tell it’s solved. All the habits of mind of a good programmer come to bear on these levels: defining the problem, breaking the problem down into parts, making a plan, syntax and debugging, sticking to it, and asking for help. ### Transfer Goals @@ -510,23 +510,23 @@ Read the instructions! Remember the hints! Sit and think about how to solve the - Persist in solving a problem ### Standards -**CCSS.Math.Practice.MP1** Make sense of problems and persevere in solving them. -**CCSS.Math.Practice.MP6** Attend to precision. -**CCSS.Math.Practice.MP7** Look for and make use of structure. -**CCSS.Math.Practice.MP8** Look for and express regularity in repeated reasoning. +**CCSS.Math.Practice.MP1** Make sense of problems and persevere in solving them. +**CCSS.Math.Practice.MP6** Attend to precision. +**CCSS.Math.Practice.MP7** Look for and make use of structure. +**CCSS.Math.Practice.MP8** Look for and express regularity in repeated reasoning. ### Instructive Activity: Review & Synthesis (10 mins) #### Interact (10 mins) Review! As a class, try to remember all the new vocabulary words you learned so far. Decide on a definition and an example. Have students write these on the board and correct each other’s work. Consult the game where there are disputes. -**Object** - a character or thing can can do actions, hero -**Function** - an action that an object can do, hero.cleave() -**Argument** - additional information for a function, hero.attack(enemy) -**Loop** - code that repeats, while True: -**Variable** - a holder for a value, enemy = ... -**Conditional** - code that checks if, if hero.isReady(): -**Property** - something about an object, flag.pos +**Object** - a character or thing can can do actions, hero +**Function** - an action that an object can do, hero.cleave() +**Argument** - additional information for a function, hero.attack(enemy) +**Loop** - code that repeats, while True: +**Variable** - a holder for a value, enemy = ... +**Conditional** - code that checks if, if hero.isReady(): +**Property** - something about an object, flag.pos ### Coding Time (30-45 mins) @@ -581,8 +581,8 @@ First, we DESIGN a solution to our problem. This includes figuring out what the Then we keep designing, implementing, and testing until it the problem is solved! #### Reflect (2 mins) -**What are the steps of the Engineering Cycle?** (Design, implement, test) -**When does the Engineering Cycle stop?** (When the problem is solved, or you run out of time) +**What are the steps of the Engineering Cycle?** (Design, implement, test) +**When does the Engineering Cycle stop?** (When the problem is solved, or you run out of time) #### Interact (5 mins) As a class, make a list of all the things your hero can do (functions). Use appropriate vocabulary. Annotate with any tips or code snippets the students deem useful. @@ -593,9 +593,9 @@ As a class, make a list of all the things your hero can do (functions). Use appr ### Coding Time (30-45 mins) Break into small campaign groups to solve the last level. -**DESIGN**: In teams, make observations about the level. Make a list of requirements. Decide what part of the problem you will start with. -**IMPLEMENT**: Write the solution to that part of your problem in code. Tip: Use a different function to solve each part of the problem! -**TEST**: Does your code work? If not, fix your code. If it does, does it solve the right part of the problem? If not, redesign. If so, move on to the next part! +**DESIGN**: In teams, make observations about the level. Make a list of requirements. Decide what part of the problem you will start with. +**IMPLEMENT**: Write the solution to that part of your problem in code. Tip: Use a different function to solve each part of the problem! +**TEST**: Does your code work? If not, fix your code. If it does, does it solve the right part of the problem? If not, redesign. If so, move on to the next part! ### Written Reflection (5 mins) From 7a2911951c1601fe8460f471e769f6cf6ff186b0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Abimael=20Alceb=C3=ADades?= Date: Sat, 27 Aug 2016 08:11:14 -0300 Subject: [PATCH 12/17] Update pt-BR.coffee (#3885) * Update pt-BR.coffee translations updated * Update pt-BR.coffee Updated translations --- app/locale/pt-BR.coffee | 66 ++++++++++++++++++++--------------------- 1 file changed, 33 insertions(+), 33 deletions(-) diff --git a/app/locale/pt-BR.coffee b/app/locale/pt-BR.coffee index 9b843a611..b6b1609c3 100644 --- a/app/locale/pt-BR.coffee +++ b/app/locale/pt-BR.coffee @@ -305,22 +305,22 @@ module.exports = nativeDescription: "Português do Brasil", englishDescription: enter_class_code: "Coloque seu código de classe" enter_birthdate: "Coloque sua data de aniversário:" parent_use_birthdate: "Responsáveis, usem o seu propio dia de nascimento." -# ask_teacher_1: "Ask your teacher for your Class Code." -# ask_teacher_2: "Not part of a class? Create an " -# ask_teacher_3: "Individual Account" -# ask_teacher_4: " instead." -# about_to_join: "You're about to join:" -# enter_parent_email: "Enter your parent’s email address:" -# parent_email_error: "Something went wrong when trying to send the email. Check the email address and try again." -# parent_email_sent: "We’ve sent an email with further instructions on how to create an account. Ask your parent to check their inbox." -# account_created: "Account Created!" -# confirm_student_blurb: "Write down your information so that you don't forget it. Your teacher can also help you reset your password at any time." -# confirm_individual_blurb: "Write down your login information in case you need it later. Verify your email so you can recover your account if you ever forget your password - check your inbox!" -# write_this_down: "Write this down:" -# start_playing: "Start Playing!" -# sso_connected: "Successfully connected with:" -# select_your_starting_hero: "Select Your Starting Hero:" -# you_can_always_change_your_hero_later: "You can always change your hero later." + ask_teacher_1: "Pergunte ao seu professora qual o código da sua turma." + ask_teacher_2: "Não faz parte da turma? Crie uma " + ask_teacher_3: "Conta Pessoal" + ask_teacher_4: " como alternativa." + about_to_join: "Sobre juntar-se:" + enter_parent_email: "Informe o endereço de e-mail de seus pais:" + parent_email_error: "Algo de errado aconteceu ao tentar enviar o email. Verifique o endereço de email e tente novamente." + parent_email_sent: "Nós enviamos um email com mais instruções de como criar uma conta. Solicite aos seus pais para que verifiquem suas caixas de emails." + account_created: "Conta criada!" + confirm_student_blurb: "Anote suas informações para que você não esqueça. Seu professor também pode ajudá-lo reiniciando sua senha a qualquer momento." + confirm_individual_blurb: "Anote suas informações de acesso no caso de você dela depois. Verifique seu e-mail para que você possa recuperar sua senha caso a tenha esquecid. Verifique sua caixa de entrada de emails!" + write_this_down: "Escreva isso:" + start_playing: "Comece jogando!" + sso_connected: "Conectado com sucesso como:" + select_your_starting_hero: "Selecione um herói para começar:" + you_can_always_change_your_hero_later: "Você poderá mudar seu herói depois." recover: recover_account_title: "Recuperar conta" @@ -337,18 +337,18 @@ module.exports = nativeDescription: "Português do Brasil", englishDescription: common: back: "Voltar" # When used as an action verb, like "Navigate backward" -# coming_soon: "Coming soon!" + coming_soon: "Em breve!" continue: "Continuar" # When used as an action verb, like "Continue forward" -# default_code: "Default Code" + default_code: "Código padrão" loading: "Carregando..." -# overview: "Overview" -# solution: "Solution" -# intro: "Intro" + overview: "Visão geral" + olution: "Solução" + intro: "Introdução" saving: "Salvando..." sending: "Enviando..." send: "Enviar" -# sent: "Sent" -# type: "Type" + sent: "Enviado" + type: "Tipo" cancel: "Cancelar" save: "Salvar" publish: "Publicar" @@ -364,7 +364,7 @@ module.exports = nativeDescription: "Português do Brasil", englishDescription: submit_patch: "Enviar arranjo" submit_changes: "Enviar mudanças" save_changes: "Salvar mudanças" -# required_field: "required" + required_field: "obrigatório" general: and: "e" @@ -418,7 +418,7 @@ module.exports = nativeDescription: "Português do Brasil", englishDescription: wizard: "Feiticeiro" first_name: "Primeiro Nome" last_name: "Último Nome" -# last_initial: "Last Initial" + last_initial: "Última Inicial" username: "Nome de Usuário" units: @@ -438,15 +438,15 @@ module.exports = nativeDescription: "Português do Brasil", englishDescription: years: "anos" play_level: -# level_complete: "Level Complete" + level_complete: "Nível Completo" completed_level: "Nivel Completo:" course: "Curso:" done: "Pronto" next_level: "Proximo Nivel" next_game: "Próximo jogo" -# language: "Language" -# languages: "Languages" -# programming_language: "Programming language" + language: "Linguagem" + languages: "Linguagens" + programming_language: "Linguagem de programação" show_menu: "Mostrar menu do jogo" home: "Início" # Not used any more, will be removed soon. level: "Fase" # Like "Level: Dungeons of Kithgard" @@ -481,10 +481,10 @@ module.exports = nativeDescription: "Português do Brasil", englishDescription: victory_experience_gained: "XP ganho" victory_gems_gained: "Gemas ganhas" victory_new_item: "Novo item" -# victory_new_hero: "New Hero" + victory_new_hero: "Novo herói" victory_viking_code_school: "Pelas barbas do profeta, esse foi um nível difícil! Se você ainda não é um desenvolvedor de software, você deveria ser. Você acaba de ser priorizado para aceitação na Viking Code School, onde você pode aprender mais e se tornar um desenvolvedor web profissional em 14 semanas." victory_become_a_viking: "Torne-se um viking" -# victory_no_progress_for_teachers: "Progress is not saved for teachers. But, you can add a student account to your classroom for yourself." + victory_no_progress_for_teachers: "O progresso não é salvo para o professores. Mas, você mesmo pode adicionar um conta de aluno na sua turma." guide_title: "Guia" tome_cast_button_run: "Rodar" tome_cast_button_running: "Rodando" @@ -494,8 +494,8 @@ module.exports = nativeDescription: "Português do Brasil", englishDescription: tome_available_spells: "Feitiços Disponíveis" tome_your_skills: "Suas habilidades" tome_current_method: "Método Atual" -# hints: "Hints" -# hints_title: "Hint {{number}}" + hints: "Acertos" + hints_title: "{{number}} acertos" code_saved: "Código Salvo" skip_tutorial: "Pular (esc)" keyboard_shortcuts: "Teclas de atalho" From cc2bf8ebd932f258d9a58de7d62527a1a04dc6a6 Mon Sep 17 00:00:00 2001 From: Imperadeiro98 Date: Sat, 27 Aug 2016 12:12:55 +0100 Subject: [PATCH 13/17] Some fixes to pt-BR --- app/locale/pt-BR.coffee | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/app/locale/pt-BR.coffee b/app/locale/pt-BR.coffee index b6b1609c3..3d70f7169 100644 --- a/app/locale/pt-BR.coffee +++ b/app/locale/pt-BR.coffee @@ -305,7 +305,7 @@ module.exports = nativeDescription: "Português do Brasil", englishDescription: enter_class_code: "Coloque seu código de classe" enter_birthdate: "Coloque sua data de aniversário:" parent_use_birthdate: "Responsáveis, usem o seu propio dia de nascimento." - ask_teacher_1: "Pergunte ao seu professora qual o código da sua turma." + ask_teacher_1: "Pergunte ao seu professor qual o código da sua turma." ask_teacher_2: "Não faz parte da turma? Crie uma " ask_teacher_3: "Conta Pessoal" ask_teacher_4: " como alternativa." @@ -342,7 +342,7 @@ module.exports = nativeDescription: "Português do Brasil", englishDescription: default_code: "Código padrão" loading: "Carregando..." overview: "Visão geral" - olution: "Solução" + solution: "Solução" intro: "Introdução" saving: "Salvando..." sending: "Enviando..." @@ -494,8 +494,8 @@ module.exports = nativeDescription: "Português do Brasil", englishDescription: tome_available_spells: "Feitiços Disponíveis" tome_your_skills: "Suas habilidades" tome_current_method: "Método Atual" - hints: "Acertos" - hints_title: "{{number}} acertos" + hints: "Sugestões" + hints_title: "Sugestão {{number}}" code_saved: "Código Salvo" skip_tutorial: "Pular (esc)" keyboard_shortcuts: "Teclas de atalho" From 8bef5809099651cbb09803436ee29974e280174f Mon Sep 17 00:00:00 2001 From: Yuki Ueda Date: Sat, 27 Aug 2016 20:13:30 +0900 Subject: [PATCH 14/17] Update ja.coffee (#3886) --- app/locale/ja.coffee | 68 ++++++++++++++++++++++---------------------- 1 file changed, 34 insertions(+), 34 deletions(-) diff --git a/app/locale/ja.coffee b/app/locale/ja.coffee index 9682acdd5..3128396bf 100644 --- a/app/locale/ja.coffee +++ b/app/locale/ja.coffee @@ -579,17 +579,17 @@ module.exports = nativeDescription: "日本語", englishDescription: "Japanese", tip_programming_not_about_computers: "天文学が望遠鏡に関する学問でないのと同様に、計算機科学はコンピュータに関する学問ではない。 - エドガー・ダイクストラ" tip_mulan: "できると信じていれば、できる。 - ムーラン" -# play_game_dev_level: -# created_by: "Created by {{name}}" -# how_to_play_title: "How to play:" -# how_to_play_1: "Use the mouse to control the hero!" -# how_to_play_2: "Click anywhere on the map to move to that location." -# how_to_play_3: "Click on the ogres to attack them." -# restart: "Restart Level" -# play: "Play Level" -# play_more_codecombat: "Play More CodeCombat" -# default_student_instructions: "Click to control your hero and win your game!" -# back_to_coding: "Back to Coding" + play_game_dev_level: + created_by: "作成者:{{name}}" + how_to_play_title: "遊び方:" + how_to_play_1: "マウスでヒーローを操作しましょう!" + how_to_play_2: "マップの動きたい場所をどこでもクリックしましょう." + how_to_play_3: "オーガをクリックして攻撃しましょう." + restart: "レベルをリセット" + play: "プレイレベル" + play_more_codecombat: "もっとCodeCombatで遊ぶ" + default_student_instructions: "ヒーローをクリックしてゲームに勝ちましょう!" + back_to_coding: "コーディングに戻る" game_menu: inventory_tab: "インベントリー" @@ -767,8 +767,8 @@ module.exports = nativeDescription: "日本語", englishDescription: "Japanese", current_value: "現在値" default_value: "デフォルト値" parameters: "パラメータ" -# required_parameters: "Required Parameters" -# optional_parameters: "Optional Parameters" + required_parameters: "必須パラメーター" + optional_parameters: "任意パラメーター" returns: "リターン" granted_by: "スキルを与えてくれるアイテム:" @@ -823,9 +823,9 @@ module.exports = nativeDescription: "日本語", englishDescription: "Japanese", phoenix_title: "ソフトウェアエンジニア" nolan_title: "地区担当マネージャー" elliot_title: "パートナーシップマネージャー" -# elliot_blurb: "Mindreader" -# lisa_title: "Market Development Rep" -# sean_title: "Territory Manager" + elliot_blurb: "読心術者" + lisa_title: "市場開発代表" + sean_title: "地域部長" retrostyle_title: "イラスト" retrostyle_blurb: "レトロスタイルのゲーム" jose_title: "ミュージック" @@ -1564,7 +1564,7 @@ module.exports = nativeDescription: "日本語", englishDescription: "Japanese", article_title: "アーティクル エディター" thang_title: "サングエディター" level_title: "レベルエディター" -# course_title: "Course Editor" + course_title: "コースエディター" achievement_title: "実績エディター" poll_title: "投票エディター" back: "バック" @@ -1750,7 +1750,7 @@ module.exports = nativeDescription: "日本語", englishDescription: "Japanese", rank_failed: "ランキングに送信できませんでした。" rank_being_ranked: "ランキングにのっています" rank_last_submitted: "送信" -# help_simulate: "Help simulate games?" + help_simulate: "試合のシミュレートのヘルプ?" # code_being_simulated: "Your new code is being simulated by other players for ranking. This will refresh as new matches come in." # no_ranked_matches_pre: "No ranked matches for the " # no_ranked_matches_post: " team! Play against some competitors and then come back here to get your game ranked." @@ -2039,19 +2039,19 @@ module.exports = nativeDescription: "日本語", englishDescription: "Japanese", # license: "license" # oreilly: "ebook of your choice" -# calendar: -# year: "Year" -# day: "Day" -# month: "Month" -# january: "January" -# february: "February" -# march: "March" -# april: "April" -# may: "May" -# june: "June" -# july: "July" -# august: "August" -# september: "September" -# october: "October" -# november: "November" -# december: "December" + calendar: + year: "年" + day: "日" + month: "月" + january: "1月" + february: "2月" + march: "3月" + april: "4月" + may: "5月" + june: "6月" + july: "7月" + august: "8月" + september: "9月" + october: "10月" + november: "11月" + december: "12月" From 3b29aae6167434321118694c1db63ac55a9f0e5d Mon Sep 17 00:00:00 2001 From: Imperadeiro98 Date: Sat, 27 Aug 2016 23:03:25 +0100 Subject: [PATCH 15/17] Remove jQuery minicolors --- vendor/scripts/jquery.minicolors.min.js | 8 - vendor/styles/jquery.minicolors.css | 245 ------------------------ 2 files changed, 253 deletions(-) delete mode 100644 vendor/scripts/jquery.minicolors.min.js delete mode 100644 vendor/styles/jquery.minicolors.css diff --git a/vendor/scripts/jquery.minicolors.min.js b/vendor/scripts/jquery.minicolors.min.js deleted file mode 100644 index b916bb29a..000000000 --- a/vendor/scripts/jquery.minicolors.min.js +++ /dev/null @@ -1,8 +0,0 @@ -/* - * jQuery MiniColors: A tiny color picker built on jQuery - * - * Copyright Cory LaViska for A Beautiful Site, LLC. (http://www.abeautifulsite.net/) - * - * Licensed under the MIT license: http://opensource.org/licenses/MIT - * - */jQuery&&function(e){function t(t,n){var r=e('
'),i=e.minicolors.defaults;if(t.data("minicolors-initialized"))return;n=e.extend(!0,{},i,n);r.addClass("minicolors-theme-"+n.theme).toggleClass("minicolors-with-opacity",n.opacity);n.position!==undefined&&e.each(n.position.split(" "),function(){r.addClass("minicolors-position-"+this)});t.addClass("minicolors-input").data("minicolors-initialized",!1).data("minicolors-settings",n).prop("size",7).wrap(r).after('
'+'
'+'
'+"
"+'
'+'
'+"
"+'
'+'
'+'
'+"
"+"
");if(!n.inline){t.after('');t.next(".minicolors-swatch").on("click",function(e){e.preventDefault();t.focus()})}t.parent().find(".minicolors-panel").on("selectstart",function(){return!1}).end();n.inline&&t.parent().addClass("minicolors-inline");u(t,!1);t.data("minicolors-initialized",!0)}function n(e){var t=e.parent();e.removeData("minicolors-initialized").removeData("minicolors-settings").removeProp("size").removeClass("minicolors-input");t.before(e).remove()}function r(e){var t=e.parent(),n=t.find(".minicolors-panel"),r=e.data("minicolors-settings");if(!e.data("minicolors-initialized")||e.prop("disabled")||t.hasClass("minicolors-inline")||t.hasClass("minicolors-focus"))return;i();t.addClass("minicolors-focus");n.stop(!0,!0).fadeIn(r.showSpeed,function(){r.show&&r.show.call(e.get(0))})}function i(){e(".minicolors-focus").each(function(){var t=e(this),n=t.find(".minicolors-input"),r=t.find(".minicolors-panel"),i=n.data("minicolors-settings");r.fadeOut(i.hideSpeed,function(){i.hide&&i.hide.call(n.get(0));t.removeClass("minicolors-focus")})})}function s(e,t,n){var r=e.parents(".minicolors").find(".minicolors-input"),i=r.data("minicolors-settings"),s=e.find("[class$=-picker]"),u=e.offset().left,a=e.offset().top,f=Math.round(t.pageX-u),l=Math.round(t.pageY-a),c=n?i.animationSpeed:0,h,p,d,v;if(t.originalEvent.changedTouches){f=t.originalEvent.changedTouches[0].pageX-u;l=t.originalEvent.changedTouches[0].pageY-a}f<0&&(f=0);l<0&&(l=0);f>e.width()&&(f=e.width());l>e.height()&&(l=e.height());if(e.parent().is(".minicolors-slider-wheel")&&s.parent().is(".minicolors-grid")){h=75-f;p=75-l;d=Math.sqrt(h*h+p*p);v=Math.atan2(p,h);v<0&&(v+=Math.PI*2);if(d>75){d=75;f=75-75*Math.cos(v);l=75-75*Math.sin(v)}f=Math.round(f);l=Math.round(l)}e.is(".minicolors-grid")?s.stop(!0).animate({top:l+"px",left:f+"px"},c,i.animationEasing,function(){o(r,e)}):s.stop(!0).animate({top:l+"px"},c,i.animationEasing,function(){o(r,e)})}function o(e,t){function n(e,t){var n,r;if(!e.length||!t)return null;n=e.offset().left;r=e.offset().top;return{x:n-t.offset().left+e.outerWidth()/2,y:r-t.offset().top+e.outerHeight()/2}}var r,i,s,o,u,f,l,h=e.val(),d=e.attr("data-opacity"),v=e.parent(),g=e.data("minicolors-settings"),y=v.find(".minicolors-swatch"),b=v.find(".minicolors-grid"),w=v.find(".minicolors-slider"),E=v.find(".minicolors-opacity-slider"),S=b.find("[class$=-picker]"),x=w.find("[class$=-picker]"),T=E.find("[class$=-picker]"),N=n(S,b),C=n(x,w),k=n(T,E);if(t.is(".minicolors-grid, .minicolors-slider")){switch(g.control){case"wheel":o=b.width()/2-N.x;u=b.height()/2-N.y;f=Math.sqrt(o*o+u*u);l=Math.atan2(u,o);l<0&&(l+=Math.PI*2);if(f>75){f=75;N.x=69-75*Math.cos(l);N.y=69-75*Math.sin(l)}i=p(f/.75,0,100);r=p(l*180/Math.PI,0,360);s=p(100-Math.floor(C.y*(100/w.height())),0,100);h=m({h:r,s:i,b:s});w.css("backgroundColor",m({h:r,s:i,b:100}));break;case"saturation":r=p(parseInt(N.x*(360/b.width()),10),0,360);i=p(100-Math.floor(C.y*(100/w.height())),0,100);s=p(100-Math.floor(N.y*(100/b.height())),0,100);h=m({h:r,s:i,b:s});w.css("backgroundColor",m({h:r,s:100,b:s}));v.find(".minicolors-grid-inner").css("opacity",i/100);break;case"brightness":r=p(parseInt(N.x*(360/b.width()),10),0,360);i=p(100-Math.floor(N.y*(100/b.height())),0,100);s=p(100-Math.floor(C.y*(100/w.height())),0,100);h=m({h:r,s:i,b:s});w.css("backgroundColor",m({h:r,s:i,b:100}));v.find(".minicolors-grid-inner").css("opacity",1-s/100);break;default:r=p(360-parseInt(C.y*(360/w.height()),10),0,360);i=p(Math.floor(N.x*(100/b.width())),0,100);s=p(100-Math.floor(N.y*(100/b.height())),0,100);h=m({h:r,s:i,b:s});b.css("backgroundColor",m({h:r,s:100,b:100}))}e.val(c(h,g.letterCase))}if(t.is(".minicolors-opacity-slider")){g.opacity?d=parseFloat(1-k.y/E.height()).toFixed(2):d=1;g.opacity&&e.attr("data-opacity",d)}y.find("SPAN").css({backgroundColor:h,opacity:d});a(e,h,d)}function u(e,t){var n,r,i,s,o,u,f,l=e.parent(),d=e.data("minicolors-settings"),v=l.find(".minicolors-swatch"),y=l.find(".minicolors-grid"),b=l.find(".minicolors-slider"),w=l.find(".minicolors-opacity-slider"),E=y.find("[class$=-picker]"),S=b.find("[class$=-picker]"),x=w.find("[class$=-picker]");n=c(h(e.val(),!0),d.letterCase);n||(n=c(h(d.defaultValue,!0),d.letterCase));r=g(n);t||e.val(n);if(d.opacity){i=e.attr("data-opacity")===""?1:p(parseFloat(e.attr("data-opacity")).toFixed(2),0,1);isNaN(i)&&(i=1);e.attr("data-opacity",i);v.find("SPAN").css("opacity",i);o=p(w.height()-w.height()*i,0,w.height());x.css("top",o+"px")}v.find("SPAN").css("backgroundColor",n);switch(d.control){case"wheel":u=p(Math.ceil(r.s*.75),0,y.height()/2);f=r.h*Math.PI/180;s=p(75-Math.cos(f)*u,0,y.width());o=p(75-Math.sin(f)*u,0,y.height());E.css({top:o+"px",left:s+"px"});o=150-r.b/(100/y.height());n===""&&(o=0);S.css("top",o+"px");b.css("backgroundColor",m({h:r.h,s:r.s,b:100}));break;case"saturation":s=p(5*r.h/12,0,150);o=p(y.height()-Math.ceil(r.b/(100/y.height())),0,y.height());E.css({top:o+"px",left:s+"px"});o=p(b.height()-r.s*(b.height()/100),0,b.height());S.css("top",o+"px");b.css("backgroundColor",m({h:r.h,s:100,b:r.b}));l.find(".minicolors-grid-inner").css("opacity",r.s/100);break;case"brightness":s=p(5*r.h/12,0,150);o=p(y.height()-Math.ceil(r.s/(100/y.height())),0,y.height());E.css({top:o+"px",left:s+"px"});o=p(b.height()-r.b*(b.height()/100),0,b.height());S.css("top",o+"px");b.css("backgroundColor",m({h:r.h,s:r.s,b:100}));l.find(".minicolors-grid-inner").css("opacity",1-r.b/100);break;default:s=p(Math.ceil(r.s/(100/y.width())),0,y.width());o=p(y.height()-Math.ceil(r.b/(100/y.height())),0,y.height());E.css({top:o+"px",left:s+"px"});o=p(b.height()-r.h/(360/b.height()),0,b.height());S.css("top",o+"px");y.css("backgroundColor",m({h:r.h,s:100,b:100}))}e.data("minicolors-initialized")&&a(e,n,i)}function a(e,t,n){var r=e.data("minicolors-settings"),i=e.data("minicolors-lastChange");if(!i||i.hex!==t||i.opacity!==n){e.data("minicolors-lastChange",{hex:t,opacity:n});if(r.change)if(r.changeDelay){clearTimeout(e.data("minicolors-changeTimeout"));e.data("minicolors-changeTimeout",setTimeout(function(){r.change.call(e.get(0),t,n)},r.changeDelay))}else r.change.call(e.get(0),t,n);e.trigger("change").trigger("input")}}function f(t){var n=h(e(t).val(),!0),r=b(n),i=e(t).attr("data-opacity");if(!r)return null;i!==undefined&&e.extend(r,{a:parseFloat(i)});return r}function l(t,n){var r=h(e(t).val(),!0),i=b(r),s=e(t).attr("data-opacity");if(!i)return null;s===undefined&&(s=1);return n?"rgba("+i.r+", "+i.g+", "+i.b+", "+parseFloat(s)+")":"rgb("+i.r+", "+i.g+", "+i.b+")"}function c(e,t){return t==="uppercase"?e.toUpperCase():e.toLowerCase()}function h(e,t){e=e.replace(/[^A-F0-9]/ig,"");if(e.length!==3&&e.length!==6)return"";e.length===3&&t&&(e=e[0]+e[0]+e[1]+e[1]+e[2]+e[2]);return"#"+e}function p(e,t,n){en&&(e=n);return e}function d(e){var t={},n=Math.round(e.h),r=Math.round(e.s*255/100),i=Math.round(e.b*255/100);if(r===0)t.r=t.g=t.b=i;else{var s=i,o=(255-r)*i/255,u=(s-o)*(n%60)/60;n===360&&(n=0);if(n<60){t.r=s;t.b=o;t.g=o+u}else if(n<120){t.g=s;t.b=o;t.r=s-u}else if(n<180){t.g=s;t.r=o;t.b=o+u}else if(n<240){t.b=s;t.r=o;t.g=s-u}else if(n<300){t.b=s;t.g=o;t.r=o+u}else if(n<360){t.r=s;t.g=o;t.b=s-u}else{t.r=0;t.g=0;t.b=0}}return{r:Math.round(t.r),g:Math.round(t.g),b:Math.round(t.b)}}function v(t){var n=[t.r.toString(16),t.g.toString(16),t.b.toString(16)];e.each(n,function(e,t){t.length===1&&(n[e]="0"+t)});return"#"+n.join("")}function m(e){return v(d(e))}function g(e){var t=y(b(e));t.s===0&&(t.h=360);return t}function y(e){var t={h:0,s:0,b:0},n=Math.min(e.r,e.g,e.b),r=Math.max(e.r,e.g,e.b),i=r-n;t.b=r;t.s=r!==0?255*i/r:0;t.s!==0?e.r===r?t.h=(e.g-e.b)/i:e.g===r?t.h=2+(e.b-e.r)/i:t.h=4+(e.r-e.g)/i:t.h=-1;t.h*=60;t.h<0&&(t.h+=360);t.s*=100/255;t.b*=100/255;return t}function b(e){e=parseInt(e.indexOf("#")>-1?e.substring(1):e,16);return{r:e>>16,g:(e&65280)>>8,b:e&255}}e.minicolors={defaults:{animationSpeed:50,animationEasing:"swing",change:null,changeDelay:0,control:"hue",defaultValue:"",hide:null,hideSpeed:100,inline:!1,letterCase:"lowercase",opacity:!1,position:"bottom left",show:null,showSpeed:100,theme:"default"}};e.extend(e.fn,{minicolors:function(s,o){switch(s){case"destroy":e(this).each(function(){n(e(this))});return e(this);case"hide":i();return e(this);case"opacity":if(o===undefined)return e(this).attr("data-opacity");e(this).each(function(){u(e(this).attr("data-opacity",o))});return e(this);case"rgbObject":return f(e(this),s==="rgbaObject");case"rgbString":case"rgbaString":return l(e(this),s==="rgbaString");case"settings":if(o===undefined)return e(this).data("minicolors-settings");e(this).each(function(){var t=e(this).data("minicolors-settings")||{};n(e(this));e(this).minicolors(e.extend(!0,t,o))});return e(this);case"show":r(e(this).eq(0));return e(this);case"value":if(o===undefined)return e(this).val();e(this).each(function(){u(e(this).val(o))});return e(this);default:s!=="create"&&(o=s);e(this).each(function(){t(e(this),o)});return e(this)}}});e(document).on("mousedown.minicolors touchstart.minicolors",function(t){e(t.target).parents().add(t.target).hasClass("minicolors")||i()}).on("mousedown.minicolors touchstart.minicolors",".minicolors-grid, .minicolors-slider, .minicolors-opacity-slider",function(t){var n=e(this);t.preventDefault();e(document).data("minicolors-target",n);s(n,t,!0)}).on("mousemove.minicolors touchmove.minicolors",function(t){var n=e(document).data("minicolors-target");n&&s(n,t)}).on("mouseup.minicolors touchend.minicolors",function(){e(this).removeData("minicolors-target")}).on("mousedown.minicolors touchstart.minicolors",".minicolors-swatch",function(t){var n=e(this).parent().find(".minicolors-input");t.preventDefault();r(n)}).on("focus.minicolors",".minicolors-input",function(){var t=e(this);if(!t.data("minicolors-initialized"))return;r(t)}).on("blur.minicolors",".minicolors-input",function(){var t=e(this),n=t.data("minicolors-settings");if(!t.data("minicolors-initialized"))return;t.val(h(t.val(),!0));t.val()===""&&t.val(h(n.defaultValue,!0));t.val(c(t.val(),n.letterCase))}).on("keydown.minicolors",".minicolors-input",function(t){var n=e(this);if(!n.data("minicolors-initialized"))return;switch(t.keyCode){case 9:i();break;case 13:case 27:i();n.blur()}}).on("keyup.minicolors",".minicolors-input",function(){var t=e(this);if(!t.data("minicolors-initialized"))return;u(t,!0)}).on("paste.minicolors",".minicolors-input",function(){var t=e(this);if(!t.data("minicolors-initialized"))return;setTimeout(function(){u(t,!0)},1)})}(jQuery); \ No newline at end of file diff --git a/vendor/styles/jquery.minicolors.css b/vendor/styles/jquery.minicolors.css deleted file mode 100644 index bdf09c083..000000000 --- a/vendor/styles/jquery.minicolors.css +++ /dev/null @@ -1,245 +0,0 @@ -.minicolors { - position: relative; -} - -.minicolors-swatch { - position: absolute; - vertical-align: middle; - background: url(/images/jquery.minicolors.png) -80px 0; - border: solid 1px #ccc; - cursor: text; - padding: 0; - margin: 0; - display: inline-block; -} - -.minicolors-swatch-color { - position: absolute; - top: 0; - left: 0; - right: 0; - bottom: 0; -} - -.minicolors input[type=hidden] + .minicolors-swatch { - width: 28px; - position: static; - cursor: pointer; -} - -/* Panel */ -.minicolors-panel { - position: absolute; - width: 173px; - height: 152px; - background: white; - border: solid 1px #CCC; - box-shadow: 0 0 20px rgba(0, 0, 0, .2); - z-index: 99999; - -moz-box-sizing: content-box; - -webkit-box-sizing: content-box; - box-sizing: content-box; - display: none; -} - -.minicolors-panel.minicolors-visible { - display: block; -} - -/* Panel positioning */ -.minicolors-position-top .minicolors-panel { - top: -154px; -} - -.minicolors-position-right .minicolors-panel { - right: 0; -} - -.minicolors-position-bottom .minicolors-panel { - top: auto; -} - -.minicolors-position-left .minicolors-panel { - left: 0; -} - -.minicolors-with-opacity .minicolors-panel { - width: 194px; -} - -.minicolors .minicolors-grid { - position: absolute; - top: 1px; - left: 1px; - width: 150px; - height: 150px; - background: url(/images/jquery.minicolors.png) -120px 0; - cursor: crosshair; -} - -.minicolors .minicolors-grid-inner { - position: absolute; - top: 0; - left: 0; - width: 150px; - height: 150px; - background: none; -} - -.minicolors-slider-saturation .minicolors-grid { - background-position: -420px 0; -} - -.minicolors-slider-saturation .minicolors-grid-inner { - background: url(/images/jquery.minicolors.png) -270px 0; -} - -.minicolors-slider-brightness .minicolors-grid { - background-position: -570px 0; -} - -.minicolors-slider-brightness .minicolors-grid-inner { - background: black; -} - -.minicolors-slider-wheel .minicolors-grid { - background-position: -720px 0; -} - -.minicolors-slider, -.minicolors-opacity-slider { - position: absolute; - top: 1px; - left: 152px; - width: 20px; - height: 150px; - background: white url(/images/jquery.minicolors.png) 0 0; - cursor: row-resize; -} - -.minicolors-slider-saturation .minicolors-slider { - background-position: -60px 0; -} - -.minicolors-slider-brightness .minicolors-slider { - background-position: -20px 0; -} - -.minicolors-slider-wheel .minicolors-slider { - background-position: -20px 0; -} - -.minicolors-opacity-slider { - left: 173px; - background-position: -40px 0; - display: none; -} - -.minicolors-with-opacity .minicolors-opacity-slider { - display: block; -} - -/* Pickers */ -.minicolors-grid .minicolors-picker { - position: absolute; - top: 70px; - left: 70px; - width: 12px; - height: 12px; - border: solid 1px black; - border-radius: 10px; - margin-top: -6px; - margin-left: -6px; - background: none; -} - -.minicolors-grid .minicolors-picker > div { - position: absolute; - top: 0; - left: 0; - width: 8px; - height: 8px; - border-radius: 8px; - border: solid 2px white; - -moz-box-sizing: content-box; - -webkit-box-sizing: content-box; - box-sizing: content-box; -} - -.minicolors-picker { - position: absolute; - top: 0; - left: 0; - width: 18px; - height: 2px; - background: white; - border: solid 1px black; - margin-top: -2px; - -moz-box-sizing: content-box; - -webkit-box-sizing: content-box; - box-sizing: content-box; -} - -/* Inline controls */ -.minicolors-inline { - display: inline-block; -} - -.minicolors-inline .minicolors-input { - display: none !important; -} - -.minicolors-inline .minicolors-panel { - position: relative; - top: auto; - left: auto; - box-shadow: none; - z-index: auto; - display: inline-block; -} - -/* Default theme */ -.minicolors-theme-default .minicolors-swatch { - top: 5px; - left: 5px; - width: 18px; - height: 18px; -} -.minicolors-theme-default.minicolors-position-right .minicolors-swatch { - left: auto; - right: 5px; -} -.minicolors-theme-default.minicolors { - width: auto; - display: inline-block; -} -.minicolors-theme-default .minicolors-input { - height: 20px; - width: auto; - display: inline-block; - padding-left: 26px; -} -.minicolors-theme-default.minicolors-position-right .minicolors-input { - padding-right: 26px; - padding-left: inherit; -} - -/* Bootstrap theme */ -.minicolors-theme-bootstrap .minicolors-swatch { - top: 3px; - left: 3px; - width: 28px; - height: 28px; - border-radius: 3px; -} -.minicolors-theme-bootstrap.minicolors-position-right .minicolors-swatch { - left: auto; - right: 3px; -} -.minicolors-theme-bootstrap .minicolors-input { - padding-left: 44px; -} -.minicolors-theme-bootstrap.minicolors-position-right .minicolors-input { - padding-right: 44px; - padding-left: 12px; -} \ No newline at end of file From dd6f862f70b8e6ca4abb24c15d37606cb1b5e73a Mon Sep 17 00:00:00 2001 From: Imperadeiro98 Date: Sun, 28 Aug 2016 23:14:25 +0100 Subject: [PATCH 16/17] Remove minicolors image --- app/assets/images/jquery.minicolors.png | Bin 69484 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 app/assets/images/jquery.minicolors.png diff --git a/app/assets/images/jquery.minicolors.png b/app/assets/images/jquery.minicolors.png deleted file mode 100644 index ef834eac387dafc97a479df788a49b6345884cf2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 69484 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 z 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 Date: Fri, 26 Aug 2016 06:41:03 -0700 Subject: [PATCH 17/17] Update campaign next level algorithm for practice levels MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Don’t show not-started unlocked levels if previous incomplete practice level is available Yellow arrow points at adventurer levels too now Closes #3882 --- app/views/play/CampaignView.coffee | 137 ++++++++++--------- test/app/views/play/CampaignView.spec.coffee | 37 +++++ 2 files changed, 112 insertions(+), 62 deletions(-) create mode 100644 test/app/views/play/CampaignView.spec.coffee diff --git a/app/views/play/CampaignView.coffee b/app/views/play/CampaignView.coffee index b8954b459..98223d550 100644 --- a/app/views/play/CampaignView.coffee +++ b/app/views/play/CampaignView.coffee @@ -178,7 +178,7 @@ module.exports = class CampaignView extends RootView context.levels = _.reject context.levels, slug: reject if me.isOnFreeOnlyServer() context.levels = _.reject context.levels, 'requiresSubscription' - @annotateLevel level for level in context.levels + @annotateLevels(context.levels) count = @countLevels context.levels context.levelsCompleted = count.completed context.levelsTotal = count.total @@ -278,51 +278,55 @@ module.exports = class CampaignView extends RootView return me.getCampaignAdsGroup() is 'leaderboard-ads' false - annotateLevel: (level) -> - level.position ?= { x: 10, y: 10 } - level.locked = not me.ownsLevel level.original - level.locked = true if level.slug is 'kithgard-mastery' and @calculateExperienceScore() is 0 - level.locked = false if @levelStatusMap[level.slug] in ['started', 'complete'] - level.locked = false if @editorMode - level.locked = false if @campaign?.get('name') in ['Auditions', 'Intro'] - level.locked = false if me.isInGodMode() - #level.locked = false if level.slug is 'robot-ragnarok' - level.disabled = true if level.adminOnly and @levelStatusMap[level.slug] not in ['started', 'complete'] - level.disabled = false if me.isInGodMode() - level.color = 'rgb(255, 80, 60)' - if level.requiresSubscription - level.color = 'rgb(80, 130, 200)' - if level.adventurer - level.color = 'rgb(200, 80, 200)' - if unlocksHero = _.find(level.rewards, 'hero')?.hero - level.unlocksHero = unlocksHero - if level.unlocksHero - level.purchasedHero = level.unlocksHero in (me.get('purchased')?.heroes or []) + annotateLevels: (orderedLevels) -> + previousIncompletePracticeLevel = false # Lock owned levels if there's a earlier incomplete practice level to play + for level in orderedLevels + level.position ?= { x: 10, y: 10 } + level.locked = not me.ownsLevel(level.original) or previousIncompletePracticeLevel + level.locked = true if level.slug is 'kithgard-mastery' and @calculateExperienceScore() is 0 + level.locked = false if @levelStatusMap[level.slug] in ['started', 'complete'] + level.locked = false if @editorMode + level.locked = false if @campaign?.get('name') in ['Auditions', 'Intro'] + level.locked = false if me.isInGodMode() + #level.locked = false if level.slug is 'robot-ragnarok' + level.disabled = true if level.adminOnly and @levelStatusMap[level.slug] not in ['started', 'complete'] + level.disabled = false if me.isInGodMode() + level.color = 'rgb(255, 80, 60)' + level.color = 'rgb(80, 130, 200)' if level.requiresSubscription + level.color = 'rgb(200, 80, 200)' if level.adventurer + if unlocksHero = _.find(level.rewards, 'hero')?.hero + level.unlocksHero = unlocksHero + if level.unlocksHero + level.purchasedHero = level.unlocksHero in (me.get('purchased')?.heroes or []) - if window.serverConfig.picoCTF - if problem = _.find(@picoCTFProblems or [], pid: level.picoCTFProblem) - level.locked = false if problem.unlocked or level.slug is 'digital-graffiti' - #level.locked = false # Testing to see all levels - level.description = """ - ### #{problem.name} - #{level.description or problem.description} + if window.serverConfig.picoCTF + if problem = _.find(@picoCTFProblems or [], pid: level.picoCTFProblem) + level.locked = false if problem.unlocked or level.slug is 'digital-graffiti' + #level.locked = false # Testing to see all levels + level.description = """ + ### #{problem.name} + #{level.description or problem.description} - #{problem.category} - #{problem.score} points - """ - level.color = 'rgb(80, 130, 200)' if problem.solved + #{problem.category} - #{problem.score} points + """ + level.color = 'rgb(80, 130, 200)' if problem.solved - level.hidden = level.locked - if level.concepts?.length - level.displayConcepts = level.concepts - maxConcepts = 6 - if level.displayConcepts.length > maxConcepts - level.displayConcepts = level.displayConcepts.slice -maxConcepts - level + if level.practice and not level.locked and @levelStatusMap[level.slug] isnt 'complete' and + (not level.requiresSubscription or level.adventurer or not @requiresSubscription) + previousIncompletePracticeLevel = true + + level.hidden = level.locked + if level.concepts?.length + level.displayConcepts = level.concepts + maxConcepts = 6 + if level.displayConcepts.length > maxConcepts + level.displayConcepts = level.displayConcepts.slice -maxConcepts countLevels: (levels) -> count = total: 0, completed: 0 for level, levelIndex in levels - @annotateLevel level unless level.locked? # Annotate if we haven't already. + continue if level.practice + @annotateLevels(levels) unless level.locked? # Annotate if we haven't already. unless level.disabled unlockedInSameCampaign = levelIndex < 5 # First few are always counted (probably unlocked in previous campaign) for otherLevel in levels when not unlockedInSameCampaign and otherLevel isnt level @@ -336,34 +340,42 @@ module.exports = class CampaignView extends RootView leaderboardModal = new LeaderboardModal supermodel: @supermodel, levelSlug: levelSlug @openModalView leaderboardModal - determineNextLevel: (levels) -> - foundNext = false + determineNextLevel: (orderedLevels) -> dontPointTo = ['lost-viking', 'kithgard-mastery'] # Challenge levels we don't want most players bashing heads against subscriptionPrompts = [{slug: 'boom-and-bust', unless: 'defense-of-plainswood'}] - for level in levels + + findNextLevel = (nextLevels, practiceOnly) => + for nextLevelOriginal in nextLevels + nextLevel = _.find orderedLevels, original: nextLevelOriginal + continue if not nextLevel or nextLevel.locked + continue if practiceOnly and not nextLevel.practice + + # If it's a challenge level, we efficiently determine whether we actually do want to point it out. + if nextLevel.slug is 'kithgard-mastery' and not @levelStatusMap[nextLevel.slug] and @calculateExperienceScore() >= 3 + unless (timesPointedOut = storage.load("pointed-out-#{nextLevel.slug}") or 0) > 3 + # We may determineNextLevel more than once per render, so we can't just do this once. But we do give up after a couple highlights. + dontPointTo = _.without dontPointTo, nextLevel.slug + storage.save "pointed-out-#{nextLevel.slug}", timesPointedOut + 1 + + # Should we point this level out? + if not nextLevel.disabled and @levelStatusMap[nextLevel.slug] isnt 'complete' and nextLevel.slug not in dontPointTo and + not nextLevel.replayable and ( + me.isPremium() or not nextLevel.requiresSubscription or nextLevel.adventurer or + _.any(subscriptionPrompts, (prompt) => nextLevel.slug is prompt.slug and not @levelStatusMap[prompt.unless]) + ) + nextLevel.next = true + return true + false + + foundNext = false + for level in orderedLevels # Iterate through all levels in order and look to find the first unlocked one that meets all our criteria for being pointed out as the next level. level.nextLevels = (reward.level for reward in level.rewards ? [] when reward.level) - unless foundNext - for nextLevelOriginal in level.nextLevels - nextLevel = _.find levels, original: nextLevelOriginal + break if foundNext = findNextLevel(level.nextLevels, true) # Check practice levels first + break if foundNext = findNextLevel(level.nextLevels, false) - # If it's a challenge level, we efficiently determine whether we actually do want to point it out. - if nextLevel and nextLevel.slug is 'kithgard-mastery' and not nextLevel.locked and not @levelStatusMap[nextLevel.slug] and @calculateExperienceScore() >= 3 - unless (timesPointedOut = storage.load("pointed-out-#{nextLevel.slug}") or 0) > 3 - # We may determineNextLevel more than once per render, so we can't just do this once. But we do give up after a couple highlights. - dontPointTo = _.without dontPointTo, nextLevel.slug - storage.save "pointed-out-#{nextLevel.slug}", timesPointedOut + 1 - - # Should we point this level out? - if nextLevel and not nextLevel.locked and not nextLevel.disabled and @levelStatusMap[nextLevel.slug] isnt 'complete' and nextLevel.slug not in dontPointTo and not nextLevel.replayable and ( - me.isPremium() or not nextLevel.requiresSubscription or - _.any(subscriptionPrompts, (prompt) => nextLevel.slug is prompt.slug and not @levelStatusMap[prompt.unless]) - ) - nextLevel.next = true - foundNext = true - break - if not foundNext and levels[0] and not levels[0].locked and @levelStatusMap[levels[0].slug] isnt 'complete' - levels[0].next = true + if not foundNext and orderedLevels[0] and not orderedLevels[0].locked and @levelStatusMap[orderedLevels[0].slug] isnt 'complete' + orderedLevels[0].next = true calculateExperienceScore: -> adultPoint = me.get('ageRange') in ['18-24', '25-34', '35-44', '45-100'] # They have to have answered the poll for this, likely after Shadow Guard. @@ -411,6 +423,7 @@ module.exports = class CampaignView extends RootView @particleMan.removeEmitters() @particleMan.attach @$el.find('.map') for level in @campaign.renderedLevels ? {} + continue if level.practice terrain = @terrain.replace('-branching-test', '').replace(/(campaign-)?(game|web)-dev-\d/, 'forest').replace('intro', 'dungeon') particleKey = ['level', terrain] particleKey.push level.type if level.type and not (level.type in ['hero', 'course']) # Would use isType, but it's not a Level model diff --git a/test/app/views/play/CampaignView.spec.coffee b/test/app/views/play/CampaignView.spec.coffee new file mode 100644 index 000000000..7815b21be --- /dev/null +++ b/test/app/views/play/CampaignView.spec.coffee @@ -0,0 +1,37 @@ +factories = require 'test/app/factories' +CampaignView = require 'views/play/CampaignView' +Levels = require 'collections/Levels' + +describe 'CampaignView', -> + + describe 'when 4 earned levels', -> + beforeEach -> + @campaignView = new CampaignView() + @campaignView.levelStatusMap = {} + levels = new Levels(_.times(4, -> factories.makeLevel())) + @campaignView.campaign = factories.makeCampaign({}, {levels}) + @levels = (level.toJSON() for level in levels.models) + earned = me.get('earned') or {} + earned.levels ?= [] + earned.levels.push(level.original) for level in @levels + me.set('earned', earned) + + describe 'and 3rd one is practice', -> + beforeEach -> + @levels[2].practice = true + @campaignView.annotateLevels(@levels) + it 'hides next levels if there are practice levels to do', -> + expect(@levels[2].hidden).toEqual(false) + expect(@levels[3].hidden).toEqual(true) + + describe 'and 2nd rewards a practice a non-practice level', -> + beforeEach -> + @campaignView.levelStatusMap[@levels[0].slug] = 'complete' + @campaignView.levelStatusMap[@levels[1].slug] = 'complete' + @levels[1].rewards = [{level: @levels[2].original}, {level: @levels[3].original}] + @levels[2].practice = true + @campaignView.annotateLevels(@levels) + @campaignView.determineNextLevel(@levels) + it 'points at practice level first', -> + expect(@levels[2].next).toEqual(true) + expect(@levels[3].next).not.toBeDefined(true)