Merge branch 'staging' into clementine
This commit is contained in:
@ -1,31 +1,49 @@
|
||||
// common namespace
|
||||
// all classes should be stored here
|
||||
var common = common || {
|
||||
// init is an array of functions that are
|
||||
// called at the beginning of dom ready
|
||||
init: []
|
||||
};
|
||||
var common = (function() {
|
||||
// common namespace
|
||||
// all classes should be stored here
|
||||
var common = window.common || {
|
||||
// init is an array of functions that are
|
||||
// called at the beginning of dom ready
|
||||
init: []
|
||||
};
|
||||
|
||||
common.challengeName = common.challengeName || window.challenge_Name ?
|
||||
window.challenge_Name :
|
||||
'';
|
||||
common.challengeName = common.challengeName || window.challenge_Name ?
|
||||
window.challenge_Name :
|
||||
'';
|
||||
|
||||
common.challengeType = common.challengeType || window.challengeType ?
|
||||
window.challengeType :
|
||||
0;
|
||||
common.challengeType = common.challengeType || window.challengeType ?
|
||||
window.challengeType :
|
||||
0;
|
||||
|
||||
common.challengeId = common.challengeId || window.challenge_Id;
|
||||
common.challengeId = common.challengeId || window.challenge_Id;
|
||||
|
||||
common.challengeSeed = common.challengeSeed || window.challengeSeed ?
|
||||
window.challengeSeed :
|
||||
[];
|
||||
common.challengeSeed = common.challengeSeed || window.challengeSeed ?
|
||||
window.challengeSeed :
|
||||
[];
|
||||
|
||||
common.seed = common.challengeSeed.reduce(function(seed, line) {
|
||||
return seed + line + '\n';
|
||||
}, '');
|
||||
common.seed = common.challengeSeed.reduce(function(seed, line) {
|
||||
return seed + line + '\n';
|
||||
}, '');
|
||||
|
||||
common.replaceScriptTags = function replaceScriptTags(value) {
|
||||
return value
|
||||
.replace(/<script>/gi, 'fccss')
|
||||
.replace(/<\/script>/gi, 'fcces');
|
||||
};
|
||||
|
||||
common.replaceSafeTags = function replaceSafeTags(value) {
|
||||
return value
|
||||
.replace(/fccss/gi, '<script>')
|
||||
.replace(/fcces/gi, '</script>');
|
||||
};
|
||||
|
||||
return common;
|
||||
})();
|
||||
|
||||
// store code in the URL
|
||||
common.codeUri = (function(common, encode, decode, location, history) {
|
||||
var replaceScriptTags = common.replaceScriptTags;
|
||||
var replaceSafeTags = common.replaceSafeTags;
|
||||
var codeUri = {
|
||||
encode: function(code) {
|
||||
return encode(code);
|
||||
@ -67,7 +85,7 @@ common.codeUri = (function(common, encode, decode, location, history) {
|
||||
null,
|
||||
location.href.split('?')[0]
|
||||
);
|
||||
location.hash = '#?' + query;
|
||||
location.hash = '#?' + replaceScriptTags(query);
|
||||
}
|
||||
} else {
|
||||
query = location.hash.replace(/^\#\?/, '');
|
||||
@ -82,13 +100,15 @@ common.codeUri = (function(common, encode, decode, location, history) {
|
||||
var key = param.split('=')[0];
|
||||
var value = param.split('=')[1];
|
||||
if (key === 'solution') {
|
||||
return codeUri.decode(value);
|
||||
return replaceSafeTags(codeUri.decode(value || ''));
|
||||
}
|
||||
return solution;
|
||||
}, null);
|
||||
},
|
||||
querify: function(solution) {
|
||||
location.hash = '?solution=' + codeUri.encode(solution);
|
||||
location.hash = '?solution=' +
|
||||
codeUri.encode(replaceScriptTags(solution));
|
||||
|
||||
return solution;
|
||||
}
|
||||
};
|
||||
@ -306,12 +326,6 @@ var sandBox = (function(jailed, codeOutput) {
|
||||
return sandBox;
|
||||
}(window.jailed, common.codeOutput));
|
||||
|
||||
function replaceSafeTags(value) {
|
||||
return value
|
||||
.replace(/fccss/gi, '<script>')
|
||||
.replace(/fcces/gi, '</script>');
|
||||
}
|
||||
|
||||
var BDDregex = new RegExp(
|
||||
'(expect(\\s+)?\\(.*\\;)|' +
|
||||
'(assert(\\s+)?\\(.*\\;)|' +
|
||||
@ -416,7 +430,7 @@ var editor = (function(CodeMirror, emmetCodeMirror, common) {
|
||||
common.seed;
|
||||
}
|
||||
|
||||
editor.setValue(replaceSafeTags(editorValue));
|
||||
editor.setValue(common.replaceSafeTags(editorValue));
|
||||
editor.refresh();
|
||||
});
|
||||
|
||||
@ -659,7 +673,7 @@ function showCompletion() {
|
||||
}
|
||||
|
||||
var resetEditor = function resetEditor() {
|
||||
editor.setValue(replaceSafeTags(common.seed));
|
||||
editor.setValue(common.replaceSafeTags(common.seed));
|
||||
$('#testSuite').empty();
|
||||
bonfireExecute(true);
|
||||
common.codeStorage.updateStorage();
|
||||
|
@ -490,6 +490,10 @@ thead {
|
||||
border-radius: 5px;
|
||||
}
|
||||
|
||||
.story-section {
|
||||
min-height: 500px;
|
||||
}
|
||||
|
||||
.testimonial-copy {
|
||||
font-size: 20px;
|
||||
text-align: center;
|
||||
|
@ -1,12 +1,19 @@
|
||||
var mapShareKey = 'map-shares';
|
||||
var main = window.main || {};
|
||||
|
||||
main.mapShareKey = 'map-shares';
|
||||
|
||||
var lastCompleted = typeof lastCompleted !== 'undefined' ?
|
||||
lastCompleted :
|
||||
'';
|
||||
|
||||
function getMapShares() {
|
||||
var alreadyShared = JSON.parse(localStorage.getItem(mapShareKey) || '[]');
|
||||
var alreadyShared = JSON.parse(
|
||||
localStorage.getItem(main.mapShareKey) ||
|
||||
'[]'
|
||||
);
|
||||
|
||||
if (!alreadyShared || !Array.isArray(alreadyShared)) {
|
||||
localStorage.setItem(mapShareKey, JSON.stringify([]));
|
||||
localStorage.setItem(main.mapShareKey, JSON.stringify([]));
|
||||
alreadyShared = [];
|
||||
}
|
||||
return alreadyShared;
|
||||
@ -23,7 +30,7 @@ function setMapShare(id) {
|
||||
if (!found) {
|
||||
alreadyShared.push(id);
|
||||
}
|
||||
localStorage.setItem(mapShareKey, JSON.stringify(alreadyShared));
|
||||
localStorage.setItem(main.mapShareKey, JSON.stringify(alreadyShared));
|
||||
return alreadyShared;
|
||||
}
|
||||
|
||||
|
55
common/models/pledge.json
Normal file
55
common/models/pledge.json
Normal file
@ -0,0 +1,55 @@
|
||||
{
|
||||
"name": "pledge",
|
||||
"base": "PersistedModel",
|
||||
"idInjection": true,
|
||||
"trackChanges": false,
|
||||
"properties": {
|
||||
"nonprofit": {
|
||||
"type": "string",
|
||||
"index": true
|
||||
},
|
||||
"amount": {
|
||||
"type": "number"
|
||||
},
|
||||
"dateStarted": {
|
||||
"type": "date",
|
||||
"defaultFn": "now"
|
||||
},
|
||||
"dateEnded": {
|
||||
"type": "date"
|
||||
},
|
||||
"formerUserId": {
|
||||
"type": "string"
|
||||
},
|
||||
"isOrphaned": {
|
||||
"type": "boolean"
|
||||
},
|
||||
"isCompleted": {
|
||||
"type": "boolean",
|
||||
"default": "false"
|
||||
}
|
||||
},
|
||||
"validations": [],
|
||||
"relations": {
|
||||
"user": {
|
||||
"type": "hasMany",
|
||||
"model": "user",
|
||||
"foreignKey": "userId"
|
||||
}
|
||||
},
|
||||
"acls": [
|
||||
{
|
||||
"accessType": "*",
|
||||
"principalType": "ROLE",
|
||||
"principalId": "$everyone",
|
||||
"permission": "DENY"
|
||||
},
|
||||
{
|
||||
"accessType": "READ",
|
||||
"principalType": "ROLE",
|
||||
"principalId": "$everyone",
|
||||
"permission": "ALLOW"
|
||||
}
|
||||
],
|
||||
"methods": []
|
||||
}
|
@ -166,6 +166,11 @@
|
||||
"type": "hasMany",
|
||||
"model": "userIdentity",
|
||||
"foreignKey": ""
|
||||
},
|
||||
"pledge": {
|
||||
"type": "hasOne",
|
||||
"model": "pledge",
|
||||
"foreignKey": ""
|
||||
}
|
||||
},
|
||||
"acls": [
|
||||
|
@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "Basic Algorithm Scripting",
|
||||
"order": 7,
|
||||
"order": 8,
|
||||
"challenges": [
|
||||
{
|
||||
"id": "ad7123c8c441eddfaeb5bdef",
|
||||
@ -378,7 +378,7 @@
|
||||
"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: <code>truncate(\"A-tisket a-tasket A green and yellow basket\", 1)</code> should return \"A-tisket...\".');",
|
||||
"assert(truncate(\"A-tisket a-tasket A green and yellow basket\", 11) === \"A-tisket...\", 'message: <code>truncate(\"A-tisket a-tasket A green and yellow basket\", 11)</code> should return \"A-tisket...\".');",
|
||||
"assert(truncate(\"Peter Piper picked a peck of pickled peppers\", 14) === \"Peter Piper...\", 'message: <code>truncate(\"Peter Piper picked a peck of pickled peppers\", 14)</code> should return \"Peter Piper...\".');",
|
||||
"assert(truncate(\"A-tisket a-tasket A green and yellow basket\", \"A-tisket a-tasket A green and yellow basket\".length) === \"A-tisket a-tasket A green and yellow basket\", 'message: <code>truncate(\"A-tisket a-tasket A green and yellow basket\", \"A-tisket a-tasket A green and yellow basket\".length)</code> should return \"A-tisket a-tasket A green and yellow basket\".');",
|
||||
"assert(truncate('A-tisket a-tasket A green and yellow basket', 'A-tisket a-tasket A green and yellow basket'.length + 2) === 'A-tisket a-tasket A green and yellow basket', 'message: <code>truncate(\"A-tisket a-tasket A green and yellow basket\", \"A-tisket a-tasket A green and yellow basket\".length + 2)</code> should return \"A-tisket a-tasket A green and yellow basket\".');"
|
||||
|
@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "Basic JavaScript",
|
||||
"order": 5,
|
||||
"order": 6,
|
||||
"challenges": [
|
||||
{
|
||||
"id":"bd7123c9c441eddfaeb4bdef",
|
||||
@ -1039,7 +1039,7 @@
|
||||
],
|
||||
"tests":[
|
||||
"assert(test === 2, 'message: Your RegEx should have found two numbers in the <code>testString</code>.');",
|
||||
"assert(editor.getValue().match(/\\/\\\\d\\+\\//gi), 'message: You should be using the following expression <code>/\\\\d+/gi</code> to find the numbers in the <code>testString</code>.');"
|
||||
"assert(editor.getValue().match(/\\/\\\\d\\+\\//g), 'message: You should be using the following expression <code>/\\d+/g</code> to find the numbers in the <code>testString</code>.');"
|
||||
],
|
||||
"challengeSeed":[
|
||||
"var test = (function() {",
|
||||
@ -1047,7 +1047,7 @@
|
||||
"",
|
||||
" // Only change code below this line.",
|
||||
"",
|
||||
" var expression = /.+/gi;",
|
||||
" var expression = /.+/g;",
|
||||
"",
|
||||
" // Only change code above this line.",
|
||||
" // We use this function to show you the value of your variable in your output box.",
|
||||
@ -1069,7 +1069,7 @@
|
||||
],
|
||||
"tests":[
|
||||
"assert(test === 7, 'message: Your RegEx should have found seven spaces in the <code>testString</code>.');",
|
||||
"assert(editor.getValue().match(/\\/\\\\s\\+\\//gi), 'message: You should be using the following expression <code>/\\\\s+/gi</code> to find the spaces in the <code>testString</code>.');"
|
||||
"assert(editor.getValue().match(/\\/\\\\s\\+\\//g), 'message: You should be using the following expression <code>/\\s+/g</code> to find the spaces in the <code>testString</code>.');"
|
||||
],
|
||||
"challengeSeed":[
|
||||
"var test = (function(){",
|
||||
@ -1077,7 +1077,7 @@
|
||||
"",
|
||||
" // Only change code below this line.",
|
||||
"",
|
||||
" var expression = /.+/gi;",
|
||||
" var expression = /.+/g;",
|
||||
"",
|
||||
" // Only change code above this line.",
|
||||
" // We use this function to show you the value of your variable in your output box.",
|
||||
@ -1092,12 +1092,12 @@
|
||||
"title": "Invert Regular Expression Matches with JavaScript",
|
||||
"difficulty":"9.987",
|
||||
"description":[
|
||||
"Use <code>/\\S/gi</code> to match everything that isn't a space in the string.",
|
||||
"Use <code>/\\S/g</code> to match everything that isn't a space in the string.",
|
||||
"You can invert any match by using the uppercase version of the selector <code>\\s</code> versus <code>\\S</code> for example."
|
||||
],
|
||||
"tests":[
|
||||
"assert(test === 49, 'message: Your RegEx should have found forty nine non-space characters in the <code>testString</code>.');",
|
||||
"assert(editor.getValue().match(/\\/\\\\S\\/gi/gi), 'message: You should be using the following expression <code>/\\\\S/gi</code> to find non-space characters in the <code>testString</code>.');"
|
||||
"assert(editor.getValue().match(/\\/\\\\S\\/g/g), 'message: You should be using the following expression <code>/\\S/g</code> to find non-space characters in the <code>testString</code>.');"
|
||||
],
|
||||
"challengeSeed":[
|
||||
"var test = (function(){",
|
||||
@ -1105,7 +1105,7 @@
|
||||
"",
|
||||
" // Only change code below this line.",
|
||||
"",
|
||||
" var expression = /./gi;",
|
||||
" var expression = /./g;",
|
||||
"",
|
||||
" // Only change code above this line.",
|
||||
" // We use this function to show you the value of your variable in your output box.",
|
||||
|
@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "Basic Front End Development Projects",
|
||||
"order": 8,
|
||||
"order": 9,
|
||||
"challenges": [
|
||||
{
|
||||
"id": "bd7158d8c442eddfbeb5bd1f",
|
||||
|
@ -9,7 +9,7 @@
|
||||
"Now let's go back to our Cat Photo App. This time, we'll style it using the popular Bootstrap responsive CSS framework.",
|
||||
"Bootstrap will figure out how wide your screen is and respond by resizing your HTML elements - hence the name <code>Responsive Design</code>.",
|
||||
"With responsive design, there is no need to design a mobile version of your website. It will look good on devices with screens of any width.",
|
||||
"You can add Bootstrap to any app just by including it with <code><link rel=\"stylesheet\" href=\"//maxcdn.bootstrapcdn.com/bootstrap/3.3.1/css/bootstrap.min.css\"/></code> at the top of your HTML. But we've gone ahead and automatically added it to your Cat Photo App for you.",
|
||||
"You can add Bootstrap to any app just by including it with <code><link rel=\"stylesheet\" href=\"//maxcdn.bootstrapcdn.com/bootstrap/3.3.1/css/bootstrap.min.css\"/></code> at the top of your HTML. But we've added it for you to this page behind the scenes.",
|
||||
"To get started, we should nest all of our HTML in a <code>div</code> element with the class <code>container-fluid</code>."
|
||||
],
|
||||
"tests": [
|
||||
|
110
seed/challenges/gear-up-for-success.json
Normal file
110
seed/challenges/gear-up-for-success.json
Normal file
@ -0,0 +1,110 @@
|
||||
{
|
||||
"name": "Gear up for Success",
|
||||
"order": 4,
|
||||
"challenges": [
|
||||
{
|
||||
"id": "560add65cb82ac38a17513c2",
|
||||
"title": "Browse Camper News",
|
||||
"challengeSeed": [],
|
||||
"description": [
|
||||
[
|
||||
"http://i.imgur.com/nmSiMy1.gif",
|
||||
"A gif showing how you can access our Camper News page and click the \"upvote\" button to upvote a story.",
|
||||
"Click the \"News\" button in your upper right hand corner. You can browse links on Camper News and upvote ones that you enjoy.",
|
||||
""
|
||||
]
|
||||
],
|
||||
"type": "Waypoint",
|
||||
"challengeType": 7,
|
||||
"tests": [],
|
||||
"nameCn": "",
|
||||
"descriptionCn": [],
|
||||
"nameFr": "",
|
||||
"descriptionFr": [],
|
||||
"nameRu": "",
|
||||
"descriptionRu": [],
|
||||
"nameEs": "",
|
||||
"descriptionEs": [],
|
||||
"namePt": "",
|
||||
"descriptionPt": []
|
||||
},
|
||||
{
|
||||
"id": "560add65cb82ac38a17513c1",
|
||||
"title": "Reference our Wiki",
|
||||
"challengeSeed": [],
|
||||
"description": [
|
||||
[
|
||||
"http://i.imgur.com/DoOqkNW.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.",
|
||||
""
|
||||
]
|
||||
],
|
||||
"type": "Waypoint",
|
||||
"challengeType": 7,
|
||||
"tests": [],
|
||||
"nameCn": "",
|
||||
"descriptionCn": [],
|
||||
"nameFr": "",
|
||||
"descriptionFr": [],
|
||||
"nameRu": "",
|
||||
"descriptionRu": [],
|
||||
"nameEs": "",
|
||||
"descriptionEs": [],
|
||||
"namePt": "",
|
||||
"descriptionPt": []
|
||||
},
|
||||
{
|
||||
"id": "570add8ccb82ac38a17513c3",
|
||||
"title": "Join our LinkedIn Alumni Network",
|
||||
"challengeSeed": [],
|
||||
"description": [
|
||||
[
|
||||
"http://i.imgur.com/P7qfJXt.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\".",
|
||||
"https://www.linkedin.com/profile/edit-education?school=Free+Code+Camp"
|
||||
]
|
||||
],
|
||||
"type": "Waypoint",
|
||||
"challengeType": 7,
|
||||
"tests": [],
|
||||
"nameCn": "",
|
||||
"descriptionCn": [],
|
||||
"nameFr": "",
|
||||
"descriptionFr": [],
|
||||
"nameRu": "",
|
||||
"descriptionRu": [],
|
||||
"nameEs": "",
|
||||
"descriptionEs": [],
|
||||
"namePt": "",
|
||||
"descriptionPt": []
|
||||
},
|
||||
{
|
||||
"id": "560add8ccb81ac38a17513c4",
|
||||
"title": "Commit to a Goal and a Nonprofit",
|
||||
"challengeSeed": [],
|
||||
"description": [
|
||||
[
|
||||
"http://i.imgur.com/P7qfJXt.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.",
|
||||
"http://freecodecamp.com/commit"
|
||||
]
|
||||
],
|
||||
"type": "Waypoint",
|
||||
"challengeType": 7,
|
||||
"tests": [],
|
||||
"nameCn": "",
|
||||
"descriptionCn": [],
|
||||
"nameFr": "",
|
||||
"descriptionFr": [],
|
||||
"nameRu": "",
|
||||
"descriptionRu": [],
|
||||
"nameEs": "",
|
||||
"descriptionEs": [],
|
||||
"namePt": "",
|
||||
"descriptionPt": []
|
||||
}
|
||||
]
|
||||
}
|
@ -134,51 +134,19 @@
|
||||
},
|
||||
{
|
||||
"id": "560add56cb82ac38a17513c0",
|
||||
"title": "Configure your Public Profile",
|
||||
"title": "Configure your Code Portfolio",
|
||||
"challengeSeed": [],
|
||||
"description": [
|
||||
[
|
||||
"http://i.imgur.com/FkEzbto.gif",
|
||||
"A gif showing how you can click your profile image in your upper right hand corner to access the account page and connect GitHub.",
|
||||
"Check out your portfolio page. Click your picture your upper right hand corner. To activate your portfolio page, you'll need to link your GitHub account with Free Code Camp.",
|
||||
"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 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 profile page and hover over different days to see how many brownie points you got on those days.",
|
||||
"Your portfolio page 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.",
|
||||
""
|
||||
]
|
||||
],
|
||||
"type": "Waypoint",
|
||||
"challengeType": 7,
|
||||
"tests": [],
|
||||
"nameCn": "",
|
||||
"descriptionCn": [],
|
||||
"nameFr": "",
|
||||
"descriptionFr": [],
|
||||
"nameRu": "",
|
||||
"descriptionRu": [],
|
||||
"nameEs": "",
|
||||
"descriptionEs": [],
|
||||
"namePt": "",
|
||||
"descriptionPt": []
|
||||
},
|
||||
{
|
||||
"id": "560add65cb82ac38a17513c1",
|
||||
"title": "Try our Wiki and Camper News",
|
||||
"challengeSeed": [],
|
||||
"description": [
|
||||
[
|
||||
"http://i.imgur.com/DoOqkNW.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.",
|
||||
""
|
||||
],
|
||||
[
|
||||
"http://i.imgur.com/nmSiMy1.gif",
|
||||
"A gif showing how you can access our Camper News page and click the \"upvote\" button to upvote a story.",
|
||||
"Click the \"News\" button in your upper right hand corner. You can browse links on Camper News and upvote ones that you enjoy.",
|
||||
"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.",
|
||||
""
|
||||
]
|
||||
],
|
||||
@ -260,38 +228,6 @@
|
||||
"namePt": "",
|
||||
"descriptionPt": []
|
||||
},
|
||||
{
|
||||
"id": "560add8ccb82ac38a17513c3",
|
||||
"title": "Join our Alumni Network and Commit to Your Goal",
|
||||
"challengeSeed": [],
|
||||
"description": [
|
||||
[
|
||||
"http://i.imgur.com/P7qfJXt.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\".",
|
||||
"https://www.linkedin.com/profile/edit-education?school=Free+Code+Camp"
|
||||
],
|
||||
[
|
||||
"",
|
||||
"",
|
||||
"Free Code Camp will always be free. If you want to feel more motivated to earn our certificates faster, we encourage you to instead pledge to donate to a nonprofit each day.",
|
||||
""
|
||||
]
|
||||
],
|
||||
"type": "Waypoint",
|
||||
"challengeType": 7,
|
||||
"tests": [],
|
||||
"nameCn": "",
|
||||
"descriptionCn": [],
|
||||
"nameFr": "",
|
||||
"descriptionFr": [],
|
||||
"nameRu": "",
|
||||
"descriptionRu": [],
|
||||
"nameEs": "",
|
||||
"descriptionEs": [],
|
||||
"namePt": "",
|
||||
"descriptionPt": []
|
||||
},
|
||||
{
|
||||
"id": "560add8ccb82ac38a17513c4",
|
||||
"title": "Learn What to Do If You Get Stuck",
|
||||
|
@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "jQuery",
|
||||
"order": 4,
|
||||
"order": 5,
|
||||
"challenges": [
|
||||
{
|
||||
"id": "bad87fee1348bd9acdd08826",
|
||||
|
@ -1,23 +0,0 @@
|
||||
{
|
||||
"name": "JSON APIs and Ajax",
|
||||
"order": 10,
|
||||
"challenges": [
|
||||
{
|
||||
"id": "bad88fee1348bd9ae8c08416",
|
||||
"title": "Stand in challenge",
|
||||
"dashedName": "waypoint-stand-in-challenge",
|
||||
"difficulty": 3.24,
|
||||
"description": [
|
||||
""
|
||||
],
|
||||
"tests": [
|
||||
|
||||
],
|
||||
"challengeSeed": [
|
||||
""
|
||||
],
|
||||
"challengeType": 0,
|
||||
"type": "waypoint"
|
||||
}
|
||||
]
|
||||
}
|
@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "Object Oriented and Functional Programming",
|
||||
"order": 6,
|
||||
"order": 7,
|
||||
"note": [
|
||||
"Methods",
|
||||
"Closures",
|
||||
@ -185,7 +185,7 @@
|
||||
],
|
||||
"tests":[
|
||||
"assert.deepEqual(array, [4,5,6,7,8], 'message: You should add three to each value in the array.');",
|
||||
"assert(editor.getValue().match(/\\.map\\(/gi), 'message: You should be making use of the map method.');",
|
||||
"assert(editor.getValue().match(/\\.map\\s*\\(/gi), 'message: You should be making use of the map method.');",
|
||||
"assert(editor.getValue().match(/\\[1\\,2\\,3\\,4\\,5\\]/gi), 'message: You should only modify the array with <code>.map</code>.');"
|
||||
],
|
||||
"challengeSeed":[
|
||||
@ -212,8 +212,8 @@
|
||||
"<code>});</code>"
|
||||
],
|
||||
"tests":[
|
||||
"assert(singleVal == 30, 'message: <code>singleVal</code> should have been set to the result of you reduce operation.');",
|
||||
"assert(editor.getValue().match(/\\.reduce\\(/gi), 'message: You should have made use of the reduce method.');"
|
||||
"assert(singleVal == 30, 'message: <code>singleVal</code> should have been set to the result of your reduce operation.');",
|
||||
"assert(editor.getValue().match(/\\.reduce\\s*\\(/gi), 'message: You should have made use of the reduce method.');"
|
||||
],
|
||||
"challengeSeed":[
|
||||
"var array = [4,5,6,7,8];",
|
||||
@ -241,7 +241,7 @@
|
||||
],
|
||||
"tests":[
|
||||
"assert.deepEqual(array, [1,2,3,4], 'message: You should have removed all the values from the array that are greater than 4.');",
|
||||
"assert(editor.getValue().match(/array\\.filter\\(/gi), 'message: You should be using the filter method to remove the values from the array.');",
|
||||
"assert(editor.getValue().match(/array\\.filter\\s*\\(/gi), 'message: You should be using the filter method to remove the values from the array.');",
|
||||
"assert(editor.getValue().match(/\\[1\\,2\\,3\\,4\\,5\\,6\\,7\\,8\\,9\\,10\\]/gi), 'message: You should only be using <code>.filter</code> to modify the contents of the array.');"
|
||||
],
|
||||
"challengeSeed":[
|
||||
@ -269,7 +269,7 @@
|
||||
"tests":[
|
||||
"assert.deepEqual(array, ['alpha', 'beta', 'charlie'], 'message: You should have sorted the array alphabetically.');",
|
||||
"assert(editor.getValue().match(/\\[\\'beta\\'\\,\\s\\'alpha\\'\\,\\s'charlie\\'\\];/gi), 'message: You should be sorting the array using sort.');",
|
||||
"assert(editor.getValue().match(/\\.sort\\(\\)/gi), 'message: You should have made use of the sort method.');"
|
||||
"assert(editor.getValue().match(/\\.sort\\s*\\(\\)/gi), 'message: You should have made use of the sort method.');"
|
||||
],
|
||||
"challengeSeed":[
|
||||
"var array = ['beta', 'alpha', 'charlie'];",
|
||||
@ -291,7 +291,7 @@
|
||||
],
|
||||
"tests": [
|
||||
"assert.deepEqual(array, [7,6,5,4,3,2,1], 'message: You should reverse the array.');",
|
||||
"assert(editor.getValue().match(/\\.reverse\\(\\)/gi), 'message: You should use the reverse method.');",
|
||||
"assert(editor.getValue().match(/\\.reverse\\s*\\(\\)/gi), 'message: You should use the reverse method.');",
|
||||
"assert(editor.getValue().match(/\\[1\\,2\\,3\\,4\\,5\\,6\\,7/gi), 'message: You should return <code>[7,6,5,4,3,2,1]</code>.');"
|
||||
],
|
||||
"challengeSeed": [
|
||||
@ -315,7 +315,7 @@
|
||||
],
|
||||
"tests": [
|
||||
"assert.deepEqual(array, [1,2,3,4,5,6], 'You should concat the two arrays together.');",
|
||||
"assert(editor.getValue().match(/\\.concat\\(/gi), 'message: You should be use the concat method to merge the two arrays.');",
|
||||
"assert(editor.getValue().match(/\\.concat\\s*\\(/gi), 'message: You should be use the concat method to merge the two arrays.');",
|
||||
"assert(editor.getValue().match(/\\[1\\,2\\,3\\]/gi) && editor.getValue().match(/\\[4\\,5\\,6\\]/gi), 'message: You should only modify the two arrays without changing the origional ones.');"
|
||||
],
|
||||
"challengeSeed": [
|
||||
|
@ -43,6 +43,7 @@ Challenge.destroyAll(function(err, info) {
|
||||
var challengeSpec = require('./challenges/' + file);
|
||||
var order = challengeSpec.order;
|
||||
var block = challengeSpec.name;
|
||||
var isBeta = !!challengeSpec.isBeta;
|
||||
|
||||
// challenge file has no challenges...
|
||||
if (challengeSpec.challenges.length === 0) {
|
||||
@ -66,6 +67,7 @@ Challenge.destroyAll(function(err, info) {
|
||||
challenge.order = order;
|
||||
challenge.suborder = index + 1;
|
||||
challenge.block = block;
|
||||
challenge.isBeta = challenge.isBeta || isBeta;
|
||||
|
||||
return challenge;
|
||||
});
|
||||
|
@ -18,6 +18,10 @@ import {
|
||||
fullStackChallangeId
|
||||
} from '../utils/constantStrings.json';
|
||||
|
||||
import {
|
||||
completeCommitment$
|
||||
} from '../utils/commit';
|
||||
|
||||
const debug = debugFactory('freecc:certification');
|
||||
const sendMessageToNonUser = ifNoUserSend(
|
||||
'must be logged in to complete.'
|
||||
@ -114,7 +118,20 @@ export default function certificate(app) {
|
||||
completedDate: new Date(),
|
||||
challengeType
|
||||
});
|
||||
return saveUser(user);
|
||||
return saveUser(user)
|
||||
// If user has commited to nonprofit,
|
||||
// this will complete his pledge
|
||||
.flatMap(
|
||||
user => completeCommitment$(user),
|
||||
(user, pledgeOrMessage) => {
|
||||
if (typeof pledgeOrMessage === 'string') {
|
||||
debug(pledgeOrMessage);
|
||||
}
|
||||
// we are only interested in the user object
|
||||
// so we ignore return from completeCommitment$
|
||||
return user;
|
||||
}
|
||||
);
|
||||
}
|
||||
return Observable.just(user);
|
||||
})
|
||||
|
@ -16,9 +16,11 @@ import {
|
||||
ifNoUserSend
|
||||
} from '../utils/middleware';
|
||||
|
||||
const isDev = process.env.NODE_ENV !== 'production';
|
||||
const isBeta = !!process.env.BETA;
|
||||
const debug = debugFactory('freecc:challenges');
|
||||
const challengesRegex = /^(bonfire|waypoint|zipline|basejump)/i;
|
||||
const firstChallenge = 'waypoint-say-hello-to-html-elements';
|
||||
const firstChallenge = 'waypoint-learn-how-free-code-camp-works';
|
||||
const challengeView = {
|
||||
0: 'coursewares/showHTML',
|
||||
1: 'coursewares/showJS',
|
||||
@ -105,6 +107,9 @@ module.exports = function(app) {
|
||||
null,
|
||||
Scheduler.default
|
||||
))
|
||||
// filter out all challenges that have isBeta flag set
|
||||
// except in development or beta site
|
||||
.filter(challenge => isDev || isBeta || !challenge.isBeta)
|
||||
.shareReplay();
|
||||
|
||||
// create a stream of challenge blocks
|
||||
@ -543,8 +548,10 @@ module.exports = function(app) {
|
||||
}
|
||||
return sum;
|
||||
}, 0);
|
||||
const isBeta = _.every(blockArray, 'isBeta');
|
||||
|
||||
return {
|
||||
isBeta,
|
||||
name: blockArray[0].block,
|
||||
dashedName: dasherize(blockArray[0].block),
|
||||
challenges: blockArray,
|
||||
|
@ -1,15 +1,224 @@
|
||||
import _ from 'lodash';
|
||||
import { Observable } from 'rx';
|
||||
import debugFactory from 'debug';
|
||||
import dedent from 'dedent';
|
||||
|
||||
import nonprofits from '../utils/commit.json';
|
||||
import {
|
||||
commitGoals,
|
||||
completeCommitment$
|
||||
} from '../utils/commit';
|
||||
|
||||
import {
|
||||
unDasherize
|
||||
} from '../utils';
|
||||
|
||||
import {
|
||||
observeQuery,
|
||||
saveInstance
|
||||
} from '../utils/rx';
|
||||
|
||||
import {
|
||||
ifNoUserRedirectTo
|
||||
} from '../utils/middleware';
|
||||
|
||||
const sendNonUserToFront = ifNoUserRedirectTo('/');
|
||||
const sendNonUserToCommit = ifNoUserRedirectTo(
|
||||
'/commit',
|
||||
'Must be signed in to update commit'
|
||||
);
|
||||
const debug = debugFactory('freecc:commit');
|
||||
|
||||
function findNonprofit(name) {
|
||||
let nonprofit;
|
||||
if (name) {
|
||||
nonprofit = _.find(nonprofits, (nonprofit) => {
|
||||
return name === nonprofit.name;
|
||||
});
|
||||
}
|
||||
|
||||
nonprofit = nonprofit || nonprofits[0];
|
||||
return nonprofit;
|
||||
}
|
||||
|
||||
export default function commit(app) {
|
||||
const router = app.loopback.Router();
|
||||
const { Pledge } = app.models;
|
||||
|
||||
router.get(
|
||||
'/commit',
|
||||
commitToNonprofit
|
||||
);
|
||||
|
||||
router.get(
|
||||
'/commit/pledge',
|
||||
sendNonUserToFront,
|
||||
pledge
|
||||
);
|
||||
|
||||
router.get(
|
||||
'/commit/directory',
|
||||
renderDirectory
|
||||
);
|
||||
|
||||
router.post(
|
||||
'/commit/stop-commitment',
|
||||
sendNonUserToCommit,
|
||||
stopCommit
|
||||
);
|
||||
|
||||
router.post(
|
||||
'/commit/complete-goal',
|
||||
sendNonUserToCommit,
|
||||
completeCommitment
|
||||
);
|
||||
|
||||
app.use(router);
|
||||
|
||||
function commitToNonprofit(req, res) {
|
||||
res.render('commit/', {
|
||||
title: 'Commit to a nonprofit. Commit to your goal.'
|
||||
function commitToNonprofit(req, res, next) {
|
||||
const { user } = req;
|
||||
let nonprofitName = unDasherize(req.query.nonprofit);
|
||||
|
||||
debug('looking for nonprofit', nonprofitName);
|
||||
const nonprofit = findNonprofit(nonprofitName);
|
||||
|
||||
Observable.just(user)
|
||||
.flatMap(user => {
|
||||
if (user) {
|
||||
debug('getting user pledge');
|
||||
return observeQuery(user, 'pledge');
|
||||
}
|
||||
return Observable.just();
|
||||
})
|
||||
.subscribe(
|
||||
pledge => {
|
||||
if (pledge) {
|
||||
debug('found previous pledge');
|
||||
req.flash('info', {
|
||||
msg: dedent`
|
||||
Looks like you already have a pledge to ${pledge.displayName}.
|
||||
Hitting commit here will replace your old commitment.
|
||||
`
|
||||
});
|
||||
}
|
||||
res.render(
|
||||
'commit/',
|
||||
Object.assign(
|
||||
{
|
||||
title: 'Commit to a nonprofit. Commit to your goal.',
|
||||
pledge,
|
||||
frontEndCert: commitGoals.frontEndCert,
|
||||
fullStackCert: commitGoals.fullStackCert
|
||||
},
|
||||
nonprofit
|
||||
)
|
||||
);
|
||||
},
|
||||
next
|
||||
);
|
||||
|
||||
}
|
||||
|
||||
function pledge(req, res, next) {
|
||||
const { user } = req;
|
||||
const {
|
||||
nonprofit: nonprofitName = 'girl develop it',
|
||||
amount = '5',
|
||||
goal = commitGoals.frontEndCert
|
||||
} = req.query;
|
||||
|
||||
const nonprofit = findNonprofit(nonprofitName);
|
||||
|
||||
observeQuery(user, 'pledge')
|
||||
.flatMap(oldPledge => {
|
||||
// create new pledge for user
|
||||
const pledge = Pledge(
|
||||
Object.assign(
|
||||
{
|
||||
amount,
|
||||
goal,
|
||||
userId: user.id
|
||||
},
|
||||
nonprofit
|
||||
)
|
||||
);
|
||||
|
||||
if (oldPledge) {
|
||||
debug('user already has pledge, creating a new one');
|
||||
// we orphan last pledge since a user only has one pledge at a time
|
||||
oldPledge.userId = '';
|
||||
oldPledge.formerUser = user.id;
|
||||
oldPledge.endDate = new Date();
|
||||
oldPledge.isOrphaned = true;
|
||||
return saveInstance(oldPledge)
|
||||
.flatMap(() => {
|
||||
return saveInstance(pledge);
|
||||
});
|
||||
}
|
||||
return saveInstance(pledge);
|
||||
})
|
||||
.subscribe(
|
||||
({ nonprofit, goal, amount }) => {
|
||||
req.flash('success', {
|
||||
msg: dedent`
|
||||
Congratulations, you have committed to giving
|
||||
${nonprofit} $${amount} each month until you have completed
|
||||
your ${goal}.
|
||||
`
|
||||
});
|
||||
res.redirect('/' + user.username);
|
||||
},
|
||||
next
|
||||
);
|
||||
}
|
||||
|
||||
function renderDirectory(req, res) {
|
||||
res.render('commit/directory', {
|
||||
title: 'Commit Directory',
|
||||
nonprofits
|
||||
});
|
||||
}
|
||||
|
||||
function completeCommitment(req, res, next) {
|
||||
const { user } = req;
|
||||
|
||||
return completeCommitment$(user)
|
||||
.subscribe(
|
||||
msgOrPledge => {
|
||||
if (typeof msgOrPledge === 'string') {
|
||||
return res.send(msgOrPledge);
|
||||
}
|
||||
return res.send(true);
|
||||
},
|
||||
next
|
||||
);
|
||||
}
|
||||
|
||||
function stopCommit(req, res, next) {
|
||||
const { user } = req;
|
||||
|
||||
observeQuery(user, 'pledge')
|
||||
.flatMap(pledge => {
|
||||
if (!pledge) {
|
||||
return Observable.just();
|
||||
}
|
||||
|
||||
pledge.formerUserId = pledge.userId;
|
||||
pledge.userId = null;
|
||||
pledge.isOrphaned = true;
|
||||
pledge.dateEnded = new Date();
|
||||
return saveInstance(pledge);
|
||||
})
|
||||
.subscribe(
|
||||
pledge => {
|
||||
let msg = `You have successfully stopped your pledge.`;
|
||||
if (!pledge) {
|
||||
msg = `No pledge found for user ${user.username}.`;
|
||||
}
|
||||
req.flash('errors', { msg });
|
||||
return res.redirect(`/${user.username}`);
|
||||
},
|
||||
next
|
||||
);
|
||||
}
|
||||
}
|
||||
|
0
server/boot/labs.js
Normal file
0
server/boot/labs.js
Normal file
@ -5,6 +5,8 @@ var Rx = require('rx'),
|
||||
request = require('request'),
|
||||
debug = require('debug')('freecc:cntr:resources'),
|
||||
constantStrings = require('../utils/constantStrings.json'),
|
||||
labs = require('../resources/labs.json'),
|
||||
testimonials = require('../resources/testimonials.json'),
|
||||
secrets = require('../../config/secrets');
|
||||
|
||||
module.exports = function(app) {
|
||||
@ -32,6 +34,8 @@ module.exports = function(app) {
|
||||
router.get('/unsubscribed', unsubscribed);
|
||||
router.get('/get-started', getStarted);
|
||||
router.get('/submit-cat-photo', submitCatPhoto);
|
||||
router.get('/labs', showLabs);
|
||||
router.get('/stories', showTestimonials);
|
||||
|
||||
app.use(router);
|
||||
|
||||
@ -96,10 +100,10 @@ module.exports = function(app) {
|
||||
});
|
||||
},
|
||||
|
||||
challenges: function (callback) {
|
||||
challenges: function(callback) {
|
||||
Challenge.find(
|
||||
{ fields: { name: true } },
|
||||
function (err, challenges) {
|
||||
function(err, challenges) {
|
||||
if (err) {
|
||||
debug('Challenge err: ', err);
|
||||
callback(err);
|
||||
@ -116,10 +120,10 @@ module.exports = function(app) {
|
||||
}
|
||||
});
|
||||
},
|
||||
stories: function (callback) {
|
||||
stories: function(callback) {
|
||||
Story.find(
|
||||
{ field: { link: true } },
|
||||
function (err, stories) {
|
||||
function(err, stories) {
|
||||
if (err) {
|
||||
debug('Story err: ', err);
|
||||
callback(err);
|
||||
@ -137,7 +141,7 @@ module.exports = function(app) {
|
||||
}
|
||||
);
|
||||
},
|
||||
nonprofits: function (callback) {
|
||||
nonprofits: function(callback) {
|
||||
Nonprofit.find(
|
||||
{ field: { name: true } },
|
||||
function(err, nonprofits) {
|
||||
@ -180,6 +184,20 @@ module.exports = function(app) {
|
||||
res.redirect('https://gitter.im/FreeCodeCamp/FreeCodeCamp');
|
||||
}
|
||||
|
||||
function showLabs(req, res) {
|
||||
res.render('resources/labs', {
|
||||
title: 'Projects Built by Free Code Camp Students',
|
||||
projects: labs
|
||||
});
|
||||
}
|
||||
|
||||
function showTestimonials(req, res) {
|
||||
res.render('resources/stories', {
|
||||
title: 'Stories from Happy Free Code Camp Campers',
|
||||
stories: testimonials
|
||||
});
|
||||
}
|
||||
|
||||
function submitCatPhoto(req, res) {
|
||||
res.send('Submitted!');
|
||||
}
|
||||
@ -197,13 +215,6 @@ module.exports = function(app) {
|
||||
});
|
||||
}
|
||||
|
||||
function catPhotoSubmit(req, res) {
|
||||
res.send(
|
||||
'Success! You have submitted your cat photo. Return to your website ' +
|
||||
'by typing any letter into your code editor.'
|
||||
);
|
||||
}
|
||||
|
||||
function sponsors(req, res) {
|
||||
res.render('sponsors/sponsors', {
|
||||
title: 'The Sponsors who make Free Code Camp Possible'
|
||||
@ -247,7 +258,7 @@ module.exports = function(app) {
|
||||
return next(err);
|
||||
}
|
||||
user.sendMonthlyEmail = false;
|
||||
user.save(function () {
|
||||
user.save(function() {
|
||||
if (err) {
|
||||
return next(err);
|
||||
}
|
||||
@ -302,7 +313,7 @@ module.exports = function(app) {
|
||||
secrets.github.clientSecret
|
||||
].join(''),
|
||||
githubHeaders,
|
||||
function (err, status2, issues) {
|
||||
function(err, status2, issues) {
|
||||
if (err) { return next(err); }
|
||||
issues = ((pulls === parseInt(pulls, 10)) && issues) ?
|
||||
Object.keys(JSON.parse(issues)).length - pulls :
|
||||
@ -336,7 +347,7 @@ module.exports = function(app) {
|
||||
'https://www.googleapis.com/blogger/v3/blogs/2421288658305323950/' +
|
||||
'posts?key=' +
|
||||
secrets.blogger.key,
|
||||
function (err, status, blog) {
|
||||
function(err, status, blog) {
|
||||
if (err) { return next(err); }
|
||||
|
||||
blog = (status && status.statusCode === 200) ?
|
||||
|
@ -15,6 +15,12 @@ const debug = debugFactory('freecc:boot:user');
|
||||
const daysBetween = 1.5;
|
||||
const sendNonUserToMap = ifNoUserRedirectTo('/map');
|
||||
|
||||
function replaceScriptTags(value) {
|
||||
return value
|
||||
.replace(/<script>/gi, 'fccss')
|
||||
.replace(/<\/script>/gi, 'fcces');
|
||||
}
|
||||
|
||||
function calcCurrentStreak(cals) {
|
||||
const revCals = cals.concat([Date.now()]).slice().reverse();
|
||||
let streakBroken = false;
|
||||
@ -158,7 +164,10 @@ module.exports = function(app) {
|
||||
const username = req.params.username.toLowerCase();
|
||||
const { path } = req;
|
||||
User.findOne(
|
||||
{ where: { username } },
|
||||
{
|
||||
where: { username },
|
||||
include: 'pledge'
|
||||
},
|
||||
function(err, profileUser) {
|
||||
if (err) {
|
||||
return next(err);
|
||||
@ -169,6 +178,7 @@ module.exports = function(app) {
|
||||
});
|
||||
return res.redirect('/');
|
||||
}
|
||||
profileUser = profileUser.toJSON();
|
||||
|
||||
var cals = profileUser
|
||||
.progressTimestamps
|
||||
@ -211,7 +221,6 @@ module.exports = function(app) {
|
||||
return (obj.name || '').match(/^Waypoint/i);
|
||||
});
|
||||
|
||||
debug('user is fec', profileUser.isFrontEndCert);
|
||||
res.render('account/show', {
|
||||
title: 'Camper ' + profileUser.username + '\'s portfolio',
|
||||
username: profileUser.username,
|
||||
@ -221,6 +230,8 @@ module.exports = function(app) {
|
||||
isGithubCool: profileUser.isGithubCool,
|
||||
isLocked: !!profileUser.isLocked,
|
||||
|
||||
pledge: profileUser.pledge,
|
||||
|
||||
isFrontEndCert: profileUser.isFrontEndCert,
|
||||
isFullStackCert: profileUser.isFullStackCert,
|
||||
isHonest: profileUser.isHonest,
|
||||
@ -243,7 +254,9 @@ module.exports = function(app) {
|
||||
moment,
|
||||
|
||||
longestStreak: profileUser.longestStreak,
|
||||
currentStreak: profileUser.currentStreak
|
||||
currentStreak: profileUser.currentStreak,
|
||||
|
||||
replaceScriptTags
|
||||
});
|
||||
}
|
||||
);
|
||||
|
@ -47,6 +47,10 @@
|
||||
"dataSource": "db",
|
||||
"public": true
|
||||
},
|
||||
"pledge": {
|
||||
"dataSource": "db",
|
||||
"public": true
|
||||
},
|
||||
"user": {
|
||||
"dataSource": "db",
|
||||
"public": true
|
||||
|
30
server/resources/labs.json
Normal file
30
server/resources/labs.json
Normal file
@ -0,0 +1,30 @@
|
||||
[
|
||||
{
|
||||
"camper": "johnstonbl01",
|
||||
"name": "Clementine.js",
|
||||
"url": "http://johnstonbl01.github.io/clementinejs/",
|
||||
"description": "The elegant and lightweight boilerplate for full stack JavaScript.",
|
||||
"image": "http://i.imgur.com/ib1wOho.png"
|
||||
},
|
||||
{
|
||||
"camper": "akiralaine",
|
||||
"name": "Camper News Bot",
|
||||
"url": "https://twitter.com/campernewsbot",
|
||||
"description": "This twitter bot tweets out Camper News stories once they hit 5 upvotes.",
|
||||
"image": "https://pbs.twimg.com/media/CLXOFLPWIAEHYPJ.png"
|
||||
},
|
||||
{
|
||||
"camper": "adventurebear",
|
||||
"name": "Coding Bootcamp Cost Calculator",
|
||||
"url": "http://www.freecodecamp.com/coding-bootcamp-cost-calculator",
|
||||
"description": "This d3.js-powered coding bootcamp cost calculator takes into account tuition, financing, lost wages and cost of living.",
|
||||
"image": "https://qph.is.quoracdn.net/main-qimg-670d6a0c5b01f74138e777732994240f?convert_to_webp=true"
|
||||
},
|
||||
{
|
||||
"camper": "ericdouglas",
|
||||
"name": "Open Source Society",
|
||||
"url": "https://github.com/open-source-society/computer-science",
|
||||
"description": "A path to a free education in Computer Science.",
|
||||
"image": "https://camo.githubusercontent.com/c42438055d3fee26b29e6d046fd8d06ebff3db20/687474703a2f2f692e696d6775722e636f6d2f6838786a72726a2e706e67"
|
||||
}
|
||||
]
|
451
server/resources/testimonials.json
Normal file
451
server/resources/testimonials.json
Normal file
@ -0,0 +1,451 @@
|
||||
[
|
||||
{
|
||||
"camper": "Bruna Torman Reseres Franasa",
|
||||
"quote": "I’m now receiving offers for internships. I have no experience in IT, but now good things are happening!",
|
||||
"github": "brunatrf",
|
||||
"linkedin": "https://www.linkedin.com/profile/view?id=AAkAABVPh9IB730qyshrsqO1hDNNRUL-X_4i8n0&authType=NAME_SEARCH&authToken=YYn-&locale=en_US&trk=tyah&trkInfo=clickedVertical%3Amynetwork%2CclickedEntityId%3A357533650%2CauthType%3ANAME_SEARCH%2Cidx%3A1-1-1%2CtarId%3A1441907147451%2Ctas%3Abruna",
|
||||
"image": "https://media.licdn.com/mpr/mpr/shrinknp_400_400/p/8/005/09e/16e/32c3d3f.jpg"
|
||||
},
|
||||
{
|
||||
"camper": "Branden Byers",
|
||||
"quote": "Could I have gotten a job without Free Code Camp? Eventually, sure. But Free Code Camp provided a far denser experience than in my roughly 24 previous years of dabbling in tech.",
|
||||
"github": "brandenbyers",
|
||||
"linkedin": "https://www.linkedin.com/in/brandenbyers",
|
||||
"image": "https://pbs.twimg.com/profile_images/539515557184167936/JqJXzV9x.jpeg"
|
||||
},
|
||||
{
|
||||
"camper": "Qing Huang",
|
||||
"quote": "Free Code Camp gives me more confidence at work. Code doesn’t look as foreign anymore.",
|
||||
"github": "qingillustrates",
|
||||
"linkedin": "https://www.linkedin.com/profile/view?id=AAkAAAOjjjoBDaPY1dtpvngnr8ednNTran6KA3s&authType=NAME_SEARCH&authToken=4zvM&locale=en_US&trk=tyah&trkInfo=clickedVertical%3Amynetwork%2CclickedEntityId%3A61050426%2CauthType%3ANAME_SEARCH%2Cidx%3A1-1-1%2CtarId%3A1441907310565%2Ctas%3Aqing",
|
||||
"image": "https://media.licdn.com/mpr/mpr/shrinknp_400_400/AAEAAQAAAAAAAAKsAAAAJDVlNmNkMzUwLWFjNzAtNDQ4OS05NWI5LWYyYmYzOWQzZjRlOQ.jpg"
|
||||
},
|
||||
{
|
||||
"camper": "John Ellis",
|
||||
"quote": "Free Code Camp has been one of the major contributors to my career in software development. I started as an apps analyst, spent 3 months going through the coursework in my off time and weekends, and just landed a job as a business systems developer.",
|
||||
"github": "johnmellis",
|
||||
"linkedin": "https://www.linkedin.com/profile/view?id=AAkAAAbrISEBqAVYOBfhni9mB3YoFFzzrAbYvvo&authType=NAME_SEARCH&authToken=jurJ&locale=en_US&trk=tyah&trkInfo=clickedVertical%3Amynetwork%2CclickedEntityId%3A116072737%2CauthType%3ANAME_SEARCH%2Cidx%3A1-1-1%2CtarId%3A1441907670143%2Ctas%3Ajohn%20ellis",
|
||||
"image": "https://media.licdn.com/mpr/mpr/shrinknp_400_400/p/5/000/268/01a/0492529.jpg"
|
||||
},
|
||||
{
|
||||
"camper": "Lori Becker",
|
||||
"quote": "After graduating with a Masters degree in computer science, I could not share any of my code with employers (university policy: fear of aiding cheating). With FreeCodeCamp, I was able to develop a small portfolio.",
|
||||
"github": "LCBecker",
|
||||
"linkedin": "https://www.linkedin.com/profile/view?id=AAkAAADrtuwBOA_0ihkKIbUFXoXskXikQT9uVeo&authType=NAME_SEARCH&authToken=sctO&locale=en_US&trk=tyah&trkInfo=clickedVertical%3Amynetwork%2CclickedEntityId%3A15447788%2CauthType%3ANAME_SEARCH%2Cidx%3A1-2-2%2CtarId%3A1441907195702%2Ctas%3Alori",
|
||||
"image": "https://media.licdn.com/mpr/mpr/shrinknp_400_400/p/1/005/080/392/295a574.jpg"
|
||||
},
|
||||
{
|
||||
"camper": "Ryan Lindeman",
|
||||
"quote": "Free Code Camp has been great in giving me a direct path to the full stack development skills I wanted to become more involved in projects at work.",
|
||||
"github": "fai1whale",
|
||||
"linkedin": "https://www.linkedin.com/profile/view?id=AAkAAAkMT1EBFCY849rMWYSDIEj6kosBJSH9n2s&authType=NAME_SEARCH&authToken=acmj&locale=en_US&trk=tyah&trkInfo=clickedVertical%3Amynetwork%2CclickedEntityId%3A151801681%2CauthType%3ANAME_SEARCH%2Cidx%3A1-1-1%2CtarId%3A1441907181695%2Ctas%3Aryan%20lind",
|
||||
"image": "https://media.licdn.com/media/p/4/000/145/24d/18e8af8.jpg"
|
||||
},
|
||||
{
|
||||
"camper": "Stephanie Brown",
|
||||
"quote": "Free Code Camp has given me structure and a direction while learning to code.",
|
||||
"github": "strawmitch",
|
||||
"linkedin": "https://www.linkedin.com/profile/view?id=AAkAAARqP5cBDDdBxPUzluctvjUhOP3UsiowRtM&authType=NAME_SEARCH&authToken=TDfV&locale=en_US&trk=tyah&trkInfo=clickedVertical%3Amynetwork%2CclickedEntityId%3A74071959%2CauthType%3ANAME_SEARCH%2Cidx%3A1-1-1%2CtarId%3A1441907473116%2Ctas%3Astephanie%20brown",
|
||||
"image": "https://media.licdn.com/mpr/mpr/shrinknp_400_400/AAEAAQAAAAAAAALJAAAAJGI5ZWY1MmNjLTJhMTUtNGI2NS04YTExLTFiOGZlYTRiMTNiOA.jpg"
|
||||
},
|
||||
{
|
||||
"camper": "Jimson Sulit",
|
||||
"quote": "Aside from the fact that I’m learning full stack web development, Free Code Camp has also given me the opportunity to lead local community projects.",
|
||||
"github": "webdevjedi25",
|
||||
"linkedin": "https://www.linkedin.com/profile/view?id=AAkAAAWqUccBopX2Wo_P1gYgy0iIEqChwXPTh2k&authType=NAME_SEARCH&authToken=kd5y&locale=en_US&trk=tyah&trkInfo=clickedVertical%3Amynetwork%2CclickedEntityId%3A95048135%2CauthType%3ANAME_SEARCH%2Cidx%3A1-1-1%2CtarId%3A1441907446780%2Ctas%3Ajimson",
|
||||
"image": "https://media.licdn.com/mpr/mpr/shrinknp_400_400/AAEAAQAAAAAAAAPzAAAAJDYyOGMxYmEyLTY1NTQtNDE3NS1iMmVkLWUwM2M4NjJiZWFhZg.jpg"
|
||||
},
|
||||
{
|
||||
"camper": "Brian Emory",
|
||||
"quote": "I like to learn by doing but with the books, while very informative, there was more reading than doing. I came across Free Code Camp which has allowed me to learn by doing. Whereas before I was struggling to learn, I am now not only learning but learning while building cool projects.",
|
||||
"github": "thebrianemory",
|
||||
"linkedin": "https://www.linkedin.com/profile/view?id=AAkAABc3jXwB-iZdZKZIVAvL93RHGB7_J9gDbVA&authType=NAME_SEARCH&authToken=w1Km&locale=en_US&trk=tyah&trkInfo=clickedVertical%3Amynetwork%2CclickedEntityId%3A389516668%2CauthType%3ANAME_SEARCH%2Cidx%3A1-1-1%2CtarId%3A1441907166795%2Ctas%3Abrian%20emory",
|
||||
"image": "https://media.licdn.com/mpr/mpr/shrinknp_400_400/AAEAAQAAAAAAAAJOAAAAJDgyZWFhYWFjLTNhZGYtNGQzOC04M2JjLWE1Nzk1NmRiMDY4MA.jpg"
|
||||
},
|
||||
{
|
||||
"camper": "Brian Barrow",
|
||||
"quote": "Free Code Camp has given me confidence that I can become a web developer.",
|
||||
"github": "briancbarrow",
|
||||
"linkedin": "https://www.linkedin.com/profile/view?id=AAkAAAVH-osBCI8WZTtv3Om5WjeD2rYnjQ6z7zA&authType=NAME_SEARCH&authToken=-yWK&locale=en_US&trk=tyah&trkInfo=clickedVertical%3Amynetwork%2CclickedEntityId%3A88603275%2CauthType%3ANAME_SEARCH%2Cidx%3A1-1-1%2CtarId%3A1441907213309%2Ctas%3Abrian%20barr",
|
||||
"image": "https://media.licdn.com/mpr/mpr/shrinknp_400_400/p/5/005/07e/272/050fd0e.jpg"
|
||||
},
|
||||
{
|
||||
"camper": "Ralph Cachero",
|
||||
"quote": "I am a software QA engineer. Free Code Camp has helped me understand what the developers go through.",
|
||||
"github": "rcachero",
|
||||
"linkedin": "https://www.linkedin.com/profile/view?id=AAkAAAJEF88BiUtMoxS3Ww7ooI9QmTZdrgP272Q&authType=NAME_SEARCH&authToken=2tza&locale=en_US&trk=tyah&trkInfo=clickedVertical%3Amynetwork%2CclickedEntityId%3A38016975%2CauthType%3ANAME_SEARCH%2Cidx%3A1-1-1%2CtarId%3A1441907225816%2Ctas%3Aralph",
|
||||
"image": "https://media.licdn.com/mpr/mpr/shrinknp_400_400/p/1/000/09f/2eb/0ec94ae.jpg"
|
||||
},
|
||||
{
|
||||
"camper": "Ina Tsetsova",
|
||||
"quote": "Bonfires really make me think and combine programming concepts creatively.",
|
||||
"github": "Tsetsova",
|
||||
"linkedin": "https://www.linkedin.com/profile/view?id=AAkAAAjPoIcBJsAF91dqwgxFQ4qct88yFcljXNU&authType=NAME_SEARCH&authToken=l8zY&locale=en_US&trk=tyah&trkInfo=clickedVertical%3Amynetwork%2CclickedEntityId%3A147824775%2CauthType%3ANAME_SEARCH%2Cidx%3A1-1-1%2CtarId%3A1441907239742%2Ctas%3Aina%20",
|
||||
"image": "https://media.licdn.com/mpr/mpr/shrinknp_400_400/p/4/005/0ad/379/050ce9d.jpg"
|
||||
},
|
||||
{
|
||||
"camper": "Adam Goswick",
|
||||
"quote": "Free Code Camp is helping me learn web development when I can’t afford to go back to school.",
|
||||
"github": "thegoz85",
|
||||
"linkedin": "https://www.linkedin.com/profile/view?id=AAkAAAObbhkBzeCKrzuEB0ssE_iGrBX0Xnu9URc&authType=NAME_SEARCH&authToken=xKaK&locale=en_US&trk=tyah&trkInfo=clickedVertical%3Amynetwork%2CclickedEntityId%3A60517913%2CauthType%3ANAME_SEARCH%2Cidx%3A1-2-2%2CtarId%3A1441907256670%2Ctas%3Aadam%20g",
|
||||
"image": "https://media.licdn.com/mpr/mpr/shrinknp_400_400/p/1/005/08d/084/0eeb904.jpg"
|
||||
},
|
||||
{
|
||||
"camper": "Josh Cronkhite",
|
||||
"quote": "My resume has been bolstered by adding a completely new stack, providing value to my clients and opening up the pool of potential clients that I would have otherwise referred to peers.",
|
||||
"github": "joshcronkhite",
|
||||
"linkedin": "https://www.linkedin.com/profile/view?id=AAkAAAGTPvoBg__9rivrYrYgo8sDJ561JpAfhHk&authType=NAME_SEARCH&authToken=6X77&locale=en_US&trk=tyah&trkInfo=clickedVertical%3Amynetwork%2CclickedEntityId%3A26427130%2CauthType%3ANAME_SEARCH%2Cidx%3A1-3-3%2CtarId%3A1441907269831%2Ctas%3Ajosh",
|
||||
"image": "https://media.licdn.com/mpr/mpr/shrinknp_400_400/p/7/000/276/003/191e9f3.jpg"
|
||||
},
|
||||
{
|
||||
"camper": "Ryan Jones",
|
||||
"quote": "Learning to code with Free Code Camp has given me a leg up in my career. It has helped to train my brain to think with the logic that computers use. This is a tremendous aid in the field of digital forensics.",
|
||||
"github": "ryanmjones",
|
||||
"linkedin": "https://www.linkedin.com/profile/view?id=AAkAABPJt1MBxC4Yero3PJPhF9rrr_Y7WfOGcCU&authType=NAME_SEARCH&authToken=Dre1&locale=en_US&trk=tyah&trkInfo=clickedVertical%3Amynetwork%2CclickedEntityId%3A331986771%2CauthType%3ANAME_SEARCH%2Cidx%3A1-1-1%2CtarId%3A1441907281816%2Ctas%3Aryan%20jones",
|
||||
"image": "https://media.licdn.com/mpr/mpr/shrinknp_400_400/AAEAAQAAAAAAAAbSAAAAJDUwY2RiZTUxLTg1YTktNDQ2Yy05YTZlLTU2NmY2YThlMmY0Yw.jpg"
|
||||
},
|
||||
{
|
||||
"camper": "Kristin Anthony",
|
||||
"quote": "The layout, pacing, and resources of Free Code Camp have given me focus and shown me a path to mastery. Just being able to tell people in my field that I’m learning full stack JavaScript and having projects to show for it has been immensely helpful both with my current position and in my job search.",
|
||||
"github": "anthkris",
|
||||
"linkedin": "https://www.linkedin.com/profile/view?id=AAkAAAZRM5MBACvQe36s4cvpe5ZHWEfgxprDUFg&authType=NAME_SEARCH&authToken=pozh&locale=en_US&trk=tyah&trkInfo=clickedVertical%3Amynetwork%2CclickedEntityId%3A105984915%2CauthType%3ANAME_SEARCH%2Cidx%3A1-1-1%2CtarId%3A1441907298390%2Ctas%3Akristin%20",
|
||||
"image": "https://media.licdn.com/media/p/4/005/0b3/377/381a362.jpg"
|
||||
},
|
||||
{
|
||||
"camper": "Jimmy Epperson",
|
||||
"quote": "I learned to build websites, which is now a new service I offer to local businesses.",
|
||||
"github": "jimmyepp",
|
||||
"linkedin": "https://www.linkedin.com/profile/view?id=AAkAAADg3N8BTBm_D58gu8Tgq6UPa3OQ_19CrSE&authType=NAME_SEARCH&authToken=W7Eg&locale=en_US&trk=tyah&trkInfo=clickedVertical%3Amynetwork%2CclickedEntityId%3A14736607%2CauthType%3ANAME_SEARCH%2Cidx%3A1-1-1%2CtarId%3A1441907323386%2Ctas%3Ajimmy%20epper",
|
||||
"image": "https://media.licdn.com/mpr/mpr/shrinknp_400_400/AAEAAQAAAAAAAALWAAAAJDUwZDc5YzYwLTc2MjYtNDIzYy1iYzAyLWNlNzZmMTNjM2M1NA.jpg"
|
||||
},
|
||||
{
|
||||
"camper": "Sara Powell",
|
||||
"quote": "I’ve progressed from not coding very much at all, to coding well enough to land job interviews for front end development positions.",
|
||||
"github": "newtcobell",
|
||||
"linkedin": "https://www.linkedin.com/profile/view?id=AAkAAAy1jmQBRjoGSUWd6Zib7FtekpSMBVHr7Vw&authType=NAME_SEARCH&authToken=wpT6&locale=en_US&trk=tyah&trkInfo=clickedVertical%3Amynetwork%2CclickedEntityId%3A213225060%2CauthType%3ANAME_SEARCH%2Cidx%3A1-1-1%2CtarId%3A1441907337130%2Ctas%3Asara%20powell",
|
||||
"image": "https://media.licdn.com/media/p/8/000/1be/159/281c5b8.jpg"
|
||||
},
|
||||
{
|
||||
"camper": "John Bull",
|
||||
"quote": "I am now able to add customized branding and layouts to web applications that fellow employees and customers use everyday. I’m now looking to move away from desktop support and into development roles.",
|
||||
"github": "Jbull328",
|
||||
"linkedin": "https://www.linkedin.com/profile/view?id=AAkAABAyfz8BsjE-oGv1k3URGzhRyeupnTGuK3I&authType=NAME_SEARCH&authToken=bnIc&locale=en_US&trk=tyah&trkInfo=clickedVertical%3Amynetwork%2CclickedEntityId%3A271744831%2CauthType%3ANAME_SEARCH%2Cidx%3A1-1-1%2CtarId%3A1441907350044%2Ctas%3Ajohn%20bull",
|
||||
"image": "https://media.licdn.com/mpr/mpr/shrinknp_400_400/AAEAAQAAAAAAAAL8AAAAJDliMGU0MTk0LWQ3YTUtNDY0NS1hMTg1LTdhN2Q1NTBlMzA5MQ.jpg"
|
||||
},
|
||||
{
|
||||
"camper": "Nicholas Slaven",
|
||||
"quote": "Free Code Camp has given me the courage to open the door to the idea of programming for a career.",
|
||||
"github": "nslaven22",
|
||||
"linkedin": "https://www.linkedin.com/profile/view?id=AAkAAA5HGyIBmpNcXY_tfHBkWxXI6OtwsFAeHRQ&authType=NAME_SEARCH&authToken=IIqr&locale=en_US&trk=tyah&trkInfo=clickedVertical%3Amynetwork%2CclickedEntityId%3A239541026%2CauthType%3ANAME_SEARCH%2Cidx%3A1-1-1%2CtarId%3A1441907370759%2Ctas%3Aslaven",
|
||||
"image": "https://media.licdn.com/media/p/3/000/222/0d1/2606078.jpg"
|
||||
},
|
||||
{
|
||||
"camper": "Andrea Goulet",
|
||||
"quote": "Before enrolling in Free Code Camp, I was nervous when people asked me, \"Do you code?\", Now, I answer with a confident \"YES!\"",
|
||||
"github": "andreagoulet",
|
||||
"linkedin": "https://www.linkedin.com/profile/view?id=AAkAAAA4KWYB-mCMwEU3LvDHXt6H0rVHbBvszq0&authType=NAME_SEARCH&authToken=hUBG&locale=en_US&trk=tyah&trkInfo=clickedVertical%3Amynetwork%2CclickedEntityId%3A3680614%2CauthType%3ANAME_SEARCH%2Cidx%3A1-1-1%2CtarId%3A1441907386771%2Ctas%3Aandrea%20go",
|
||||
"image": "https://media.licdn.com/mpr/mpr/shrinknp_400_400/AAEAAQAAAAAAAAMyAAAAJDI1MWU4OWU4LTZmNTAtNGFmMS1iYzcxLTA5Y2IwYzIyMWIxYQ.jpg"
|
||||
},
|
||||
{
|
||||
"camper": "Justin Clay Lane",
|
||||
"quote": "Free Code Camp provided a structured learning experience more akin to an actual class, compared to other free learning sites. I was recently hired to update and maintain the website for a local doctor’s office. The extra money and experience from that is wonderful.",
|
||||
"github": "jclane",
|
||||
"linkedin": "https://www.linkedin.com/profile/view?id=AAkAAAYZYQ4BBY337OqRUhMnZqDJNX1wNXjT7Bk&authType=NAME_SEARCH&authToken=8TbF&locale=en_US&trk=tyah&trkInfo=clickedVertical%3Amynetwork%2CclickedEntityId%3A102326542%2CauthType%3ANAME_SEARCH%2Cidx%3A1-1-1%2CtarId%3A1441907405129%2Ctas%3Ajustin%20lane",
|
||||
"image": "https://media.licdn.com/mpr/mpr/shrinknp_400_400/AAEAAQAAAAAAAAI5AAAAJDNmNzViYzdmLTdkMTEtNDllYS1iNTRmLWVmZjgzZTY3ZWNjNQ.jpg"
|
||||
},
|
||||
{
|
||||
"camper": "Angshuman Gupta",
|
||||
"quote": "I’m a co-founder of a startup. We had been coding with PHP, but always wanted to shift to meteor.js. Free Code Camp gave me a structured JavaScript guide.",
|
||||
"github": "codingang",
|
||||
"linkedin": "https://www.linkedin.com/profile/view?id=AAkAAAhIipMB6vAXaratEs0MtUd3GgyYm70cvbE&authType=NAME_SEARCH&authToken=pbTj&locale=en_US&trk=tyah&trkInfo=clickedVertical%3Amynetwork%2CclickedEntityId%3A138971795%2CauthType%3ANAME_SEARCH%2Cidx%3A1-1-1%2CtarId%3A1441907423626%2Ctas%3Aangsh",
|
||||
"image": "https://media.licdn.com/media/AAEAAQAAAAAAAAKPAAAAJGRjMmQwZjY5LTViMmUtNDQyZS04Y2Y3LTRhYjZiYWJlZDQzNw.jpg"
|
||||
},
|
||||
{
|
||||
"camper": "Rhonadale Florentino",
|
||||
"quote": "I can now confidently tell clients that I can design their website.",
|
||||
"github": "None Given",
|
||||
"linkedin": "https://www.linkedin.com/profile/view?id=AAkAAAI53oUBmy6MPKp1UeHxBy3_y0cyTS4bWow&authType=NAME_SEARCH&authToken=gz62&locale=en_US&trk=tyah&trkInfo=clickedVertical%3Amynetwork%2CclickedEntityId%3A37346949%2CauthType%3ANAME_SEARCH%2Cidx%3A1-1-1%2CtarId%3A1441907434768%2Ctas%3Arhona",
|
||||
"image": "https://media.licdn.com/media/p/7/005/0aa/319/1aaa08f.jpg"
|
||||
},
|
||||
{
|
||||
"camper": "Nick Galluzzo",
|
||||
"quote": "I currently work in a support role for a tech startup (www.knackhq.com). The more I learn about JavaScript, the more I’m able to contribute to a product I really believe in!",
|
||||
"github": "ngalluzzo",
|
||||
"linkedin": "https://www.linkedin.com/profile/view?id=AAkAAAjQl1EBZPrbUQ6zGPXmKIuNzpCyqqsnox4&authType=NAME_SEARCH&authToken=9w-G&locale=en_US&trk=tyah&trkInfo=clickedVertical%3Amynetwork%2CclickedEntityId%3A147887953%2CauthType%3ANAME_SEARCH%2Cidx%3A1-1-1%2CtarId%3A1441907461071%2Ctas%3Anick%20gall",
|
||||
"image": "https://media.licdn.com/mpr/mpr/shrinknp_400_400/AAEAAQAAAAAAAANtAAAAJDE3YWZmYjE0LTg4ODYtNDg1Mi1hZDhjLThkZmZhMjkxYWI3Mg.jpg"
|
||||
},
|
||||
{
|
||||
"camper": "Genavieve Clausen",
|
||||
"quote": "Free Code Camp has benefitted me in numerous ways, including the opportunity to learn in a self-paced, supportive environment. I am excited to be a part of a growing community making lasting connections for the career and lifestyle I am pursuing.",
|
||||
"github": "GenavieveMarie",
|
||||
"linkedin": "https://www.linkedin.com/profile/view?id=AAkAAAOISlMBAi43m1SG-xM_S2B8Vy05yiQz5rE&authType=NAME_SEARCH&authToken=AY6E&locale=en_US&trk=tyah&trkInfo=clickedVertical%3Amynetwork%2CclickedEntityId%3A59263571%2CauthType%3ANAME_SEARCH%2Cidx%3A1-1-1%2CtarId%3A1441907488270%2Ctas%3Agenav",
|
||||
"image": "https://media.licdn.com/mpr/mpr/shrinknp_400_400/AAEAAQAAAAAAAAWUAAAAJDc2ODU4MjVkLTlmMDUtNDM4My05OTY2LTliMTQxNzFlZmY0OQ.jpg"
|
||||
},
|
||||
{
|
||||
"camper": "Tim Stauffer",
|
||||
"quote": "I found Free Code Camp more helpful than my MS degree, so I quit college. Learning so much. Also saving $50,000.",
|
||||
"github": "timstauffer",
|
||||
"linkedin": "https://www.linkedin.com/profile/view?id=AAkAAADVcVIBz8UCNjQKl2GUy9ka8UGnQXAXAYw&authType=NAME_SEARCH&authToken=7Hkg&locale=en_US&trk=tyah&trkInfo=clickedVertical%3Amynetwork%2CclickedEntityId%3A13988178%2CauthType%3ANAME_SEARCH%2Cidx%3A1-1-1%2CtarId%3A1441907522559%2Ctas%3Astauffer",
|
||||
"image": "https://avatars1.githubusercontent.com/u/3429096?v=3&s=460"
|
||||
},
|
||||
{
|
||||
"camper": "Pete Considine",
|
||||
"quote": "The guided and structured lessons have been really helpful, as has the relatively slow pace that new concepts are introduced. I had been taking a Udemy course and it really seemed to be skimming the surface of JavaScript in the interest of \"getting to everything.\"",
|
||||
"github": "Pjconsidine",
|
||||
"linkedin": "https://www.linkedin.com/profile/view?id=AAkAAAAi8-8BxUVpoi_VuJQmeGWN5zhMBgbvPbs&authType=NAME_SEARCH&authToken=WCEU&locale=en_US&trk=tyah&trkInfo=clickedVertical%3Amynetwork%2CclickedEntityId%3A2290671%2CauthType%3ANAME_SEARCH%2Cidx%3A1-1-1%2CtarId%3A1441907557932%2Ctas%3Apete%20c",
|
||||
"image": "https://media.licdn.com/mpr/mpr/shrinknp_400_400/p/3/005/06c/3b2/0ab8c08.jpg"
|
||||
},
|
||||
{
|
||||
"camper": "Khatra Ahmed",
|
||||
"quote": "I can learn to code with support by my side. Everyone is so helpful and it makes learning to code less of a struggle.",
|
||||
"github": "Mystfreak",
|
||||
"linkedin": "https://www.linkedin.com/profile/view?id=AAkAAAbdUsIBApacWEmL7CIxe2q7aevMn7aQvmQ&authType=NAME_SEARCH&authToken=a_zs&locale=en_US&trk=tyah&trkInfo=clickedVertical%3Amynetwork%2CclickedEntityId%3A115167938%2CauthType%3ANAME_SEARCH%2Cidx%3A1-1-1%2CtarId%3A1441907569985%2Ctas%3Akhatra",
|
||||
"image": "https://avatars0.githubusercontent.com/u/11299138?v=3&s=460"
|
||||
},
|
||||
{
|
||||
"camper": "Miranda Bashore",
|
||||
"quote": "I want to be able to freelance and create dynamic websites. Free Code Camp makes that more of a reality for me, as I cannot afford an expensive bootcamp while getting my Master’s degree.",
|
||||
"github": "DutchBay",
|
||||
"linkedin": "https://www.linkedin.com/profile/view?id=AAkAAA8KmJMBTtvvgJzjeAUo_YOssh2yLZZlvlk&authType=NAME_SEARCH&authToken=fWay&locale=en_US&trk=tyah&trkInfo=clickedVertical%3Amynetwork%2CclickedEntityId%3A252352659%2CauthType%3ANAME_SEARCH%2Cidx%3A1-2-2%2CtarId%3A1441907584953%2Ctas%3Amiranda",
|
||||
"image": "https://media.licdn.com/mpr/mpr/shrinknp_400_400/p/5/005/078/187/0ca3604.jpg"
|
||||
},
|
||||
{
|
||||
"camper": "Marcus Lyons",
|
||||
"quote": "Free Code Camp has helped me gain the confidence to automate part of my work responsibilities. I was able to use skills I learned from Free Code Camp to help with writing a bash script to search through mobile app database log files to find errors.",
|
||||
"github": "auron1223",
|
||||
"linkedin": "https://www.linkedin.com/profile/view?id=AAkAAA_1aLABo1pVJH9ijSqz8PvLgpzVYkIsjVc&authType=NAME_SEARCH&authToken=cNE6&locale=en_US&trk=tyah&trkInfo=clickedVertical%3Amynetwork%2CclickedEntityId%3A267741360%2CauthType%3ANAME_SEARCH%2Cidx%3A1-2-2%2CtarId%3A1441925486836%2Ctas%3Alyons",
|
||||
"image": "https://media.licdn.com/mpr/mpr/shrinknp_400_400/AAEAAQAAAAAAAAM9AAAAJDA4YjM1NGIxLThjZWYtNDllMi04N2NkLWMzMzk1YWI1MTYyMg.jpg"
|
||||
},
|
||||
{
|
||||
"camper": "Reynald Emmanuel Endaya",
|
||||
"quote": "There is an active community (even in Manila) and it’s interactive, unlike all the MOOCs I tried before where I had to listen to somebody speak for a long time. I am learning a lot here and I have not yet lost my momentum.",
|
||||
"github": "None Given",
|
||||
"linkedin": "https://www.linkedin.com/profile/view?id=AAkAAAUlm8oBQuXm_Y89_LDC9mb2vOjjQH_pZDo&authType=NAME_SEARCH&authToken=4WJf&locale=en_US&trk=tyah&trkInfo=clickedVertical%3Amynetwork%2CclickedEntityId%3A86350794%2CauthType%3ANAME_SEARCH%2Cidx%3A1-1-1%2CtarId%3A1441907601893%2Ctas%3Areynald",
|
||||
"image": "https://media.licdn.com/mpr/mpr/shrinknp_400_400/p/2/000/1a7/0ab/089b5aa.jpg"
|
||||
},
|
||||
{
|
||||
"camper": "Victoria Kariolic",
|
||||
"quote": "I discovered a coding partner through the Free Code Camp groups who has been able to cover gaps for my client work.",
|
||||
"github": "Niaskywalk",
|
||||
"linkedin": "https://www.linkedin.com/profile/view?id=AAkAAAEFmXMBlTFIR2j1G-vJhAMsUOPONILGrLM&authType=NAME_SEARCH&authToken=yGV-&locale=en_US&trk=tyah&trkInfo=clickedVertical%3Amynetwork%2CclickedEntityId%3A17144179%2CauthType%3ANAME_SEARCH%2Cidx%3A1-1-1%2CtarId%3A1441907613265%2Ctas%3Avictoria%20",
|
||||
"image": "https://media.licdn.com/mpr/mpr/shrinknp_400_400/p/8/005/025/299/0d297ae.jpg"
|
||||
},
|
||||
{
|
||||
"camper": "Cameron Eshgh",
|
||||
"quote": "Free Code Camp enables me as a digital marketer to dive right into whatever asset or content and fix things that haven’t been working, as well as roll up my sleeves when our web developers are not available.",
|
||||
"github": "eshghitude",
|
||||
"linkedin": "https://www.linkedin.com/profile/view?id=AAkAAAVdU1MBFFiei4ZYNImnVDcR3H_EiuS6qLY&authType=NAME_SEARCH&authToken=TlgU&locale=en_US&trk=tyah&trkInfo=clickedVertical%3Amynetwork%2CclickedEntityId%3A90002259%2CauthType%3ANAME_SEARCH%2Cidx%3A1-1-1%2CtarId%3A1441907626390%2Ctas%3Acameron%20",
|
||||
"image": "https://media.licdn.com/mpr/mpr/shrinknp_400_400/p/6/005/0a4/178/079a07b.jpg"
|
||||
},
|
||||
{
|
||||
"camper": "Marquina M Iliev-Piselli",
|
||||
"quote": "I’m re-designing a site for my full-time job.",
|
||||
"github": "Marquina",
|
||||
"linkedin": "https://www.linkedin.com/profile/view?id=AAkAAACYvVUBTuu8dNRHthN1TFiyk137PLDqnv4&authType=NAME_SEARCH&authToken=V_iG&locale=en_US&trk=tyah&trkInfo=clickedVertical%3Amynetwork%2CclickedEntityId%3A10009941%2CauthType%3ANAME_SEARCH%2Cidx%3A1-1-1%2CtarId%3A1441907639677%2Ctas%3Amarquin",
|
||||
"image": "https://media.licdn.com/mpr/mpr/shrinknp_400_400/AAEAAQAAAAAAAAZLAAAAJDQ5Nzg4MjJmLWUyMjQtNDI5Ny05NmY5LTE5Yjc1Y2Q1YWFhOA.jpg"
|
||||
},
|
||||
|
||||
{
|
||||
"camper": "Devarsh Ruparelia",
|
||||
"quote": "Even though I am still just a high school student. The startup I intern for said that if I finish the full track of Free Code Camp, they will strongly consider me for their programming jobs. Thanks Free Code Camp!",
|
||||
"github": "devarsh1997",
|
||||
"linkedin": "https://www.linkedin.com/profile/view?id=AAkAAApxpP8BZBcHQzr6Ci3xmkkZX-OSH_oLuJs&authType=NAME_SEARCH&authToken=wdjb&locale=en_US&trk=tyah&trkInfo=clickedVertical%3Amynetwork%2CclickedEntityId%3A175219967%2CauthType%3ANAME_SEARCH%2Cidx%3A1-1-1%2CtarId%3A1441907682493%2Ctas%3Adevarsh",
|
||||
"image": "https://media.licdn.com/mpr/mpr/shrinknp_400_400/p/7/005/087/339/14535ee.jpg"
|
||||
},
|
||||
{
|
||||
"camper": "Christian Morera",
|
||||
"quote": "Free Code Camp has been a great experience. I’ve learned so many things. I am in the process of transitioning from content developer to full stack developer.",
|
||||
"github": "chrmorfeus",
|
||||
"linkedin": "https://www.linkedin.com/profile/view?id=AAkAAAMc-tYBtYri0H1KHz1WNQjWxZ23jg0tMNU&authType=NAME_SEARCH&authToken=NzUg&locale=en_US&trk=tyah&trkInfo=clickedVertical%3Amynetwork%2CclickedEntityId%3A52230870%2CauthType%3ANAME_SEARCH%2Cidx%3A1-2-2%2CtarId%3A1441907694834%2Ctas%3Achristian",
|
||||
"image": "https://media.licdn.com/mpr/mpr/shrinknp_400_400/AAEAAQAAAAAAAAa-AAAAJDVkYmQyNTdmLTJkM2UtNDRjNi04NjZkLThlMmE3ZTg0NzhlZQ.jpg"
|
||||
},
|
||||
{
|
||||
"camper": "James Allen",
|
||||
"quote": "I finally feel like I can learn to code in my own time and progress to the point of employability.",
|
||||
"github": "None Given",
|
||||
"linkedin": "https://www.linkedin.com/profile/view?id=AAkAAA4OrsIB5WyfuqeECSQO7HYisImVMDiFBl0&authType=NAME_SEARCH&authToken=Uxjm&locale=en_US&trk=tyah&trkInfo=clickedVertical%3Amynetwork%2CclickedEntityId%3A235843266%2CauthType%3ANAME_SEARCH%2Cidx%3A1-1-1%2CtarId%3A1441907723968%2Ctas%3Ajames%20allen",
|
||||
"image": "https://media.licdn.com/media/p/5/000/228/30b/1bb1c6f.jpg"
|
||||
},
|
||||
{
|
||||
"camper": "Jason Arnold",
|
||||
"quote": "I like self-paced learning, so Free Code Camp has been great. The challenges are difficult enough to push boundaries but not so tough to scare people off.",
|
||||
"github": "thejasonfile",
|
||||
"linkedin": "https://www.linkedin.com/profile/view?id=AAkAAABlImsBwAEZ3u3A5NIlCegho8WZ2j4h0w0&authType=NAME_SEARCH&authToken=gaxA&locale=en_US&trk=tyah&trkInfo=clickedVertical%3Amynetwork%2CclickedEntityId%3A6627947%2CauthType%3ANAME_SEARCH%2Cidx%3A1-1-1%2CtarId%3A1441907738051%2Ctas%3Ajason%20arn",
|
||||
"image": "https://media.licdn.com/media/p/6/005/05d/271/0bdaef1.jpg"
|
||||
},
|
||||
{
|
||||
"camper": "Kaveet Laxmidas",
|
||||
"quote": "Free Code Camp is inspiring me to overhaul some of my old open source projects using more modern approaches and technologies.",
|
||||
"github": "kaveet",
|
||||
"linkedin": "https://www.linkedin.com/profile/view?id=AAkAABZooOgBZJg_0MAJ09pd5vROk83oBFA1cEE&authType=NAME_SEARCH&authToken=52Ju&locale=en_US&trk=tyah&trkInfo=clickedVertical%3Amynetwork%2CclickedEntityId%3A375955688%2CauthType%3ANAME_SEARCH%2Cidx%3A1-1-1%2CtarId%3A1441907749550%2Ctas%3Akaveet%20",
|
||||
"image": "https://media.licdn.com/mpr/mpr/shrinknp_400_400/AAEAAQAAAAAAAAMiAAAAJDlhMGNiYzdjLTNlZmEtNDI3MC04Mzg4LTU4YTBkYjkxYTg5Zg.jpg"
|
||||
},
|
||||
{
|
||||
"camper": "Brett Guillory",
|
||||
"quote": "Free Code Camp has given me a great, goal oriented curriculum to learn exactly what I was looking for. And best of all it’s 100% free!",
|
||||
"github": "Kurzninja",
|
||||
"linkedin": "https://www.linkedin.com/profile/view?id=AAkAAAUMPqMBa6GwMTkA_oHUeqnZzyD95FisjwM&authType=NAME_SEARCH&authToken=-mt1&locale=en_US&trk=tyah&trkInfo=clickedVertical%3Amynetwork%2CclickedEntityId%3A84688547%2CauthType%3ANAME_SEARCH%2Cidx%3A1-2-2%2CtarId%3A1441907760167%2Ctas%3Abrett",
|
||||
"image": "https://media.licdn.com/mpr/mpr/shrinknp_400_400/p/5/005/054/0cd/0fee17b.jpg"
|
||||
},
|
||||
{
|
||||
"camper": "Kory J. Campbell",
|
||||
"quote": "I just graduated university, so my financial status is pretty meager, however this camp has definitely helped me improve my skills.",
|
||||
"github": "@koryjcampbell [sic]",
|
||||
"linkedin": "https://www.linkedin.com/profile/view?id=AAkAAAtxvTgB0N_uJhW-87Dew4wHyeqLUP-XyZk&authType=NAME_SEARCH&authToken=0hqw&locale=en_US&trk=tyah&trkInfo=clickedVertical%3Amynetwork%2CclickedEntityId%3A192003384%2CauthType%3ANAME_SEARCH%2Cidx%3A1-1-1%2CtarId%3A1441907770739%2Ctas%3Akory",
|
||||
"image": "https://media.licdn.com/mpr/mpr/shrinknp_400_400/p/4/000/17a/3cd/3b781f4.jpg"
|
||||
},
|
||||
{
|
||||
"camper": "Bryon Christopher Miller",
|
||||
"quote": "Free Code Camp has given me a free, online opportunity to study full stack JavaScript in a structured, community-based format. I am very grateful for this opportunity.",
|
||||
"github": "bryonmiller",
|
||||
"linkedin": "https://www.linkedin.com/profile/view?id=AAkAABEXhHoBxj3Uiq7I0a5v1pVkeJ1gWycbm90&authType=NAME_SEARCH&authToken=4klF&locale=en_US&trk=tyah&trkInfo=clickedVertical%3Amynetwork%2CclickedEntityId%3A286753914%2CauthType%3ANAME_SEARCH%2Cidx%3A1-1-1%2CtarId%3A1441907784405%2Ctas%3Abryon",
|
||||
"image": "https://media.licdn.com/mpr/mpr/shrinknp_400_400/p/7/005/07d/040/1d3ca82.jpg"
|
||||
},
|
||||
{
|
||||
"camper": "Darren Joy",
|
||||
"quote": "Great learning opportunity. Good coding challenges and I’m meeting some very motivated people.",
|
||||
"github": "Darrenfj",
|
||||
"linkedin": "https://www.linkedin.com/profile/view?id=AAkAAARv6UIBWeXw4ZfCJ70kBKgnhcv8XgnVsa8&authType=NAME_SEARCH&authToken=fMvj&locale=en_US&trk=tyah&trkInfo=clickedVertical%3Amynetwork%2CclickedEntityId%3A74443074%2CauthType%3ANAME_SEARCH%2Cidx%3A1-2-2%2CtarId%3A1441907795737%2Ctas%3Adarren",
|
||||
"image": "https://media.licdn.com/mpr/mpr/shrinknp_400_400/AAEAAQAAAAAAAANwAAAAJGRiNjA5Zjg4LTE0OTEtNGVlNi1hZjdlLWFkOWZhNzk2YzJiNg.jpg"
|
||||
},
|
||||
{
|
||||
"camper": "Stephen Mayeux",
|
||||
"quote": "Free Code Camp is helpful because it’s not 100% hand-holding, and it pushes me out of my comfort zone.",
|
||||
"github": "stephenmayeux",
|
||||
"linkedin": "https://www.linkedin.com/profile/view?id=AAkAAAjTe7cBhjovoz6zTE_M6MwZ_rr3szhiSOM&authType=NAME_SEARCH&authToken=s6xI&locale=en_US&trk=tyah&trkInfo=clickedVertical%3Amynetwork%2CclickedEntityId%3A148077495%2CauthType%3ANAME_SEARCH%2Cidx%3A1-2-2%2CtarId%3A1441907806830%2Ctas%3Astephen",
|
||||
"image": "https://media.licdn.com/mpr/mpr/shrinknp_400_400/AAEAAQAAAAAAAAUmAAAAJDg3MzIzMGVlLWYzZGEtNGE0Yi05ODkzLTFkODkyOWI5N2NjYg.jpg"
|
||||
},
|
||||
{
|
||||
"camper": "John Hillegass",
|
||||
"quote": "Free Code Camp has given me the confidence that I need when heading into high level client meetings and developer scrum sessions.",
|
||||
"github": "Ohillio",
|
||||
"linkedin": "https://www.linkedin.com/profile/view?id=AAkAAAWEO3AB51y8eR2tYF8nydQb8kANkdPwR5U&authType=NAME_SEARCH&authToken=Pzvi&locale=en_US&trk=tyah&trkInfo=clickedVertical%3Amynetwork%2CclickedEntityId%3A92552048%2CauthType%3ANAME_SEARCH%2Cidx%3A1-1-1%2CtarId%3A1441907818081%2Ctas%3Ajohn%20hille",
|
||||
"image": "https://media.licdn.com/mpr/mpr/shrinknp_400_400/p/2/000/1cd/27b/2ab4573.jpg"
|
||||
},
|
||||
{
|
||||
"camper": "Eric Hartline",
|
||||
"quote": "The community is very helpful, and I have already accomplished so much more than what I did with other self-guided courses.",
|
||||
"github": "wildlifehexagon",
|
||||
"linkedin": "https://www.linkedin.com/profile/view?id=AAkAAAFitUwByB_tgxdExntMnakgQnTK1H3eEd8&authType=NAME_SEARCH&authToken=230A&locale=en_US&trk=tyah&trkInfo=clickedVertical%3Amynetwork%2CclickedEntityId%3A23246156%2CauthType%3ANAME_SEARCH%2Cidx%3A1-1-1%2CtarId%3A1441907829391%2Ctas%3Aeric%20har",
|
||||
"image": "https://media.licdn.com/mpr/mpr/shrinknp_400_400/p/2/000/1e1/095/12800b6.jpg"
|
||||
},
|
||||
{
|
||||
"camper": "Brian Grant ",
|
||||
"quote": "It has given me a place where like minded people are learning to code together. It has also inspired me to start a code camp here in the midwest.",
|
||||
"github": "codeseekingman",
|
||||
"linkedin": "https://www.linkedin.com/profile/view?id=AAkAAAEUqXoBFOq1SWQrBsTMHG4ij9Ss4Qqnrtg&authType=NAME_SEARCH&authToken=a85-&locale=en_US&trk=tyah&trkInfo=clickedVertical%3Amynetwork%2CclickedEntityId%3A18131322%2CauthType%3ANAME_SEARCH%2Cidx%3A1-1-1%2CtarId%3A1441907840255%2Ctas%3Abrian%20g",
|
||||
"image": "https://media.licdn.com/mpr/mpr/shrinknp_400_400/AAEAAQAAAAAAAANEAAAAJGY5ZjZkMDVjLTJhY2EtNDZjYS1iMDk5LTY0ZDliN2EyODUxMQ.jpg"
|
||||
},
|
||||
{
|
||||
"camper": "Danielle J Moss",
|
||||
"quote": "Aside from learning to code in a fun way, I also know I’m not alone and have somewhere to go when I do get stuck and need help.",
|
||||
"github": "psykobilliethekid",
|
||||
"linkedin": "https://www.linkedin.com/profile/view?id=AAkAAAV4ccABlbMXZ5VfzvlYentPOIKzFbjgbZM&authType=NAME_SEARCH&authToken=D-EU&locale=en_US&trk=tyah&trkInfo=clickedVertical%3Amynetwork%2CclickedEntityId%3A91779520%2CauthType%3ANAME_SEARCH%2Cidx%3A1-4-4%2CtarId%3A1441907855210%2Ctas%3Adanielle%20",
|
||||
"image": "https://media.licdn.com/mpr/mpr/shrinknp_400_400/p/5/000/1be/2cb/16e5e39.jpg"
|
||||
},
|
||||
{
|
||||
"camper": "Orcun Tonyali",
|
||||
"quote": "The thorough curriculum helped a lot in managing my company’s website.",
|
||||
"github": "orcuntonyali",
|
||||
"linkedin": "https://www.linkedin.com/profile/view?id=AAkAAAVwBQIBvE3-M8pDWxzep9umHDnV6JjKmTU&authType=NAME_SEARCH&authToken=h4NM&locale=en_US&trk=tyah&trkInfo=clickedVertical%3Amynetwork%2CclickedEntityId%3A91227394%2CauthType%3ANAME_SEARCH%2Cidx%3A1-1-1%2CtarId%3A1441907869032%2Ctas%3Aorcun",
|
||||
"image": "https://media.licdn.com/mpr/mpr/shrinknp_400_400/AAEAAQAAAAAAAAI7AAAAJDE2ZGVkY2IxLTkyZDEtNDUwNS1iNmU0LWI5ZWUzYjUxZDIyMw.jpg"
|
||||
},
|
||||
{
|
||||
"camper": "Brendan Murphy",
|
||||
"quote": "I like that it isn’t just a 9 week course. The chat room and partner coding were also very helpful.",
|
||||
"github": "dendari",
|
||||
"linkedin": "https://www.linkedin.com/profile/view?id=AAkAAAA06V8BqPNnPod-FGRuvifILht-QwZX3YY&authType=NAME_SEARCH&authToken=9SFh&locale=en_US&trk=tyah&trkInfo=clickedVertical%3Amynetwork%2CclickedEntityId%3A3467615%2CauthType%3ANAME_SEARCH%2Cidx%3A1-1-1%2CtarId%3A1441907882775%2Ctas%3Abrendan%20m",
|
||||
"image": "https://media.licdn.com/media/p/5/000/2be/073/198504b.jpg"
|
||||
},
|
||||
{
|
||||
"camper": "Michael Berry",
|
||||
"quote": "Free Code Camp has helped me learn JavaScript, jQuery, and Bootstrap as well as helped me brush up on my HTML and CSS skills. I was laid off from Boeing in April. I’m hoping to land a job as a JavaScript developer as I get closer to finishing the curriculum. I wish I had known about Free Code Camp sooner.",
|
||||
"github": "Karnblack ",
|
||||
"linkedin": "https://www.linkedin.com/profile/view?id=AAkAAAGRqf4BwCI3cdJw9wAPc6NlReG3fzOIQq0&authType=NAME_SEARCH&authToken=SqNG&locale=en_US&trk=tyah&trkInfo=clickedVertical%3Amynetwork%2CclickedEntityId%3A26323454%2CauthType%3ANAME_SEARCH%2Cidx%3A1-1-1%2CtarId%3A1441907895359%2Ctas%3Amichael%20berr",
|
||||
"image": "https://media.licdn.com/mpr/mpr/shrinknp_400_400/AAEAAQAAAAAAAAM3AAAAJDc2YTRmMjY1LTcxNjQtNDJjOC1hYWJmLTJkMGFkMWVhYjE3Mw.jpg"
|
||||
},
|
||||
{
|
||||
"camper": "Angie Canon",
|
||||
"quote": "Free Code Camp is helping my career. I work with developers and I’m beginning to understand their world better. I can phrase questions more clearly, and begin to guess what an issue might be related to.",
|
||||
"github": "angiecan",
|
||||
"linkedin": "https://www.linkedin.com/profile/view?id=AAkAAACfWbABAMsll9ovljvvsLpH317o47hNHX0&authType=NAME_SEARCH&authToken=UmUf&locale=en_US&trk=tyah&trkInfo=clickedVertical%3Amynetwork%2CclickedEntityId%3A10443184%2CauthType%3ANAME_SEARCH%2Cidx%3A1-1-1%2CtarId%3A1441907913670%2Ctas%3Aangie%20canon",
|
||||
"image": "https://media.licdn.com/mpr/mpr/shrinknp_400_400/p/8/000/20b/098/273de00.jpg"
|
||||
},
|
||||
{
|
||||
"camper": "Irfan Kucuk",
|
||||
"quote": "I’ve long been looking for a place that could keep me interested in learning how to code. I’ve tried several Codecademy and comparable places, but none have proven as engaging as Free Code Camp.",
|
||||
"github": "Ikucuk",
|
||||
"linkedin": "https://www.linkedin.com/profile/view?id=AAkAAA5ripkBiFAjXkB3ndO6sKiiq6gD21mk6bw&authType=NAME_SEARCH&authToken=46t_&locale=en_US&trk=tyah&trkInfo=clickedVertical%3Amynetwork%2CclickedEntityId%3A241928857%2CauthType%3ANAME_SEARCH%2Cidx%3A1-2-2%2CtarId%3A1441907929553%2Ctas%3Airfan%20kuc",
|
||||
"image": "https://media.licdn.com/mpr/mpr/shrinknp_400_400/p/4/005/027/3f1/08ce9a4.jpg"
|
||||
},
|
||||
{
|
||||
"camper": "Jonathan Kvicky",
|
||||
"quote": "Free Code Camp has given me a strong foundational advantage into pursuing a career in software/web development, and has also served as a great platform for connecting with others who share the same passion for software engineering.",
|
||||
"github": "jonkvix",
|
||||
"linkedin": "https://www.linkedin.com/profile/view?id=AAkAABk3i9YB_hcw1AyVg2QHaf8KMQ8ADQ_R_vg&authType=NAME_SEARCH&authToken=0yLa&locale=en_US&trk=tyah&trkInfo=clickedVertical%3Amynetwork%2CclickedEntityId%3A423070678%2CauthType%3ANAME_SEARCH%2Cidx%3A1-1-1%2CtarId%3A1441907942441%2Ctas%3Ajonathan%20kv",
|
||||
"image": "https://media.licdn.com/mpr/mpr/shrinknp_400_400/AAEAAQAAAAAAAANTAAAAJDk3ZGMwMjFlLTZkNDYtNDgwYy05NGE0LTk5ZjgwNGQ4NWU0OA.jpg"
|
||||
},
|
||||
{
|
||||
"camper": "Susannah Skyer Gupta",
|
||||
"quote": "As a jack-of-all-trades at a small educational software company, I’m already putting my coding skills to work, beginning to submit my own pull requests for bug fixes instead of just opening a problem ticket and waiting for someone else to fix it.",
|
||||
"github": "SuzGupta",
|
||||
"linkedin": "https://www.linkedin.com/profile/view?id=AAkAAAFIosEBLewkmbuudMwAqiTM5YE3wHvcE4A&authType=NAME_SEARCH&authToken=dFye&locale=en_US&trk=tyah&trkInfo=clickedVertical%3Amynetwork%2CclickedEntityId%3A21537473%2CauthType%3ANAME_SEARCH%2Cidx%3A1-1-1%2CtarId%3A1441907953988%2Ctas%3Asusanna",
|
||||
"image": "https://media.licdn.com/mpr/mpr/shrinknp_400_400/p/7/005/025/20f/3d29475.jpg"
|
||||
},
|
||||
{
|
||||
"camper": "Puneet Shivanand",
|
||||
"quote": "Free Code Camp has helped me create and maintain a website for a local bioinformatics conference.",
|
||||
"github": "puneet-shivanand",
|
||||
"linkedin": "https://www.linkedin.com/profile/view?id=AAkAAArBgXABw4qoSJQoGjqrvU6_vBX1gUmcwGg&authType=NAME_SEARCH&authToken=bARS&locale=en_US&trk=tyah&trkInfo=clickedVertical%3Amynetwork%2CclickedEntityId%3A180453744%2CauthType%3ANAME_SEARCH%2Cidx%3A1-1-1%2CtarId%3A1441907966038%2Ctas%3Apuneet",
|
||||
"image": "https://media.licdn.com/mpr/mpr/shrinknp_400_400/AAEAAQAAAAAAAAUYAAAAJGI3NmNlMGNhLWM1NDEtNGNlNS1iNmQzLTY0OTM3OGEzMTk0Yg.jpg"
|
||||
},
|
||||
{
|
||||
"camper": "Ian Seabrook",
|
||||
"quote": "I’ve made connections with people I never would have approached before Free Code Camp.",
|
||||
"github": "ianseabrook",
|
||||
"linkedin": "https://www.linkedin.com/profile/view?id=AAkAAAuVUi4BSJ3K6fcyTa2fnZr_9Oosb3nKM34&authType=NAME_SEARCH&authToken=b7uD&locale=en_US&trk=tyah&trkInfo=clickedVertical%3Amynetwork%2CclickedEntityId%3A194335278%2CauthType%3ANAME_SEARCH%2Cidx%3A1-1-1%2CtarId%3A1441907982480%2Ctas%3Aian%20seabroo",
|
||||
"image": "https://media.licdn.com/mpr/mpr/shrinknp_400_400/AAEAAQAAAAAAAAJNAAAAJDVkMmI1MDYxLTc1ZmEtNDY0Yy05MTRhLTY1ZjVkNWQyNWI1Ng.jpg"
|
||||
},
|
||||
{
|
||||
"camper": "Oleh Kuchuk",
|
||||
"quote": "The coding exercises helped me to prepare for my first job interview.",
|
||||
"github": "drkraken",
|
||||
"linkedin": "https://www.linkedin.com/profile/view?id=AAkAABgy6MwBva2OKpsffAU-OBBeTC7qahTYpGw&authType=NAME_SEARCH&authToken=Xm_u&locale=en_US&trk=tyah&trkInfo=clickedVertical%3Amynetwork%2CclickedEntityId%3A405989580%2CauthType%3ANAME_SEARCH%2Cidx%3A1-1-1%2CtarId%3A1441907996469%2Ctas%3Aoleh%20kuchuk",
|
||||
"image": "https://pbs.twimg.com/profile_images/518155039781580800/djkuOlrL.jpeg"
|
||||
},
|
||||
{
|
||||
"camper": "Larisa Bekerman",
|
||||
"quote": "Free Code Camp has made me more comfortable with certain aspects of code and helped me review and understand concepts in a more hands-on style. Some people learn by reading theory, I don’t understand things until I’ve made them work myself!",
|
||||
"github": "xaosqueen",
|
||||
"linkedin": "https://www.linkedin.com/profile/view?id=AAkAAAB-SHUBga96BB-iaHe7QFI-S2dFmeUQaq0&authType=NAME_SEARCH&authToken=CWOo&locale=en_US&trk=tyah&trkInfo=clickedVertical%3Amynetwork%2CclickedEntityId%3A8276085%2CauthType%3ANAME_SEARCH%2Cidx%3A1-1-1%2CtarId%3A1441908013366%2Ctas%3Alarisa%20beker",
|
||||
"image": "https://media.licdn.com/mpr/mpr/shrinknp_400_400/p/8/005/093/243/2c06287.jpg"
|
||||
},
|
||||
{
|
||||
"camper": "Jesse Mull",
|
||||
"quote": "I learned more using Free Code Camp in three months than I ever could have at a traditional university.",
|
||||
"github": "jessemull",
|
||||
"linkedin": "https://www.linkedin.com/profile/view?id=AAkAAAr2HfcBswHtmQeLM1rxDEg7GdCuxvNin5s&authType=NAME_SEARCH&authToken=nca0&locale=en_US&trk=tyah&trkInfo=clickedVertical%3Amynetwork%2CclickedEntityId%3A183901687%2CauthType%3ANAME_SEARCH%2Cidx%3A1-1-1%2CtarId%3A1441908026733%2Ctas%3Ajesse%20mull",
|
||||
"image": "https://media.licdn.com/mpr/mpr/shrinknp_400_400/p/3/005/016/3ff/006213a.jpg"
|
||||
},
|
||||
{
|
||||
"camper": "Mihai Popescu",
|
||||
"quote": "The exercises helped me hone my skills and get an internship at a tech startup. My projects were a great talking point in the interview, showing them what I did and how I approached the problems. Great thing you are doing here.",
|
||||
"github": "Mihaisavezi",
|
||||
"linkedin": "https://www.linkedin.com/profile/view?id=AAkAAApQxGQBYz-WAQu_0zXPTkW-R7QbdaXEZeA&authType=NAME_SEARCH&authToken=r84S&locale=en_US&trk=tyah&trkInfo=clickedVertical%3Amynetwork%2CclickedEntityId%3A173065316%2CauthType%3ANAME_SEARCH%2Cidx%3A1-1-1%2CtarId%3A1441908038920%2Ctas%3Amihai%20p",
|
||||
"image": "https://lh6.googleusercontent.com/-4JB6FPzm9ZE/VakUEj7WYsI/AAAAAAAALkU/4C0ILUwn-B8/w888-h891-no/profilepic.png"
|
||||
},
|
||||
{
|
||||
"camper": "Zlatko Cabric",
|
||||
"quote": "I am still in school, pursuing an AS in web development. The JavaScript course in college was a breeze thanks to Free Code Camp.",
|
||||
"github": "zlajac ",
|
||||
"linkedin": "https://www.linkedin.com/profile/view?id=AAkAAAsCCFMBUlE24Ie41G_YS3XhdtQMDl5vCZA&authType=NAME_SEARCH&authToken=h1m7&locale=en_US&trk=tyah&trkInfo=clickedVertical%3Amynetwork%2CclickedEntityId%3A184682579%2CauthType%3ANAME_SEARCH%2Cidx%3A1-1-1%2CtarId%3A1441908055072%2Ctas%3Azlat",
|
||||
"image": "https://media.licdn.com/mpr/mpr/shrinknp_400_400/AAEAAQAAAAAAAALQAAAAJDMzNjY4M2UwLWVlYWEtNGQwYS04MDY0LTVjNGVhNGNhYWM5OQ.jpg"
|
||||
},
|
||||
{
|
||||
"camper": "Anthony DePaolo",
|
||||
"quote": "I can learn web development at my own pace, which is great with my crazy life’s schedule. It also doesn’t cost $10k-$17k, which I just can’t fork over right now.",
|
||||
"github": "adepaolo",
|
||||
"linkedin": "https://www.linkedin.com/profile/view?id=AAkAAAOCUkABzCvw3p1mBiPbbFWq91BEFXGXKxA&authType=NAME_SEARCH&authToken=7zb7&locale=en_US&trk=tyah&trkInfo=clickedVertical%3Amynetwork%2CclickedEntityId%3A58872384%2CauthType%3ANAME_SEARCH%2Cidx%3A1-1-1%2CtarId%3A1441908068309%2Ctas%3Aanthony%20depa",
|
||||
"image": "https://media.licdn.com/mpr/mpr/shrinknp_400_400/AAEAAQAAAAAAAAJPAAAAJGI4NGY3ZGI1LWM2N2UtNGQ2Ni1iZDUwLTFkN2I4YWM2YThjMQ.jpg"
|
||||
}
|
||||
]
|
@ -16,6 +16,7 @@ var getUsernameFromProvider = require('./utils/auth').getUsernameFromProvider;
|
||||
var generateKey =
|
||||
require('loopback-component-passport/lib/models/utils').generateKey;
|
||||
|
||||
var isBeta = !!process.env.BETA;
|
||||
var app = loopback();
|
||||
|
||||
expressState.extend(app);
|
||||
@ -96,10 +97,13 @@ app.start = function() {
|
||||
app.listen(app.get('port'), function() {
|
||||
app.emit('started');
|
||||
console.log(
|
||||
'FreeCodeCamp server listening on port %d in %s mode',
|
||||
'FreeCodeCamp server listening on port %d in %s',
|
||||
app.get('port'),
|
||||
app.get('env')
|
||||
);
|
||||
if (isBeta) {
|
||||
console.log('Free Code Camp is in beta mode');
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
|
4
server/utils/commit-goals.json
Normal file
4
server/utils/commit-goals.json
Normal file
@ -0,0 +1,4 @@
|
||||
{
|
||||
"frontEndCert": "Front End Development Certification",
|
||||
"fullStackCert": "Full Stack Development Certification"
|
||||
}
|
36
server/utils/commit.js
Normal file
36
server/utils/commit.js
Normal file
@ -0,0 +1,36 @@
|
||||
import dedent from 'dedent';
|
||||
import debugFactory from 'debug';
|
||||
import { Observable } from 'rx';
|
||||
|
||||
import commitGoals from './commit-goals.json';
|
||||
const debug = debugFactory('freecc:utils/commit');
|
||||
|
||||
export { commitGoals };
|
||||
|
||||
export function completeCommitment$(user) {
|
||||
const { isFrontEndCert, isFullStackCert } = user;
|
||||
return Observable.fromNodeCallback(user.pledge, user)()
|
||||
.flatMap(pledge => {
|
||||
if (!pledge) {
|
||||
return Observable.just('No pledge found');
|
||||
}
|
||||
|
||||
const { goal } = pledge;
|
||||
|
||||
if (
|
||||
isFrontEndCert && goal === commitGoals.frontEndCert ||
|
||||
isFullStackCert && goal === commitGoals.fullStackCert
|
||||
) {
|
||||
debug('marking goal complete');
|
||||
pledge.isCompleted = true;
|
||||
pledge.dateEnded = new Date();
|
||||
pledge.formerUserId = pledge.userId;
|
||||
pledge.userId = null;
|
||||
return Observable.fromNodeCallback(pledge.save, pledge)();
|
||||
}
|
||||
return Observable.just(dedent`
|
||||
You have not yet reached your goal of completing the ${goal}
|
||||
Please retry when you have met the requirements.
|
||||
`);
|
||||
});
|
||||
}
|
18
server/utils/commit.json
Normal file
18
server/utils/commit.json
Normal file
@ -0,0 +1,18 @@
|
||||
[
|
||||
{
|
||||
"name": "girl develop it",
|
||||
"displayName": "Girl Develop It",
|
||||
"donateUrl": "https://www.girldevelopit.com/donate",
|
||||
"description": "Girl Develop It provides in-person classes for women to learn to code.",
|
||||
"imgAlt": "Girl Develop It participants coding at tables.",
|
||||
"imgUrl": "http://i.imgur.com/U1CyEuA.jpg"
|
||||
},
|
||||
{
|
||||
"name": "black girls code",
|
||||
"displayName": "Black Girls CODE",
|
||||
"donateUrl": "http://www.blackgirlscode.com/",
|
||||
"description": "Black Girls CODE is devoted to showing the world that black girls can code, and do so much more.",
|
||||
"imgAlt": "Girls developing code with instructor",
|
||||
"imgUrl": "http://i.imgur.com/HBVrdaj.jpg"
|
||||
}
|
||||
]
|
@ -1,8 +1,14 @@
|
||||
export function ifNoUserRedirectTo(url) {
|
||||
export function ifNoUserRedirectTo(url, message) {
|
||||
return function(req, res, next) {
|
||||
const { path } = req;
|
||||
if (req.user) {
|
||||
return next();
|
||||
}
|
||||
|
||||
req.flash('errors', {
|
||||
msg: message || `You must be signed to go to ${path}`
|
||||
});
|
||||
|
||||
return res.redirect(url);
|
||||
};
|
||||
}
|
||||
|
@ -5,38 +5,38 @@ block content
|
||||
var challengeName = 'Profile View';
|
||||
if (user && user.username === username)
|
||||
.panel.panel-info
|
||||
.panel-heading.text-center Update Your Portfolio
|
||||
.panel-heading.text-center Update your code portfolio
|
||||
.panel-body
|
||||
.row
|
||||
.col-xs-12
|
||||
if (!user.isGithubCool)
|
||||
a.btn.btn-lg.btn-block.btn-github.btn-link-social(href='/link/github')
|
||||
i.fa.fa-github
|
||||
| Link my GitHub to unlock this profile
|
||||
| Link my GitHub to unlock my portfolio
|
||||
else
|
||||
a.btn.btn-lg.btn-block.btn-github.btn-link-social(href='/link/github')
|
||||
i.fa.fa-github
|
||||
| Update my profile from GitHub
|
||||
| Update my portfolio from GitHub
|
||||
if (!user.twitter)
|
||||
a.btn.btn-lg.btn-block.btn-twitter.btn-link-social(href='/link/twitter')
|
||||
i.fa.fa-twitter
|
||||
| Add my Twitter to my profile
|
||||
| Add my Twitter to my portfolio
|
||||
if (!user.facebook)
|
||||
a.btn.btn-lg.btn-block.btn-facebook.btn-link-social(href='/link/facebook')
|
||||
i.fa.fa-facebook
|
||||
| Add my Facebook to my profile
|
||||
| Add my Facebook to my portfolio
|
||||
if (!user.linkedin)
|
||||
a.btn.btn-lg.btn-block.btn-linkedin.btn-link-social(href='/link/linkedin')
|
||||
i.fa.fa-linkedin
|
||||
| Add my LinkedIn to my profile
|
||||
| Add my LinkedIn to my portfolio
|
||||
if (!user.google)
|
||||
a.btn.btn-lg.btn-block.btn-google-plus.btn-link-social(href='/link/google')
|
||||
i.fa.fa-google-plus
|
||||
| Add my Google+ to my profile
|
||||
| Add my Google+ to my portfolio
|
||||
|
||||
.panel.panel-info
|
||||
.panel-heading.text-center
|
||||
h1 #{username}'s portfolio
|
||||
h1 #{username}'s code portfolio
|
||||
.panel-body
|
||||
.row
|
||||
.col-xs-12.col-sm-10.col-sm-offset-1.col-md-8.col-md-offset-2.text-center
|
||||
@ -58,15 +58,22 @@ block content
|
||||
h1.flat-top.wrappable= name
|
||||
h1.flat-top.wrappable= location
|
||||
h1.flat-top.text-primary= "[ " + (progressTimestamps.length) + " ]"
|
||||
if pledge
|
||||
.spacer
|
||||
h4
|
||||
| This camper has committed to giving $#{pledge.amount} to
|
||||
a(href='#{pledge.donateUrl}?ref=freecodecamp.com' target='_blank') #{pledge.displayName}
|
||||
| each month until they have completed their #{pledge.goal}.
|
||||
.spacer
|
||||
if isFrontEndCert
|
||||
a.btn.btn-primary(href='/' + username + '/front-end-certification') View My Front End Development Certification
|
||||
if isFullStackCert
|
||||
.button-spacer
|
||||
a.btn.btn-success(href='/' + username + '/full-stack-certification') View My Full Stack Development Certification
|
||||
if (user && user.username !== username)
|
||||
a.btn.btn-lg.btn-block.btn-twitter.btn-link-social(href='/leaderboard/add?username=#{username}')
|
||||
i.fa.fa-plus-square
|
||||
| Add them to my personal leaderboard
|
||||
//if (user && user.username !== username)
|
||||
// a.btn.btn-lg.btn-block.btn-twitter.btn-link-social(href='/leaderboard/add?username=#{username}')
|
||||
// i.fa.fa-plus-square
|
||||
// | Add them to my personal leaderboard
|
||||
|
||||
.spacer
|
||||
.hidden-xs.hidden-sm.col-md-12
|
||||
@ -131,7 +138,7 @@ block content
|
||||
td.col-xs-4= bonfire.name
|
||||
td.col-xs-2= moment(bonfire.completedDate, 'x').format("MMM DD, YYYY")
|
||||
td.col-xs-6
|
||||
a(href='/challenges/' + bonfire.name + '?solution=' + encodeURIComponent(bonfire.solution), target='_blank') View my solution
|
||||
a(href='/challenges/' + bonfire.name + '?solution=' + encodeURIComponent(replaceScriptTags(bonfire.solution)), target='_blank') View my solution
|
||||
if (waypoints.length > 0)
|
||||
.col-sm-12
|
||||
table.table.table-striped
|
||||
@ -146,14 +153,18 @@ block content
|
||||
td.col-xs-2= moment(challenge.completedDate, 'x').format("MMM DD, YYYY")
|
||||
td.col-xs-6
|
||||
if (challenge.solution)
|
||||
a(href='/challenges/' + challenge.name + '?solution=' + encodeURIComponent(challenge.solution), target='_blank') View my solution
|
||||
a(href='/challenges/' + challenge.name + '?solution=' + encodeURIComponent(replaceScriptTags(challenge.solution)), target='_blank') View my solution
|
||||
else
|
||||
a(href='/challenges/' + challenge.name) View this challenge
|
||||
|
||||
if (user && user.username === username)
|
||||
.panel.panel-info
|
||||
.panel-heading.text-center Manage Your Account
|
||||
.panel-heading.text-center Manage your account
|
||||
.panel-body
|
||||
.col-xs-12
|
||||
a.btn.btn-lg.btn-block.btn-warning.btn-link-social(href='/logout')
|
||||
span.ion-android-exit
|
||||
| Sign me out of Free Code Camp
|
||||
.col-xs-12
|
||||
a.btn.btn-lg.btn-block.btn-primary.btn-link-social(href='mailto:team@freecodecamp.com')
|
||||
span.ion-email
|
||||
@ -169,9 +180,9 @@ block content
|
||||
span.ion-unlocked
|
||||
| Let other people see all my solutions
|
||||
.col-xs-12
|
||||
a.btn.btn-lg.btn-block.btn-warning.btn-link-social(href='/logout')
|
||||
span.ion-android-exit
|
||||
| Sign me out of Free Code Camp
|
||||
a.btn.btn-lg.btn-block.btn-success.btn-link-social(href='/commit')
|
||||
span.ion-edit
|
||||
| Edit my pledge
|
||||
.col-xs-12
|
||||
a.btn.btn-lg.btn-block.btn-danger.btn-link-social.confirm-deletion
|
||||
span.ion-trash-b
|
||||
|
@ -18,35 +18,17 @@ block content
|
||||
span.text-primary #{daysRunning}  
|
||||
| days ago.
|
||||
.spacer
|
||||
if (user && !user.tshirtVote && user.progressTimestamps.length > 5)
|
||||
h3.text-center Vote for the T-shirt design you like the most.
|
||||
h4.text-center We'll announce the winning design during our Summit on Saturday at Noon EST on 
|
||||
a(href='https://twitch.tv/freecodecamp' target='_blank') Twitch.tv
|
||||
|  and it will become our community's first official t-shirt (in women's and men's sizes).
|
||||
.row
|
||||
.col-xs-6
|
||||
a(href="http://i.imgur.com/LlXGa5y.png" data-lightbox="img-enlarge")
|
||||
img.img-responsive(src='http://i.imgur.com/LlXGa5y.png' alt="t-shirt option 1 women's")
|
||||
.col-xs-6
|
||||
a(href="http://i.imgur.com/aefwnnv.png" data-lightbox="img-enlarge")
|
||||
img.img-responsive(src='http://i.imgur.com/aefwnnv.png' alt="t-shirt option 2 women's")
|
||||
.button-spacer
|
||||
.row
|
||||
.col-xs-6
|
||||
a(href="http://i.imgur.com/aYH0aqf.png" data-lightbox="img-enlarge")
|
||||
img.img-responsive(src='http://i.imgur.com/aYH0aqf.png' alt="t-shirt option 1 men's")
|
||||
.col-xs-6
|
||||
a(href="http://i.imgur.com/v9KlV4g.png" data-lightbox="img-enlarge")
|
||||
img.img-responsive(src='http://i.imgur.com/v9KlV4g.png' alt="t-shirt option 2 men's")
|
||||
.button-spacer
|
||||
.row
|
||||
.col-xs-6
|
||||
h3.text-center "Minified JavaScript Logo"
|
||||
a.button.btn.btn-block.btn-primary(href='/vote1') Vote for this Design
|
||||
.col-xs-6
|
||||
h3.text-center "Function Call Logo"
|
||||
a.button.btn.btn-block.btn-primary(href='/vote2') Vote for this design
|
||||
.spacer
|
||||
if (user && user.progressTimestamps.length > 5)
|
||||
#tshirt-notice.col-xs-12.col-md-8.col-md-offset-2.hidden
|
||||
h2.text-center Get our first-edition t-shirt
|
||||
img.thumbnail.img-center.img-responsive(src="http://i.imgur.com/o07uuOL.png")
|
||||
p.text-justify Our community has voted. Get our winning design emblazoned on a durable, American-made American Apparel shirt (available in women's and men's sizes). 
|
||||
a(href="https://teespring.com/free-code-camp-shirt-eu" target="_blank") Also ships from Europe
|
||||
| .
|
||||
a.button.btn.btn-block.signup-btn(href="https://teespring.com/get-free-code-camp-t-shirt" target="_blank") Get yours
|
||||
.button-spacer
|
||||
#hideTshirtNoticeButton.button.btn.btn-block.btn-info Hide this
|
||||
.spacer
|
||||
.row
|
||||
.col-xs-12.col-sm-8.col-sm-offset-2
|
||||
h3 800 Hours of Practice:
|
||||
@ -140,21 +122,15 @@ block content
|
||||
script.
|
||||
var username = !{JSON.stringify(user && user.username || '')};
|
||||
var lastCompleted = !{JSON.stringify(lastCompleted || false)}
|
||||
// #announcementModal.modal(tabindex='-1')
|
||||
// .modal-dialog.animated.fadeInUp.fast-animation
|
||||
// .modal-content
|
||||
// .modal-header.challenge-list-header Add us to your LinkedIn profile
|
||||
// a.close.closing-x(href='#', data-dismiss='modal', aria-hidden='true') ×
|
||||
// .modal-body
|
||||
// h3.text-left LinkedIn now recognizes Free Code Camp as a university.
|
||||
// img.img-responsive.img-center(src='https://www.evernote.com/l/AHTzkHwtg-BHj57bqqDL7WFF8WgrI5V8cxwB/image.png')
|
||||
// h3.text-left It takes less than a minute to add Free Code Camp to your LinkedIn profile.
|
||||
// a.btn.btn-lg.btn-info.btn-block(name='_csrf', value=_csrf, aria-hidden='true', href='/linkedin', target='_blank') Show me how to do this
|
||||
// a.btn.btn-lg.btn-primary.btn-block(href='#', data-dismiss='modal', aria-hidden='true') Thanks for the heads-up
|
||||
//script.
|
||||
// $(document).ready(function () {
|
||||
// if (!localStorage || !localStorage.linkedIn) {
|
||||
// $('#announcementModal').modal('show');
|
||||
// localStorage.linkedIn = "true";
|
||||
// }
|
||||
// });
|
||||
$(document).ready(function () {
|
||||
if (!localStorage || !localStorage.hideTshirtNotice) {
|
||||
$("#tshirt-notice").removeClass("hidden");
|
||||
}
|
||||
$("#hideTshirtNoticeButton").on("click", function() {
|
||||
$("#tshirt-notice").addClass('animated fadeOut');
|
||||
setTimeout(function() {
|
||||
$("#tshirt-notice").hide();
|
||||
}, 1000);
|
||||
localStorage.hideTshirtNotice = "true";
|
||||
});
|
||||
});
|
||||
|
20
server/views/commit/directory.jade
Normal file
20
server/views/commit/directory.jade
Normal file
@ -0,0 +1,20 @@
|
||||
extends ../layout
|
||||
block content
|
||||
.panel.panel-info
|
||||
.panel-heading.text-center Commit to one of these nonprofits
|
||||
.panel-body
|
||||
.row
|
||||
.col-xs-12.col-sm-10.col-sm-offset-1
|
||||
for nonprofit in nonprofits
|
||||
.col-xs-12.col-sm-6.col-md-4.story-section
|
||||
.text-center
|
||||
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}
|
||||
p= nonprofit.description
|
||||
.spacer
|
||||
.col-xs-12
|
||||
a.btn.btn-lg.btn-block.btn-primary.btn-link-social(href='mailto:team@freecodecamp.com?subject=Supporting%20Nonprofits')
|
||||
span.ion-email
|
||||
| Email us about adding your nonprofit here
|
@ -2,53 +2,70 @@ extends ../layout
|
||||
block content
|
||||
.panel.panel-info
|
||||
.panel-body
|
||||
h3.text-center Commit to yourself. Commit to a nonprofit.
|
||||
.col-xs-12.col-sm-6.col-sm-offset-3
|
||||
p Are you looking for a burst of motivation? Do you want to help nonprofits before you’re ready to code for them? You can do both by pledging a monthly donation to a nonprofit until you've earned either your Front End or Full Stack Development certificate. Join Commit below or click "maybe later".
|
||||
.col-xs-12.col-sm-6.col-sm-offset-3
|
||||
h4 Step 1: Choose your goal
|
||||
.radio
|
||||
label
|
||||
input(type='radio' id='front-end-development-certificate' name='goal')
|
||||
| Front End Development Certificate (takes about 400 hours)
|
||||
.radio
|
||||
label
|
||||
input(type='radio' id='full-stack-development-certificate' name='goal')
|
||||
| Full Stack Development Certificate (takes about 800 hours)
|
||||
.spacer
|
||||
h4 Step 2: Choose one of our nonprofits
|
||||
.row
|
||||
.col-xs-12.col-sm-6
|
||||
a(href="http://i.imgur.com/U1CyEuA.jpg" data-lightbox="img-enlarge")
|
||||
img.img-responsive(src='http://i.imgur.com/U1CyEuA.jpg' alt="Girl Develop It participants coding at tables.")
|
||||
.radio
|
||||
label
|
||||
input(type='radio' id='girl-develop-it' name='nonprofit')
|
||||
| Girl Develop It is a nonprofit that provides in-person classes for women to learn to code.
|
||||
.col-xs-12.col-sm-6
|
||||
a(href="http://i.imgur.com/NERytFF.jpg" data-lightbox="img-enlarge")
|
||||
img.img-responsive(src='http://i.imgur.com/NERytFF.jpg' alt="Vets in Tech participants standing together at a conference.")
|
||||
.radio
|
||||
label
|
||||
input(type='radio' id='vets-in-tech' name='nonprofit')
|
||||
| Vets in Tech is a nonprofit that helps veterans prepare for tech jobs.
|
||||
.spacer
|
||||
h4 Step 3: Choose your monthly pledge
|
||||
.radio
|
||||
label
|
||||
input(type='radio' id='5-dollar-pledge' name='pledge-amount')
|
||||
| $5 per month
|
||||
.radio
|
||||
label
|
||||
input(type='radio' id='10-dollar-pledge' name='pledge-amount')
|
||||
| $10 per month
|
||||
.radio
|
||||
label
|
||||
input(type='radio' id='50-dollar-pledge' name='pledge-amount')
|
||||
| $50 per month
|
||||
h2.text-center Commit to yourself. Commit to a nonprofit.
|
||||
.row
|
||||
.col-xs-12.col-sm-6.col-sm-offset-3
|
||||
p Give yourself external motivation and help nonprofits right away. Pledge a monthly donation to a nonprofit until you’ve earned either your Front End or Full Stack Development Certification.
|
||||
|
||||
.row
|
||||
.col-xs-12.col-sm-6.col-sm-offset-3.text-center
|
||||
h3 Pledge to #{displayName} 
|
||||
.button-spacer
|
||||
a(href='#{imgUrl}' data-lightbox='img-enlarge' alt='#{imgAlt}')
|
||||
img.img-responsive(src='#{imgUrl}' alt='#{imgAlt}')
|
||||
p.large-p
|
||||
= description
|
||||
a(href='/commit/directory') ...or see other nonprofits
|
||||
.spacer
|
||||
form.form(name='commit')
|
||||
.hidden
|
||||
input(type='text' value='#{name}' name='nonprofit')
|
||||
.row
|
||||
.col-xs-12.col-sm-6.col-sm-offset-3
|
||||
h3 Choose your goal:
|
||||
.btn-group.btn-group-justified(data-toggle='buttons' role='group')
|
||||
label.btn.btn-primary.btn-lg.active
|
||||
input(type='radio' id=frontEndCert value=frontEndCert name='goal' checked="checked")
|
||||
| Front End Development Certification (takes about 400 hours)
|
||||
label.btn.btn-primary.btn-lg
|
||||
input(type='radio' id=fullStackCert value=fullStackCert name='goal')
|
||||
| Full Stack Development Certification (takes about 800 hours)
|
||||
.spacer
|
||||
a.button.btn.btn-block.btn-primary(href='https://www.paypal.com/us/cgi-bin/webscr?cmd=_flow&SESSION=T3x0DY-bLMFXuhmjYZXs-BhmDoiXfuNh5BWad5VBcMomkkDSZY0b_-_W3HS&dispatch=5885d80a13c0db1f8e263663d3faee8d0b9dcb01a9b6dc564e45f62871326a5e') Commit
|
||||
.button-spacer
|
||||
a.button.btn.btn-block.btn-warning(href='/') Maybe later
|
||||
.row
|
||||
.col-xs-12.col-sm-6.col-sm-offset-3
|
||||
h3 Choose your monthly pledge:
|
||||
.btn-group.btn-group-justified(data-toggle='buttons' role='group')
|
||||
label.btn.btn-success
|
||||
input(type='radio' id='5-dollar-pledge' value='5' name='amount')
|
||||
| $5 per month
|
||||
label.btn.btn-success.active
|
||||
input(type='radio' id='10-dollar-pledge' value='10' name='amount' checked="checked")
|
||||
| $10 per month
|
||||
label.btn.btn-success
|
||||
input(type='radio' id='25-dollar-pledge' value='25' name='amount' checked="checked")
|
||||
| $25 per month
|
||||
label.btn.btn-success
|
||||
input(type='radio' id='50-dollar-pledge' value='50' name='amount')
|
||||
| $50 per month
|
||||
.spacer
|
||||
.row
|
||||
.col-xs-12.col-sm-6.col-sm-offset-3.text-center
|
||||
a#commit-btn-submit.btn.btn-block.btn-lg.signup-btn(href=donateUrl target='_blank') Commit (and open donate page)
|
||||
|
||||
if pledge
|
||||
form.row(name='stop-pledge' action='/commit/stop-commitment' method='post')
|
||||
.col-xs-12.col-sm-6.col-sm-offset-3.text-center
|
||||
.button-spacer
|
||||
button.btn.btn-block.btn-danger(name='submit' type='submit') Stop my current pledge
|
||||
else
|
||||
.row
|
||||
.col-xs-12.col-sm-6.col-sm-offset-3.text-center
|
||||
.button-spacer
|
||||
a.btn.btn-block.btn-default(href='/') Maybe later
|
||||
.spacer
|
||||
script.
|
||||
$(function() {
|
||||
$('#commit-btn-submit').click(function() {
|
||||
window.location.href = '/commit/pledge?' + $('form').serialize();
|
||||
});
|
||||
});
|
||||
|
15
server/views/commit/pledge.jade
Normal file
15
server/views/commit/pledge.jade
Normal file
@ -0,0 +1,15 @@
|
||||
extends ../layout
|
||||
block content
|
||||
.panel.panel-info
|
||||
.panel-body
|
||||
h3.text-center You've commited!
|
||||
.row
|
||||
.col-xs-12.col-sm-6.col-sm-offset-3
|
||||
p Congratulations, you have commit to giving
|
||||
span(style='text-transform: capitalize') #{nonprofit}
|
||||
| #{amount} dollars a month until you have reached your goal
|
||||
| of completing your #{goal}
|
||||
.row
|
||||
.col-xs-12.col-sm-6.col-sm-offset-3
|
||||
img.img-responsive(src='http://i.imgur.com/U1CyEuA.jpg' alt="Girl Develop It participants coding at tables.")
|
||||
p Girl Develop It is a nonprofit that provides in-person classes for women to learn to code.
|
@ -27,12 +27,9 @@ block content
|
||||
a.btn.btn-cta.signup-btn.btn-block(href="/login") Start learning to code (it's free)
|
||||
.button-spacer
|
||||
a.btn.btn-cta.btn-success.btn-block(href="/nonprofits") My nonprofit needs coding help
|
||||
h2 As featured in
|
||||
h2 As featured in:
|
||||
img.img-center.img-responsive(src='https://s3.amazonaws.com/freecodecamp/as-seen-on.png')
|
||||
.spacer
|
||||
h2 We're a proven way to start your software engineering career:
|
||||
img.img-center.img-responsive(src='https://s3.amazonaws.com/freecodecamp/linkedin-alumni.png')
|
||||
.spacer
|
||||
h2 Campers you'll hang out with:
|
||||
.row
|
||||
.col-xs-12.col-sm-12.col-md-4
|
||||
@ -47,6 +44,10 @@ block content
|
||||
img.img-responsive.testimonial-image.img-center(src="https://s3.amazonaws.com/freecodecamp/testimonial-cynthia.jpg", alt="@cynthialanel's testimonial image")
|
||||
.testimonial-copy I'm currently working through Free Code Camp to improve my JavaScript. The community is very welcoming!
|
||||
h3 - @cynthialanel
|
||||
.button-spacer
|
||||
.row
|
||||
.col-xs-12.col-sm-8.col-sm-offset-2
|
||||
a.btn.btn-big.btn-primary.btn-block(href='/stories') Hear from more of our campers
|
||||
.big-break
|
||||
h2 Skills you'll learn:
|
||||
.text-center.negative-35
|
||||
|
22
server/views/resources/labs.jade
Normal file
22
server/views/resources/labs.jade
Normal file
@ -0,0 +1,22 @@
|
||||
extends ../layout
|
||||
block content
|
||||
.panel.panel-info
|
||||
.panel-heading.text-center Projects Created by Free Code Camp Campers
|
||||
.panel-body.text-left
|
||||
.row
|
||||
.col-xs-12.col-sm-10.col-sm-offset-1
|
||||
for project in projects
|
||||
.spacer
|
||||
.row
|
||||
.col-xs-12.col-sm-3
|
||||
img.img-responsive(src=project.image)
|
||||
.col-xs-12.col-sm-9.negative-15
|
||||
h3
|
||||
a(href=project.url) #{project.name}
|
||||
h4 by 
|
||||
a(href='/' + project.camper) #{project.camper}
|
||||
p= project.description
|
||||
|
||||
if !user
|
||||
a.btn.btn-cta.signup-btn.btn-primary(href="/login") Start learning to code (it's free)
|
||||
.spacer
|
21
server/views/resources/stories.jade
Normal file
21
server/views/resources/stories.jade
Normal file
@ -0,0 +1,21 @@
|
||||
extends ../layout
|
||||
block content
|
||||
.panel.panel-info
|
||||
.panel-heading.text-center Stories from happy campers
|
||||
.panel-body.text-left
|
||||
.row
|
||||
.col-xs-12.col-sm-10.col-sm-offset-1
|
||||
.row
|
||||
for story in stories
|
||||
.col-xs-12.col-sm-6.col-md-4
|
||||
.story-section
|
||||
a(href=story.linkedin target='_blank')
|
||||
img.testimonial-image.img-responsive.img-center(src=story.image)
|
||||
h3.text-center
|
||||
a(href=story.linkedin target='_blank')= story.camper
|
||||
p.text-justify= story.quote
|
||||
|
||||
|
||||
if !user
|
||||
a.btn.btn-cta.signup-btn.btn-primary(href="/login") Start learning to code (it's free)
|
||||
.spacer
|
@ -47,8 +47,8 @@
|
||||
"<br>" +
|
||||
(typeof username !== 'undefined' ?
|
||||
"<button id='" + data[i].id + "' class='btn btn-no-shadow btn-primary btn-block btn-primary-ghost btn-upvote'>upvote</button>" :
|
||||
"<a href='/signup' class='btn btn-no-shadow btn-primary btn-block btn-primary-ghost btn-upvote'>upvote</a>") +
|
||||
"<a class='btn btn-no-shadow btn-primary btn-block btn-primary-ghost' href='/news/" + linkedName + "'>more info</a>" +
|
||||
"<a href='/signin' class='btn btn-no-shadow btn-primary btn-block btn-primary-ghost btn-upvote'>upvote</a>") +
|
||||
"<a class='btn btn-no-shadow btn-primary btn-block btn-primary-ghost hidden' href='/news/" + linkedName + "'>more info</a>" +
|
||||
"</div>" +
|
||||
"</div>" +
|
||||
"<div class='hidden-xs row media-stories'>" +
|
||||
@ -69,7 +69,7 @@
|
||||
(typeof username !== 'undefined' ?
|
||||
"<button id='" + data[i].id + "' class='btn btn-no-shadow btn-primary btn-xs btn-primary-ghost btn-upvote'>upvote</button>" :
|
||||
"<a href='/signin' class='btn btn-no-shadow btn-primary btn-xs btn-primary-ghost'>upvote</a>") +
|
||||
" · <a class='btn btn-no-shadow btn-primary btn-xs btn-primary-ghost' href='/news/" + linkedName + "'>more info</a> · " +
|
||||
"<a class='btn btn-no-shadow btn-primary btn-xs btn-primary-ghost hidden' href='/news/" + linkedName + "'>more info</a> · " +
|
||||
rank + (rank > 1 ? " points" : " point") + " · posted " +
|
||||
moment(data[i].timePosted).fromNow() +
|
||||
" by <a href='/" + data[i].author.username + "'>@" + data[i].author.username + "</a> " +
|
||||
|
Reference in New Issue
Block a user