From e07941936759f6dc4da0f43ba4ccb94d4692f45c Mon Sep 17 00:00:00 2001 From: ahstro Date: Mon, 5 Oct 2015 18:01:28 +0200 Subject: [PATCH 01/21] Confirm the Ending: Add test case Add a test case that makes sure the user can't just check the last character or word. --- seed/challenges/basic-bonfires.json | 1 + 1 file changed, 1 insertion(+) diff --git a/seed/challenges/basic-bonfires.json b/seed/challenges/basic-bonfires.json index 931c157ce1..3e6b8aa1bc 100644 --- a/seed/challenges/basic-bonfires.json +++ b/seed/challenges/basic-bonfires.json @@ -307,6 +307,7 @@ "assert(end(\"Connor\", \"n\") === false, 'message: end(\"Connor\", \"n\") should return false.');", "assert(end(\"Walking on water and developing software from a specification are easy if both are frozen.\", \"specification\") === false, 'message: end(\"Walking on water and developing software from a specification are easy if both are frozen.\", \"specification\") should return false.');", "assert(end(\"He has to give me a new name\", \"name\") === true, 'message: end(\"He has to give me a new name\", \"name\") should return true.');", + "assert(end(\"He has to give me a new name\", \"me\") === true, 'message: end(\"He has to give me a new name\", \"me\") should return true.');", "assert(end(\"If you want to save our world, you must hurry. We dont know how much longer we can withstand the nothing\", \"mountain\") === false, 'message: end(\"If you want to save our world, you must hurry. We dont know how much longer we can withstand the nothing\", \"mountain\") should return false.');" ], "MDNlinks": [ From e080ff1811cf5d2fa1faa251e31c4bdef008f154 Mon Sep 17 00:00:00 2001 From: Abhisek Pattnaik Date: Fri, 9 Oct 2015 18:05:55 +0530 Subject: [PATCH 02/21] Add tests in Bonfire - Diff Two Arrays --- seed/challenges/intermediate-bonfires.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/seed/challenges/intermediate-bonfires.json b/seed/challenges/intermediate-bonfires.json index d237bf6f18..baf02e2500 100644 --- a/seed/challenges/intermediate-bonfires.json +++ b/seed/challenges/intermediate-bonfires.json @@ -66,7 +66,8 @@ "assert.deepEqual(diff([1, 2, 3, 5], [1, 2, 3, 4, 5]), [4], 'message: [1, 2, 3, 5], [1, 2, 3, 4, 5] should return [4].');", "assert.includeMembers(diff([1, \"calf\", 3, \"piglet\"], [1, \"calf\", 3, 4]), [\"piglet\", 4], 'message: [1, \"calf\", 3, \"piglet\"], [1, \"calf\", 3, 4] should return [\"piglet\", 4].');", "assert.deepEqual(diff([], [\"snuffleupagus\", \"cookie monster\", \"elmo\"]), [\"snuffleupagus\", \"cookie monster\", \"elmo\"], 'message: [], [\"snuffleupagus\", \"cookie monster\", \"elmo\"] should return [\"snuffleupagus\", \"cookie monster\", \"elmo\"].');", - "assert.includeMembers(diff([1, \"calf\", 3, \"piglet\"], [7, \"filly\"]), [1, \"calf\", 3, \"piglet\", 7, \"filly\"], 'message: [1, \"calf\", 3, \"piglet\"], [7, \"filly\"] should return [1, \"calf\", 3, \"piglet\", 7, \"filly\"].');" + "assert.includeMembers(diff([1, \"calf\", 3, \"piglet\"], [7, \"filly\"]), [1, \"calf\", 3, \"piglet\", 7, \"filly\"], 'message: [1, \"calf\", 3, \"piglet\"], [7, \"filly\"] should return [1, \"calf\", 3, \"piglet\", 7, \"filly\"].');", + "assert.deepEqual(diff([1, 2, 3, 3], [1]), [2, 3, 3], 'message: [1, 2, 3, 3], [1] should return [2, 3, 3].');" ], "MDNlinks": [ "Comparison Operators", From ea425864be3673fd287be7bd840fb46c07fa44d3 Mon Sep 17 00:00:00 2001 From: SaintPeter Date: Sat, 10 Oct 2015 13:24:15 -0700 Subject: [PATCH 03/21] Remove suprious parameters from early Bonfires --- seed/challenges/basic-bonfires.json | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/seed/challenges/basic-bonfires.json b/seed/challenges/basic-bonfires.json index 2c22329088..df9b1b8355 100644 --- a/seed/challenges/basic-bonfires.json +++ b/seed/challenges/basic-bonfires.json @@ -60,7 +60,7 @@ " return str;", "}", "", - "reverseString(\"hello\", \"\");" + "reverseString(\"hello\");" ], "MDNlinks": [ "Global String Object", @@ -103,7 +103,7 @@ " return num;", "}", "", - "factorialize(5, '');" + "factorialize(5);" ], "MDNlinks": [ "Arithmetic Operators" @@ -224,7 +224,7 @@ " return str;", "}", "", - "titleCase(\"I'm a little tea pot\", \"\");" + "titleCase(\"I'm a little tea pot\");" ], "tests": [ "assert(typeof(titleCase(\"I'm a little tea pot\")) === \"string\", 'message: titleCase() should return a string.');", @@ -300,7 +300,7 @@ " return str;", "}", "", - "end(\"Bastian\", \"n\", \"\");" + "end(\"Bastian\", \"n\");" ], "tests": [ "assert(end(\"Bastian\", \"n\") === true, 'message: end(\"Bastian\", \"n\") should return true.');", @@ -338,7 +338,7 @@ " return str;", "}", "", - "repeat(\"abc\", 3, \"\");" + "repeat(\"abc\", 3);" ], "tests": [ "assert(repeat(\"*\", 3) === \"***\", 'message: repeat(\"*\", 3) should return \"***\".');", @@ -375,7 +375,7 @@ " return str;", "}", "", - "truncate(\"A-tisket a-tasket A green and yellow basket\", 11, \"\");" + "truncate(\"A-tisket a-tasket A green and yellow basket\", 11);" ], "tests": [ "assert(truncate(\"A-tisket a-tasket A green and yellow basket\", 11) === \"A-tisket...\", 'message: truncate(\"A-tisket a-tasket A green and yellow basket\", 11) should return \"A-tisket...\".');", @@ -412,7 +412,7 @@ " return arr;", "}", "", - "chunk([\"a\", \"b\", \"c\", \"d\"], 2, \"\");" + "chunk([\"a\", \"b\", \"c\", \"d\"], 2);" ], "tests": [ "assert.deepEqual(chunk([\"a\", \"b\", \"c\", \"d\"], 2), [[\"a\", \"b\"], [\"c\", \"d\"]], 'message: chunk([\"a\", \"b\", \"c\", \"d\"], 2) should return [[\"a\", \"b\"], [\"c\", \"d\"]].');", @@ -450,7 +450,7 @@ " return arr;", "}", "", - "slasher([1, 2, 3], 2, \"\");" + "slasher([1, 2, 3], 2);" ], "tests": [ "assert.deepEqual(slasher([1, 2, 3], 2), [3], 'message: slasher([1, 2, 3], 2, [3]) should return [3].');", @@ -489,7 +489,7 @@ " return arr;", "}", "", - "mutation([\"hello\", \"hey\"], \"\");" + "mutation([\"hello\", \"hey\"]);" ], "tests": [ "assert(mutation([\"hello\", \"hey\"]) === false, 'message: mutation([\"hello\", \"hey\"]) should return false.');", @@ -531,7 +531,7 @@ " return arr;", "}", "", - "bouncer([7, \"ate\", \"\", false, 9], \"\");" + "bouncer([7, \"ate\", \"\", false, 9]);" ], "tests": [ "assert.deepEqual(bouncer([7, \"ate\", \"\", false, 9]), [7, \"ate\", 9], 'message: bouncer([7, \"ate\", \"\", false, 9]) should return [7, \"ate\", 9].');", @@ -608,7 +608,7 @@ " return num;", "}", "", - "where([40, 60], 50, \"\");" + "where([40, 60], 50);" ], "MDNlinks": [ "Array.sort()" From 21c78f9f96ec0ba131fb1c06e6128239ff118cfa Mon Sep 17 00:00:00 2001 From: uwaseem Date: Sun, 11 Oct 2015 17:41:27 +0800 Subject: [PATCH 04/21] Removed an extra m from the word commit --- server/views/commit/directory.jade | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/views/commit/directory.jade b/server/views/commit/directory.jade index 2ba3836f30..5133e89116 100644 --- a/server/views/commit/directory.jade +++ b/server/views/commit/directory.jade @@ -11,7 +11,7 @@ block content h2= nonprofit.displayName img.testimonial-image.img-responsive.img-center(src=nonprofit.imgUrl) .button-spacer - a.text-center(href='/commit?nonprofit=#{nonprofit.name}') Commmit to #{nonprofit.displayName} + a.text-center(href='/commit?nonprofit=#{nonprofit.name}') Commit to #{nonprofit.displayName} p= nonprofit.description .spacer .col-xs-12 From 1e2f42dfe639e6995721de9c643a53c70f3f0cd4 Mon Sep 17 00:00:00 2001 From: Arsen Melikyan Date: Sun, 11 Oct 2015 15:34:14 +0400 Subject: [PATCH 05/21] refactor upper intermediate bonfire tests to use asserts --- seed/challenges/upper-intermediate-bonfires.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/seed/challenges/upper-intermediate-bonfires.json b/seed/challenges/upper-intermediate-bonfires.json index b1ddbc2ac1..42f3c67293 100644 --- a/seed/challenges/upper-intermediate-bonfires.json +++ b/seed/challenges/upper-intermediate-bonfires.json @@ -105,10 +105,10 @@ ], "tests": [ "assert.deepEqual(pairwise([1, 4, 2, 3, 0, 5], 7), 11, 'message: pairwise([1, 4, 2, 3, 0, 5], 7) should return 11.');", - "expect(pairwise([1, 3, 2, 4], 4), 1, 'message: pairwise([1, 3, 2, 4], 4), 1 should return 1.');", - "expect(pairwise([1,1,1], 2), 1, 'message: pairwise([1,1,1], 2) should return 1.');", - "expect(pairwise([0, 0, 0, 0, 1, 1], 1), 10, 'message: pairwise([0, 0, 0, 0, 1, 1], 1) should return 10.');", - "expect(pairwise([], 100), 0, 'message: pairwise([], 100) should return 0.');" + "assert.deepEqual(pairwise([1, 3, 2, 4], 4), 1, 'message: pairwise([1, 3, 2, 4], 4), 1 should return 1.');", + "assert.deepEqual(pairwise([1,1,1], 2), 1, 'message: pairwise([1,1,1], 2) should return 1.');", + "assert.deepEqual(pairwise([0, 0, 0, 0, 1, 1], 1), 10, 'message: pairwise([0, 0, 0, 0, 1, 1], 1) should return 10.');", + "assert.deepEqual(pairwise([], 100), 0, 'message: pairwise([], 100) should return 0.');" ], "MDNlinks": [ "Array.reduce()" From b3d2a1839929a8e558812c72032d9be89b7851a4 Mon Sep 17 00:00:00 2001 From: natac13 Date: Sun, 11 Oct 2015 10:07:25 -0400 Subject: [PATCH 06/21] fix boo(NaN) return true to false closes #3701 --- seed/challenges/intermediate-bonfires.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/seed/challenges/intermediate-bonfires.json b/seed/challenges/intermediate-bonfires.json index ae17999083..810bf00cbf 100644 --- a/seed/challenges/intermediate-bonfires.json +++ b/seed/challenges/intermediate-bonfires.json @@ -356,7 +356,7 @@ "assert.strictEqual(boo([].slice), false, 'message: boo([].slice) should return false.');", "assert.strictEqual(boo({ \"a\": 1 }), false, 'message: boo({ \"a\": 1 }) should return false.');", "assert.strictEqual(boo(1), false, 'message: boo(1) should return false.');", - "assert.strictEqual(boo(NaN), false, 'message: boo(NaN) should return true.');", + "assert.strictEqual(boo(NaN), false, 'message: boo(NaN) should return false.');", "assert.strictEqual(boo(\"a\"), false, 'message: boo(\"a\") should return false.');" ], "MDNlinks": [ From c80caba883a2a05459726dcd18bcff2c099b93a8 Mon Sep 17 00:00:00 2001 From: Logan Tegman Date: Sun, 11 Oct 2015 10:10:22 -0700 Subject: [PATCH 07/21] Fix BF Slasher Flick Tests Closes #3687 and adds a case to catch the problematic solution pointed out by @bugron --- seed/challenges/basic-bonfires.json | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/seed/challenges/basic-bonfires.json b/seed/challenges/basic-bonfires.json index df9b1b8355..7567aaed31 100644 --- a/seed/challenges/basic-bonfires.json +++ b/seed/challenges/basic-bonfires.json @@ -453,9 +453,10 @@ "slasher([1, 2, 3], 2);" ], "tests": [ - "assert.deepEqual(slasher([1, 2, 3], 2), [3], 'message: slasher([1, 2, 3], 2, [3]) should return [3].');", + "assert.deepEqual(slasher([1, 2, 3], 2), [3], 'message: slasher([1, 2, 3], 2) should return [3].');", "assert.deepEqual(slasher([1, 2, 3], 0), [1, 2, 3], 'message: slasher([1, 2, 3], 0) should return [1, 2, 3].');", - "assert.deepEqual(slasher([1, 2, 3], 9), [], 'message: slasher([1, 2, 3], 9) should return [].');" + "assert.deepEqual(slasher([1, 2, 3], 9), [], 'message: slasher([1, 2, 3], 9) should return [].');", + "assert.deepEqual(slasher([1, 2, 3], 4), [], 'message: slasher([1, 2, 3], 4) should return [].');" ], "MDNlinks": [ "Array.slice()", From 7b444b15dc96a1f23c6447cff2c64e29db420ff2 Mon Sep 17 00:00:00 2001 From: Berkeley Martinez Date: Sun, 11 Oct 2015 15:57:49 -0700 Subject: [PATCH 08/21] Update loopback, ThunderCats and RxJS. closes #2929 --- common/app/flux/Store.js | 12 ++++++++---- common/app/routes/Hikes/components/Lecture.jsx | 6 +++--- common/app/routes/Hikes/components/Question.jsx | 13 +++++++------ common/app/routes/Hikes/flux/Actions.js | 2 +- common/app/routes/Hikes/flux/Store.js | 12 ++++++++---- common/app/routes/Jobs/flux/Store.js | 12 ++++++++---- package.json | 12 ++++++------ server/boot/challenge.js | 4 ++-- 8 files changed, 43 insertions(+), 30 deletions(-) diff --git a/common/app/flux/Store.js b/common/app/flux/Store.js index c745e16ac0..30ee4e7ff3 100644 --- a/common/app/flux/Store.js +++ b/common/app/flux/Store.js @@ -8,13 +8,17 @@ const initValue = { points: 0 }; -export default Store(initValue) - .refs({ displayName: 'AppStore' }) - .init(({ instance: appStore, args: [cat] }) => { +export default Store({ + refs: { + displayName: 'AppStore', + value: initValue + }, + init({ instance: appStore, args: [cat] }) { const { setUser, setTitle } = cat.getActions('appActions'); const register = createRegistrar(appStore); register(setter(fromMany(setUser, setTitle))); return appStore; - }); + } +}); diff --git a/common/app/routes/Hikes/components/Lecture.jsx b/common/app/routes/Hikes/components/Lecture.jsx index ea3c85191d..e47dc0fc98 100644 --- a/common/app/routes/Hikes/components/Lecture.jsx +++ b/common/app/routes/Hikes/components/Lecture.jsx @@ -1,6 +1,6 @@ import React, { PropTypes } from 'react'; import { Button, Col, Row, Panel } from 'react-bootstrap'; -import { Navigation } from 'react-router'; +import { History } from 'react-router'; import Vimeo from 'react-vimeo'; import debugFactory from 'debug'; @@ -8,7 +8,7 @@ const debug = debugFactory('freecc:hikes'); export default React.createClass({ displayName: 'Lecture', - mixins: [Navigation], + mixins: [History], propTypes: { currentHike: PropTypes.object, @@ -20,7 +20,7 @@ export default React.createClass({ handleFinish() { debug('loading questions'); const { dashedName } = this.props.params; - this.transitionTo(`/hikes/${dashedName}/questions/1`); + this.history.pushState(null, `/hikes/${dashedName}/questions/1`); }, renderTranscript(transcript, dashedName) { diff --git a/common/app/routes/Hikes/components/Question.jsx b/common/app/routes/Hikes/components/Question.jsx index e7fe7662d9..4f7e97f149 100644 --- a/common/app/routes/Hikes/components/Question.jsx +++ b/common/app/routes/Hikes/components/Question.jsx @@ -1,6 +1,6 @@ import React, { PropTypes } from 'react'; import { Spring } from 'react-motion'; -import { Navigation, TransitionHook } from 'react-router'; +import { History, Lifecycle } from 'react-router'; import debugFactory from 'debug'; import { Button, @@ -19,8 +19,8 @@ export default React.createClass({ displayName: 'Question', mixins: [ - Navigation, - TransitionHook + History, + Lifecycle ], propTypes: { @@ -150,7 +150,8 @@ export default React.createClass({ postJSON$('/completed-challenge', { id, name }).subscribeOnCompleted(() => { if (tests[nextQuestionIndex]) { - return this.transitionTo( + return this.history.pushState( + null, `/hikes/${ dashedName }/questions/${ nextQuestionIndex + 1 }` ); } @@ -168,13 +169,13 @@ export default React.createClass({ }, null); if (nextHike) { - return this.transitionTo(`/hikes/${ nextHike.dashedName }`); + return this.history.pushState(null, `/hikes/${ nextHike.dashedName }`); } debug( 'next Hike was not found, currentHike %s', currentHike.dashedName ); - this.transitionTo('/hikes'); + this.history.pushState(null, '/hikes'); }); }, diff --git a/common/app/routes/Hikes/flux/Actions.js b/common/app/routes/Hikes/flux/Actions.js index 2d9d44a4fd..f6ed407fae 100644 --- a/common/app/routes/Hikes/flux/Actions.js +++ b/common/app/routes/Hikes/flux/Actions.js @@ -3,7 +3,7 @@ import debugFactory from 'debug'; const debug = debugFactory('freecc:hikes:actions'); -function getCurrentHike(hikes =[{}], dashedName, currentHike) { +function getCurrentHike(hikes = [{}], dashedName, currentHike) { if (!dashedName) { debug('no dashedName'); return hikes[0]; diff --git a/common/app/routes/Hikes/flux/Store.js b/common/app/routes/Hikes/flux/Store.js index 4c7080b1c2..9755ed679a 100644 --- a/common/app/routes/Hikes/flux/Store.js +++ b/common/app/routes/Hikes/flux/Store.js @@ -5,12 +5,16 @@ const initialValue = { currentHike: {} }; -export default Store(initialValue) - .refs({ displayName: 'HikesStore'}) - .init(({ instance: hikeStore, args: [cat] }) => { +export default Store({ + refs: { + displayName: 'HikesStore', + value: initialValue + }, + init({ instance: hikeStore, args: [cat] }) { let { setHikes } = cat.getActions('hikesActions'); hikeStore.register(setHikes); return hikeStore; - }); + } +}); diff --git a/common/app/routes/Jobs/flux/Store.js b/common/app/routes/Jobs/flux/Store.js index b2f5132013..8f3acd2949 100644 --- a/common/app/routes/Jobs/flux/Store.js +++ b/common/app/routes/Jobs/flux/Store.js @@ -6,9 +6,12 @@ const { transformer } = Store; -export default Store({ showModal: false }) - .refs({ displayName: 'JobsStore' }) - .init(({ instance: jobsStore, args: [cat] }) => { +export default Store({ + refs: { + displayName: 'JobsStore', + value: { showModal: false } + }, + init({ instance: jobsStore, args: [cat] }) { const { setJobs, findJob, @@ -27,4 +30,5 @@ export default Store({ showModal: false }) register(transformer(findJob)); register(handleForm); - }); + } +}); diff --git a/package.json b/package.json index c3f7c0bebb..06d6a933ce 100644 --- a/package.json +++ b/package.json @@ -63,8 +63,8 @@ "json-loader": "^0.5.2", "less": "~2.5.1", "lodash": "^3.9.3", - "loopback": "https://github.com/FreeCodeCamp/loopback.git#fix/no-password", - "loopback-boot": "2.8.2", + "loopback": "^2.22.0", + "loopback-boot": "^2.13.0", "loopback-component-passport": "https://github.com/FreeCodeCamp/loopback-component-passport.git#feature/flashfailure", "loopback-connector-mongodb": "^1.10.0", "lusca": "~1.0.2", @@ -89,17 +89,17 @@ "react": "^0.13.3", "react-bootstrap": "~0.23.7", "react-motion": "~0.1.0", - "react-router": "^1.0.0-rc1", + "react-router": "https://github.com/BerkeleyTrue/react-router.git#freecodecamp", "react-vimeo": "^0.0.3", "request": "~2.53.0", "rev-del": "^1.0.5", - "rx": "^2.5.3", + "rx": "^4.0.0", "sanitize-html": "~1.6.1", "sort-keys": "^1.1.1", "source-map-support": "^0.3.2", "store": "https://github.com/berkeleytrue/store.js.git#feature/noop-server", - "thundercats": "^2.1.0", - "thundercats-react": "^0.1.0", + "thundercats": "^3.0.0", + "thundercats-react": "^0.3.0", "twit": "~1.1.20", "uglify-js": "~2.4.15", "validator": "^3.22.1", diff --git a/server/boot/challenge.js b/server/boot/challenge.js index 3b973cc0ac..400c32db33 100644 --- a/server/boot/challenge.js +++ b/server/boot/challenge.js @@ -186,7 +186,7 @@ module.exports = function(app) { ); } const firstChallengeOfNextBlock$ = blocks$ - .elementAtOrDefault(blockIndex + 1, {}) + .elementAt(blockIndex + 1, {}) .map(({ challenges = [] }) => challenges[0]); return blocks$ @@ -259,7 +259,7 @@ module.exports = function(app) { .filter((challenge) => { return testChallengeName.test(challenge.name); }) - .lastOrDefault(null) + .last({ defaultValue: null }) .flatMap(challenge => { // Handle not found From 5603531b7ff7bae1e782407e3c13c6bc8db2b07c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juan=20Mart=C3=ADnez?= Date: Mon, 12 Oct 2015 11:44:34 +0000 Subject: [PATCH 09/21] Fixes background-color required twice to pass --- seed/challenges/html5-and-css.json | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/seed/challenges/html5-and-css.json b/seed/challenges/html5-and-css.json index f4a6cd5d7b..99a0753ad0 100644 --- a/seed/challenges/html5-and-css.json +++ b/seed/challenges/html5-and-css.json @@ -3702,7 +3702,7 @@ "Let's replace the hex code in our body element's background color with the RGB value for black: rgb(0, 0, 0)" ], "tests": [ - "assert($(\"body\").css(\"background-color\") === \"rgb(0, 0, 0)\", 'Give your body element the background-color of black.')", + "assert($(\"body\").css(\"background-color\") === \"rgb(0, 0, 0)\", 'Your body element should have a black background.')", "assert(editor.match(/rgb\\s*\\(\\s*0\\s*,\\s*0\\s*,\\s*0\\s*\\)/ig), 'Use rgb to give your body element the background-color of black. For example body { color: rgb(0, 0, 0); }.')" ], "challengeSeed": [ @@ -3736,7 +3736,7 @@ "Change the body element's background color from the RGB value for black to the rgb value for white: rgb(255, 255, 255)" ], "tests": [ - "assert($(\"body\").css(\"background-color\") === \"rgb(255, 255, 255)\", 'Give your body element the background-color of white.')", + "assert($(\"body\").css(\"background-color\") === \"rgb(255, 255, 255)\", 'Your body should have a white background.')", "assert(editor.match(/rgb\\s*\\(\\s*255\\s*,\\s*255\\s*,\\s*255\\s*\\)/ig), 'Use rgb to give your body element the background-color of white. For example body { background-color: rgb(255, 255 , 255); }.')" ], "challengeSeed": [ @@ -3770,7 +3770,7 @@ "Change the body element's background color to the RGB value red: rgb(255, 0, 0)" ], "tests": [ - "assert($(\"body\").css(\"background-color\") === \"rgb(255, 0, 0)\", 'Give your body element the background-color of red.')", + "assert($(\"body\").css(\"background-color\") === \"rgb(255, 0, 0)\", 'Your body should have a red background.')", "assert(editor.match(/rgb\\s*\\(\\s*255\\s*,\\s*0\\s*,\\s*0\\s*\\)/ig), 'Use rgb to give your body element the background-color of red. For example body { background-color: rgb(255, 0, 0); }.')" ], "challengeSeed": [ @@ -3802,7 +3802,7 @@ "Now change the body element's background color to the rgb value green: rgb(0, 255, 0)" ], "tests": [ - "assert($(\"body\").css(\"background-color\") === \"rgb(0, 255, 0)\", 'Give your body element the background-color of green.')", + "assert($(\"body\").css(\"background-color\") === \"rgb(0, 255, 0)\", 'Your body element should have a green background.')", "assert(editor.match(/rgb\\s*\\(\\s*0\\s*,\\s*255\\s*,\\s*0\\s*\\)/ig), 'Use rgb to give your body element the background-color of green. For example body { background-color: rgb(0, 255, 0); }.')" ], "challengeSeed": [ @@ -3834,7 +3834,7 @@ "Change the body element's background color to the RGB value blue: rgb(0, 0, 255)" ], "tests": [ - "assert($(\"body\").css(\"background-color\") === \"rgb(0, 0, 255)\", 'Give your body element the background-color of blue.')", + "assert($(\"body\").css(\"background-color\") === \"rgb(0, 0, 255)\", 'Your body element should have a blue background.')", "assert(editor.match(/rgb\\s*\\(\\s*0\\s*,\\s*0\\s*,\\s*255\\s*\\)/ig), 'Use rgb to give your body element the background-color of blue. For example body { background-color: rgb(0, 0, 255); }.')" ], "challengeSeed": [ @@ -3867,7 +3867,7 @@ "Change the body element's background color to the RGB value orange: rgb(255, 165, 0)" ], "tests": [ - "assert($(\"body\").css(\"background-color\") === \"rgb(255, 165, 0)\", 'Give your body element the background-color of orange.')", + "assert($(\"body\").css(\"background-color\") === \"rgb(255, 165, 0)\", 'Your body element should have an orange background.')", "assert(editor.match(/rgb\\s*\\(\\s*255\\s*,\\s*165\\s*,\\s*0\\s*\\)/ig), 'Use rgb to give your body element the background-color of orange. For example body { background-color: rgb(255, 165, 0); }.')" ], "challengeSeed": [ @@ -3900,7 +3900,7 @@ "Change the body element's background color to the RGB value for gray: rgb(128, 128, 128)" ], "tests": [ - "assert($(\"body\").css(\"background-color\") === \"rgb(128, 128, 128)\", 'Give your body element the background-color of gray.')", + "assert($(\"body\").css(\"background-color\") === \"rgb(128, 128, 128)\", 'Your body element should have a gray background.')", "assert(editor.match(/rgb\\s*\\(\\s*128\\s*,\\s*128\\s*,\\s*128\\s*\\)/ig), 'Use rgb to give your body element the background-color of gray. For example body { background-color: rgb(128, 128, 128); }.')" ], "challengeSeed": [ From 5c6d4477547d6b5b809e2e2260ee804fda711db4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladimir=20T=C3=A1mara=20Pati=C3=B1o?= Date: Mon, 12 Oct 2015 10:07:33 -0500 Subject: [PATCH 10/21] equal button instead of clear button --- seed/challenges/basic-ziplines.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/seed/challenges/basic-ziplines.json b/seed/challenges/basic-ziplines.json index a13e962f7c..94b59f69d1 100644 --- a/seed/challenges/basic-ziplines.json +++ b/seed/challenges/basic-ziplines.json @@ -202,7 +202,7 @@ "Here are the user stories you must enable, and optional bonus user stories:", "User Story: As a user, I can add, subtract, multiply and divide two numbers.", "Bonus User Story: I can clear the input field with a clear button.", - "Bonus User Story: I can keep chaining mathematical operations together until I hit the clear button, and the calculator will tell me the correct output.", + "Bonus User Story: I can keep chaining mathematical operations together until I hit the equal button, and the calculator will tell me the correct output.", "Remember to use Read-Search-Ask if you get stuck.", "When you are finished, click the \"I've completed this challenge\" button and include a link to your CodePen. If you pair programmed, you should also include the Free Code Camp username of your pair.", "If you'd like immediate feedback on your project from fellow campers, click this button and paste in a link to your CodePen project.

Click here then add your link to your tweet's text" From f30239fb6c80734c1e69de6549bd650dde9b26dd Mon Sep 17 00:00:00 2001 From: Quincy Larson Date: Mon, 12 Oct 2015 22:56:10 -0700 Subject: [PATCH 11/21] add time estimates to challenge blocks on map --- seed/challenges/advanced-bonfires.json | 1 + seed/challenges/angularjs.json | 1 + .../automated-testing-and-debugging.json | 1 + seed/challenges/basejumps.json | 1 + seed/challenges/basic-bonfires.json | 1 + seed/challenges/basic-javascript.json | 1 + seed/challenges/basic-ziplines.json | 1 + seed/challenges/bootstrap.json | 1 + .../front-end-development-certificate.json | 1 + .../full-stack-development-certificate.json | 1 + seed/challenges/gear-up-for-success.json | 1 + seed/challenges/getting-started.json | 1 + seed/challenges/git.json | 1 + seed/challenges/hikes.json | 1 + seed/challenges/html5-and-css.json | 1 + seed/challenges/intermediate-bonfires.json | 1 + seed/challenges/intermediate-ziplines.json | 1 + seed/challenges/jquery.json | 1 + seed/challenges/mongodb.json | 1 + seed/challenges/nodejs-and-expressjs.json | 1 + ...t-oriented-and-functional-programming.json | 1 + .../upper-intermediate-bonfires.json | 1 + seed/index.js | 1 + server/boot/challenge.js | 3 +- server/views/challengeMap/show.jade | 68 ++++++++++--------- 25 files changed, 61 insertions(+), 33 deletions(-) diff --git a/seed/challenges/advanced-bonfires.json b/seed/challenges/advanced-bonfires.json index a4488b8696..e6dc2474c3 100644 --- a/seed/challenges/advanced-bonfires.json +++ b/seed/challenges/advanced-bonfires.json @@ -1,6 +1,7 @@ { "name": "Advanced Algorithm Scripting", "order": 15, + "time": "50h", "challenges": [ { "id": "aff0395860f5d3034dc0bfc9", diff --git a/seed/challenges/angularjs.json b/seed/challenges/angularjs.json index 92c85e751b..905c120f33 100644 --- a/seed/challenges/angularjs.json +++ b/seed/challenges/angularjs.json @@ -1,6 +1,7 @@ { "name": "AngularJS", "order": 16, + "time": "5h", "challenges": [ { "id": "bd7154d8c441eddfaeb5bdef", diff --git a/seed/challenges/automated-testing-and-debugging.json b/seed/challenges/automated-testing-and-debugging.json index b5ab25c2f9..0c7304045b 100644 --- a/seed/challenges/automated-testing-and-debugging.json +++ b/seed/challenges/automated-testing-and-debugging.json @@ -1,6 +1,7 @@ { "name": "Automated Testing and Debugging", "order": 14, + "time": "15m", "challenges": [ { "id":"cf1111c1c16feddfaeb6bdef", diff --git a/seed/challenges/basejumps.json b/seed/challenges/basejumps.json index b665d28622..627e95482f 100644 --- a/seed/challenges/basejumps.json +++ b/seed/challenges/basejumps.json @@ -1,6 +1,7 @@ { "name": "Full Stack JavaScript Projects", "order": 20, + "time": "300h", "challenges": [ { "id": "bd7158d8c443eddfaeb5bcef", diff --git a/seed/challenges/basic-bonfires.json b/seed/challenges/basic-bonfires.json index 2c22329088..2c5a3667d2 100644 --- a/seed/challenges/basic-bonfires.json +++ b/seed/challenges/basic-bonfires.json @@ -1,6 +1,7 @@ { "name": "Basic Algorithm Scripting", "order": 8, + "time": "50h", "challenges": [ { "id": "ad7123c8c441eddfaeb5bdef", diff --git a/seed/challenges/basic-javascript.json b/seed/challenges/basic-javascript.json index f9caca1efe..7d88e724ce 100644 --- a/seed/challenges/basic-javascript.json +++ b/seed/challenges/basic-javascript.json @@ -1,6 +1,7 @@ { "name": "Basic JavaScript", "order": 6, + "time": "3h", "challenges": [ { "id":"bd7123c9c441eddfaeb4bdef", diff --git a/seed/challenges/basic-ziplines.json b/seed/challenges/basic-ziplines.json index a13e962f7c..dd13678621 100644 --- a/seed/challenges/basic-ziplines.json +++ b/seed/challenges/basic-ziplines.json @@ -1,6 +1,7 @@ { "name": "Basic Front End Development Projects", "order": 9, + "time": "100h", "challenges": [ { "id": "bd7158d8c442eddfbeb5bd1f", diff --git a/seed/challenges/bootstrap.json b/seed/challenges/bootstrap.json index 3982fe18d5..91e0e5e776 100644 --- a/seed/challenges/bootstrap.json +++ b/seed/challenges/bootstrap.json @@ -1,6 +1,7 @@ { "name": "Responsive Design with Bootstrap", "order": 3, + "time": "2h", "challenges": [ { "id": "bad87fee1348bd9acde08712", diff --git a/seed/challenges/front-end-development-certificate.json b/seed/challenges/front-end-development-certificate.json index 65b98018c6..4d6a83c406 100644 --- a/seed/challenges/front-end-development-certificate.json +++ b/seed/challenges/front-end-development-certificate.json @@ -1,6 +1,7 @@ { "name": "Claim Your Front End Development Certificate", "order": 12, + "time": "5m", "challenges": [ { "id": "561add10cb82ac38a17513be", diff --git a/seed/challenges/full-stack-development-certificate.json b/seed/challenges/full-stack-development-certificate.json index d383fc5a0f..1d0cd92963 100644 --- a/seed/challenges/full-stack-development-certificate.json +++ b/seed/challenges/full-stack-development-certificate.json @@ -1,6 +1,7 @@ { "name": "Claim Your Full Stack Development Certificate", "order": 21, + "time": "5m", "challenges": [ { "id": "660add10cb82ac38a17513be", diff --git a/seed/challenges/gear-up-for-success.json b/seed/challenges/gear-up-for-success.json index d11fdecf6e..0eb45c60a0 100644 --- a/seed/challenges/gear-up-for-success.json +++ b/seed/challenges/gear-up-for-success.json @@ -1,6 +1,7 @@ { "name": "Gear up for Success", "order": 4, + "time": "10m", "challenges": [ { "id": "560add65cb82ac38a17513c2", diff --git a/seed/challenges/getting-started.json b/seed/challenges/getting-started.json index 8f8b559eb7..87ba38e5a2 100644 --- a/seed/challenges/getting-started.json +++ b/seed/challenges/getting-started.json @@ -1,6 +1,7 @@ { "name": "Get Started with Free Code Camp", "order": 1, + "time": "10m", "challenges": [ { "id": "560add10cb82ac38a17513be", diff --git a/seed/challenges/git.json b/seed/challenges/git.json index d3abf068ba..8a642ab615 100644 --- a/seed/challenges/git.json +++ b/seed/challenges/git.json @@ -1,6 +1,7 @@ { "name": "Git", "order" : 17, + "time": "3h", "challenges": [ { "id": "bd7353d8c341eddeaeb5bd0f", diff --git a/seed/challenges/hikes.json b/seed/challenges/hikes.json index 1f5d7f3113..0e9dbb56a4 100644 --- a/seed/challenges/hikes.json +++ b/seed/challenges/hikes.json @@ -1,6 +1,7 @@ { "name": "Hikes", "order": 0.050, + "time": "3h", "challenges": [ { "id": "bd7128d8c441eddfbeb5bddf", diff --git a/seed/challenges/html5-and-css.json b/seed/challenges/html5-and-css.json index f4a6cd5d7b..41c46c2126 100644 --- a/seed/challenges/html5-and-css.json +++ b/seed/challenges/html5-and-css.json @@ -1,6 +1,7 @@ { "name": "HTML5 and CSS", "order": 2, + "time": "3h", "challenges": [ { "id": "bd7123c8c441eddfaeb5bdef", diff --git a/seed/challenges/intermediate-bonfires.json b/seed/challenges/intermediate-bonfires.json index ae17999083..38f77d9631 100644 --- a/seed/challenges/intermediate-bonfires.json +++ b/seed/challenges/intermediate-bonfires.json @@ -1,6 +1,7 @@ { "name": "Intermediate Algorithm Scripting", "order": 10, + "time": "50h", "challenges": [ { "id": "a3566b1109230028080c9345", diff --git a/seed/challenges/intermediate-ziplines.json b/seed/challenges/intermediate-ziplines.json index 27680d7350..fd3ea5b5e9 100644 --- a/seed/challenges/intermediate-ziplines.json +++ b/seed/challenges/intermediate-ziplines.json @@ -1,6 +1,7 @@ { "name": "Intermediate Front End Development Projects", "order": 11, + "time": "200h", "challenges": [ { "id": "bd7158d8c442eddfaeb5bd10", diff --git a/seed/challenges/jquery.json b/seed/challenges/jquery.json index 6aa103d38c..e220c99d29 100644 --- a/seed/challenges/jquery.json +++ b/seed/challenges/jquery.json @@ -1,6 +1,7 @@ { "name": "jQuery", "order": 5, + "time": "2h", "challenges": [ { "id": "bad87fee1348bd9acdd08826", diff --git a/seed/challenges/mongodb.json b/seed/challenges/mongodb.json index 437a4da2e6..0fe93ba6f9 100644 --- a/seed/challenges/mongodb.json +++ b/seed/challenges/mongodb.json @@ -1,6 +1,7 @@ { "name": "MongoDB", "order" : 19, + "time": "3h", "challenges": [ { "id": "bd7243d8c341eddeaeb5bd0f", diff --git a/seed/challenges/nodejs-and-expressjs.json b/seed/challenges/nodejs-and-expressjs.json index 6eb04629c0..36b2231409 100644 --- a/seed/challenges/nodejs-and-expressjs.json +++ b/seed/challenges/nodejs-and-expressjs.json @@ -1,6 +1,7 @@ { "name": "Node.js and Express.js", "order" : 18, + "time": "20h", "challenges": [ { "id": "bd7153d8c441eddfaeb5bd0f", diff --git a/seed/challenges/object-oriented-and-functional-programming.json b/seed/challenges/object-oriented-and-functional-programming.json index 7e890b52fe..8f1c7a8a1a 100644 --- a/seed/challenges/object-oriented-and-functional-programming.json +++ b/seed/challenges/object-oriented-and-functional-programming.json @@ -1,6 +1,7 @@ { "name": "Object Oriented and Functional Programming", "order": 7, + "time": "1h", "note": [ "Methods", "Closures", diff --git a/seed/challenges/upper-intermediate-bonfires.json b/seed/challenges/upper-intermediate-bonfires.json index b1ddbc2ac1..126da14507 100644 --- a/seed/challenges/upper-intermediate-bonfires.json +++ b/seed/challenges/upper-intermediate-bonfires.json @@ -1,6 +1,7 @@ { "name": "Upper Intermediate Algorithm Scripting", "order": 13, + "time": "50h", "challenges": [ { "id": "a2f1d72d9b908d0bd72bb9f6", diff --git a/seed/index.js b/seed/index.js index bd05f2de96..464242c26e 100644 --- a/seed/index.js +++ b/seed/index.js @@ -68,6 +68,7 @@ Challenge.destroyAll(function(err, info) { challenge.suborder = index + 1; challenge.block = block; challenge.isBeta = challenge.isBeta || isBeta; + challenge.time = challengeSpec.time; return challenge; }); diff --git a/server/boot/challenge.js b/server/boot/challenge.js index 3b973cc0ac..218e5fc321 100644 --- a/server/boot/challenge.js +++ b/server/boot/challenge.js @@ -555,7 +555,8 @@ module.exports = function(app) { name: blockArray[0].block, dashedName: dasherize(blockArray[0].block), challenges: blockArray, - completed: completedCount / blockArray.length * 100 + completed: completedCount / blockArray.length * 100, + time: blockArray[0] && blockArray[0].time || "???" }; }) .filter(({ name }) => name !== 'Hikes') diff --git a/server/views/challengeMap/show.jade b/server/views/challengeMap/show.jade index db351b7af8..ae0370b802 100644 --- a/server/views/challengeMap/show.jade +++ b/server/views/challengeMap/show.jade @@ -85,40 +85,44 @@ block content .spacer.negative-55 .row - .col-xs-12.col-sm-8.col-sm-offset-2 - h3 #{challengeBlock.name} + .hidden-xs.col-sm-3.col-md-2 + h3.text-primary.text-right + i.fa.fa-clock-o #{challengeBlock.time} + .col-xs-12.col-sm-9.col-md-10 + h3 #{challengeBlock.name}   + + .row - .col-xs-12 - ol - for challenge in challengeBlock.challenges - if challenge.completed - .row - .hidden-xs.col-sm-3.col-md-2.text-primary.ion-checkmark-circled.padded-ionic-icon.text-center.map-p.negative-10 - .col-xs-12.col-sm-9.col-md-10 - li.faded.map-p.negative-10 - a(href="/challenges/#{challenge.dashedName}") - span.capitalize= challenge.type + ': ' - span= challenge.title - span.sr-only= " Complete" - - - else - .row - .hidden-xs.col-sm-3.col-md-2 - span.negative-10 - .col-xs-12.col-sm-9.col-md-10 - li.map-p.negative-10 - a(href="/challenges/#{challenge.dashedName}") - span.capitalize= challenge.type + ': ' - span= challenge.title - span.sr-only= " Incomplete" - - if (challengeBlock.completed === 100) - .button-spacer + ol + for challenge in challengeBlock.challenges + if challenge.completed .row - .col-xs-12.col-sm-8.col-md-6.col-sm-offset-3.col-md-offset-2.hidden - a.btn.btn-lg.btn-block.signup-btn.map-challenge-block-share Section complete. Share your Portfolio with your friends. - .hidden(id="#{challengeBlock.name}") + .hidden-xs.col-sm-3.col-md-2.text-primary.ion-checkmark-circled.padded-ionic-icon.text-center.map-p.negative-10 + .col-xs-12.col-sm-9.col-md-10 + li.faded.map-p.negative-10 + a(href="/challenges/#{challenge.dashedName}") + span.capitalize= challenge.type + ': ' + span= challenge.title + span.sr-only= " Complete" + + + else + .row + .hidden-xs.col-sm-3.col-md-2 + span.negative-10 + .col-xs-12.col-sm-9.col-md-10 + li.map-p.negative-10 + a(href="/challenges/#{challenge.dashedName}") + span.capitalize= challenge.type + ': ' + span= challenge.title + span.sr-only= " Incomplete" + + if (challengeBlock.completed === 100) + .button-spacer + .row + .col-xs-12.col-sm-8.col-md-6.col-sm-offset-3.col-md-offset-2.hidden + a.btn.btn-lg.btn-block.signup-btn.map-challenge-block-share Section complete. Share your Portfolio with your friends. + .hidden(id="#{challengeBlock.name}") script. var username = !{JSON.stringify(user && user.username || '')}; var lastCompleted = !{JSON.stringify(lastCompleted || false)} From 8da93ddea9d8b208117b08444d744f81ef797ba8 Mon Sep 17 00:00:00 2001 From: Quincy Larson Date: Mon, 12 Oct 2015 23:02:24 -0700 Subject: [PATCH 12/21] add spacing and nowrap to ensure time stays on single line --- server/views/challengeMap/show.jade | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/server/views/challengeMap/show.jade b/server/views/challengeMap/show.jade index ae0370b802..14243dee9b 100644 --- a/server/views/challengeMap/show.jade +++ b/server/views/challengeMap/show.jade @@ -86,8 +86,8 @@ block content .row .hidden-xs.col-sm-3.col-md-2 - h3.text-primary.text-right - i.fa.fa-clock-o #{challengeBlock.time} + h3.text-primary.text-right.nowrap + i.fa.fa-clock-o  #{challengeBlock.time} .col-xs-12.col-sm-9.col-md-10 h3 #{challengeBlock.name}   From 277fcb49cab024b0a27de9c1e844aa20593467e3 Mon Sep 17 00:00:00 2001 From: Quincy Larson Date: Tue, 13 Oct 2015 01:47:53 -0700 Subject: [PATCH 13/21] add the codepen challenge --- seed/challenges/basic-ziplines.json | 68 +++++++++++++++-------------- 1 file changed, 35 insertions(+), 33 deletions(-) diff --git a/seed/challenges/basic-ziplines.json b/seed/challenges/basic-ziplines.json index 94b59f69d1..f133fceac5 100644 --- a/seed/challenges/basic-ziplines.json +++ b/seed/challenges/basic-ziplines.json @@ -5,46 +5,48 @@ { "id": "bd7158d8c442eddfbeb5bd1f", "title": "Get Set for Ziplines", - "difficulty": 1.00, - "challengeSeed": ["125658022"], + "challengeSeed": [], "description": [ - "Now you're ready to start our Zipline challenges. These front-end development challenges will give you many opportunities to apply the HTML, CSS, jQuery and JavaScript you've learned to build static (database-less) applications.", - "Whatever you do, don't get discouraged! Remember to use Read-Search-Ask if you get stuck.", - "We'll build these challenges using CodePen, a popular tool for creating, sharing, and discovering static web applications.", - "Go to http://codepen.io and create an account.", - "Click your user image in the top right corner, then click the \"New pen\" button that drops down.", - "Drag the windows around and press the buttons in the lower-right hand corner to change the orientation to suit your preference.", - "Click the gear next to CSS. Then under the \"Add External CSS\" section, use the \"Quick-add\" select box to select Bootstrap. Then click \"Save & Close\".", - "Verify that bootstrap is active by adding the following code to your HTML: <h1 class='text-primary'>Hello CodePen!</h1>. The text's color should be Bootstrap blue.", - "Click the gear next to JavaScript. Click the \"Quick-add\" select box and choose jQuery (not jQuery UI).", - "Click the \"Quick-add\" select box again and choose Bootstrap. Then click \"Save & Close\".", - "Now add the following code to your JavaScript: $(document).ready(function() { $('.text-primary').text('Hi CodePen!') });. Click the \"Save\" button at the top. Your \"Hello CodePen!\" should change to \"Hi CodePen!\". This means that jQuery is working.", - "You can use this CodePen that you've just created as a starting point for your Ziplines. Just click the \"fork\" button at the top of your CodePen and it will create a duplicate CodePen.", - "Now you're ready for your first Zipline. Click the \"I've completed this challenge\" button." + [ + "http://i.imgur.com/6WLULsC.gif", + "A gif showing how to create a Codepen account.", + "For our front end Zipline challenges, we'll use a popular browser-based code editor CodePen. Open CodePen and click \"Sign up\" in the upper right hand corner, then scroll down to the free plan and click \"Sign up\" again. Click the \"Use info from GitHub button\", then add your email address and create a password. Click the \"Sign up\" button. Then in the upper right hand corner, click \"New pen\".", + "http://codepen.io" + ], + [ + "http://i.imgur.com/U4y9RJ1.gif", + "A gif showing that you can type \"hello world\" will output \"hello world\" in the preview window. You can also drag windows to resize them, and change their orientation.", + "In the HTML box, create an h1 element with the text \"Hello World\". You can drag the frames around to resize them. You can also click the \"Change View\" button and change the orientation of the frames.", + "" + ], + [ + "http://i.imgur.com/G9KFQDL.gif", + "A gif showing the process of adding Bootstrap to your pen.", + "Click the gear in the upper left hand corner of the CSS box, then scroll down to \"Quick add\" and choose Bootstrap. Now give your h1 element the class of \"text-primary\" to change its color and prove that Bootstrap is now available.", + "" + ], + [ + "http://i.imgur.com/Gi3aig0.gif", + "A gif showing the process of adding Animate.css and jQuery to pen.", + "Click the gear in the upper left hand corner of the CSS box, then scroll down to \"Quick add\" and choose Animate.css. Click the gear in the upper left hand corner of the JS box, then scroll down to \"Quick add\" and choose jQuery. Prove that Animate.css and jQuery are loaded properly. In the JS box, add the following code to make your h1 element bounce: $(document).ready(function(){ $(\"h1\").addClass(\"animated bounce\"); });.", + "" + ], + [ + "http://i.imgur.com/Wzt6Y9Y.gif", + "A gif showing the process of saving and forking a pen.", + "Save your pen with the \"Save\" button. Then click the \"Fork\" button. This will create a fork (copy) of your pen that you can experimient with.", + "" + ] ], - "type": "waypoint", - "challengeType": 2, + "type": "Waypoint", + "challengeType": 7, "tests": [], "nameCn": "", "descriptionCn": [], "nameFr": "", "descriptionFr": [], - "nameRu": "Приготовьтесь к Zipline'ам", - "descriptionRu": [ - "Теперь вы готовы приступить к Zipline'ам. Это задания по фронт-энд разработке, в них вы примените ранее изученные HTML, CSS, jQuery и JavaScript и создадите статические (не использующие базу данных) приложения.", - "Ни в коем случае не унывайте! Воспользуйтесь Read-Search-Ask, если что-то не получается.", - "Задания мы будем выполнять используя CodePen - популярный инструмент для создания и обмена статическими веб приложениями.", - "Перейдите по ссылке http://codepen.io и создайте аккаунт.", - "Нажмите на ваш аватар в правом верхнем углу, а затем в открывшемся меню на кнопку \"New pen\".", - "Выберите удобное расположение окон с помощью кнопок в правом нижнем углу, отрегулируйте их ширину.", - "Нажмите на звездочку рядом с CSS. Затем в секции \"Add External CSS\" выберите \"Quick-add\" и добавьте Bootstrap. Нажмите \"Save & Close\".", - "Проверьте, что Bootstrap подключен добавив следующий HTML код: <h1 class='text-primary'>Hello CodePen!</h1>. Цвет текста должен быть синим.", - "Нажмите на звездочку рядом с JavaScript. Нажмите \"Quick-add\" и выберите jQuery (не jQuery UI). Нажмите \"Save & Close\".", - "Снова нажмите на поле \"Quick-add\", выберите Bootstrap и затем нажмите \"Save & Close\".", - "Теперь добавьте следующий код в окошко JavaScript: $(document).ready(function() { $('.text-primary').text('Hi CodePen!') });. Нажмите на кнопку \"Save\" расположенную наверху. Текст \"Hello CodePen!\" должен измениться на \"Hi CodePen!\". Это значит что jQuery работает.", - "CodePen, который мы создали, можно использовать в качестве отправной точки для ваших Zipline'ов. Кликните кнопку \"fork\", чтобы создать копию текущего CodePen'a.", - "Все готово для первого Zipline'а. Жмите кнопку \"I've completed this challenge\"." - ], + "nameRu": "", + "descriptionRu": [], "nameEs": "", "descriptionEs": [], "namePt": "", From 6013a5e3ff4715a2681afd9c50e5598d08ccca98 Mon Sep 17 00:00:00 2001 From: Quincy Larson Date: Tue, 13 Oct 2015 02:04:09 -0700 Subject: [PATCH 14/21] update gear up and getting started challenges --- seed/challenges/gear-up-for-success.json | 4 +-- seed/challenges/getting-started.json | 36 ++++++++++-------------- 2 files changed, 17 insertions(+), 23 deletions(-) diff --git a/seed/challenges/gear-up-for-success.json b/seed/challenges/gear-up-for-success.json index d11fdecf6e..b73404a129 100644 --- a/seed/challenges/gear-up-for-success.json +++ b/seed/challenges/gear-up-for-success.json @@ -60,9 +60,9 @@ "challengeSeed": [], "description": [ [ - "http://i.imgur.com/P7qfJXt.gif", + "http://i.imgur.com/vJyiXzU.gif", "A gif showing how you can click the link below and fill in the necessary fields to add your Free Code Camp studies to your LinkedIn profile.", - "You can add Free Code Camp to your LinkedIn education background. Set your graduation date as next year. For \"Degree\", type \"Full Stack Web Development\". For \"Field of study\", type \"Computer Software Engineering\". Then click \"Save Changes\".", + "You can add Free Code Camp to your LinkedIn education background. Set your graduation date as next year. For \"Degree\", type \"Full Stack Web Development Certification\". For \"Field of study\", type \"Computer Software Engineering\". Then click \"Save Changes\".", "https://www.linkedin.com/profile/edit-education?school=Free+Code+Camp" ] ], diff --git a/seed/challenges/getting-started.json b/seed/challenges/getting-started.json index 8f8b559eb7..bd3638725f 100644 --- a/seed/challenges/getting-started.json +++ b/seed/challenges/getting-started.json @@ -9,13 +9,13 @@ "description": [ [ "http://i.imgur.com/RlEk2IF.jpg", - "a picture of Free Code Camp's 4 benefits: Get connected, Learn JavaScript, Build your Portfolio, Help nonprofits", + "A picture of Free Code Camp's 4 benefits: Get connected, Learn JavaScript, Build your Portfolio, Help nonprofits", "Welcome to Free Code Camp. We're an open source community of busy people who learn to code and help nonprofits.", "" ], [ "http://i.imgur.com/pYsTbjI.jpg", - "a screenshot of our curriculum alongside a screenshot of our chat room.", + "A screenshot of our curriculum alongside a screenshot of our chat room.", "Learning to code is hard. To succeed, you'll need lots of practice and support. That's why we've created a rigorous curriculum and supportive community.", "" ], @@ -33,13 +33,13 @@ ], [ "http://i.imgur.com/sKYQhdG.jpg", - "a screenshot of our Front End Development Certificate", + "A screenshot of our Front End Development Certificate", "About half way through our curriculum, you'll earn a verified Front End Development Certificate. If you can finish our entire curriculum, you'll earn a verified Full Stack Development Certificate.", "" ], [ "http://i.imgur.com/yXyxbDd.jpg", - "a screen shot of our nonprofit project directory.", + "A screen shot of our nonprofit project directory.", "Then you'll build several real-life projects for nonprofits. By the time you finish, you'll have a portfolio of real apps that people use every day.", "" ] @@ -65,7 +65,7 @@ "description": [ [ "http://i.imgur.com/EAR7Lvh.jpg", - "a screenshot of our one of our Gitter chat rooms.", + "A screenshot of our one of our Gitter chat rooms.", "Now let's join Free Code Camp's chat rooms. You can come here any time of day to hang out, ask questions, or find another camper to pair program with. First you'll need a GitHub account.", "" ], @@ -83,14 +83,14 @@ ], [ "http://i.imgur.com/OXL3G3n.gif", - "Click the link below to navigate to Free Code Camp's open-source repository. In the upper right hand corner, you can click the \"star\" button to star this repository.", + "A gif showing how you can star a GitHub repo.", "Go to Free Code Camp's open-source repository and \"star\" it. \"Starring\" is the GitHub equivalent of \"liking\" something.", "https://github.com/freecodecamp/freecodecamp" ], [ - "http://i.imgur.com/EZHzKCV.gif", + "http://i.imgur.com/zwYPeQT.gif", "A gif showing you how to click the link below to go to our chat room and click the \"sign in with GitHub\" button. Then you can click into the text input field and type a message to your fellow campers.", - " Now that you have a GitHub account, you can join our main chat room by logging in with GitHub. Introduce yourself by saying \"Hello world!\". Tell your fellow campers how you found Free Code Camp. Also tell us why you want to learn to code.", + "Now that you have a GitHub account, you can join our main chat room by logging in with GitHub. Introduce yourself by saying \"Hello world!\". Tell your fellow campers how you found Free Code Camp. Also tell us why you want to learn to code.", "https://gitter.im/FreeCodeCamp/FreeCodeCamp" ], [ @@ -112,7 +112,7 @@ "" ], [ - "http://i.imgur.com/SLQ27Gr.gif", + "http://i.imgur.com/WvQvNGN.gif", "A gif showing how you can click the link below to download a native chat room app for your computer.", "You can also download the chat room app to your computer or phone.", "https://gitter.im/apps" @@ -138,15 +138,9 @@ "challengeSeed": [], "description": [ [ - "http://i.imgur.com/FkEzbto.gif", + "http://i.imgur.com/tP2ccTE.gif", "A gif showing how you can click your profile image in your upper right hand corner to your code portfolio and connect GitHub.", - "Check out your code portfolio. Click your picture in your upper right hand corner. To activate your code portfolio, you'll need to link your GitHub account with Free Code Camp.", - "" - ], - [ - "http://i.imgur.com/WKzEr1q.gif", - "A gif showing how you can access your code portfolio and hover over different days to see how many brownie points you got on those days.", - "Your code portfolio shows your progress and how many Brownie Points you have. You can get Brownie Points by completing challenges and by helping other campers in our chat rooms. If you get Brownie Points on several days in a row, you'll get a streak.", + "Check out your code portfolio. Click your picture in your upper right hand corner. To activate your code portfolio, you'll need to link your GitHub account with Free Code Camp. Your code portfolio shows your progress and how many Brownie Points you have. You can get Brownie Points by completing challenges and by helping other campers in our chat rooms. If you get Brownie Points on several days in a row, you'll get a streak.", "" ] ], @@ -176,9 +170,9 @@ "" ], [ - "http://i.imgur.com/EZHzKCV.gif", + "http://i.imgur.com/fTFMjwf.gif", "A gif showing how you can click the link below, find your city on the list of Campsites, then click on the Facebook link for your city and join your city's Facebook group.", - "Find your city on this list, click the \"Facebook\" link, then click the \"Join group\" button to apply to join your city's Facebook group (someone from the campsite should approve you shortly). If your city isn't on this list, scroll to the bottom of the wiki article for instructions for how you can create your city's Campsite.", + "Find your city on this list and click it. This will take you to your city's Campsite's Facebook group. Click the \"Join group\" button to apply to join your city's Facebook group. Someone from the campsite should approve you shortly. If your city isn't on this list, scroll to the bottom of the wiki article for instructions for how you can create your city's Campsite.", "https://github.com/FreeCodeCamp/freecodecamp/wiki/List-of-Free-Code-Camp-city-based-Campsites" ] ], @@ -226,8 +220,8 @@ "https://gitter.im/FreeCodeCamp/Help" ], [ - "http://i.imgur.com/WsfzvVo.gif", - "A gif showing us clicking the \"map\" button in our upper right hand corner and browsing our challenge map.", + "http://i.imgur.com/ZRgXraT.gif", + "A gif showing us scrolling through our challenge map.", "Now you're ready to start coding! The \"Map\" button in your upper right hand corner will show you our challenge map. This map shows all our coding challenges. We recommend that you complete these from top to bottom, at a sustainable pace. You can also return to your next challenge by clicking the \"Learn\" button.", "" ] From a162c3eea5a3f5f86f15f440d033240a1ab76b68 Mon Sep 17 00:00:00 2001 From: Quincy Larson Date: Tue, 13 Oct 2015 03:14:20 -0700 Subject: [PATCH 15/21] add clementine.js and codepen onboarding step challenges --- seed/challenges/basejumps.json | 153 ++++++++++++++++++---------- seed/challenges/basic-ziplines.json | 2 - 2 files changed, 100 insertions(+), 55 deletions(-) diff --git a/seed/challenges/basejumps.json b/seed/challenges/basejumps.json index b665d28622..edb7f45792 100644 --- a/seed/challenges/basejumps.json +++ b/seed/challenges/basejumps.json @@ -7,60 +7,107 @@ "title": "Get Set for Basejumps", "challengeSeed": ["128451852"], "description": [ - "Objective: Get the MEAN stack running on Cloud 9, push your code to GitHub, and deploy it to Heroku.", - "We'll build our Basejumps on Cloud 9, a powerful online code editor with a full Ubuntu Linux workspace, all running in the cloud.", - "If you don't already have Cloud 9 account, create one now at http://c9.io.", - "Now let's get your development environment ready for a new Angular-Fullstack application provided by Yeoman.", - "Open up http://c9.io and sign in to your account.", - "Click on the \"+\" icon at the top right of the c9.io page to create a new workspace.", - "Give your workspace a name and an optional description.", - "Choose Node.js in the selection area below the name field.", - "Click the \"Create workspace\" button.", - "Once C9 builds and loads your workspace, you should see a terminal window in the lower right hand corner. In this window use the following commands. You don't need to know what these mean at this point.", - "Never run this command on your local machine. But in your Cloud 9 terminal window, run: rm -rf * && echo \"export NODE_PATH=$NODE_PATH:/home/ubuntu/.nvm/v0.10.35/lib/node_modules\" >> ~/.bashrc && source ~/.bashrc && npm install -g yo grunt grunt-cli generator-angular-fullstack && yo angular-fullstack", - "Yeoman will prompt you to answer some questions. Answer them like this:", - "What would you like to write scripts with? JavaScript", - "What would you like to write markup with? HTML", - "What would you like to write stylesheets with? CSS", - "What Angular router would you like to use? ngRoute", - "Would you like to include Bootstrap? Yes", - "Would you like to include UI Bootstrap? Yes", - "Would you like to use MongoDB with Mongoose for data modeling? Yes", - "Would you scaffold out an authentication boilerplate? Yes", - "Would you like to include additional oAuth strategies? Twitter", - "Would you like to use socket.io? No", - "May bower anonymously report usage statistics to improve the tool over time? (Y/n) Y", - "You may get an error similar to ERR! EEXIST, open ‘/home/ubuntu/.npm. This is caused when Cloud9 runs out of memory and kills an install. If you get this, simply re-run this process with the command yo angular-fullstack. You will then be asked a few questions regarding the re-install. Answer them as follows:", - "Existing .yo-rc configuration found, would you like to use it? (Y/n) Y", - "Overwrite client/favicon.ico? (Ynaxdh) Y", - "To finish the installation run the commands: bower install && npm install", - "To start MongoDB, run the following commands in your terminal: mkdir data && echo 'mongod --bind_ip=$IP --dbpath=data --nojournal --rest \"$@\"' > mongod && chmod a+x mongod && ./mongod", - "You will want to open up a new terminal to work from by clicking on the + icon and select New Terminal", - "Start the application by running the following command in your new terminal window: grunt serve", - "Wait for the following message to appear: xdg-open: no method available for opening 'http://localhost:8080' . Now you can open the internal Cloud9 browser. To launch the browser select Preview in the toolbar then select the dropdown option Preview Running Application.", - "Turn the folder in which your application is running into a Git repository by running the following commands: git init && git add . && git commit -am 'initial commit'.", - "Now we need to add your GitHub SSH key to c9.io. Click the \"Add-on Services\" button in the lower left of your C9 dashboard. Click \"activate\" next to the GitHub icon.", - "A pop up will appear. Allow access to your account.", - "While still on the dashboard, under “Account Settings”, click the link for \"Show your SSH key\". Copy the key to you clipboard.", - "Sign in to http://github.com and navigate to the GitHub SSH settings page. Click the \"Add SSH Key\". Give your key the title \"cloud 9\". Paste your SSH Key into the \"Key\" box, then click \"Add Key\".", - "Create a new GitHub repository by and clicking on the + button next to your username in the upper-right hand side of your screen, then selecting \"New Repository\".", - "Enter a project name, then click the \"Create Repository\" button.", - "Find the \"...or push an existing repository from the command line\" section and click the Copy to Clipboard button beside it.", - "Paste the commands from your clipboard into the Cloud9 terminal prompt. This will push your changes to your repository on Cloud 9 up to GitHub.", - "Check back on your GitHub profile to verify the changes were successfully pushed up to GitHub.", - "Now let's push your code to Heroku. If you don't already have a Heroku account, create one at http://heroku.com. You shouldn't be charged for anything, but you will need to add your credit card information to your Heroku before you will be able to use Heroku's free MongoLab add on.", - "Before you publish to Heroku, you should free up as much memory as possible on Cloud9. In each of the Cloud9 terminal prompt tabs where MongoDB and Grunt are running, press the control + c hotkey to shut down these processes.", - "Run the following command in a Cloud9 terminal prompt tab: npm install grunt-contrib-imagemin --save-dev && npm install --save-dev && heroku login. At this point, the terminal will prompt you to log in to Heroku from the command line.", - "Now run yo angular-fullstack:heroku. You can choose a name for your Heroku project, or Heroku will create a random one for you. You can choose whether you want to deploy to servers the US or the EU.", - "Set the config flag for your Heroku environment and add MongoLab for your MongoDB instance by running the following command: cd ~/workspace/dist && heroku config:set NODE_ENV=production && heroku addons:add mongolab.", - "As you build your app, you should frequently commit changes to your codebase. Make sure you're in the ~/workspace directory by running cd ~/workspace. Then you can use this code to stage the changes to your changes and commit them: git commit -am \"your commit message\". Note that you should replace \"your commit message\" with a short summary of the changes you made to your code, such as \"added a records controller and corresponding routes\".", - "You can push these new commits to GitHub by running git push origin master, and to Heroku by running grunt --force && grunt buildcontrol:heroku.", - "If you need further guidance on using Yeoman Angular-Fullstack Generator, check out: https://github.com/clnhll/guidetobasejumps.", - "Now you're ready to move on to your first Basejump. Click the \"I've completed this challenge\" and move on." + [ + "http://i.imgur.com/4IZjWZ3.gif", + "A gif showing how to create a c9.io account.", + "We recommend building our full stack Basejump challenges on c9.io, a powerful browser-based development environment. This save you hours of time that you would spend configuring your local computer to run Node.js and MongoDB - time you could instead spend coding. Create a c9.io account bu clicking the GitHub symbol in the upper right hand corner of the c9.io page. Click the big plus symbol to create a new workspace. Enter your email address when prompted.", + "http://c9.io" + ], + [ + "http://i.imgur.com/F7i5Hhi.gif", + "A gif showing how to fill out the new workspace form", + "On c9.io, give your workspace a name, then leave \"Template\" as custom and create your workspace from this GitHub url: https://github.com/johnstonbl01/clementinejs-fcc.git", + "" + ], + [ + "http://i.imgur.com/42m1vyr.gif", + "A gif showing you how to show hidden files.", + "Click the gear in the upper right corner of c9.io's file structure. Select \"show hidden files\".", + "" + ], + [ + "http://i.imgur.com/qrE8xaK.gif", + "A gif showing you how to create a new file.", + "Right click and create a new file called .env.", + "" + ], + [ + "http://i.imgur.com/sULwMlo.gif", + "A gif showing you how to prep your environmental variables in your .env file.", + "Open your .env file and past this into it, then save it:", + "GITHUB_KEY=", + "GITHUB_SECRET=", + "APP_URL=", + "" + ], + [ + "http://i.imgur.com/BH2qLhB.gif", + "A gif showing you how to open c9.io's preview window.", + "Open up your application in a preview tab by clicking window > share > application > open.", + "" + ], + [ + "http://i.imgur.com/EIiaiPg.gif", + "A gif showing you how to creat ea GitHub app using c9.io's preview URL.", + "Create a GitHub app for authentication and choose an \"Application name\". For the homepage URL, paste the URL from your preview tab. You'll also paste the URL from your preview tab into \"Authorization callback URL\", then add to it: auth/github/callback", + "https://github.com/settings/applications/new" + ], + [ + "http://i.imgur.com/drPlNaE.gif", + "A gif showing you how to transfer GitHub's key and secret over to your .env file, as well as your c9.io URL.", + "GitHub will create an app and present you with a Client ID and a Client Secret. Set your .env file's GITHUB_KEY equal to the Client ID, and set your .env file's GITHUB_SECRET equal to the Client Secret. Copy the URL from the your preview tab and paste it into your .env file as your APP_URL.", + "" + ], + [ + "http://i.imgur.com/VqCmJOh.gif", + "A gif showing you how to update the ajax-functions.js file with your c9.io preview URL.", + "Open app/common/ajax-functions.js and replace \"http://localhost:8080/\" with the URL from your clipboard (the URL from your preview tab).", + "" + ], + [ + "http://i.imgur.com/bLXrt6P.gif", + "A gif showing you how to start mongoDB in c9.io's terminal.", + "In your terminal, start MongoDB by entering mongod --smallfiles", + "" + ], + [ + "http://i.imgur.com/TNygDfF.gif", + "A gif showing you how to open a new tab in c9.io's terminal.", + "Open a new terminal tab with the + button above your terminal, then run npm install", + "" + ], + [ + "http://i.imgur.com/NYk4VeS.gif", + "A gif showing you how to navigate to your preview tab and sign in to your new Clementine.js app.", + "run node server.js to start the server. Refresh your preview tab. You should see the Clementine.js logo. Click \"sign in\" and accept GitHub's prompt to authorize the application.", + "" + ], + [ + "http://i.imgur.com/hA2MCee.gif", + "A gif showing you how to use Clementine.js's simple demo app.", + "Click the \"click me\" button and you'll see that it increments the number clicks. Click the profile button and you'll see that it has your GitHub information.", + "" + ], + [ + "http://i.imgur.com/Q8IfdQj.gif", + "A gif showing you how to create a commit on c9.io, then create a GitHub repository and push your code up to it.", + "Create a commit by typing git add . && git commit -m\"first commit\". Then open GitHub in a new tab and click \"New repository\". Name your repository, then click \"Create repository\". Then copy its .git URL. Return to c9.io's terminal and set your GitHub remote URL: git remote set-url origin followed by the URL you copied from GitHub. Run git push origin master. Now tab back to GitHub and refresh, and you'll see that your code is now on GitHub.", + "" + ] ], - "type": "waypoint", - "challengeType": 2, - "tests": [] + "type": "Waypoint", + "challengeType": 7, + "tests": [], + "nameCn": "", + "descriptionCn": [], + "nameFr": "", + "descriptionFr": [], + "nameRu": "", + "descriptionRu": [], + "nameEs": "", + "descriptionEs": [], + "namePt": "", + "descriptionPt": [] }, { "id": "bd7158d8c443eddfaeb5bdef", diff --git a/seed/challenges/basic-ziplines.json b/seed/challenges/basic-ziplines.json index f133fceac5..b68158ef49 100644 --- a/seed/challenges/basic-ziplines.json +++ b/seed/challenges/basic-ziplines.json @@ -55,7 +55,6 @@ { "id": "bd7158d8c242eddfaeb5bd13", "title": "Build a Personal Portfolio Webpage", - "difficulty": 1.01, "challengeSeed": ["133315782"], "description": [ "Objective: Build a CodePen.io app that successfully reverse-engineers this: http://codepen.io/ThiagoFerreir4/full/eNMxEp.", @@ -109,7 +108,6 @@ { "id": "bd7158d8c442eddfaeb5bd13", "title": "Build a Random Quote Machine", - "difficulty": 1.02, "challengeSeed": ["126415122"], "description": [ "Objective: Build a CodePen.io app that successfully reverse-engineers this: http://codepen.io/AdventureBear/full/vEoVMw.", From 407bd16aaf7b04146f7f1d84d786576e9fccbcbf Mon Sep 17 00:00:00 2001 From: Quincy Larson Date: Tue, 13 Oct 2015 10:04:44 -0700 Subject: [PATCH 16/21] make additional improvements and fixes to step challenges --- seed/challenges/basejumps.json | 4 ++-- seed/challenges/basic-ziplines.json | 4 ++-- seed/challenges/gear-up-for-success.json | 2 +- seed/challenges/getting-started.json | 2 +- server/views/coursewares/showStep.jade | 2 +- server/views/partials/navbar.jade | 2 +- 6 files changed, 8 insertions(+), 8 deletions(-) diff --git a/seed/challenges/basejumps.json b/seed/challenges/basejumps.json index edb7f45792..67a630d701 100644 --- a/seed/challenges/basejumps.json +++ b/seed/challenges/basejumps.json @@ -5,7 +5,7 @@ { "id": "bd7158d8c443eddfaeb5bcef", "title": "Get Set for Basejumps", - "challengeSeed": ["128451852"], + "challengeSeed": [], "description": [ [ "http://i.imgur.com/4IZjWZ3.gif", @@ -16,7 +16,7 @@ [ "http://i.imgur.com/F7i5Hhi.gif", "A gif showing how to fill out the new workspace form", - "On c9.io, give your workspace a name, then leave \"Template\" as custom and create your workspace from this GitHub url: https://github.com/johnstonbl01/clementinejs-fcc.git", + "Instead of starting from scratch, we recommend using Clementine.js, a full stack JavaScript \"boilerplate\" that already has some basic code written for you. On c9.io, give your workspace a name, then leave \"Template\" as custom and create your workspace from this GitHub url: https://github.com/johnstonbl01/clementinejs-fcc.git", "" ], [ diff --git a/seed/challenges/basic-ziplines.json b/seed/challenges/basic-ziplines.json index b68158ef49..e2487d14ef 100644 --- a/seed/challenges/basic-ziplines.json +++ b/seed/challenges/basic-ziplines.json @@ -10,7 +10,7 @@ [ "http://i.imgur.com/6WLULsC.gif", "A gif showing how to create a Codepen account.", - "For our front end Zipline challenges, we'll use a popular browser-based code editor CodePen. Open CodePen and click \"Sign up\" in the upper right hand corner, then scroll down to the free plan and click \"Sign up\" again. Click the \"Use info from GitHub button\", then add your email address and create a password. Click the \"Sign up\" button. Then in the upper right hand corner, click \"New pen\".", + "For our front end Zipline challenges, we'll use a popular browser-based code editor called CodePen. Open CodePen and click \"Sign up\" in the upper right hand corner, then scroll down to the free plan and click \"Sign up\" again. Click the \"Use info from GitHub button\", then add your email address and create a password. Click the \"Sign up\" button. Then in the upper right hand corner, click \"New pen\".", "http://codepen.io" ], [ @@ -28,7 +28,7 @@ [ "http://i.imgur.com/Gi3aig0.gif", "A gif showing the process of adding Animate.css and jQuery to pen.", - "Click the gear in the upper left hand corner of the CSS box, then scroll down to \"Quick add\" and choose Animate.css. Click the gear in the upper left hand corner of the JS box, then scroll down to \"Quick add\" and choose jQuery. Prove that Animate.css and jQuery are loaded properly. In the JS box, add the following code to make your h1 element bounce: $(document).ready(function(){ $(\"h1\").addClass(\"animated bounce\"); });.", + "Click the gear in the upper left hand corner of the CSS box, then scroll down to \"Quick add\" and choose Animate.css. Click the gear in the upper left hand corner of the JS box, then scroll down to \"Quick add\" and choose jQuery. Let's prove that Animate.css and jQuery are loaded properly. In the JS box, add the following code to make your h1 element bounce: $(document).ready(function(){ $(\"h1\").addClass(\"animated bounce\"); });.", "" ], [ diff --git a/seed/challenges/gear-up-for-success.json b/seed/challenges/gear-up-for-success.json index b73404a129..382dc3b43a 100644 --- a/seed/challenges/gear-up-for-success.json +++ b/seed/challenges/gear-up-for-success.json @@ -36,7 +36,7 @@ [ "http://i.imgur.com/4GO4zcI.gif", "A gif showing how you can click the \"Wiki\" button in your upper-right corner to access the wiki.", - "Try this: Click the \"Wiki\" button in your upper right hand corner. Our community has contributed lots of useful information to this searchable wiki.", + "Click the \"Wiki\" button in your upper right hand corner. Our community has contributed lots of useful information to this searchable wiki.", "" ] ], diff --git a/seed/challenges/getting-started.json b/seed/challenges/getting-started.json index bd3638725f..5b32a65023 100644 --- a/seed/challenges/getting-started.json +++ b/seed/challenges/getting-started.json @@ -82,7 +82,7 @@ "https://github.com/settings/profile" ], [ - "http://i.imgur.com/OXL3G3n.gif", + "http://i.imgur.com/pYk0wOk.gif", "A gif showing how you can star a GitHub repo.", "Go to Free Code Camp's open-source repository and \"star\" it. \"Starring\" is the GitHub equivalent of \"liking\" something.", "https://github.com/freecodecamp/freecodecamp" diff --git a/server/views/coursewares/showStep.jade b/server/views/coursewares/showStep.jade index fb375a83d3..274b9e72b3 100644 --- a/server/views/coursewares/showStep.jade +++ b/server/views/coursewares/showStep.jade @@ -6,7 +6,7 @@ block content .thumbnail.challenge-step(class=index !== 0 ? 'hidden': '') img.gif-block.img-center.img-responsive.thumbnail(src='#{step[0]}' alt='#{step[1]}') .caption - p.large-p= step[2] + p.large-p!= step[2] if step[3] a.btn.btn-block.btn-primary.challenge-step-btn-action(id='#{index}' href='#{step[3]}' target='_blank') Open link in new tab if index + 1 === description.length diff --git a/server/views/partials/navbar.jade b/server/views/partials/navbar.jade index 7108bd05b4..18f3320315 100644 --- a/server/views/partials/navbar.jade +++ b/server/views/partials/navbar.jade @@ -14,7 +14,7 @@ nav.navbar.navbar-default.navbar-fixed-top.nav-height li a(href='//gitter.im/FreeCodeCamp/FreeCodeCamp', target='_blank') Chat li - a(href='/news') News + a(href='/news', target='_blank') News li a(href='//github.com/FreeCodeCamp/freecodecamp/wiki/Home', target='_blank') Wiki if !user From d805e9caae264c6cbe6228061e64959c9f9f0b54 Mon Sep 17 00:00:00 2001 From: Quincy Larson Date: Tue, 13 Oct 2015 10:12:26 -0700 Subject: [PATCH 17/21] additional improvements to basejumps --- seed/challenges/basejumps.json | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/seed/challenges/basejumps.json b/seed/challenges/basejumps.json index 67a630d701..a65959e630 100644 --- a/seed/challenges/basejumps.json +++ b/seed/challenges/basejumps.json @@ -16,7 +16,7 @@ [ "http://i.imgur.com/F7i5Hhi.gif", "A gif showing how to fill out the new workspace form", - "Instead of starting from scratch, we recommend using Clementine.js, a full stack JavaScript \"boilerplate\" that already has some basic code written for you. On c9.io, give your workspace a name, then leave \"Template\" as custom and create your workspace from this GitHub url: https://github.com/johnstonbl01/clementinejs-fcc.git", + "Instead of starting from scratch, we recommend using Clementine.js, a full stack JavaScript \"boilerplate\" that already has some basic code written for you. Clementine.js has a detailed tutorial you can go through to build it yourself, but for now let's just clone its code. On c9.io, give your workspace a name, then leave \"Template\" as custom and create your workspace from this GitHub url: https://github.com/johnstonbl01/clementinejs-fcc.git", "" ], [ @@ -34,10 +34,7 @@ [ "http://i.imgur.com/sULwMlo.gif", "A gif showing you how to prep your environmental variables in your .env file.", - "Open your .env file and past this into it, then save it:", - "GITHUB_KEY=", - "GITHUB_SECRET=", - "APP_URL=", + "Open your .env file and paste this into it, then save it:
GITHUB_KEY=
GITHUB_SECRET=
APP_URL=
", "" ], [ @@ -61,7 +58,7 @@ [ "http://i.imgur.com/VqCmJOh.gif", "A gif showing you how to update the ajax-functions.js file with your c9.io preview URL.", - "Open app/common/ajax-functions.js and replace \"http://localhost:8080/\" with the URL from your clipboard (the URL from your preview tab).", + "Open app/common/ajax-functions.js and replace http://localhost:8080/ with the URL from your clipboard (the URL from your preview tab).", "" ], [ @@ -117,7 +114,6 @@ "Objective: Build a full stack JavaScript app that successfully reverse-engineers this: http://votingapp.herokuapp.com/ and deploy it to Heroku.", "Note that for each Basejump, you should create a new GitHub repository and a new Heroku project. If you can't remember how to do this, revisit http://freecodecamp.com/challenges/get-set-for-basejumps.", "As you build your app, you should frequently commit changes to your codebase. You can do this by running git commit -am \"your commit message\". Note that you should replace \"your commit message\" with a brief summary of the changes you made to your code.", - "You can push these new commits to GitHub by running git push origin master, and to Heroku by running grunt --force && grunt buildcontrol:heroku.", "Here are the specific User Stories you should implement for this Basejump:", "User Story: As an authenticated user, I can keep my polls and come back later to access them.", "User Story: As an authenticated user, I can share my polls with my friends.", From 156d0247e91fa400038b7d42e8a82c1d81c977dd Mon Sep 17 00:00:00 2001 From: Quincy Larson Date: Tue, 13 Oct 2015 14:29:32 -0700 Subject: [PATCH 18/21] revert to old basejump.json --- seed/challenges/basejumps.json | 153 ++++++++++++--------------------- 1 file changed, 55 insertions(+), 98 deletions(-) diff --git a/seed/challenges/basejumps.json b/seed/challenges/basejumps.json index a65959e630..b665d28622 100644 --- a/seed/challenges/basejumps.json +++ b/seed/challenges/basejumps.json @@ -5,106 +5,62 @@ { "id": "bd7158d8c443eddfaeb5bcef", "title": "Get Set for Basejumps", - "challengeSeed": [], + "challengeSeed": ["128451852"], "description": [ - [ - "http://i.imgur.com/4IZjWZ3.gif", - "A gif showing how to create a c9.io account.", - "We recommend building our full stack Basejump challenges on c9.io, a powerful browser-based development environment. This save you hours of time that you would spend configuring your local computer to run Node.js and MongoDB - time you could instead spend coding. Create a c9.io account bu clicking the GitHub symbol in the upper right hand corner of the c9.io page. Click the big plus symbol to create a new workspace. Enter your email address when prompted.", - "http://c9.io" - ], - [ - "http://i.imgur.com/F7i5Hhi.gif", - "A gif showing how to fill out the new workspace form", - "Instead of starting from scratch, we recommend using Clementine.js, a full stack JavaScript \"boilerplate\" that already has some basic code written for you. Clementine.js has a detailed tutorial you can go through to build it yourself, but for now let's just clone its code. On c9.io, give your workspace a name, then leave \"Template\" as custom and create your workspace from this GitHub url: https://github.com/johnstonbl01/clementinejs-fcc.git", - "" - ], - [ - "http://i.imgur.com/42m1vyr.gif", - "A gif showing you how to show hidden files.", - "Click the gear in the upper right corner of c9.io's file structure. Select \"show hidden files\".", - "" - ], - [ - "http://i.imgur.com/qrE8xaK.gif", - "A gif showing you how to create a new file.", - "Right click and create a new file called .env.", - "" - ], - [ - "http://i.imgur.com/sULwMlo.gif", - "A gif showing you how to prep your environmental variables in your .env file.", - "Open your .env file and paste this into it, then save it:
GITHUB_KEY=
GITHUB_SECRET=
APP_URL=
", - "" - ], - [ - "http://i.imgur.com/BH2qLhB.gif", - "A gif showing you how to open c9.io's preview window.", - "Open up your application in a preview tab by clicking window > share > application > open.", - "" - ], - [ - "http://i.imgur.com/EIiaiPg.gif", - "A gif showing you how to creat ea GitHub app using c9.io's preview URL.", - "Create a GitHub app for authentication and choose an \"Application name\". For the homepage URL, paste the URL from your preview tab. You'll also paste the URL from your preview tab into \"Authorization callback URL\", then add to it: auth/github/callback", - "https://github.com/settings/applications/new" - ], - [ - "http://i.imgur.com/drPlNaE.gif", - "A gif showing you how to transfer GitHub's key and secret over to your .env file, as well as your c9.io URL.", - "GitHub will create an app and present you with a Client ID and a Client Secret. Set your .env file's GITHUB_KEY equal to the Client ID, and set your .env file's GITHUB_SECRET equal to the Client Secret. Copy the URL from the your preview tab and paste it into your .env file as your APP_URL.", - "" - ], - [ - "http://i.imgur.com/VqCmJOh.gif", - "A gif showing you how to update the ajax-functions.js file with your c9.io preview URL.", - "Open app/common/ajax-functions.js and replace http://localhost:8080/ with the URL from your clipboard (the URL from your preview tab).", - "" - ], - [ - "http://i.imgur.com/bLXrt6P.gif", - "A gif showing you how to start mongoDB in c9.io's terminal.", - "In your terminal, start MongoDB by entering mongod --smallfiles", - "" - ], - [ - "http://i.imgur.com/TNygDfF.gif", - "A gif showing you how to open a new tab in c9.io's terminal.", - "Open a new terminal tab with the + button above your terminal, then run npm install", - "" - ], - [ - "http://i.imgur.com/NYk4VeS.gif", - "A gif showing you how to navigate to your preview tab and sign in to your new Clementine.js app.", - "run node server.js to start the server. Refresh your preview tab. You should see the Clementine.js logo. Click \"sign in\" and accept GitHub's prompt to authorize the application.", - "" - ], - [ - "http://i.imgur.com/hA2MCee.gif", - "A gif showing you how to use Clementine.js's simple demo app.", - "Click the \"click me\" button and you'll see that it increments the number clicks. Click the profile button and you'll see that it has your GitHub information.", - "" - ], - [ - "http://i.imgur.com/Q8IfdQj.gif", - "A gif showing you how to create a commit on c9.io, then create a GitHub repository and push your code up to it.", - "Create a commit by typing git add . && git commit -m\"first commit\". Then open GitHub in a new tab and click \"New repository\". Name your repository, then click \"Create repository\". Then copy its .git URL. Return to c9.io's terminal and set your GitHub remote URL: git remote set-url origin followed by the URL you copied from GitHub. Run git push origin master. Now tab back to GitHub and refresh, and you'll see that your code is now on GitHub.", - "" - ] + "Objective: Get the MEAN stack running on Cloud 9, push your code to GitHub, and deploy it to Heroku.", + "We'll build our Basejumps on Cloud 9, a powerful online code editor with a full Ubuntu Linux workspace, all running in the cloud.", + "If you don't already have Cloud 9 account, create one now at http://c9.io.", + "Now let's get your development environment ready for a new Angular-Fullstack application provided by Yeoman.", + "Open up http://c9.io and sign in to your account.", + "Click on the \"+\" icon at the top right of the c9.io page to create a new workspace.", + "Give your workspace a name and an optional description.", + "Choose Node.js in the selection area below the name field.", + "Click the \"Create workspace\" button.", + "Once C9 builds and loads your workspace, you should see a terminal window in the lower right hand corner. In this window use the following commands. You don't need to know what these mean at this point.", + "Never run this command on your local machine. But in your Cloud 9 terminal window, run: rm -rf * && echo \"export NODE_PATH=$NODE_PATH:/home/ubuntu/.nvm/v0.10.35/lib/node_modules\" >> ~/.bashrc && source ~/.bashrc && npm install -g yo grunt grunt-cli generator-angular-fullstack && yo angular-fullstack", + "Yeoman will prompt you to answer some questions. Answer them like this:", + "What would you like to write scripts with? JavaScript", + "What would you like to write markup with? HTML", + "What would you like to write stylesheets with? CSS", + "What Angular router would you like to use? ngRoute", + "Would you like to include Bootstrap? Yes", + "Would you like to include UI Bootstrap? Yes", + "Would you like to use MongoDB with Mongoose for data modeling? Yes", + "Would you scaffold out an authentication boilerplate? Yes", + "Would you like to include additional oAuth strategies? Twitter", + "Would you like to use socket.io? No", + "May bower anonymously report usage statistics to improve the tool over time? (Y/n) Y", + "You may get an error similar to ERR! EEXIST, open ‘/home/ubuntu/.npm. This is caused when Cloud9 runs out of memory and kills an install. If you get this, simply re-run this process with the command yo angular-fullstack. You will then be asked a few questions regarding the re-install. Answer them as follows:", + "Existing .yo-rc configuration found, would you like to use it? (Y/n) Y", + "Overwrite client/favicon.ico? (Ynaxdh) Y", + "To finish the installation run the commands: bower install && npm install", + "To start MongoDB, run the following commands in your terminal: mkdir data && echo 'mongod --bind_ip=$IP --dbpath=data --nojournal --rest \"$@\"' > mongod && chmod a+x mongod && ./mongod", + "You will want to open up a new terminal to work from by clicking on the + icon and select New Terminal", + "Start the application by running the following command in your new terminal window: grunt serve", + "Wait for the following message to appear: xdg-open: no method available for opening 'http://localhost:8080' . Now you can open the internal Cloud9 browser. To launch the browser select Preview in the toolbar then select the dropdown option Preview Running Application.", + "Turn the folder in which your application is running into a Git repository by running the following commands: git init && git add . && git commit -am 'initial commit'.", + "Now we need to add your GitHub SSH key to c9.io. Click the \"Add-on Services\" button in the lower left of your C9 dashboard. Click \"activate\" next to the GitHub icon.", + "A pop up will appear. Allow access to your account.", + "While still on the dashboard, under “Account Settings”, click the link for \"Show your SSH key\". Copy the key to you clipboard.", + "Sign in to http://github.com and navigate to the GitHub SSH settings page. Click the \"Add SSH Key\". Give your key the title \"cloud 9\". Paste your SSH Key into the \"Key\" box, then click \"Add Key\".", + "Create a new GitHub repository by and clicking on the + button next to your username in the upper-right hand side of your screen, then selecting \"New Repository\".", + "Enter a project name, then click the \"Create Repository\" button.", + "Find the \"...or push an existing repository from the command line\" section and click the Copy to Clipboard button beside it.", + "Paste the commands from your clipboard into the Cloud9 terminal prompt. This will push your changes to your repository on Cloud 9 up to GitHub.", + "Check back on your GitHub profile to verify the changes were successfully pushed up to GitHub.", + "Now let's push your code to Heroku. If you don't already have a Heroku account, create one at http://heroku.com. You shouldn't be charged for anything, but you will need to add your credit card information to your Heroku before you will be able to use Heroku's free MongoLab add on.", + "Before you publish to Heroku, you should free up as much memory as possible on Cloud9. In each of the Cloud9 terminal prompt tabs where MongoDB and Grunt are running, press the control + c hotkey to shut down these processes.", + "Run the following command in a Cloud9 terminal prompt tab: npm install grunt-contrib-imagemin --save-dev && npm install --save-dev && heroku login. At this point, the terminal will prompt you to log in to Heroku from the command line.", + "Now run yo angular-fullstack:heroku. You can choose a name for your Heroku project, or Heroku will create a random one for you. You can choose whether you want to deploy to servers the US or the EU.", + "Set the config flag for your Heroku environment and add MongoLab for your MongoDB instance by running the following command: cd ~/workspace/dist && heroku config:set NODE_ENV=production && heroku addons:add mongolab.", + "As you build your app, you should frequently commit changes to your codebase. Make sure you're in the ~/workspace directory by running cd ~/workspace. Then you can use this code to stage the changes to your changes and commit them: git commit -am \"your commit message\". Note that you should replace \"your commit message\" with a short summary of the changes you made to your code, such as \"added a records controller and corresponding routes\".", + "You can push these new commits to GitHub by running git push origin master, and to Heroku by running grunt --force && grunt buildcontrol:heroku.", + "If you need further guidance on using Yeoman Angular-Fullstack Generator, check out: https://github.com/clnhll/guidetobasejumps.", + "Now you're ready to move on to your first Basejump. Click the \"I've completed this challenge\" and move on." ], - "type": "Waypoint", - "challengeType": 7, - "tests": [], - "nameCn": "", - "descriptionCn": [], - "nameFr": "", - "descriptionFr": [], - "nameRu": "", - "descriptionRu": [], - "nameEs": "", - "descriptionEs": [], - "namePt": "", - "descriptionPt": [] + "type": "waypoint", + "challengeType": 2, + "tests": [] }, { "id": "bd7158d8c443eddfaeb5bdef", @@ -114,6 +70,7 @@ "Objective: Build a full stack JavaScript app that successfully reverse-engineers this: http://votingapp.herokuapp.com/ and deploy it to Heroku.", "Note that for each Basejump, you should create a new GitHub repository and a new Heroku project. If you can't remember how to do this, revisit http://freecodecamp.com/challenges/get-set-for-basejumps.", "As you build your app, you should frequently commit changes to your codebase. You can do this by running git commit -am \"your commit message\". Note that you should replace \"your commit message\" with a brief summary of the changes you made to your code.", + "You can push these new commits to GitHub by running git push origin master, and to Heroku by running grunt --force && grunt buildcontrol:heroku.", "Here are the specific User Stories you should implement for this Basejump:", "User Story: As an authenticated user, I can keep my polls and come back later to access them.", "User Story: As an authenticated user, I can share my polls with my friends.", From 1b784a70ae820d6c765b38a104d55de2b7f0a494 Mon Sep 17 00:00:00 2001 From: Berkeley Martinez Date: Tue, 13 Oct 2015 15:00:46 -0700 Subject: [PATCH 19/21] Fix typo --- seed/challenges/gear-up-for-success.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/seed/challenges/gear-up-for-success.json b/seed/challenges/gear-up-for-success.json index 382dc3b43a..00b6521bf6 100644 --- a/seed/challenges/gear-up-for-success.json +++ b/seed/challenges/gear-up-for-success.json @@ -88,7 +88,7 @@ [ "http://i.imgur.com/Og1ifsn.gif", "A gif showing how you can commit to a goal for your Free Code Camp studies and pledge a monthly donation to a nonprofit to give you external motivation to reach that goal.", - "You can set a goal and pledge to donate to a nonprofit each month until you achieve that goal. give you external motivation in your quest to learn to code, as well as the opportunity to help nonprofits right away. Choose your goal, choose a monthly donation. When you click \"commit\", the nonprofit's donate page will open in a new tab. You can change your committment or stop it at any time.", + "You can set a goal and pledge to donate to a nonprofit each month until you achieve that goal. give you external motivation in your quest to learn to code, as well as the opportunity to help nonprofits right away. Choose your goal, choose a monthly donation. When you click \"commit\", the nonprofit's donate page will open in a new tab. You can change your commitment or stop it at any time.", "/commit" ] ], From b4417a4f4d566a62e7d301559f58861d0be9e66d Mon Sep 17 00:00:00 2001 From: Berkeley Martinez Date: Tue, 13 Oct 2015 20:46:20 -0700 Subject: [PATCH 20/21] fix diff array should be free of duplicates --- seed/challenges/intermediate-bonfires.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/seed/challenges/intermediate-bonfires.json b/seed/challenges/intermediate-bonfires.json index 5a4cf71a59..248382e6f3 100644 --- a/seed/challenges/intermediate-bonfires.json +++ b/seed/challenges/intermediate-bonfires.json @@ -68,7 +68,7 @@ "assert.includeMembers(diff([1, \"calf\", 3, \"piglet\"], [1, \"calf\", 3, 4]), [\"piglet\", 4], 'message: [1, \"calf\", 3, \"piglet\"], [1, \"calf\", 3, 4] should return [\"piglet\", 4].');", "assert.deepEqual(diff([], [\"snuffleupagus\", \"cookie monster\", \"elmo\"]), [\"snuffleupagus\", \"cookie monster\", \"elmo\"], 'message: [], [\"snuffleupagus\", \"cookie monster\", \"elmo\"] should return [\"snuffleupagus\", \"cookie monster\", \"elmo\"].');", "assert.includeMembers(diff([1, \"calf\", 3, \"piglet\"], [7, \"filly\"]), [1, \"calf\", 3, \"piglet\", 7, \"filly\"], 'message: [1, \"calf\", 3, \"piglet\"], [7, \"filly\"] should return [1, \"calf\", 3, \"piglet\", 7, \"filly\"].');", - "assert.deepEqual(diff([1, 2, 3, 3], [1]), [2, 3, 3], 'message: [1, 2, 3, 3], [1] should return [2, 3, 3].');" + "assert.deepEqual(diff([1, 2, 3, 3], [1]), [2, 3], 'message: [1, 2, 3, 3], [1] should return [2, 3].');" ], "MDNlinks": [ "Comparison Operators", From df56b85cd55110669e773e3132e2baa91f8e5370 Mon Sep 17 00:00:00 2001 From: Michael Kebe Date: Wed, 14 Oct 2015 22:45:50 +0200 Subject: [PATCH 21/21] Added more tests to Bonfire: Validate US Telephone Numbers --- seed/challenges/advanced-bonfires.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/seed/challenges/advanced-bonfires.json b/seed/challenges/advanced-bonfires.json index e6dc2474c3..8ff025e2fe 100644 --- a/seed/challenges/advanced-bonfires.json +++ b/seed/challenges/advanced-bonfires.json @@ -40,7 +40,9 @@ "assert(telephoneCheck(\"27576227382\") === false, 'message: telephoneCheck(\"27576227382\") should return false.');", "assert(telephoneCheck(\"(275)76227382\") === false, 'message: telephoneCheck(\"(275)76227382\") should return false.');", "assert(telephoneCheck(\"2(757)6227382\") === false, 'message: telephoneCheck(\"2(757)6227382\") should return false.');", - "assert(telephoneCheck(\"2(757)622-7382\") === false, 'message: telephoneCheck(\"2(757)622-7382\") should return false.');" + "assert(telephoneCheck(\"2(757)622-7382\") === false, 'message: telephoneCheck(\"2(757)622-7382\") should return false.');", + "assert(telephoneCheck(\"555)-555-5555\") === false, 'message: telephoneCheck(\"555)555-5555\") should return false.');", + "assert(telephoneCheck(\"(555-555-5555\") === false, 'message: telephoneCheck(\"(555-555-5555\") should return false.');" ], "challengeSeed": [ "function telephoneCheck(str) {",