var firstName = \"Julie\"
, we could find out how long the string \"Julie\" is by using the firstName.length
property."
],
"tests": [
- "assert((function(){if(typeof(lastNameLength) != 'undefined' && typeof(lastNameLength) == 'number' && lastNameLength == 4){return(true);}else{return(false);}})(), 'lastNameLength should be equal to four')"
+ "assert((function(){if(typeof(lastNameLength) != 'undefined' && typeof(lastNameLength) == 'number' && lastNameLength == 4){return(true);}else{return(false);}})(), 'lastNameLength should be equal to four')",
+ "assert((function(){if(editor.getValue().match(/\\.length/gi).length >= 2 && editor.getValue().match(/var lastNameLength \\= 0;/gi).length >= 1){return(true);}else{return(false);}})(), 'You should be getting the length of lastName
by using .length like this lastName.length
');"
],
"challengeSeed": [
+ "var firstNameLength = 0;",
+ "var lastNameLength = 0;",
"var firstName = \"Madeline\";",
"",
- "var firstNameLength = firstName.length;",
+ "firstNameLength = firstName.length;",
"",
"var lastName = \"Chen\";",
"",
- "var lastNameLength = lastName;",
+ "lastNameLength = lastName;",
"",
"",
"",
"// You can ignore this.",
"// We use this to show you the value of your variable in your output box.",
"// We'll learn about functions soon.",
- "if(typeof(lastNameLength) != 'undefined')(function(v){return(v);})(lastNameLength);}"
+ "if(typeof(lastNameLength) != 'undefined'){(function(v){return(v);})(lastNameLength);}"
],
"challengeType": 1
},
@@ -154,16 +157,19 @@
"Try looking at the firstLetterOfFirstName
variable declaration if you get stuck."
],
"tests": [
- "assert((function(){if(typeof(firstLetterOfLastName) != 'undefined' && typeof(firstLetterOfLastName) == 'string' && firstLetterOfLastName == 'C'){return(true);}else{return(false);}})(), 'The first letter of firstLetterOfLastName should be a C');"
+ "assert((function(){if(typeof(firstLetterOfLastName) != 'undefined' && editor.getValue().match(/\\[0\\]/gi) && typeof(firstLetterOfLastName) == 'string' && firstLetterOfLastName == 'C'){return(true);}else{return(false);}})(), 'The first letter of firstLetterOfLastName should be a C');"
],
"challengeSeed": [
+ "var firstLetterOfLastName = \"\"",
+ "var firstLetterOfLastName = \"\"",
+ "",
"var firstName = \"Madeline\";",
"",
- "var firstLetterOfFirstName = firstName[0];",
+ "firstLetterOfFirstName = firstName[0];",
"",
"var lastName = \"Chen\";",
"",
- "var firstLetterOfLastName = lastName;",
+ "firstLetterOfLastName = lastName;",
"",
"",
"// You can ignore this.",
@@ -562,7 +568,7 @@
"difficulty": "9.9818",
"description": [
"",
- "Now that we've learn how to pop
things from the end of the array, we need to learn how to push
stuff back to the end",
+ "Now that we've learned how to pop
things from the end of the array, we need to learn how to push
stuff back to the end",
"Let's take the code we had last time and push
this value to the end: ['dog', 3]
"
],
"tests": [
@@ -644,7 +650,7 @@
"Let's try creating and calling a function now called myFunction
"
],
"tests":[
- "assert((function(){if(typeof(f) !== 'undefined' && typeof(f) === 'number' && f === a + b && editor.getValue().match(RegExp('return\\\\(a\\\\+b\\\\)', 'g')).length >= 1){return(true);}else{return(false);}})(), 'Your function should return the value of a + b');"
+ "assert((function(){if(typeof(f) !== 'undefined' && typeof(f) === 'number' && f === a + b && editor.getValue().match(/return/gi).length >= 1 && editor.getValue().match(/a/gi).length >= 1 && editor.getValue().match(/b/gi).length >= 1 && editor.getValue().match(/\\+/gi).length >= 1){return(true);}else{return(false);}})(), 'Your function should return the value of a + b');"
],
"challengeSeed":[
"var a = 4;",
@@ -794,7 +800,7 @@
"description":[
"",
"Loops are a critical part of any program! The next few challenges",
- "first we will be taking a look at the for loop",
+ "first we will be taking a look at the while loop",
"",
"var ourArray = [];",
"var i = 0;",
diff --git a/seed/challenges/bootstrap.json b/seed/challenges/bootstrap.json
index ea01b15573..c0b4014f93 100644
--- a/seed/challenges/bootstrap.json
+++ b/seed/challenges/bootstrap.json
@@ -797,8 +797,8 @@
"Delete the \".red-text\", \"p\", and \".smaller-image\" CSS declarations from your style
element so that the only declarations left in your style
element are \"h2\" and \"thick-green-border\". Then Delete the p
element that contains a dead link. Then remove the \"red-text\" class from your h2
element and replace it with the \"text-primary\" Bootstrap class. Finally, remove the \"smaller-image\" class from your first img
element and replace it with the img-responsive
class."
],
"tests": [
- "assert(!$('h2').hasClass('red-text'), 'You h2 element should no longer have the class \"red-text\".')",
- "assert($('h2').hasClass('text-primary'), 'You h2 element should now have the class \"text-primary\".')",
+ "assert(!$('h2').hasClass('red-text'), 'Your h2 element should no longer have the class \"red-text\".')",
+ "assert($('h2').hasClass('text-primary'), 'Your h2 element should now have the class \"text-primary\".')",
"assert(!$('p').css('font-family').match(/monospace/i), 'Your paragraph elements should no longer use the font \"Monospace\".')",
"assert(!$('img').hasClass('smaller-image'), 'Remove the \"smaller-image\" class from your top image.')",
"assert($('.img-responsive').length > 1, 'Add the \"img-responsive\" class to your top image.')"
@@ -1874,7 +1874,7 @@
},
{
"id": "bad87fee1348bd9aec908854",
- "name": "Waypoint: Label Boostrap Wells",
+ "name": "Waypoint: Label Bootstrap Wells",
"dashedName": "waypoint-label-bootstrap-wells",
"difficulty": 2.26,
"description": [
@@ -1883,9 +1883,9 @@
"Above your right-well, inside its \"col-xs-6\" div
element, add a h4
element with the text \"#right-well\"."
],
"tests": [
- "assert($('.col-xs-12').children('h4') && $('.col-xs-12').children('h4').length > 1, 'Add an h4
element to each of your <div class='col-xs-6'>
elements.')",
- "assert(new RegExp('#left-well','gi').test($('h4').text()), 'One h4
element should have the text \"#left-well\".')",
- "assert(new RegExp('#right-well','gi').test($('h4').text()), 'One h4
element should have the text \"#right-well\".')"
+ "assert($('.col-xs-12').children('h4') && $('.col-xs-12').children('h4').length > 1, 'Add an h4
element to each of your <div class=\\'col-xs-6\\'>
elements.');",
+ "assert(new RegExp('#left-well','gi').test($('h4').text()), 'One h4
element should have the text \"#left-well\".');",
+ "assert(new RegExp('#right-well','gi').test($('h4').text()), 'One h4
element should have the text \"#right-well\".');"
],
"challengeSeed": [
"",
@@ -1930,12 +1930,12 @@
"Give each of your buttons a unique id like, starting with \"target1\" and ending with \"target6\"."
],
"tests": [
- "assert($('#target1') && $('#target1').length > 0, 'One button
element should have the id \"#target1\".')",
- "assert($('#target2') && $('#target2').length > 0, 'One button
element should have the id \"#target2\".')",
- "assert($('#target3') && $('#target3').length > 0, 'One button
element should have the id \"#target3\".')",
- "assert($('#target4') && $('#target4').length > 0, 'One button
element should have the id \"#target4\".')",
- "assert($('#target5') && $('#target5').length > 0, 'One button
element should have the id \"#target5\".')",
- "assert($('#target6') && $('#target6').length > 0, 'One button
element should have the id \"#target6\".')"
+ "assert($('#target1') && $('#target1').length > 0, 'One button
element should have the id \"target1\".')",
+ "assert($('#target2') && $('#target2').length > 0, 'One button
element should have the id \"target2\".')",
+ "assert($('#target3') && $('#target3').length > 0, 'One button
element should have the id \"target3\".')",
+ "assert($('#target4') && $('#target4').length > 0, 'One button
element should have the id \"target4\".')",
+ "assert($('#target5') && $('#target5').length > 0, 'One button
element should have the id \"target5\".')",
+ "assert($('#target6') && $('#target6').length > 0, 'One button
element should have the id \"target6\".')"
],
"challengeSeed": [
"",
diff --git a/seed/challenges/jquery-ajax-and-json.json b/seed/challenges/jquery-ajax-and-json.json
index 92509ffade..d482a60f3f 100644
--- a/seed/challenges/jquery-ajax-and-json.json
+++ b/seed/challenges/jquery-ajax-and-json.json
@@ -160,8 +160,8 @@
"Make all the button
element with the id \"target3\" fadeOut. $('#target3').addClass('animated fadeOut')
."
],
"tests": [
- "$('#target3').hasClass('animated') && $('#target3').hasClass('fadeOut'), 'Select the button
element with the id
of \"target3\" and use the jQuery addClass()
function to give it the classes of \"animated\" and \"fadeOut\".')",
- "assert(!editor.match(/class.*animated/g), 'Only use jQuery to add these classes to the element.')"
+ "assert($('#target3').hasClass('animated') && $('#target3').hasClass('fadeOut'), 'Select the button
element with the id
of \"target3\" and use the jQuery addClass()
function to give it the classes of \"animated\" and \"fadeOut\".');",
+ "assert(!editor.match(/class.*animated/g), 'Only use jQuery to add these classes to the element.');"
],
"challengeSeed": [
"fccss",
diff --git a/server/boot/challenge.js b/server/boot/challenge.js
index 8a74822b34..5e0cc37f0d 100644
--- a/server/boot/challenge.js
+++ b/server/boot/challenge.js
@@ -372,7 +372,7 @@ module.exports = function(app) {
function completedZiplineOrBasejump(req, res, next) {
- var completedWith = req.body.challengeInfo.completedWith || false;
+ var completedWith = req.body.challengeInfo.completedWith || '';
var completedDate = Math.round(+new Date());
var challengeId = req.body.challengeInfo.challengeId;
var solutionLink = req.body.challengeInfo.publicURL;
@@ -423,17 +423,17 @@ module.exports = function(app) {
pairedWith: pairedWith
};
})
- .doOnNext(function(dats) {
+ .doOnNext(function({ user, pairedWith }) {
updateUserProgress(
- dats.user,
+ user,
challengeId,
- dats.pairedWith ?
- assign({ completedWith: dats.pairedWith.id }, challengeData) :
+ pairedWith ?
+ assign({ completedWith: pairedWith.id }, challengeData) :
challengeData
);
})
- .flatMap(function(dats) {
- return Rx.Observable.from([dats.user, dats.pairedWith]);
+ .flatMap(function({ user, pairedWith }) {
+ return Rx.Observable.from([user, pairedWith]);
})
// save users
.flatMap(function(user) {
diff --git a/server/server.js b/server/server.js
index c8967df128..fe0e924a55 100755
--- a/server/server.js
+++ b/server/server.js
@@ -186,11 +186,6 @@ passportConfigurator.init();
app.use(rxMiddleware());
app.use(function(req, res, next) {
- // add beta warning
- req.flash('info', {
- msg: `warning: you are on experimental branch of Free Code Camp:
- Your progress here may or may not be saved to the main site`
- });
// Make user object available in templates.
res.locals.user = req.user;
diff --git a/server/views/account/account.jade b/server/views/account/account.jade
index dd9d3d9c47..0dc4e5cb2c 100644
--- a/server/views/account/account.jade
+++ b/server/views/account/account.jade
@@ -261,31 +261,31 @@ block content
.panel-heading.text-center Manage your account here:
.panel-body
if (!user.google || !user.facebook || !user.linkedin || !user.twitter)
- if (!user.google)
+ if (!user.github)
.col-xs-12
- a.btn.btn-lg.btn-block.btn-google-plus.btn-link-social(href='/auth/google')
- i.fa.fa-google-plus
- | Link Google with my account
- if (!user.facebook)
- .col-xs-12
- a.btn.btn-lg.btn-block.btn-facebook.btn-link-social(href='/auth/facebook')
- i.fa.fa-facebook
- | Link Facebook with my account
- //if (!user.github)
- // .col-xs-12
- // a.btn.btn-lg.btn-block.btn-github.btn-link-social(href='/auth/github')
- // i.fa.fa-github
- // | Link GitHub with my account
- if (!user.linkedin)
- .col-xs-12
- a.btn.btn-lg.btn-block.btn-linkedin.btn-link-social(href='/auth/linkedin')
- i.fa.fa-linkedin
- | Link LinkedIn with my account
+ a.btn.btn-lg.btn-block.btn-github.btn-link-social(href='/auth/github')
+ i.fa.fa-github
+ | Link GitHub with my account
if (!user.twitter)
.col-xs-12
a.btn.btn-lg.btn-block.btn-twitter.btn-link-social(href='/auth/twitter')
i.fa.fa-twitter
| Link Twitter with my account
+ if (!user.google)
+ .col-xs-12
+ a.btn.btn-lg.btn-block.btn-google-plus.btn-link-social.disabled(href='#')
+ i.fa.fa-google-plus
+ | Link Google with my account
+ if (!user.facebook)
+ .col-xs-12
+ a.btn.btn-lg.btn-block.btn-facebook.btn-link-social.disabled(href='#')
+ i.fa.fa-facebook
+ | Link Facebook with my account
+ if (!user.linkedin)
+ .col-xs-12
+ a.btn.btn-lg.btn-block.btn-linkedin.btn-link-social.disabled(href='#')
+ i.fa.fa-linkedin
+ | Link LinkedIn with my account
.col-xs-12
a.btn.btn-lg.btn-block.btn-warning.btn-link-social(href='/logout')
span.ion-android-exit
diff --git a/server/views/account/signin.jade b/server/views/account/signin.jade
index 878b278ba4..0e2e22a9ab 100644
--- a/server/views/account/signin.jade
+++ b/server/views/account/signin.jade
@@ -8,13 +8,13 @@ block content
a.btn.btn-lg.btn-block.btn-twitter.btn-social(href='/auth/twitter')
i.fa.fa-twitter
| Sign in with Twitter
- a.btn.btn-lg.btn-block.btn-facebook.btn-social(href='/auth/facebook')
+ a.btn.btn-lg.btn-block.btn-facebook.btn-social.disabled(href='#')
i.fa.fa-facebook
| Sign in with Facebook
- a.btn.btn-lg.btn-block.btn-google-plus.btn-social(href='/auth/google')
+ a.btn.btn-lg.btn-block.btn-google-plus.btn-social.disabled(href='#')
i.fa.fa-google-plus
| Sign in with Google
- a.btn.btn-lg.btn-block.btn-linkedin.btn-social(href='/auth/linkedin')
+ a.btn.btn-lg.btn-block.btn-linkedin.btn-social.disabled(href='#')
i.fa.fa-linkedin
| Sign in with LinkedIn
br