merge staging and overhaul ajax challenges
This commit is contained in:
@ -15,7 +15,7 @@ Our campers (students) start by working through our free, self-paced, browser-ba
|
||||
|
||||
80% of our campers are over 25, and nearly a fifth of our campers are women.
|
||||
|
||||
This code is running live at [FreeCodeCamp.com](http://www.FreeCodeCamp.com). We also have [Gitter](https://gitter.im/FreeCodeCamp/FreeCodeCamp), a [blog](http://blog.freecodecamp.com), and even a [Twitch.tv channel](http://twitch.tv/freecodecamp).
|
||||
This code is running live at [FreeCodeCamp.com](http://www.FreeCodeCamp.com). We also have [Gitter](https://gitter.im/FreeCodeCamp/FreeCodeCamp), a [blog](http://medium.freecodecamp.com), and even a [Twitch.tv channel](http://twitch.tv/freecodecamp).
|
||||
|
||||
[Join our community here](http://www.freecodecamp.com/signin).
|
||||
|
||||
|
@ -1,31 +1,72 @@
|
||||
// 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>');
|
||||
};
|
||||
|
||||
common.replaceFormActionAttr = function replaceFormAction(value) {
|
||||
return value.replace(/<form[^>]*>/, function(val) {
|
||||
return val.replace(/action(\s*?)=/, 'fccfaa$1=');
|
||||
});
|
||||
};
|
||||
|
||||
common.replaceFccfaaAttr = function replaceFccfaaAttr(value) {
|
||||
return value.replace(/<form[^>]*>/, function(val) {
|
||||
return val.replace(/fccfaa(\s*?)=/, 'action$1=');
|
||||
});
|
||||
};
|
||||
|
||||
return common;
|
||||
})();
|
||||
|
||||
// store code in the URL
|
||||
common.codeUri = (function(common, encode, decode, location, history) {
|
||||
var replaceScriptTags = common.replaceScriptTags;
|
||||
var replaceSafeTags = common.replaceSafeTags;
|
||||
var replaceFormActionAttr = common.replaceFormActionAttr;
|
||||
var replaceFccfaaAttr = common.replaceFccfaaAttr;
|
||||
|
||||
function encodeFcc(val) {
|
||||
return replaceScriptTags(replaceFormActionAttr(val));
|
||||
}
|
||||
|
||||
function decodeFcc(val) {
|
||||
return replaceSafeTags(replaceFccfaaAttr(val));
|
||||
}
|
||||
|
||||
var codeUri = {
|
||||
encode: function(code) {
|
||||
return encode(code);
|
||||
@ -54,10 +95,14 @@ common.codeUri = (function(common, encode, decode, location, history) {
|
||||
}, false);
|
||||
},
|
||||
isAlive: function() {
|
||||
return codeUri.isInQuery(location.search) ||
|
||||
return codeUri.enabled &&
|
||||
codeUri.isInQuery(location.search) ||
|
||||
codeUri.isInQuery(location.hash);
|
||||
},
|
||||
parse: function() {
|
||||
if (!codeUri.enabled) {
|
||||
return null;
|
||||
}
|
||||
var query;
|
||||
if (location.search && codeUri.isInQuery(location.search)) {
|
||||
query = location.search.replace(/^\?/, '');
|
||||
@ -67,7 +112,7 @@ common.codeUri = (function(common, encode, decode, location, history) {
|
||||
null,
|
||||
location.href.split('?')[0]
|
||||
);
|
||||
location.hash = '#?' + query;
|
||||
location.hash = '#?' + encodeFcc(query);
|
||||
}
|
||||
} else {
|
||||
query = location.hash.replace(/^\#\?/, '');
|
||||
@ -82,15 +127,21 @@ 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 decodeFcc(codeUri.decode(value || ''));
|
||||
}
|
||||
return solution;
|
||||
}, null);
|
||||
},
|
||||
querify: function(solution) {
|
||||
location.hash = '?solution=' + codeUri.encode(solution);
|
||||
if (!codeUri.enabled) {
|
||||
return null;
|
||||
}
|
||||
location.hash = '?solution=' +
|
||||
codeUri.encode(encodeFcc(solution));
|
||||
|
||||
return solution;
|
||||
}
|
||||
},
|
||||
enabled: true
|
||||
};
|
||||
|
||||
common.init.push(function() {
|
||||
@ -306,12 +357,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+)?\\(.*\\;)|' +
|
||||
@ -408,7 +453,6 @@ var editor = (function(CodeMirror, emmetCodeMirror, common) {
|
||||
common.init.push(function() {
|
||||
var editorValue;
|
||||
if (common.codeUri.isAlive()) {
|
||||
console.log('in query');
|
||||
editorValue = common.codeUri.parse();
|
||||
} else {
|
||||
editorValue = codeStorage.isAlive() ?
|
||||
@ -416,7 +460,7 @@ var editor = (function(CodeMirror, emmetCodeMirror, common) {
|
||||
common.seed;
|
||||
}
|
||||
|
||||
editor.setValue(replaceSafeTags(editorValue));
|
||||
editor.setValue(common.replaceSafeTags(editorValue));
|
||||
editor.refresh();
|
||||
});
|
||||
|
||||
@ -445,6 +489,7 @@ function workerError(error) {
|
||||
var housing = $('#testSuite');
|
||||
if (display.html() !== error) {
|
||||
display.remove();
|
||||
|
||||
housing.prepend(
|
||||
'<div class="runTimeError" style="font-size: 18px;"><code>' +
|
||||
error.replace(/j\$/gi, '$').replace(/jdocument/gi, 'document').replace(/jjQuery/gi, 'jQuery') +
|
||||
@ -471,7 +516,10 @@ function safeHTMLRun(test) {
|
||||
var codeStorage = common.codeStorage;
|
||||
if (common.challengeType === '0') {
|
||||
var previewFrame = document.getElementById('preview');
|
||||
var preview = previewFrame.contentDocument || previewFrame.contentWindow.document;
|
||||
|
||||
var preview = previewFrame.contentDocument ||
|
||||
previewFrame.contentWindow.document;
|
||||
|
||||
if (editor.getValue().match(/\<script\>/gi) !== null) {
|
||||
var s = editor
|
||||
.getValue()
|
||||
@ -554,9 +602,11 @@ function updatePreview() {
|
||||
|
||||
if (typeof prodOrDev !== 'undefined') {
|
||||
|
||||
var nodeEnv = prodOrDev === 'production' ?
|
||||
/* eslint-disable no-unused-vars */
|
||||
var nodeEnv = window.prodOrDev === 'production' ?
|
||||
'http://www.freecodecamp.com' :
|
||||
'http://localhost:3001';
|
||||
/* eslint-enable no-unused-vars */
|
||||
|
||||
if (common.challengeType === '0') {
|
||||
setTimeout(updatePreview, 300);
|
||||
@ -567,8 +617,11 @@ if (typeof prodOrDev !== 'undefined') {
|
||||
* "post" methods
|
||||
*/
|
||||
|
||||
/* eslint-disable no-unused-vars */
|
||||
var testResults = [];
|
||||
var postSuccess = function(data) {
|
||||
/* eslint-enable no-unused-vars */
|
||||
|
||||
var testDoc = document.createElement('div');
|
||||
$(testDoc).html(
|
||||
"<div class='row'><div class='col-xs-2 text-center'><i class='ion-checkmark-circled big-success-icon'></i></div><div class='col-xs-10 test-output test-vertical-center wrappable'>" +
|
||||
@ -614,7 +667,9 @@ function showCompletion() {
|
||||
isInitRun = false;
|
||||
return;
|
||||
}
|
||||
var time = Math.floor(Date.now()) - started;
|
||||
|
||||
var time = Math.floor(Date.now()) - window.started;
|
||||
|
||||
ga(
|
||||
'send',
|
||||
'event',
|
||||
@ -672,8 +727,11 @@ function showCompletion() {
|
||||
});
|
||||
}
|
||||
|
||||
/* eslint-disable no-unused-vars */
|
||||
var resetEditor = function resetEditor() {
|
||||
editor.setValue(replaceSafeTags(common.seed));
|
||||
/* eslint-enable no-unused-vars */
|
||||
|
||||
editor.setValue(common.replaceSafeTags(common.seed));
|
||||
$('#testSuite').empty();
|
||||
bonfireExecute(true);
|
||||
common.codeStorage.updateStorage();
|
||||
@ -863,15 +921,15 @@ common.init.push((function() {
|
||||
var nextStep = getNextStep($(stepClass));
|
||||
$(this)
|
||||
.parent()
|
||||
.addClass('animated fadeOutLeft')
|
||||
.delay(700)
|
||||
.addClass('animated fadeOutLeft fast-animation')
|
||||
.delay(250)
|
||||
.queue(function(next) {
|
||||
$(this).addClass('hidden');
|
||||
if (nextStep) {
|
||||
$(nextStep)
|
||||
.removeClass('hidden')
|
||||
.addClass('animated slideInRight')
|
||||
.delay(1000)
|
||||
.addClass('animated slideInRight fast-animation')
|
||||
.delay(500)
|
||||
.queue(function(next) {
|
||||
$(this).removeClass('slideInRight');
|
||||
next();
|
||||
|
24
client/less/chat.less
Normal file
24
client/less/chat.less
Normal file
@ -0,0 +1,24 @@
|
||||
.chat-embed-main-title {
|
||||
display: flex;
|
||||
flex-grow: 1;
|
||||
padding-left: 31px;
|
||||
padding-top: 7px;
|
||||
}
|
||||
|
||||
.gitter-chat-embed {
|
||||
z-index: 100;
|
||||
position: fixed;
|
||||
|
||||
top: 0;
|
||||
left: 60%;
|
||||
bottom: 0;
|
||||
right: 0;
|
||||
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
transition: transform 0.3s cubic-bezier(0.16, 0.22, 0.22, 1.7);
|
||||
}
|
||||
|
||||
.gitter-chat-embed.is-collapsed:not(.is-loading) {
|
||||
transform: translateX(110%);
|
||||
}
|
@ -96,6 +96,10 @@ h1, h2, h3, h4, h5, h6, p, li {
|
||||
margin-right: 5px;
|
||||
}
|
||||
|
||||
.fa:hover {
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
.img-center {
|
||||
margin: 0 auto;
|
||||
}
|
||||
@ -490,11 +494,17 @@ thead {
|
||||
border-radius: 5px;
|
||||
}
|
||||
|
||||
.story-section {
|
||||
height: 500px;
|
||||
}
|
||||
|
||||
.testimonial-copy {
|
||||
font-size: 20px;
|
||||
text-align: center;
|
||||
text-align: justify;
|
||||
font-size: 18px !important;
|
||||
margin-left: 20px;
|
||||
margin-right: 20px;
|
||||
@media (min-width: 991px) and (max-width: 1199px) {
|
||||
height: 120px;
|
||||
height: 140px;
|
||||
}
|
||||
@media (min-width: 1200px) {
|
||||
height: 90px;
|
||||
@ -945,6 +955,11 @@ code {
|
||||
margin: 0!important;
|
||||
}
|
||||
|
||||
// gitter chat
|
||||
.gitter-chat-embed {
|
||||
z-index: 20000 !important;
|
||||
}
|
||||
|
||||
//uncomment this to see the dimensions of all elements outlined in red
|
||||
//* {
|
||||
// border-color: red;
|
||||
@ -1052,3 +1067,5 @@ code {
|
||||
transform: rotate(0deg);
|
||||
}
|
||||
}
|
||||
|
||||
@import "chat.less";
|
||||
|
123
client/main.js
123
client/main.js
@ -1,12 +1,120 @@
|
||||
var mapShareKey = 'map-shares';
|
||||
var main = window.main || {};
|
||||
|
||||
main.mapShareKey = 'map-shares';
|
||||
|
||||
main.ga = window.ga || function() {};
|
||||
|
||||
main = (function(main) {
|
||||
|
||||
// should be set before gitter script loads
|
||||
((window.gitter = {}).chat = {}).options = {
|
||||
disableDefaultChat: true
|
||||
};
|
||||
// wait for sidecar to load
|
||||
|
||||
main.chat = {};
|
||||
main.chat.isOpen = false;
|
||||
main.chat.createHelpChat = function createHelpChat() {
|
||||
throw new Error('Sidecar chat has not initialized');
|
||||
};
|
||||
|
||||
document.addEventListener('gitter-sidecar-ready', function(e) {
|
||||
main.chat.GitterChat = e.detail.Chat;
|
||||
|
||||
main.chat.createHelpChat = function(room, helpChatBtnClass, roomTitle) {
|
||||
roomTitle = roomTitle || 'Waypoint Help';
|
||||
|
||||
$('body').append(
|
||||
'<aside id="chat-embed-help" class="gitter-chat-embed is-collapsed" />'
|
||||
);
|
||||
|
||||
main.chat.helpChat = new main.chat.GitterChat({
|
||||
room: room,
|
||||
activationElement: false,
|
||||
targetElement: $('#chat-embed-help')
|
||||
});
|
||||
|
||||
$(helpChatBtnClass).on('click', function() {
|
||||
// is button already pressed?
|
||||
// no? open chat
|
||||
// yes? close chat
|
||||
var shouldChatBeOpen = !$(this).hasClass('active');
|
||||
main.chat.helpChat.toggleChat(shouldChatBeOpen);
|
||||
if (shouldChatBeOpen) {
|
||||
$(helpChatBtnClass).addClass('active');
|
||||
}
|
||||
});
|
||||
|
||||
var helpTitleAdd = false;
|
||||
$('#chat-embed-help').on('gitter-chat-toggle', function(e) {
|
||||
var shouldButtonBePressed = !!e.originalEvent.detail.state;
|
||||
|
||||
if (!helpTitleAdd) {
|
||||
helpTitleAdd = true;
|
||||
$('#chat-embed-help > .gitter-chat-embed-action-bar').prepend(
|
||||
'<div class="chat-embed-main-title">' +
|
||||
'<span>' +
|
||||
roomTitle +
|
||||
'</span>' +
|
||||
'</div>'
|
||||
);
|
||||
}
|
||||
|
||||
if (shouldButtonBePressed) {
|
||||
return $(helpChatBtnClass).addClass('active');
|
||||
}
|
||||
return $(helpChatBtnClass).removeClass('active');
|
||||
});
|
||||
};
|
||||
|
||||
$('body').append(
|
||||
'<aside id="chat-embed-main" class="gitter-chat-embed is-collapsed" />'
|
||||
);
|
||||
|
||||
main.chat.mainChat = new main.chat.GitterChat({
|
||||
room: 'freecodecamp/freecodecamp',
|
||||
activationElement: false,
|
||||
targetElement: $('#chat-embed-main')
|
||||
});
|
||||
|
||||
var mainChatTitleAdded = false;
|
||||
$('#chat-embed-main').on('gitter-chat-toggle', function() {
|
||||
if (mainChatTitleAdded) {
|
||||
return null;
|
||||
}
|
||||
mainChatTitleAdded = true;
|
||||
|
||||
$('#chat-embed-main > .gitter-chat-embed-action-bar').prepend(
|
||||
'<div class="chat-embed-main-title">' +
|
||||
'<span>Free Code Camp\'s Main Chat</span>' +
|
||||
'</div>'
|
||||
);
|
||||
});
|
||||
|
||||
|
||||
$('#nav-chat-btn').on('click', function() {
|
||||
if (!main.chat.isOpen) {
|
||||
|
||||
main.chat.mainChat.toggleChat(true);
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
return main;
|
||||
}(main));
|
||||
|
||||
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,15 +131,16 @@ function setMapShare(id) {
|
||||
if (!found) {
|
||||
alreadyShared.push(id);
|
||||
}
|
||||
localStorage.setItem(mapShareKey, JSON.stringify(alreadyShared));
|
||||
localStorage.setItem(main.mapShareKey, JSON.stringify(alreadyShared));
|
||||
return alreadyShared;
|
||||
}
|
||||
|
||||
$(document).ready(function() {
|
||||
|
||||
|
||||
var challengeName = typeof challengeName !== 'undefined' ?
|
||||
challengeName :
|
||||
'Untitled';
|
||||
'';
|
||||
|
||||
if (challengeName) {
|
||||
ga('send', 'event', 'Challenge', 'load', challengeName);
|
||||
@ -126,13 +235,14 @@ $(document).ready(function() {
|
||||
'links to screenshots if possible.\n\n'
|
||||
].join('');
|
||||
|
||||
if (editor.getValue().trim()) {
|
||||
if (typeof editor !== 'undefined' && editor.getValue().trim()) {
|
||||
var type;
|
||||
switch (challengeType) {
|
||||
case challengeTypes.HTML_CSS_JQ:
|
||||
type = 'html';
|
||||
break;
|
||||
case challengeTypes.JAVASCRIPT:
|
||||
case challengeTypes.BONFIRE:
|
||||
type = 'javascript';
|
||||
break;
|
||||
default:
|
||||
@ -444,6 +554,7 @@ $(document).ready(function() {
|
||||
'&redirect_uri=http%3A%2F%2Ffreecodecamp%2Ecom%2Fmap';
|
||||
|
||||
setMapShare(challengeBlockName);
|
||||
main.ga('send', 'event', 'FB_LINK', 'SHARE', 'Facebook map share');
|
||||
window.location.href = link;
|
||||
});
|
||||
});
|
||||
|
@ -2,7 +2,7 @@
|
||||
{
|
||||
"className": "ion-speakerphone",
|
||||
"content": " Blog ",
|
||||
"href": "http://blog.freecodecamp.com",
|
||||
"href": "http://medium.freecodecamp.com",
|
||||
"target": "_blank"
|
||||
},
|
||||
{
|
||||
|
@ -8,13 +8,17 @@ const initValue = {
|
||||
points: 0
|
||||
};
|
||||
|
||||
export default Store(initValue)
|
||||
.refs({ displayName: 'AppStore' })
|
||||
.init(({ instance: appStore, args: [cat] }) => {
|
||||
export default Store({
|
||||
refs: {
|
||||
displayName: 'AppStore',
|
||||
value: initValue
|
||||
},
|
||||
init({ instance: appStore, args: [cat] }) {
|
||||
const { setUser, setTitle } = cat.getActions('appActions');
|
||||
const register = createRegistrar(appStore);
|
||||
|
||||
register(setter(fromMany(setUser, setTitle)));
|
||||
|
||||
return appStore;
|
||||
});
|
||||
}
|
||||
});
|
||||
|
@ -1,6 +1,6 @@
|
||||
import React, { PropTypes } from 'react';
|
||||
import { Button, Col, Row, Panel } from 'react-bootstrap';
|
||||
import { Navigation } from 'react-router';
|
||||
import { History } from 'react-router';
|
||||
import Vimeo from 'react-vimeo';
|
||||
import debugFactory from 'debug';
|
||||
|
||||
@ -8,7 +8,7 @@ const debug = debugFactory('freecc:hikes');
|
||||
|
||||
export default React.createClass({
|
||||
displayName: 'Lecture',
|
||||
mixins: [Navigation],
|
||||
mixins: [History],
|
||||
|
||||
propTypes: {
|
||||
currentHike: PropTypes.object,
|
||||
@ -20,7 +20,7 @@ export default React.createClass({
|
||||
handleFinish() {
|
||||
debug('loading questions');
|
||||
const { dashedName } = this.props.params;
|
||||
this.transitionTo(`/hikes/${dashedName}/questions/1`);
|
||||
this.history.pushState(null, `/hikes/${dashedName}/questions/1`);
|
||||
},
|
||||
|
||||
renderTranscript(transcript, dashedName) {
|
||||
|
@ -1,6 +1,6 @@
|
||||
import React, { PropTypes } from 'react';
|
||||
import { Spring } from 'react-motion';
|
||||
import { Navigation, TransitionHook } from 'react-router';
|
||||
import { History, Lifecycle } from 'react-router';
|
||||
import debugFactory from 'debug';
|
||||
import {
|
||||
Button,
|
||||
@ -19,8 +19,8 @@ export default React.createClass({
|
||||
displayName: 'Question',
|
||||
|
||||
mixins: [
|
||||
Navigation,
|
||||
TransitionHook
|
||||
History,
|
||||
Lifecycle
|
||||
],
|
||||
|
||||
propTypes: {
|
||||
@ -150,7 +150,8 @@ export default React.createClass({
|
||||
|
||||
postJSON$('/completed-challenge', { id, name }).subscribeOnCompleted(() => {
|
||||
if (tests[nextQuestionIndex]) {
|
||||
return this.transitionTo(
|
||||
return this.history.pushState(
|
||||
null,
|
||||
`/hikes/${ dashedName }/questions/${ nextQuestionIndex + 1 }`
|
||||
);
|
||||
}
|
||||
@ -168,13 +169,13 @@ export default React.createClass({
|
||||
}, null);
|
||||
|
||||
if (nextHike) {
|
||||
return this.transitionTo(`/hikes/${ nextHike.dashedName }`);
|
||||
return this.history.pushState(null, `/hikes/${ nextHike.dashedName }`);
|
||||
}
|
||||
debug(
|
||||
'next Hike was not found, currentHike %s',
|
||||
currentHike.dashedName
|
||||
);
|
||||
this.transitionTo('/hikes');
|
||||
this.history.pushState(null, '/hikes');
|
||||
});
|
||||
},
|
||||
|
||||
|
@ -3,7 +3,7 @@ import debugFactory from 'debug';
|
||||
|
||||
const debug = debugFactory('freecc:hikes:actions');
|
||||
|
||||
function getCurrentHike(hikes =[{}], dashedName, currentHike) {
|
||||
function getCurrentHike(hikes = [{}], dashedName, currentHike) {
|
||||
if (!dashedName) {
|
||||
debug('no dashedName');
|
||||
return hikes[0];
|
||||
|
@ -5,12 +5,16 @@ const initialValue = {
|
||||
currentHike: {}
|
||||
};
|
||||
|
||||
export default Store(initialValue)
|
||||
.refs({ displayName: 'HikesStore'})
|
||||
.init(({ instance: hikeStore, args: [cat] }) => {
|
||||
export default Store({
|
||||
refs: {
|
||||
displayName: 'HikesStore',
|
||||
value: initialValue
|
||||
},
|
||||
init({ instance: hikeStore, args: [cat] }) {
|
||||
|
||||
let { setHikes } = cat.getActions('hikesActions');
|
||||
hikeStore.register(setHikes);
|
||||
|
||||
return hikeStore;
|
||||
});
|
||||
}
|
||||
});
|
||||
|
@ -6,9 +6,12 @@ const {
|
||||
transformer
|
||||
} = Store;
|
||||
|
||||
export default Store({ showModal: false })
|
||||
.refs({ displayName: 'JobsStore' })
|
||||
.init(({ instance: jobsStore, args: [cat] }) => {
|
||||
export default Store({
|
||||
refs: {
|
||||
displayName: 'JobsStore',
|
||||
value: { showModal: false }
|
||||
},
|
||||
init({ instance: jobsStore, args: [cat] }) {
|
||||
const {
|
||||
setJobs,
|
||||
findJob,
|
||||
@ -27,4 +30,5 @@ export default Store({ showModal: false })
|
||||
|
||||
register(transformer(findJob));
|
||||
register(handleForm);
|
||||
});
|
||||
}
|
||||
});
|
||||
|
@ -82,6 +82,10 @@
|
||||
},
|
||||
"descriptionPt": {
|
||||
"type": "array"
|
||||
},
|
||||
"solutions": {
|
||||
"type": "array",
|
||||
"default": []
|
||||
}
|
||||
},
|
||||
"validations": [],
|
||||
|
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": []
|
||||
}
|
@ -322,7 +322,7 @@ module.exports = function(User) {
|
||||
})
|
||||
// no results means this is the first brownie point given by giver
|
||||
// so return -1 to indicate receiver should receive point
|
||||
.firstOrDefault(null, -1)
|
||||
.first({ defaultValue: -1 })
|
||||
.flatMap((browniePointsFromGiver) => {
|
||||
if (browniePointsFromGiver === -1) {
|
||||
|
||||
|
@ -166,6 +166,11 @@
|
||||
"type": "hasMany",
|
||||
"model": "userIdentity",
|
||||
"foreignKey": ""
|
||||
},
|
||||
"pledge": {
|
||||
"type": "hasOne",
|
||||
"model": "pledge",
|
||||
"foreignKey": ""
|
||||
}
|
||||
},
|
||||
"acls": [
|
||||
|
@ -79,6 +79,7 @@ var paths = {
|
||||
],
|
||||
|
||||
less: './client/less/main.less',
|
||||
lessFiles: './client/less/*.less',
|
||||
|
||||
manifest: 'server/manifests/',
|
||||
|
||||
@ -392,7 +393,7 @@ var watchDependents = [
|
||||
];
|
||||
|
||||
gulp.task('watch', watchDependents, function() {
|
||||
gulp.watch(paths.less, ['less']);
|
||||
gulp.watch(paths.lessFiles, ['less']);
|
||||
gulp.watch(paths.js, ['js']);
|
||||
gulp.watch(paths.challenges, ['test-challenges']);
|
||||
gulp.watch(paths.js, ['js', 'dependents']);
|
||||
|
12
package.json
12
package.json
@ -63,8 +63,8 @@
|
||||
"json-loader": "^0.5.2",
|
||||
"less": "~2.5.1",
|
||||
"lodash": "^3.9.3",
|
||||
"loopback": "https://github.com/FreeCodeCamp/loopback.git#fix/no-password",
|
||||
"loopback-boot": "2.8.2",
|
||||
"loopback": "^2.22.0",
|
||||
"loopback-boot": "^2.13.0",
|
||||
"loopback-component-passport": "https://github.com/FreeCodeCamp/loopback-component-passport.git#feature/flashfailure",
|
||||
"loopback-connector-mongodb": "^1.10.0",
|
||||
"lusca": "~1.0.2",
|
||||
@ -89,17 +89,17 @@
|
||||
"react": "^0.13.3",
|
||||
"react-bootstrap": "~0.23.7",
|
||||
"react-motion": "~0.1.0",
|
||||
"react-router": "^1.0.0-rc1",
|
||||
"react-router": "https://github.com/BerkeleyTrue/react-router.git#freecodecamp",
|
||||
"react-vimeo": "^0.0.3",
|
||||
"request": "~2.53.0",
|
||||
"rev-del": "^1.0.5",
|
||||
"rx": "^2.5.3",
|
||||
"rx": "^4.0.0",
|
||||
"sanitize-html": "~1.6.1",
|
||||
"sort-keys": "^1.1.1",
|
||||
"source-map-support": "^0.3.2",
|
||||
"store": "https://github.com/berkeleytrue/store.js.git#feature/noop-server",
|
||||
"thundercats": "^2.1.0",
|
||||
"thundercats-react": "^0.1.0",
|
||||
"thundercats": "^3.0.0",
|
||||
"thundercats-react": "^0.3.0",
|
||||
"twit": "~1.1.20",
|
||||
"uglify-js": "~2.4.15",
|
||||
"validator": "^3.22.1",
|
||||
|
@ -1,6 +1,7 @@
|
||||
{
|
||||
"name": "Advanced Algorithm Scripting",
|
||||
"order": 15,
|
||||
"time": "50h",
|
||||
"challenges": [
|
||||
{
|
||||
"id": "aff0395860f5d3034dc0bfc9",
|
||||
@ -39,7 +40,9 @@
|
||||
"assert(telephoneCheck(\"27576227382\") === false, 'message: <code>telephoneCheck(\"27576227382\")</code> should return false.');",
|
||||
"assert(telephoneCheck(\"(275)76227382\") === false, 'message: <code>telephoneCheck(\"(275)76227382\")</code> should return false.');",
|
||||
"assert(telephoneCheck(\"2(757)6227382\") === false, 'message: <code>telephoneCheck(\"2(757)6227382\")</code> should return false.');",
|
||||
"assert(telephoneCheck(\"2(757)622-7382\") === false, 'message: <code>telephoneCheck(\"2(757)622-7382\")</code> should return false.');"
|
||||
"assert(telephoneCheck(\"2(757)622-7382\") === false, 'message: <code>telephoneCheck(\"2(757)622-7382\")</code> should return false.');",
|
||||
"assert(telephoneCheck(\"555)-555-5555\") === false, 'message: <code>telephoneCheck(\"555)555-5555\")</code> should return false.');",
|
||||
"assert(telephoneCheck(\"(555-555-5555\") === false, 'message: <code>telephoneCheck(\"(555-555-5555\")</code> should return false.');"
|
||||
],
|
||||
"challengeSeed": [
|
||||
"function telephoneCheck(str) {",
|
||||
@ -142,6 +145,7 @@
|
||||
"assert.deepEqual(drawer(19.50, 20.00, [[\"PENNY\", 1.01], [\"NICKEL\", 2.05], [\"DIME\", 3.10], [\"QUARTER\", 4.25], [\"ONE\", 90.00], [\"FIVE\", 55.00], [\"TEN\", 20.00], [\"TWENTY\", 60.00], [\"ONE HUNDRED\", 100.00]]), [[\"QUARTER\", 0.50]], 'message: <code>drawer(19.50, 20.00, [[\"PENNY\", 1.01], [\"NICKEL\", 2.05], [\"DIME\", 3.10], [\"QUARTER\", 4.25], [\"ONE\", 90.00], [\"FIVE\", 55.00], [\"TEN\", 20.00], [\"TWENTY\", 60.00], [\"ONE HUNDRED\", 100.00]])</code> should return <code>[[\"QUARTER\", 0.50]]</code>.');",
|
||||
"assert.deepEqual(drawer(3.26, 100.00, [[\"PENNY\", 1.01], [\"NICKEL\", 2.05], [\"DIME\", 3.10], [\"QUARTER\", 4.25], [\"ONE\", 90.00], [\"FIVE\", 55.00], [\"TEN\", 20.00], [\"TWENTY\", 60.00], [\"ONE HUNDRED\", 100.00]]), [[\"TWENTY\", 60.00], [\"TEN\", 20.00], [\"FIVE\", 15], [\"ONE\", 1], [\"QUARTER\", 0.50], [\"DIME\", 0.20], [\"PENNY\", 0.04]], 'message: <code>drawer(3.26, 100.00, [[\"PENNY\", 1.01], [\"NICKEL\", 2.05], [\"DIME\", 3.10], [\"QUARTER\", 4.25], [\"ONE\", 90.00], [\"FIVE\", 55.00], [\"TEN\", 20.00], [\"TWENTY\", 60.00], [\"ONE HUNDRED\", 100.00]])</code> should return <code>[[\"TWENTY\", 60.00], [\"TEN\", 20.00], [\"FIVE\", 15], [\"ONE\", 1], [\"QUARTER\", 0.50], [\"DIME\", 0.20], [\"PENNY\", 0.04]]</code>.');",
|
||||
"assert.deepEqual(drawer(19.50, 20.00, [[\"PENNY\", 0.01], [\"NICKEL\", 0], [\"DIME\", 0], [\"QUARTER\", 0], [\"ONE\", 0], [\"FIVE\", 0], [\"TEN\", 0], [\"TWENTY\", 0], [\"ONE HUNDRED\", 0]]), \"Insufficient Funds\", 'message: <code>drawer(19.50, 20.00, [[\"PENNY\", 0.01], [\"NICKEL\", 0], [\"DIME\", 0], [\"QUARTER\", 0], [\"ONE\", 0], [\"FIVE\", 0], [\"TEN\", 0], [\"TWENTY\", 0], [\"ONE HUNDRED\", 0]])</code> should return \"Insufficient Funds\".');",
|
||||
"assert.deepEqual(drawer(19.50, 20.00, [[\"PENNY\", 0.01], [\"NICKEL\", 0], [\"DIME\", 0], [\"QUARTER\", 0], [\"ONE\", 1.00], [\"FIVE\", 0], [\"TEN\", 0], [\"TWENTY\", 0], [\"ONE HUNDRED\", 0]]), \"Insufficient Funds\", 'message: <code>drawer(19.50, 20.00, [[\"PENNY\", 0.01], [\"NICKEL\", 0], [\"DIME\", 0], [\"QUARTER\", 0], [\"ONE\", 1.00], [\"FIVE\", 0], [\"TEN\", 0], [\"TWENTY\", 0], [\"ONE HUNDRED\", 0]])</code> should return \"Insufficient Funds\".');",
|
||||
"assert.deepEqual(drawer(19.50, 20.00, [[\"PENNY\", 0.50], [\"NICKEL\", 0], [\"DIME\", 0], [\"QUARTER\", 0], [\"ONE\", 0], [\"FIVE\", 0], [\"TEN\", 0], [\"TWENTY\", 0], [\"ONE HUNDRED\", 0]]), \"Closed\", 'message: <code>drawer(19.50, 20.00, [[\"PENNY\", 0.50], [\"NICKEL\", 0], [\"DIME\", 0], [\"QUARTER\", 0], [\"ONE\", 0], [\"FIVE\", 0], [\"TEN\", 0], [\"TWENTY\", 0], [\"ONE HUNDRED\", 0]])</code> should return \"Closed\".');"
|
||||
],
|
||||
"MDNlinks": [
|
||||
|
@ -1,6 +1,7 @@
|
||||
{
|
||||
"name": "AngularJS",
|
||||
"order": 16,
|
||||
"time": "5h",
|
||||
"challenges": [
|
||||
{
|
||||
"id": "bd7154d8c441eddfaeb5bdef",
|
||||
|
@ -1,6 +1,7 @@
|
||||
{
|
||||
"name": "Automated Testing and Debugging",
|
||||
"order": 14,
|
||||
"time": "15m",
|
||||
"challenges": [
|
||||
{
|
||||
"id":"cf1111c1c16feddfaeb6bdef",
|
||||
|
@ -1,6 +1,7 @@
|
||||
{
|
||||
"name": "Full Stack JavaScript Projects",
|
||||
"order": 20,
|
||||
"time": "300h",
|
||||
"challenges": [
|
||||
{
|
||||
"id": "bd7158d8c443eddfaeb5bcef",
|
||||
@ -52,7 +53,7 @@
|
||||
"Before you publish to Heroku, you should free up as much memory as possible on Cloud9. In each of the Cloud9 terminal prompt tabs where MongoDB and Grunt are running, press the <code>control + c</code> hotkey to shut down these processes.",
|
||||
"Run the following command in a Cloud9 terminal prompt tab: <code>npm install grunt-contrib-imagemin --save-dev && npm install --save-dev && heroku login</code>. At this point, the terminal will prompt you to log in to Heroku from the command line.",
|
||||
"Now run <code>yo angular-fullstack:heroku</code>. You can choose a name for your Heroku project, or Heroku will create a random one for you. You can choose whether you want to deploy to servers the US or the EU.",
|
||||
"Set the config flag for your Heroku environment and add MongoLab for your MongoDB instance by running the following command: <code>cd ~/workspace/dist && heroku config:set NODE_ENV=production && heroku addons:create mongolab</code>.",
|
||||
"Set the config flag for your Heroku environment and add MongoLab for your MongoDB instance by running the following command: <code>cd ~/workspace/dist && heroku config:set NODE_ENV=production && heroku addons:add mongolab</code>.",
|
||||
"As you build your app, you should frequently commit changes to your codebase. Make sure you're in the <code>~/workspace</code> directory by running <code>cd ~/workspace</code>. Then you can use this code to stage the changes to your changes and commit them: <code>git commit -am \"your commit message\"</code>. Note that you should replace \"your commit message\" with a short summary of the changes you made to your code, such as \"added a records controller and corresponding routes\".",
|
||||
"You can push these new commits to GitHub by running <code>git push origin master</code>, and to Heroku by running <code>grunt --force && grunt buildcontrol:heroku</code>.",
|
||||
"If you need further guidance on using Yeoman Angular-Fullstack Generator, check out: <a href='https://github.com/clnhll/guidetobasejumps' target='_blank'>https://github.com/clnhll/guidetobasejumps</a>.",
|
||||
|
@ -1,6 +1,7 @@
|
||||
{
|
||||
"name": "Basic Algorithm Scripting",
|
||||
"order": 7,
|
||||
"order": 8,
|
||||
"time": "50h",
|
||||
"challenges": [
|
||||
{
|
||||
"id": "ad7123c8c441eddfaeb5bdef",
|
||||
@ -60,7 +61,7 @@
|
||||
" return str;",
|
||||
"}",
|
||||
"",
|
||||
"reverseString(\"hello\", \"\");"
|
||||
"reverseString(\"hello\");"
|
||||
],
|
||||
"MDNlinks": [
|
||||
"Global String Object",
|
||||
@ -103,7 +104,7 @@
|
||||
" return num;",
|
||||
"}",
|
||||
"",
|
||||
"factorialize(5, '');"
|
||||
"factorialize(5);"
|
||||
],
|
||||
"MDNlinks": [
|
||||
"Arithmetic Operators"
|
||||
@ -142,7 +143,7 @@
|
||||
"assert(palindrome(\"almostomla\") === false, 'message: <code>palindrome(\"almostomla\")</code> should return false.');",
|
||||
"assert(palindrome(\"My age is 0, 0 si ega ym.\") === true, 'message: <code>palindrome(\"My age is 0, 0 si ega ym.\")</code> should return true.');",
|
||||
"assert(palindrome(\"1 eye for of 1 eye.\") === false, 'message: <code>palindrome(\"1 eye for of 1 eye.\")</code> should return false.');",
|
||||
"assert(palindrome(\"0_0 (: /-\\ :) 0-0\") === true, 'message: <code>palindrome(\"0_0 (: /-\\\\ :) 0-0\")</code> should return true.');"
|
||||
"assert(palindrome(\"0_0 (: /-\\ :) 0-0\") === true, 'message: <code>palindrome(\"0_0 (: /-\\ :) 0-0\")</code> should return true.');"
|
||||
],
|
||||
"challengeSeed": [
|
||||
"function palindrome(str) {",
|
||||
@ -224,7 +225,7 @@
|
||||
" return str;",
|
||||
"}",
|
||||
"",
|
||||
"titleCase(\"I'm a little tea pot\", \"\");"
|
||||
"titleCase(\"I'm a little tea pot\");"
|
||||
],
|
||||
"tests": [
|
||||
"assert(typeof(titleCase(\"I'm a little tea pot\")) === \"string\", 'message: <code>titleCase()</code> should return a string.');",
|
||||
@ -300,13 +301,14 @@
|
||||
" return str;",
|
||||
"}",
|
||||
"",
|
||||
"end(\"Bastian\", \"n\", \"\");"
|
||||
"end(\"Bastian\", \"n\");"
|
||||
],
|
||||
"tests": [
|
||||
"assert(end(\"Bastian\", \"n\") === true, 'message: <code>end(\"Bastian\", \"n\")</code> should return true.');",
|
||||
"assert(end(\"Connor\", \"n\") === false, 'message: <code>end(\"Connor\", \"n\")</code> should return false.');",
|
||||
"assert(end(\"Walking on water and developing software from a specification are easy if both are frozen.\", \"specification\") === false, 'message: <code>end(\"Walking on water and developing software from a specification are easy if both are frozen.\", \"specification\")</code> should return false.');",
|
||||
"assert(end(\"He has to give me a new name\", \"name\") === true, 'message: <code>end(\"He has to give me a new name\", \"name\")</code> should return true.');",
|
||||
"assert(end(\"He has to give me a new name\", \"me\") === true, 'message: <code>end(\"He has to give me a new name\", \"me\")</code> should return true.');",
|
||||
"assert(end(\"If you want to save our world, you must hurry. We dont know how much longer we can withstand the nothing\", \"mountain\") === false, 'message: <code>end(\"If you want to save our world, you must hurry. We dont know how much longer we can withstand the nothing\", \"mountain\")</code> should return false.');"
|
||||
],
|
||||
"MDNlinks": [
|
||||
@ -338,7 +340,7 @@
|
||||
" return str;",
|
||||
"}",
|
||||
"",
|
||||
"repeat(\"abc\", 3, \"\");"
|
||||
"repeat(\"abc\", 3);"
|
||||
],
|
||||
"tests": [
|
||||
"assert(repeat(\"*\", 3) === \"***\", 'message: <code>repeat(\"*\", 3)</code> should return <code>\"***\"</code>.');",
|
||||
@ -367,6 +369,7 @@
|
||||
"description": [
|
||||
"Truncate a string (first argument) if it is longer than the given maximum string length (second argument). Return the truncated string with a \"...\" ending.",
|
||||
"Note that the three dots at the end add to the string length.",
|
||||
"If the length of the string is less than or equal to 3 characters, then the length of the three dots is not added to the string length.",
|
||||
"Remember to use <a href=\"//github.com/FreeCodeCamp/freecodecamp/wiki/How-to-get-help-when-you-get-stuck\" target=\"_blank\">Read-Search-Ask</a> if you get stuck. Write your own code."
|
||||
],
|
||||
"challengeSeed": [
|
||||
@ -375,13 +378,14 @@
|
||||
" return str;",
|
||||
"}",
|
||||
"",
|
||||
"truncate(\"A-tisket a-tasket A green and yellow basket\", 11, \"\");"
|
||||
"truncate(\"A-tisket a-tasket A green and yellow basket\", 11);"
|
||||
],
|
||||
"tests": [
|
||||
"assert(truncate(\"A-tisket a-tasket A green and yellow basket\", 11) === \"A-tisket...\", 'message: <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\".');"
|
||||
"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\".');",
|
||||
"assert(truncate(\"A-\", 1) === \"A...\", 'message: <code>truncate(\"A-\", 1)</code> should return \"A...\".');"
|
||||
],
|
||||
"MDNlinks": [
|
||||
"String.slice()"
|
||||
@ -412,7 +416,7 @@
|
||||
" return arr;",
|
||||
"}",
|
||||
"",
|
||||
"chunk([\"a\", \"b\", \"c\", \"d\"], 2, \"\");"
|
||||
"chunk([\"a\", \"b\", \"c\", \"d\"], 2);"
|
||||
],
|
||||
"tests": [
|
||||
"assert.deepEqual(chunk([\"a\", \"b\", \"c\", \"d\"], 2), [[\"a\", \"b\"], [\"c\", \"d\"]], 'message: <code>chunk([\"a\", \"b\", \"c\", \"d\"], 2)</code> should return <code>[[\"a\", \"b\"], [\"c\", \"d\"]]</code>.');",
|
||||
@ -450,12 +454,13 @@
|
||||
" return arr;",
|
||||
"}",
|
||||
"",
|
||||
"slasher([1, 2, 3], 2, \"\");"
|
||||
"slasher([1, 2, 3], 2);"
|
||||
],
|
||||
"tests": [
|
||||
"assert.deepEqual(slasher([1, 2, 3], 2), [3], 'message: <code>slasher([1, 2, 3], 2, [3])</code> should return <code>[3]</code>.');",
|
||||
"assert.deepEqual(slasher([1, 2, 3], 2), [3], 'message: <code>slasher([1, 2, 3], 2)</code> should return <code>[3]</code>.');",
|
||||
"assert.deepEqual(slasher([1, 2, 3], 0), [1, 2, 3], 'message: <code>slasher([1, 2, 3], 0)</code> should return <code>[1, 2, 3]</code>.');",
|
||||
"assert.deepEqual(slasher([1, 2, 3], 9), [], 'message: <code>slasher([1, 2, 3], 9)</code> should return <code>[]</code>.');"
|
||||
"assert.deepEqual(slasher([1, 2, 3], 9), [], 'message: <code>slasher([1, 2, 3], 9)</code> should return <code>[]</code>.');",
|
||||
"assert.deepEqual(slasher([1, 2, 3], 4), [], 'message: <code>slasher([1, 2, 3], 4)</code> should return <code>[]</code>.');"
|
||||
],
|
||||
"MDNlinks": [
|
||||
"Array.slice()",
|
||||
@ -489,7 +494,7 @@
|
||||
" return arr;",
|
||||
"}",
|
||||
"",
|
||||
"mutation([\"hello\", \"hey\"], \"\");"
|
||||
"mutation([\"hello\", \"hey\"]);"
|
||||
],
|
||||
"tests": [
|
||||
"assert(mutation([\"hello\", \"hey\"]) === false, 'message: <code>mutation([\"hello\", \"hey\"])</code> should return false.');",
|
||||
@ -531,7 +536,7 @@
|
||||
" return arr;",
|
||||
"}",
|
||||
"",
|
||||
"bouncer([7, \"ate\", \"\", false, 9], \"\");"
|
||||
"bouncer([7, \"ate\", \"\", false, 9]);"
|
||||
],
|
||||
"tests": [
|
||||
"assert.deepEqual(bouncer([7, \"ate\", \"\", false, 9]), [7, \"ate\", 9], 'message: <code>bouncer([7, \"ate\", \"\", false, 9])</code> should return <code>[7, \"ate\", 9]</code>.');",
|
||||
@ -568,7 +573,7 @@
|
||||
" return arr;",
|
||||
"}",
|
||||
"",
|
||||
"destroyer([1, 2, 3, 1, 2, 3], 2, 3, \"\");"
|
||||
"destroyer([1, 2, 3, 1, 2, 3], 2, 3);"
|
||||
],
|
||||
"tests": [
|
||||
"assert.deepEqual(destroyer([1, 2, 3, 1, 2, 3], 2, 3), [1, 1], 'message: <code>destroyer([1, 2, 3, 1, 2, 3], 2, 3)</code> should return <code>[1, 1]</code>.');",
|
||||
@ -608,7 +613,7 @@
|
||||
" return num;",
|
||||
"}",
|
||||
"",
|
||||
"where([40, 60], 50, \"\");"
|
||||
"where([40, 60], 50);"
|
||||
],
|
||||
"MDNlinks": [
|
||||
"Array.sort()"
|
||||
|
@ -1,6 +1,7 @@
|
||||
{
|
||||
"name": "Basic JavaScript",
|
||||
"order": 5,
|
||||
"order": 6,
|
||||
"time": "3h",
|
||||
"challenges": [
|
||||
{
|
||||
"id":"bd7123c9c441eddfaeb4bdef",
|
||||
@ -177,9 +178,9 @@
|
||||
"id": "bd7123c9c450eddfaeb5bdef",
|
||||
"title": "Use Bracket Notation to Find the Nth Character in a String",
|
||||
"description": [
|
||||
"You can also use <code>bracket Notation</code>to get the character at other positions within a string.",
|
||||
"You can also use <code>bracket notation</code> to get the character at other positions within a string.",
|
||||
"Remember that computers start counting at 0, so the first character is actually the zeroth character.",
|
||||
"Let's try to set <code>thirdLetterOfLastName</code>to equal the <code>third letter</code> of the <code>lastName</code> variable.",
|
||||
"Let's try to set <code>thirdLetterOfLastName</code> to equal the <code>third letter</code> of the <code>lastName</code> variable.",
|
||||
"Try looking at the <code>secondLetterOfFirstName</code> variable declaration if you get stuck."
|
||||
],
|
||||
"tests": [
|
||||
@ -529,7 +530,7 @@
|
||||
],
|
||||
"tests": [
|
||||
"assert((function(d){if(d[0] == 'John' && d[1] == 23 && d[2] == undefined){return true;}else{return false;}})(myArray), 'message: <code>myArray</code> should only contain <code>[\"John\", 23]</code>.');",
|
||||
"assert((function(d){if(d[0] == 'cat' && d[1] == 2 && d[2] == undefined){return true;}else{return false;}})(removed), 'message: <code>removed</code> should only contain <code>[\"cat\"], 2</code>.');"
|
||||
"assert((function(d){if(d[0] == 'cat' && d[1] == 2 && d[2] == undefined){return true;}else{return false;}})(removed), 'message: <code>removed</code> should only contain <code>[\"cat\", 2]</code>.');"
|
||||
],
|
||||
"challengeSeed": [
|
||||
"// var numbers = [1,2,3];",
|
||||
@ -802,7 +803,7 @@
|
||||
"assert.deepEqual(myArray, [0,1,2,3,4], 'message: <code>myArray</code> should equal [0,1,2,3,4].');"
|
||||
],
|
||||
"challengeSeed":[
|
||||
"ourArray = [];",
|
||||
"var ourArray = [];",
|
||||
"for(var i = 0; i < 5; i++){",
|
||||
" ourArray.push(i);",
|
||||
"}",
|
||||
@ -933,13 +934,13 @@
|
||||
"assert(myFunction() >= min, 'message: The random number generated by <code>myFunction</code> should be greater than or equal to the minimum number.');",
|
||||
"assert(myFunction() <= max, 'message: The random number generated by <code>myFunction</code> should be less than or equal to the maximum number.');",
|
||||
"assert(myFunction() % 1 === 0 , 'message: The random number generated by <code>myFunction</code> should be an integer, not a decimal.');",
|
||||
"assert((function(){if(editor.getValue().match(/max/g).length >= 2 && editor.getValue().match(/min/g).length >= 2 && editor.getValue().match(/Math.floor/g) && editor.getValue().match(/Math.random/g)){return true;}else{return false;}})(), 'message: You should be using the function given in the description to calculate the random in number in a range.');"
|
||||
"assert((function(){if(editor.getValue().match(/max/g).length >= 3 && editor.getValue().match(/min/g).length >= 4 && editor.getValue().match(/Math.floor/g) && editor.getValue().match(/Math.random/g)){return true;}else{return false;}})(), 'message: You should be using the function given in the description to calculate the random in number in a range.');"
|
||||
],
|
||||
"challengeSeed":[
|
||||
"var min = 0;",
|
||||
"var min = 1;",
|
||||
"var max = 9;",
|
||||
"function myFunction() {",
|
||||
" // Make myFunction return a random number between zero and nine instead of a decimal",
|
||||
" // Make myFunction return a random number between min and max values instead of a decimal",
|
||||
" // Only change code below this line.",
|
||||
"",
|
||||
" return Math.random();",
|
||||
@ -1059,13 +1060,14 @@
|
||||
},
|
||||
{
|
||||
"id":"cf1111c1c12feddfaeb8bdef",
|
||||
"title": "Find White Space with Regular Expressions",
|
||||
"title": "Find Whitespace with Regular Expressions",
|
||||
"difficulty":"9.986",
|
||||
"description":[
|
||||
"We can also use selectors like <code>\\s</code> to find spaces in a string.",
|
||||
"We can also use selectors like <code>\\s</code> to find whitespace in a string.",
|
||||
"The whitespace characters are <code>\" \"</code> (space), <code>\\r</code> (carriage return), <code>\\n</code> (newline), <code>\\t</code> (tab), and <code>\\f</code> (form feed).",
|
||||
"It is used like this:",
|
||||
"<code>/\\s+/g</code>",
|
||||
"Select all the spaces in the sentence string."
|
||||
"Select all the whitespace characters in the sentence string."
|
||||
],
|
||||
"tests":[
|
||||
"assert(test === 7, 'message: Your RegEx should have found seven spaces in the <code>testString</code>.');",
|
||||
@ -1127,10 +1129,10 @@
|
||||
"<code>Math.floor(Math.random() * (3 - 1 + 1)) + 1;</code>"
|
||||
],
|
||||
"tests":[
|
||||
"assert(typeof(runSlots($(\".slot\"))[0]) === \"number\", 'message: <code>slotOne</code> should be a random number.')",
|
||||
"assert(typeof(runSlots($(\".slot\"))[1]) === \"number\", 'message: <code>slotTwo</code> should be a random number.')",
|
||||
"assert(typeof(runSlots($(\".slot\"))[2]) === \"number\", 'message: <code>slotThree</code> should be a random number.')",
|
||||
"assert((function(){if(editor.match(/Math\\.floor\\(\\s?Math\\.random\\(\\)\\s?\\*\\s?\\(\\s?3\\s?\\-\\s?1\\s?\\+\\s?1\\s?\\)\\s?\\)\\s?\\+\\s?1;/gi) !== null){return editor.match(/Math\\.floor\\(\\s?Math\\.random\\(\\)\\s?\\*\\s?\\(\\s?3\\s?\\-\\s?1\\s?\\+\\s?1\\s?\\)\\s?\\)\\s?\\+\\s?1;/gi).length >= 3;}else{return false;}})(), 'message: You should have used <code>Math.floor(Math.random() * (3 - 1 + 1)) + 1;</code> three times to generate your random numbers.')"
|
||||
"assert(typeof(runSlots($(\".slot\"))[0]) === \"number\", '<code>slotOne</code> should be a random number.')",
|
||||
"assert(typeof(runSlots($(\".slot\"))[1]) === \"number\", '<code>slotTwo</code> should be a random number.')",
|
||||
"assert(typeof(runSlots($(\".slot\"))[2]) === \"number\", '<code>slotThree</code> should be a random number.')",
|
||||
"assert((function(){if(editor.match(/Math\\.floor\\(\\s?Math\\.random\\(\\)\\s?\\*\\s?\\(\\s?3\\s?\\-\\s?1\\s?\\+\\s?1\\s?\\)\\s?\\)\\s?\\+\\s?1;/gi) !== null){return editor.match(/Math\\.floor\\(\\s?Math\\.random\\(\\)\\s?\\*\\s?\\(\\s?3\\s?\\-\\s?1\\s?\\+\\s?1\\s?\\)\\s?\\)\\s?\\+\\s?1;/gi).length >= 3;}else{return false;}})(), 'You should have used <code>Math.floor(Math.random() * (3 - 1 + 1)) + 1;</code> three times to generate your random numbers.')"
|
||||
],
|
||||
"challengeSeed":[
|
||||
"fccss",
|
||||
|
@ -1,50 +1,53 @@
|
||||
{
|
||||
"name": "Basic Front End Development Projects",
|
||||
"order": 8,
|
||||
"order": 9,
|
||||
"time": "100h",
|
||||
"challenges": [
|
||||
{
|
||||
"id": "bd7158d8c442eddfbeb5bd1f",
|
||||
"title": "Get Set for Ziplines",
|
||||
"difficulty": 1.00,
|
||||
"challengeSeed": ["125658022"],
|
||||
"challengeSeed": [],
|
||||
"description": [
|
||||
"Now you're ready to start our Zipline challenges. These front-end development challenges will give you many opportunities to apply the HTML, CSS, jQuery and JavaScript you've learned to build static (database-less) applications.",
|
||||
"Whatever you do, don't get discouraged! Remember to use <a href='//github.com/FreeCodeCamp/freecodecamp/wiki/How-to-get-help-when-you-get-stuck' target='_blank'>Read-Search-Ask</a> if you get stuck.",
|
||||
"We'll build these challenges using CodePen, a popular tool for creating, sharing, and discovering static web applications.",
|
||||
"Go to <a href='http://codepen.io' target='_blank'>http://codepen.io</a> and create an account.",
|
||||
"Click your user image in the top right corner, then click the \"New pen\" button that drops down.",
|
||||
"Drag the windows around and press the buttons in the lower-right hand corner to change the orientation to suit your preference.",
|
||||
"Click the gear next to CSS. Then under the \"Add External CSS\" section, use the \"Quick-add\" select box to select Bootstrap. Then click \"Save & Close\".",
|
||||
"Verify that bootstrap is active by adding the following code to your HTML: <code><h1 class='text-primary'>Hello CodePen!</h1></code>. The text's color should be Bootstrap blue.",
|
||||
"Click the gear next to JavaScript. Click the \"Quick-add\" select box and choose jQuery (not jQuery UI).",
|
||||
"Click the \"Quick-add\" select box again and choose Bootstrap. Then click \"Save & Close\".",
|
||||
"Now add the following code to your JavaScript: <code>$(document).ready(function() { $('.text-primary').text('Hi CodePen!') });</code>. Click the \"Save\" button at the top. Your \"Hello CodePen!\" should change to \"Hi CodePen!\". This means that jQuery is working.",
|
||||
"You can use this CodePen that you've just created as a starting point for your Ziplines. Just click the \"fork\" button at the top of your CodePen and it will create a duplicate CodePen.",
|
||||
"Now you're ready for your first Zipline. Click the \"I've completed this challenge\" button."
|
||||
[
|
||||
"http://i.imgur.com/6WLULsC.gif",
|
||||
"A gif showing how to create a Codepen account.",
|
||||
"For our front end Zipline challenges, we'll use a popular browser-based code editor called CodePen. Open CodePen and click \"Sign up\" in the upper right hand corner, then scroll down to the free plan and click \"Sign up\" again. Click the \"Use info from GitHub button\", then add your email address and create a password. Click the \"Sign up\" button. Then in the upper right hand corner, click \"New pen\".",
|
||||
"http://codepen.io"
|
||||
],
|
||||
[
|
||||
"http://i.imgur.com/U4y9RJ1.gif",
|
||||
"A gif showing that you can type \"hello world\" will output \"hello world\" in the preview window. You can also drag windows to resize them, and change their orientation.",
|
||||
"In the HTML box, create an h1 element with the text \"Hello World\". You can drag the frames around to resize them. You can also click the \"Change View\" button and change the orientation of the frames.",
|
||||
""
|
||||
],
|
||||
[
|
||||
"http://i.imgur.com/G9KFQDL.gif",
|
||||
"A gif showing the process of adding Bootstrap to your pen.",
|
||||
"Click the gear in the upper left hand corner of the CSS box, then scroll down to \"Quick add\" and choose Bootstrap. Now give your h1 element the class of \"text-primary\" to change its color and prove that Bootstrap is now available.",
|
||||
""
|
||||
],
|
||||
[
|
||||
"http://i.imgur.com/Gi3aig0.gif",
|
||||
"A gif showing the process of adding Animate.css and jQuery to pen.",
|
||||
"Click the gear in the upper left hand corner of the CSS box, then scroll down to \"Quick add\" and choose Animate.css. Click the gear in the upper left hand corner of the JS box, then scroll down to \"Quick add\" and choose jQuery. Let's prove that Animate.css and jQuery are loaded properly. In the JS box, add the following code to make your h1 element bounce: <code>$(document).ready(function(){ $(\"h1\").addClass(\"animated bounce\"); });</code>.",
|
||||
""
|
||||
],
|
||||
[
|
||||
"http://i.imgur.com/Wzt6Y9Y.gif",
|
||||
"A gif showing the process of saving and forking a pen.",
|
||||
"Save your pen with the \"Save\" button. Then click the \"Fork\" button. This will create a fork (copy) of your pen that you can experiment with.",
|
||||
""
|
||||
]
|
||||
],
|
||||
"type": "waypoint",
|
||||
"challengeType": 2,
|
||||
"type": "Waypoint",
|
||||
"challengeType": 7,
|
||||
"tests": [],
|
||||
"nameCn": "",
|
||||
"descriptionCn": [],
|
||||
"nameFr": "",
|
||||
"descriptionFr": [],
|
||||
"nameRu": "Приготовьтесь к Zipline'ам",
|
||||
"descriptionRu": [
|
||||
"Теперь вы готовы приступить к Zipline'ам. Это задания по фронт-энд разработке, в них вы примените ранее изученные HTML, CSS, jQuery и JavaScript и создадите статические (не использующие базу данных) приложения.",
|
||||
"Ни в коем случае не унывайте! Воспользуйтесь <a href='//github.com/FreeCodeCamp/freecodecamp/wiki/How-to-get-help-when-you-get-stuck' target='_blank'>Read-Search-Ask</a>, если что-то не получается.",
|
||||
"Задания мы будем выполнять используя CodePen - популярный инструмент для создания и обмена статическими веб приложениями.",
|
||||
"Перейдите по ссылке <a href='http://codepen.io' target='_blank'>http://codepen.io</a> и создайте аккаунт.",
|
||||
"Нажмите на ваш аватар в правом верхнем углу, а затем в открывшемся меню на кнопку \"New pen\".",
|
||||
"Выберите удобное расположение окон с помощью кнопок в правом нижнем углу, отрегулируйте их ширину.",
|
||||
"Нажмите на звездочку рядом с CSS. Затем в секции \"Add External CSS\" выберите \"Quick-add\" и добавьте Bootstrap. Нажмите \"Save & Close\".",
|
||||
"Проверьте, что Bootstrap подключен добавив следующий HTML код: <code><h1 class='text-primary'>Hello CodePen!</h1></code>. Цвет текста должен быть синим.",
|
||||
"Нажмите на звездочку рядом с JavaScript. Нажмите \"Quick-add\" и выберите jQuery (не jQuery UI). Нажмите \"Save & Close\".",
|
||||
"Снова нажмите на поле \"Quick-add\", выберите Bootstrap и затем нажмите \"Save & Close\".",
|
||||
"Теперь добавьте следующий код в окошко JavaScript: <code>$(document).ready(function() { $('.text-primary').text('Hi CodePen!') });</code>. Нажмите на кнопку \"Save\" расположенную наверху. Текст \"Hello CodePen!\" должен измениться на \"Hi CodePen!\". Это значит что jQuery работает.",
|
||||
"CodePen, который мы создали, можно использовать в качестве отправной точки для ваших Zipline'ов. Кликните кнопку \"fork\", чтобы создать копию текущего CodePen'a.",
|
||||
"Все готово для первого Zipline'а. Жмите кнопку \"I've completed this challenge\"."
|
||||
],
|
||||
"nameRu": "",
|
||||
"descriptionRu": [],
|
||||
"nameEs": "",
|
||||
"descriptionEs": [],
|
||||
"namePt": "",
|
||||
@ -53,7 +56,6 @@
|
||||
{
|
||||
"id": "bd7158d8c242eddfaeb5bd13",
|
||||
"title": "Build a Personal Portfolio Webpage",
|
||||
"difficulty": 1.01,
|
||||
"challengeSeed": ["133315782"],
|
||||
"description": [
|
||||
"<span class='text-info'>Objective:</span> Build a <a href='http://codepen.io' target='_blank'>CodePen.io</a> app that successfully reverse-engineers this: <a href='http://codepen.io/ThiagoFerreir4/full/eNMxEp' target='_blank'>http://codepen.io/ThiagoFerreir4/full/eNMxEp</a>.",
|
||||
@ -107,7 +109,6 @@
|
||||
{
|
||||
"id": "bd7158d8c442eddfaeb5bd13",
|
||||
"title": "Build a Random Quote Machine",
|
||||
"difficulty": 1.02,
|
||||
"challengeSeed": ["126415122"],
|
||||
"description": [
|
||||
"<span class='text-info'>Objective:</span> Build a <a href='http://codepen.io' target='_blank'>CodePen.io</a> app that successfully reverse-engineers this: <a href='http://codepen.io/AdventureBear/full/vEoVMw' target='_blank'>http://codepen.io/AdventureBear/full/vEoVMw</a>.",
|
||||
@ -117,7 +118,6 @@
|
||||
"Here are the <a href='http://en.wikipedia.org/wiki/User_story' target='_blank'>user stories</a> you must enable, and optional bonus user stories:",
|
||||
"<span class='text-info'>User Story:</span> As a user, I can click a button to show me a new random quote.",
|
||||
"<span class='text-info'>Bonus User Story:</span> As a user, I can press a button to tweet out a quote.",
|
||||
"Note that you can either put your quotes into an array and show them at random, or use an API to get quotes, such as <a href='http://forismatic.com/en/api/'>http://forismatic.com/en/api/</a>.",
|
||||
"Remember to use <a href='//github.com/FreeCodeCamp/freecodecamp/wiki/How-to-get-help-when-you-get-stuck' target='_blank'>Read-Search-Ask</a> if you get stuck.",
|
||||
"When you are finished, click the \"I've completed this challenge\" button and include a link to your CodePen. If you pair programmed, you should also include the Free Code Camp username of your pair.",
|
||||
"If you'd like immediate feedback on your project from fellow campers, click this button and paste in a link to your CodePen project. <br><br><a class='btn btn-primary btn-block' href='https://twitter.com/intent/tweet?text=Check%20out%20the%20project%20I%20just%20built%20with%20%40FreeCodeCamp:%20PASTE_YOUR_CODEPEN_URL_HERE%20%0A%20%23LearnToCode%20%23JavaScript' target='_blank'>Click here then add your link to your tweet's text</a>"
|
||||
@ -203,7 +203,7 @@
|
||||
"Here are the <a href='http://en.wikipedia.org/wiki/User_story' target='_blank'>user stories</a> you must enable, and optional bonus user stories:",
|
||||
"<span class='text-info'>User Story:</span> As a user, I can add, subtract, multiply and divide two numbers.",
|
||||
"<span class='text-info'>Bonus User Story:</span> I can clear the input field with a clear button.",
|
||||
"<span class='text-info'>Bonus User Story:</span> I can keep chaining mathematical operations together until I hit the clear button, and the calculator will tell me the correct output.",
|
||||
"<span class='text-info'>Bonus User Story:</span> I can keep chaining mathematical operations together until I hit the equal button, and the calculator will tell me the correct output.",
|
||||
"Remember to use <a href='//github.com/FreeCodeCamp/freecodecamp/wiki/How-to-get-help-when-you-get-stuck' target='_blank'>Read-Search-Ask</a> if you get stuck.",
|
||||
"When you are finished, click the \"I've completed this challenge\" button and include a link to your CodePen. If you pair programmed, you should also include the Free Code Camp username of your pair.",
|
||||
"If you'd like immediate feedback on your project from fellow campers, click this button and paste in a link to your CodePen project. <br><br><a class='btn btn-primary btn-block' href='https://twitter.com/intent/tweet?text=Check%20out%20the%20project%20I%20just%20built%20with%20%40FreeCodeCamp:%20PASTE_YOUR_CODEPEN_URL_HERE%20%0A%20%23LearnToCode%20%23JavaScript' target='_blank'>Click here then add your link to your tweet's text</a>"
|
||||
|
@ -1,6 +1,7 @@
|
||||
{
|
||||
"name": "Responsive Design with Bootstrap",
|
||||
"order": 3,
|
||||
"time": "2h",
|
||||
"challenges": [
|
||||
{
|
||||
"id": "bad87fee1348bd9acde08712",
|
||||
@ -13,8 +14,9 @@
|
||||
"To get started, we should nest all of our HTML in a <code>div</code> element with the class <code>container-fluid</code>."
|
||||
],
|
||||
"tests": [
|
||||
"assert($(\"div\").hasClass(\"container-fluid\"), 'Your <code>div</code> element should have the class <code>container-fluid</code>')",
|
||||
"assert(editor.match(/<\\/div>/g) && editor.match(/<div/g) && editor.match(/<\\/div>/g).length === editor.match(/<div/g).length, 'Make sure each of your <code>div</code> elements has a closing tag.')"
|
||||
"assert($(\"div\").hasClass(\"container-fluid\"), 'Your <code>div</code> element should have the class <code>container-fluid</code>.')",
|
||||
"assert(editor.match(/<\\/div>/g) && editor.match(/<div/g) && editor.match(/<\\/div>/g).length === editor.match(/<div/g).length, 'Make sure each of your <code>div</code> elements has a closing tag.')",
|
||||
"assert($(\".container-fluid\").children().length >= 8, 'Make sure you have nested all HTML elements in <code>.container-fluid</code>.')"
|
||||
],
|
||||
"challengeSeed": [
|
||||
"<link href=\"http://fonts.googleapis.com/css?family=Lobster\" rel=\"stylesheet\" type=\"text/css\">",
|
||||
@ -89,7 +91,7 @@
|
||||
"id": "bad87fee1348bd9acde08812",
|
||||
"title": "Make Images Mobile Responsive",
|
||||
"description": [
|
||||
"First, add a new image below the existing one. Set it's <code>src</code> attribute to <code>http://bit.ly/fcc-running-cats</code>.",
|
||||
"First, add a new image below the existing one. Set its <code>src</code> attribute to <code>http://bit.ly/fcc-running-cats</code>.",
|
||||
"It would be great if this image could be exactly the width of our phone's screen.",
|
||||
"Fortunately, with Bootstrap, all we need to do is add the <code>img-responsive</code> class to your image. Do this, and the image should perfectly fit the width of your page."
|
||||
],
|
||||
@ -2110,7 +2112,7 @@
|
||||
"tests": [
|
||||
"assert(editor.match(/<!--/g) && editor.match(/<!--/g).length > 0, 'Start a comment with <code><!--</code>.')",
|
||||
"assert(editor.match(/this line/g) && editor.match(/this line/g).length > 0, 'Your comment should have the text <code>You shouldn't need to modify code below this line</code>.')",
|
||||
"assert(editor.match(/-->/g) && editor.match(/-->/g).length > 0, 'Be sure to close your comment with <code>--></code>.')"
|
||||
"assert(editor.match(/-->.*\\n+.+/g), 'Be sure to close your comment with <code>--></code>.')"
|
||||
],
|
||||
"challengeSeed": [
|
||||
"<div class=\"container-fluid\">",
|
||||
|
@ -1,6 +1,7 @@
|
||||
{
|
||||
"name": "Claim Your Front End Development Certificate",
|
||||
"order": 12,
|
||||
"time": "5m",
|
||||
"challenges": [
|
||||
{
|
||||
"id": "561add10cb82ac38a17513be",
|
||||
@ -14,7 +15,7 @@
|
||||
],
|
||||
"description": [
|
||||
[
|
||||
"http://i.imgur.com/luMkKst.jpg",
|
||||
"http://i.imgur.com/syJxavV.jpg",
|
||||
"An image of our Front End Development Certificate",
|
||||
"This challenge will give you your verified Front End Development Certificate. Before we issue your certificate, we must verify that you have completed all of our basic and intermediate Bonfires, and all our basic and intermediate Ziplines. You must also accept our Academic Honesty Pledge. Click the button below to start this process.",
|
||||
""
|
||||
|
@ -1,6 +1,7 @@
|
||||
{
|
||||
"name": "Claim Your Full Stack Development Certificate",
|
||||
"order": 21,
|
||||
"time": "5m",
|
||||
"challenges": [
|
||||
{
|
||||
"id": "660add10cb82ac38a17513be",
|
||||
@ -15,7 +16,7 @@
|
||||
],
|
||||
"description": [
|
||||
[
|
||||
"http://i.imgur.com/qXublEe.jpg",
|
||||
"http://i.imgur.com/sKYQhdG.jpg",
|
||||
"An image of our Full Stack Development Certificate",
|
||||
"This challenge will give you your verified Full Stack Development Certificate. Before we issue your certificate, we must verify that you have completed all of Bonfires, Ziplines and Basejumps. You must also accept our Academic Honesty Pledge. Click the button below to start this process.",
|
||||
""
|
||||
|
111
seed/challenges/gear-up-for-success.json
Normal file
111
seed/challenges/gear-up-for-success.json
Normal file
@ -0,0 +1,111 @@
|
||||
{
|
||||
"name": "Gear up for Success",
|
||||
"order": 4,
|
||||
"time": "10m",
|
||||
"challenges": [
|
||||
{
|
||||
"id": "560add65cb82ac38a17513c2",
|
||||
"title": "Browse Camper News",
|
||||
"challengeSeed": [],
|
||||
"description": [
|
||||
[
|
||||
"http://i.imgur.com/YNwsMXM.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/4GO4zcI.gif",
|
||||
"A gif showing how you can click the \"Wiki\" button in your upper-right corner to access the wiki.",
|
||||
"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/vJyiXzU.gif",
|
||||
"A gif showing how you can click the link below and fill in the necessary fields to add your Free Code Camp studies to your LinkedIn profile.",
|
||||
"You can add Free Code Camp to your LinkedIn education background. Set your graduation date as next year. For \"Degree\", type \"Full Stack Web Development Certification\". 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/Og1ifsn.gif",
|
||||
"A gif showing how you can commit to a goal for your Free Code Camp studies and pledge a monthly donation to a nonprofit to give you external motivation to reach that goal.",
|
||||
"You can set a goal and pledge to donate to a nonprofit each month until you achieve that goal. give you external motivation in your quest to learn to code, as well as the opportunity to help nonprofits right away. Choose your goal, choose a monthly donation. When you click \"commit\", the nonprofit's donate page will open in a new tab. You can change your commitment or stop it at any time.",
|
||||
"/commit"
|
||||
]
|
||||
],
|
||||
"type": "Waypoint",
|
||||
"challengeType": 7,
|
||||
"tests": [],
|
||||
"nameCn": "",
|
||||
"descriptionCn": [],
|
||||
"nameFr": "",
|
||||
"descriptionFr": [],
|
||||
"nameRu": "",
|
||||
"descriptionRu": [],
|
||||
"nameEs": "",
|
||||
"descriptionEs": [],
|
||||
"namePt": "",
|
||||
"descriptionPt": []
|
||||
}
|
||||
]
|
||||
}
|
@ -1,6 +1,7 @@
|
||||
{
|
||||
"name": "Get Started with Free Code Camp",
|
||||
"order": 1,
|
||||
"time": "10m",
|
||||
"challenges": [
|
||||
{
|
||||
"id": "560add10cb82ac38a17513be",
|
||||
@ -9,13 +10,13 @@
|
||||
"description": [
|
||||
[
|
||||
"http://i.imgur.com/RlEk2IF.jpg",
|
||||
"a picture of Free Code Camp's 4 benefits: Get connected, Learn JavaScript, Build your Portfolio, Help nonprofits",
|
||||
"A picture of Free Code Camp's 4 benefits: Get connected, Learn JavaScript, Build your Portfolio, Help nonprofits",
|
||||
"Welcome to Free Code Camp. We're an open source community of busy people who learn to code and help nonprofits.",
|
||||
""
|
||||
],
|
||||
[
|
||||
"http://i.imgur.com/pYsTbjI.jpg",
|
||||
"a screenshot of our curriculum alongside a screenshot of our chat room.",
|
||||
"A screenshot of our curriculum alongside a screenshot of our chat room.",
|
||||
"Learning to code is hard. To succeed, you'll need lots of practice and support. That's why we've created a rigorous curriculum and supportive community.",
|
||||
""
|
||||
],
|
||||
@ -32,14 +33,14 @@
|
||||
""
|
||||
],
|
||||
[
|
||||
"http://i.imgur.com/q4IjuCL.jpg",
|
||||
"a screenshot of our Front End Development Certificate",
|
||||
"http://i.imgur.com/sKYQhdG.jpg",
|
||||
"A screenshot of our Front End Development Certificate",
|
||||
"About half way through our curriculum, you'll earn a verified Front End Development Certificate. If you can finish our entire curriculum, you'll earn a verified Full Stack Development Certificate.",
|
||||
""
|
||||
],
|
||||
[
|
||||
"http://i.imgur.com/yXyxbDd.jpg",
|
||||
"a screen shot of our nonprofit project directory.",
|
||||
"A screen shot of our nonprofit project directory.",
|
||||
"Then you'll build several real-life projects for nonprofits. By the time you finish, you'll have a portfolio of real apps that people use every day.",
|
||||
""
|
||||
]
|
||||
@ -65,7 +66,7 @@
|
||||
"description": [
|
||||
[
|
||||
"http://i.imgur.com/EAR7Lvh.jpg",
|
||||
"a screenshot of our one of our Gitter chat rooms.",
|
||||
"A screenshot of our one of our Gitter chat rooms.",
|
||||
"Now let's join Free Code Camp's chat rooms. You can come here any time of day to hang out, ask questions, or find another camper to pair program with. First you'll need a GitHub account.",
|
||||
""
|
||||
],
|
||||
@ -82,15 +83,15 @@
|
||||
"https://github.com/settings/profile"
|
||||
],
|
||||
[
|
||||
"http://i.imgur.com/OXL3G3n.gif",
|
||||
"Click the link below to navigate to Free Code Camp's open-source repository. In the upper right hand corner, you can click the \"star\" button to star this repository.",
|
||||
"http://i.imgur.com/pYk0wOk.gif",
|
||||
"A gif showing how you can star a GitHub repo.",
|
||||
"Go to Free Code Camp's open-source repository and \"star\" it. \"Starring\" is the GitHub equivalent of \"liking\" something.",
|
||||
"https://github.com/freecodecamp/freecodecamp"
|
||||
],
|
||||
[
|
||||
"http://i.imgur.com/EZHzKCV.gif",
|
||||
"http://i.imgur.com/zwYPeQT.gif",
|
||||
"A gif showing you how to click the link below to go to our chat room and click the \"sign in with GitHub\" button. Then you can click into the text input field and type a message to your fellow campers.",
|
||||
" Now that you have a GitHub account, you can join our main chat room by logging in with GitHub. Introduce yourself by saying \"Hello world!\". Tell your fellow campers how you found Free Code Camp. Also tell us why you want to learn to code.",
|
||||
"Now that you have a GitHub account, you can join our main chat room by logging in with GitHub. Introduce yourself by saying \"Hello world!\". Tell your fellow campers how you found Free Code Camp. Also tell us why you want to learn to code.",
|
||||
"https://gitter.im/FreeCodeCamp/FreeCodeCamp"
|
||||
],
|
||||
[
|
||||
@ -112,7 +113,7 @@
|
||||
""
|
||||
],
|
||||
[
|
||||
"http://i.imgur.com/SLQ27Gr.gif",
|
||||
"http://i.imgur.com/WvQvNGN.gif",
|
||||
"A gif showing how you can click the link below to download a native chat room app for your computer.",
|
||||
"You can also download the chat room app to your computer or phone.",
|
||||
"https://gitter.im/apps"
|
||||
@ -134,51 +135,13 @@
|
||||
},
|
||||
{
|
||||
"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.",
|
||||
""
|
||||
],
|
||||
[
|
||||
"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.",
|
||||
"http://i.imgur.com/tP2ccTE.gif",
|
||||
"A gif showing how you can click your profile image in your upper right hand corner to your code portfolio and connect GitHub.",
|
||||
"Check out your code portfolio. Click your picture in your upper right hand corner. To activate your code portfolio, you'll need to link your GitHub account with Free Code Camp. 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.",
|
||||
""
|
||||
]
|
||||
],
|
||||
@ -208,9 +171,9 @@
|
||||
""
|
||||
],
|
||||
[
|
||||
"http://i.imgur.com/EZHzKCV.gif",
|
||||
"http://i.imgur.com/fTFMjwf.gif",
|
||||
"A gif showing how you can click the link below, find your city on the list of Campsites, then click on the Facebook link for your city and join your city's Facebook group.",
|
||||
"Find your city on this list, click the \"Facebook\" link, then click the \"Join group\" button to apply to join your city's Facebook group (someone from the campsite should approve you shortly). If your city isn't on this list, scroll to the bottom of the wiki article for instructions for how you can create your city's Campsite.",
|
||||
"Find your city on this list and click it. This will take you to your city's Campsite's Facebook group. Click the \"Join group\" button to apply to join your city's Facebook group. Someone from the campsite should approve you shortly. If your city isn't on this list, scroll to the bottom of the wiki article for instructions for how you can create your city's Campsite.",
|
||||
"https://github.com/FreeCodeCamp/freecodecamp/wiki/List-of-Free-Code-Camp-city-based-Campsites"
|
||||
]
|
||||
],
|
||||
@ -228,38 +191,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",
|
||||
@ -290,8 +221,8 @@
|
||||
"https://gitter.im/FreeCodeCamp/Help"
|
||||
],
|
||||
[
|
||||
"http://i.imgur.com/WsfzvVo.gif",
|
||||
"A gif showing us clicking the \"map\" button in our upper right hand corner and browsing our challenge map.",
|
||||
"http://i.imgur.com/ZRgXraT.gif",
|
||||
"A gif showing us scrolling through our challenge map.",
|
||||
"Now you're ready to start coding! The \"Map\" button in your upper right hand corner will show you our challenge map. This map shows all our coding challenges. We recommend that you complete these from top to bottom, at a sustainable pace. You can also return to your next challenge by clicking the \"Learn\" button.",
|
||||
""
|
||||
]
|
||||
|
@ -1,6 +1,7 @@
|
||||
{
|
||||
"name": "Git",
|
||||
"order" : 17,
|
||||
"time": "3h",
|
||||
"challenges": [
|
||||
{
|
||||
"id": "bd7353d8c341eddeaeb5bd0f",
|
||||
|
@ -1,6 +1,7 @@
|
||||
{
|
||||
"name": "Hikes",
|
||||
"order": 0.050,
|
||||
"time": "3h",
|
||||
"challenges": [
|
||||
{
|
||||
"id": "bd7128d8c441eddfbeb5bddf",
|
||||
|
@ -1,6 +1,7 @@
|
||||
{
|
||||
"name": "HTML5 and CSS",
|
||||
"order": 2,
|
||||
"time": "3h",
|
||||
"challenges": [
|
||||
{
|
||||
"id": "bd7123c8c441eddfaeb5bdef",
|
||||
@ -376,6 +377,7 @@
|
||||
"assert(!$(\"h2\").attr(\"style\"), 'Remove the style attribute from your <code>h2</code> element.')",
|
||||
"assert($(\"style\") && $(\"style\").length > 1, 'Create a <code>style</code> element.')",
|
||||
"assert($(\"h2\").css(\"color\") === \"rgb(0, 0, 255)\", 'Your <code>h2</code> element should be blue.')",
|
||||
"assert(editor.match(/h2\\s*\\{\\s*color:\\s*blue;\\s*\\}/g), 'Ensure that your stylesheet <code>h2</code> declaration is valid with a semicolon and closing brace')",
|
||||
"assert(editor.match(/<\\/style>/g) && editor.match(/<\\/style>/g).length === (editor.match(/<style((\\s)*((type|media|scoped|title|disabled)=\"[^\"]*\")?(\\s)*)*>/g) || []).length, 'Make sure all your <code>style</code> elements are valid and have a closing tag.')"
|
||||
],
|
||||
"challengeSeed": [
|
||||
@ -434,6 +436,7 @@
|
||||
"tests": [
|
||||
"assert($(\"h2\").css(\"color\") === \"rgb(255, 0, 0)\", 'Your <code>h2</code> element should be red.')",
|
||||
"assert($(\"h2\").hasClass(\"red-text\"), 'Your <code>h2</code> element should have the class <code>red-text</code>.')",
|
||||
"assert(editor.match(/\\.red-text\\s*\\{\\s*color:\\s*red;\\s*\\}/g), 'Your stylesheet should declare a <code>red-text</code> class and have its color set to red.')",
|
||||
"assert($(\"h2\").attr(\"style\") === undefined, 'Do not use inline style declarations like <code>style=\"color: red\"</code> in your <code>h2</code> element.')"
|
||||
],
|
||||
"challengeSeed": [
|
||||
@ -541,7 +544,6 @@
|
||||
"assert($(\"p\").length > 1, 'You need 2 <code>p</code> elements with Kitty Ipsum text.')",
|
||||
"assert(editor.match(/<\\/p>/g) && editor.match(/<\\/p>/g).length === editor.match(/<p/g).length, 'Make sure each of your <code>p</code> elements has a closing tag.')",
|
||||
"assert.isTrue((/Purr\\s+jump\\s+eat/gi).test($(\"p\").text()), 'Your <code>p</code> element should contain the first few words of the provided additional <code>kitty ipsum text</code>.')",
|
||||
"assert($(\"p.red-text\").length === 2, 'Give each of your <code>p</code> elements the <code>red-text</code> class.')",
|
||||
"assert($(\"p\").css(\"font-size\") === \"16px\", 'Give elements with the <code>red-text</code> class a <code>font-size</code> of 16px.')"
|
||||
],
|
||||
"challengeSeed": [
|
||||
@ -1122,7 +1124,7 @@
|
||||
"assert($(\"a\").text().match(/cat\\sphotos/gi), 'Your <code>a</code> element should have the anchor text of \"cat photos\"')",
|
||||
"assert($(\"p\") && $(\"p\").length > 2, 'Create a new <code>p</code> element around your <code>a</code> element.')",
|
||||
"assert($(\"a[href=\\\"http://www.freecatphotoapp.com\\\"]\").parent().is(\"p\"), 'Your <code>a</code> element should be nested within your new <code>p</code> element.')",
|
||||
"assert($(\"p\").text().match(/^View\\smore\\s/gi), 'Your <code>p</code> element should have the text \"View more \" (with a space after it).')",
|
||||
"assert($(\"p\").text().match(/^\\s*View\\smore\\s/gi), 'Your <code>p</code> element should have the text \"View more \" (with a space after it).')",
|
||||
"assert(!$(\"a\").text().match(/View\\smore/gi), 'Your <code>a</code> element should <em>not</em> have the text \"View more\".')",
|
||||
"assert(editor.match(/<\\/p>/g) && editor.match(/<p/g) && editor.match(/<\\/p>/g).length === editor.match(/<p/g).length, 'Make sure each of your <code>p</code> elements has a closing tag.')",
|
||||
"assert(editor.match(/<\\/a>/g) && editor.match(/<a/g) && editor.match(/<\\/a>/g).length === editor.match(/<a/g).length, 'Make sure each of your <code>a</code> elements has a closing tag.')"
|
||||
@ -1156,9 +1158,11 @@
|
||||
"</style>",
|
||||
"",
|
||||
"<h2 class=\"red-text\">CatPhotoApp</h2>",
|
||||
"<!--Do not alter code above this line-->",
|
||||
"",
|
||||
"<a href=\"http://www.freecatphotoapp.com\">cat photos</a>",
|
||||
"",
|
||||
"<!--Do not alter code below this line-->",
|
||||
"<img class=\"smaller-image thick-green-border\" src=\"https://bit.ly/fcc-relaxing-cat\">",
|
||||
"",
|
||||
"<p class=\"red-text\">Kitty ipsum dolor sit amet, shed everywhere shed everywhere stretching attack your ankles chase the red dot, hairball run catnip eat the grass sniff.</p>",
|
||||
@ -1411,7 +1415,7 @@
|
||||
"assert($(\"ul\").length > 0, 'Create a <code>ul</code> element.')",
|
||||
"assert($(\"ul li\").length > 2, 'You should have three <code>li</code> elements within your <code>ul</code> element.')",
|
||||
"assert(editor.match(/<\\/ul>/g) && editor.match(/<ul/g) && editor.match(/<\\/ul>/g).length === editor.match(/<ul/g).length, 'Make sure your <code>ul</code> element has a closing tag.')",
|
||||
"assert(editor.match(/<\\/li>/g) && editor.match(/<li>/g) && editor.match(/<\\/li>/g).length === editor.match(/<li>/g).length, 'Make sure your <code>li</code> element has a closing tag.')"
|
||||
"assert(editor.match(/<\\/li>/g) && editor.match(/<li[\\s>]/g) && editor.match(/<\\/li>/g).length === editor.match(/<li[\\s>]/g).length, 'Make sure your <code>li</code> elements have closing tags.')"
|
||||
],
|
||||
"challengeSeed": [
|
||||
"<link href=\"http://fonts.googleapis.com/css?family=Lobster\" rel=\"stylesheet\" type=\"text/css\">",
|
||||
@ -3702,7 +3706,7 @@
|
||||
"Let's replace the hex code in our <code>body</code> element's background color with the RGB value for black: <code>rgb(0, 0, 0)</code>"
|
||||
],
|
||||
"tests": [
|
||||
"assert($(\"body\").css(\"background-color\") === \"rgb(0, 0, 0)\", 'Give your <code>body</code> element the <code>background-color</code> of black.')",
|
||||
"assert($(\"body\").css(\"background-color\") === \"rgb(0, 0, 0)\", 'Your <code>body</code> element should have a black background.')",
|
||||
"assert(editor.match(/rgb\\s*\\(\\s*0\\s*,\\s*0\\s*,\\s*0\\s*\\)/ig), 'Use <code>rgb</code> to give your <code>body</code> element the <code>background-color</code> of black. For example <code>body { color: rgb(0, 0, 0); }</code>.')"
|
||||
],
|
||||
"challengeSeed": [
|
||||
@ -3736,7 +3740,7 @@
|
||||
"Change the <code>body</code> element's background color from the RGB value for black to the <code>rgb</code> value for white: <code>rgb(255, 255, 255)</code>"
|
||||
],
|
||||
"tests": [
|
||||
"assert($(\"body\").css(\"background-color\") === \"rgb(255, 255, 255)\", 'Give your <code>body</code> element the <code>background-color</code> of white.')",
|
||||
"assert($(\"body\").css(\"background-color\") === \"rgb(255, 255, 255)\", 'Your <code>body</code> should have a white background.')",
|
||||
"assert(editor.match(/rgb\\s*\\(\\s*255\\s*,\\s*255\\s*,\\s*255\\s*\\)/ig), 'Use <code>rgb</code> to give your <code>body</code> element the <code>background-color</code> of white. For example <code>body { background-color: rgb(255, 255 , 255); }</code>.')"
|
||||
],
|
||||
"challengeSeed": [
|
||||
@ -3770,7 +3774,7 @@
|
||||
"Change the <code>body</code> element's background color to the RGB value red: <code>rgb(255, 0, 0)</code>"
|
||||
],
|
||||
"tests": [
|
||||
"assert($(\"body\").css(\"background-color\") === \"rgb(255, 0, 0)\", 'Give your <code>body</code> element the <code>background-color</code> of red.')",
|
||||
"assert($(\"body\").css(\"background-color\") === \"rgb(255, 0, 0)\", 'Your <code>body</code> should have a red background.')",
|
||||
"assert(editor.match(/rgb\\s*\\(\\s*255\\s*,\\s*0\\s*,\\s*0\\s*\\)/ig), 'Use <code>rgb</code> to give your <code>body</code> element the <code>background-color</code> of red. For example <code>body { background-color: rgb(255, 0, 0); }</code>.')"
|
||||
],
|
||||
"challengeSeed": [
|
||||
@ -3802,7 +3806,7 @@
|
||||
"Now change the <code>body</code> element's background color to the <code>rgb</code> value green: <code>rgb(0, 255, 0)</code>"
|
||||
],
|
||||
"tests": [
|
||||
"assert($(\"body\").css(\"background-color\") === \"rgb(0, 255, 0)\", 'Give your <code>body</code> element the <code>background-color</code> of green.')",
|
||||
"assert($(\"body\").css(\"background-color\") === \"rgb(0, 255, 0)\", 'Your <code>body</code> element should have a green background.')",
|
||||
"assert(editor.match(/rgb\\s*\\(\\s*0\\s*,\\s*255\\s*,\\s*0\\s*\\)/ig), 'Use <code>rgb</code> to give your <code>body</code> element the <code>background-color</code> of green. For example <code>body { background-color: rgb(0, 255, 0); }</code>.')"
|
||||
],
|
||||
"challengeSeed": [
|
||||
@ -3834,7 +3838,7 @@
|
||||
"Change the <code>body</code> element's background color to the RGB value blue: <code>rgb(0, 0, 255)</code>"
|
||||
],
|
||||
"tests": [
|
||||
"assert($(\"body\").css(\"background-color\") === \"rgb(0, 0, 255)\", 'Give your <code>body</code> element the background-color of blue.')",
|
||||
"assert($(\"body\").css(\"background-color\") === \"rgb(0, 0, 255)\", 'Your <code>body</code> element should have a blue background.')",
|
||||
"assert(editor.match(/rgb\\s*\\(\\s*0\\s*,\\s*0\\s*,\\s*255\\s*\\)/ig), 'Use <code>rgb</code> to give your <code>body</code> element the <code>background-color</code> of blue. For example <code>body { background-color: rgb(0, 0, 255); }</code>.')"
|
||||
],
|
||||
"challengeSeed": [
|
||||
@ -3867,7 +3871,7 @@
|
||||
"Change the <code>body</code> element's background color to the RGB value orange: <code>rgb(255, 165, 0)</code>"
|
||||
],
|
||||
"tests": [
|
||||
"assert($(\"body\").css(\"background-color\") === \"rgb(255, 165, 0)\", 'Give your <code>body</code> element the background-color of orange.')",
|
||||
"assert($(\"body\").css(\"background-color\") === \"rgb(255, 165, 0)\", 'Your <code>body</code> element should have an orange background.')",
|
||||
"assert(editor.match(/rgb\\s*\\(\\s*255\\s*,\\s*165\\s*,\\s*0\\s*\\)/ig), 'Use <code>rgb</code> to give your <code>body</code> element the <code>background-color</code> of orange. For example <code>body { background-color: rgb(255, 165, 0); }</code>.')"
|
||||
],
|
||||
"challengeSeed": [
|
||||
@ -3900,7 +3904,7 @@
|
||||
"Change the <code>body</code> element's background color to the RGB value for gray: <code>rgb(128, 128, 128)</code>"
|
||||
],
|
||||
"tests": [
|
||||
"assert($(\"body\").css(\"background-color\") === \"rgb(128, 128, 128)\", 'Give your <code>body</code> element the background-color of gray.')",
|
||||
"assert($(\"body\").css(\"background-color\") === \"rgb(128, 128, 128)\", 'Your <code>body</code> element should have a gray background.')",
|
||||
"assert(editor.match(/rgb\\s*\\(\\s*128\\s*,\\s*128\\s*,\\s*128\\s*\\)/ig), 'Use <code>rgb</code> to give your <code>body</code> element the <code>background-color</code> of gray. For example <code>body { background-color: rgb(128, 128, 128); }</code>.')"
|
||||
],
|
||||
"challengeSeed": [
|
||||
|
@ -1,6 +1,7 @@
|
||||
{
|
||||
"name": "Intermediate Algorithm Scripting",
|
||||
"order": 9,
|
||||
"order": 10,
|
||||
"time": "50h",
|
||||
"challenges": [
|
||||
{
|
||||
"id": "a3566b1109230028080c9345",
|
||||
@ -65,7 +66,8 @@
|
||||
"assert.deepEqual(diff([\"andesite\", \"grass\", \"dirt\", \"dead shrub\"], [\"andesite\", \"grass\", \"dirt\", \"dead shrub\"]), [], 'message: <code>[\"andesite\", \"grass\", \"dirt\", \"dead shrub\"], [\"andesite\", \"grass\", \"dirt\", \"dead shrub\"]</code> should return <code>[]</code>.');",
|
||||
"assert.deepEqual(diff([1, 2, 3, 5], [1, 2, 3, 4, 5]), [4], 'message: <code>[1, 2, 3, 5], [1, 2, 3, 4, 5]</code> should return <code>[4]</code>.');",
|
||||
"assert.includeMembers(diff([1, \"calf\", 3, \"piglet\"], [1, \"calf\", 3, 4]), [\"piglet\", 4], 'message: <code>[1, \"calf\", 3, \"piglet\"], [1, \"calf\", 3, 4]</code> should return <code>[\"piglet\", 4]</code>.');",
|
||||
"assert.deepEqual(diff([], [\"snuffleupagus\", \"cookie monster\", \"elmo\"]), [\"snuffleupagus\", \"cookie monster\", \"elmo\"], 'message: <code>[], [\"snuffleupagus\", \"cookie monster\", \"elmo\"]</code> should return <code>[\"snuffleupagus\", \"cookie monster\", \"elmo\"]</code>.');"
|
||||
"assert.deepEqual(diff([], [\"snuffleupagus\", \"cookie monster\", \"elmo\"]), [\"snuffleupagus\", \"cookie monster\", \"elmo\"], 'message: <code>[], [\"snuffleupagus\", \"cookie monster\", \"elmo\"]</code> should return <code>[\"snuffleupagus\", \"cookie monster\", \"elmo\"]</code>.');",
|
||||
"assert.includeMembers(diff([1, \"calf\", 3, \"piglet\"], [7, \"filly\"]), [1, \"calf\", 3, \"piglet\", 7, \"filly\"], 'message: <code>[1, \"calf\", 3, \"piglet\"], [7, \"filly\"]</code> should return <code>[1, \"calf\", 3, \"piglet\", 7, \"filly\"]</code>.');"
|
||||
],
|
||||
"MDNlinks": [
|
||||
"Comparison Operators",
|
||||
@ -355,7 +357,7 @@
|
||||
"assert.strictEqual(boo([].slice), false, 'message: <code>boo([].slice)</code> should return false.');",
|
||||
"assert.strictEqual(boo({ \"a\": 1 }), false, 'message: <code>boo({ \"a\": 1 })</code> should return false.');",
|
||||
"assert.strictEqual(boo(1), false, 'message: <code>boo(1)</code> should return false.');",
|
||||
"assert.strictEqual(boo(NaN), false, 'message: <code>boo(NaN)</code> should return true.');",
|
||||
"assert.strictEqual(boo(NaN), false, 'message: <code>boo(NaN)</code> should return false.');",
|
||||
"assert.strictEqual(boo(\"a\"), false, 'message: <code>boo(\"a\")</code> should return false.');"
|
||||
],
|
||||
"MDNlinks": [
|
||||
@ -511,7 +513,7 @@
|
||||
"sumFibs(4);"
|
||||
],
|
||||
"tests": [
|
||||
"assert(typeof(sumFibs(1)) === \"number\", 'message: <code>sumFibs()</code> should return a number.');",
|
||||
"assert(typeof(sumFibs(1)) === \"number\", 'message: <code>sumFibs(1)</code> should return a number.');",
|
||||
"assert.deepEqual(sumFibs(1000), 1785, 'message: <code>sumFibs(1000)</code> should return 1785.');",
|
||||
"assert.deepEqual(sumFibs(4000000), 4613732, 'message: <code>sumFibs(4000000)</code> should return 4613732.');",
|
||||
"assert.deepEqual(sumFibs(4), 5, 'message: <code>sumFibs(4)</code> should return 5.');",
|
||||
@ -631,7 +633,7 @@
|
||||
"assert.strictEqual(find([1, 3, 5, 9], function(num) { return num % 2 === 0; }), undefined, 'message: <code>find([1, 3, 5, 9], function(num) { return num % 2 === 0; })</code> should return undefined.');"
|
||||
],
|
||||
"MDNlinks": [
|
||||
"Array.some()"
|
||||
"Array.filter()"
|
||||
],
|
||||
"type": "bonfire",
|
||||
"challengeType": 5,
|
||||
@ -823,7 +825,7 @@
|
||||
"assert.isUndefined(add(2)([3]), 'message: <code>add(2)([3])</code> should return undefined.');"
|
||||
],
|
||||
"MDNlinks": [
|
||||
"Global Function Object",
|
||||
"Closures",
|
||||
"Arguments object"
|
||||
],
|
||||
"type": "bonfire",
|
||||
|
@ -1,13 +1,14 @@
|
||||
{
|
||||
"name": "Intermediate Front End Development Projects",
|
||||
"order": 11,
|
||||
"time": "200h",
|
||||
"challenges": [
|
||||
{
|
||||
"id": "bd7158d8c442eddfaeb5bd10",
|
||||
"title": "Show the Local Weather",
|
||||
"challengeSeed": ["126415127"],
|
||||
"description": [
|
||||
"<span class='text-info'>Objective:</span> Build a <a href='http://codepen.io' target='_blank'>CodePen.io</a> app that successfully reverse-engineers this: <a href='http://codepen.io/AdventureBear/full/yNBJRj' target='_blank'>http://codepen.io/AdventureBear/full/yNBJRj</a>.",
|
||||
"<span class='text-info'>Objective:</span> Build a <a href='http://codepen.io' target='_blank'>CodePen.io</a> app that successfully reverse-engineers this: <a href='http://codepen.io/FreeCodeCamp/pen/avqvgJ' target='_blank'>http://codepen.io/FreeCodeCamp/pen/avqvgJ</a>.",
|
||||
"<span class='text-info'>Rule #1:</span> Don't look at the example project's code on CodePen. Figure it out for yourself.",
|
||||
"<span class='text-info'>Rule #2:</span> You may use whichever libraries or APIs you need.",
|
||||
"<span class='text-info'>Rule #3:</span> Reverse engineer the example project's functionality, and also feel free to personalize it.",
|
||||
@ -16,6 +17,7 @@
|
||||
"<span class='text-info'>Bonus User Story:</span> As a user, I can see an icon depending on the weather.",
|
||||
"<span class='text-info'>Bonus User Story:</span> As a user, I see a different background image (e.g. snowy mountain, hot desert) depending on the weather.",
|
||||
"<span class='text-info'>Bonus User Story:</span> As a user, I can push a button to toggle between Fahrenheit and Celsius.",
|
||||
"We recommend using the <a href='http://openweathermap.org/current#geo' target='_blank'>Open Weather API</a>. This will require creating a free API key. Normally you want to avoid exposing API keys on CodePen, but we haven't been able to find a keyless API for weather.",
|
||||
"Remember to use <a href='//github.com/FreeCodeCamp/freecodecamp/wiki/How-to-get-help-when-you-get-stuck' target='_blank'>Read-Search-Ask</a> if you get stuck.",
|
||||
"When you are finished, click the \"I've completed this challenge\" button and include a link to your CodePen. If you pair programmed, you should also include the Free Code Camp username of your pair.",
|
||||
"If you'd like immediate feedback on your project from fellow campers, click this button and paste in a link to your CodePen project. <br><br><a class='btn btn-primary btn-block' href='https://twitter.com/intent/tweet?text=Check%20out%20the%20project%20I%20just%20built%20with%20%40FreeCodeCamp:%20PASTE_YOUR_CODEPEN_URL_HERE%20%0A%20%23LearnToCode%20%23JavaScript' target='_blank'>Click here then add your link to your tweet's text</a>"
|
||||
|
@ -1,6 +1,7 @@
|
||||
{
|
||||
"name": "jQuery",
|
||||
"order": 4,
|
||||
"order": 5,
|
||||
"time": "2h",
|
||||
"challenges": [
|
||||
{
|
||||
"id": "bad87fee1348bd9acdd08826",
|
||||
@ -10,7 +11,9 @@
|
||||
"Before we can start using jQuery, we need to add some things to our HTML.",
|
||||
"First, add a <code>script</code> element at the top of your page. Be sure to close it on the following line.",
|
||||
"Your browser will run any JavaScript inside a <code>script</code> element, including jQuery.",
|
||||
"Inside your <code>script</code> element, add this code: <code>$(document).ready(function() {</code> to your <code>script</code>. Then close it on the following line (still inside your <code>script</code> element) with: <code>});</code>"
|
||||
"Inside your <code>script</code> element, add this code: <code>$(document).ready(function() {</code> to your <code>script</code>. Then close it on the following line (still inside your <code>script</code> element) with: <code>});</code>",
|
||||
"We'll learn more about <code>functions</code> later. The important thing to know is that code you put inside this <code>function</code> will run as soon as your browser has loaded your page.",
|
||||
"This is important because without your <code>document ready function</code>, your code may run before your HTML is rendered, which would cause bugs."
|
||||
],
|
||||
"tests": [
|
||||
"assert(editor.match(/<script>/g), 'Create a <code>script</code> element.')",
|
||||
@ -52,8 +55,7 @@
|
||||
"id": "bad87fee1348bd9bedc08826",
|
||||
"title": "Target HTML Elements with Selectors Using jQuery",
|
||||
"description": [
|
||||
"Now we have a <code>document ready function</code>. We'll learn more about <code>functions</code> later. The important thing to know is that code you put inside this <code>function</code> will run as soon as your browser has loaded your page.",
|
||||
"This is important because without your <code>document ready function</code>, your code may run before your HTML is rendered, which would cause bugs.",
|
||||
"Now we have a <code>document ready function</code>.",
|
||||
"Now let's write our first jQuery statement. All jQuery functions start with a <code>$</code>, usually referred to as a <code>dollar sign operator</code>, or simply as <code>bling</code>.",
|
||||
"jQuery often selects an HTML element with a <code>selector</code>, then does something to that element.",
|
||||
"For example, let's make all of your <code>button</code> elements bounce. Just add this code inside your document ready function: <code>$(\"button\").addClass(\"animated bounce\")</code>.",
|
||||
@ -253,8 +255,10 @@
|
||||
"title": "Target the same element with multiple jQuery Selectors",
|
||||
"description": [
|
||||
"Now you know three ways of targeting elements: by type: <code>$(\"button\")</code>, by class: <code>$(\".btn\")</code>, and by id <code>$(\"#target1\")</code>.",
|
||||
"Use each of these jQuery selectors to target your <code>button</code> element with the class <code>btn</code> and the id <code>target1</code>.",
|
||||
"Use the <code>addClass()</code> jQuery function to give the element one new class for each selector: <code>animated</code>, <code>shake</code>, and <code>btn-primary</code>."
|
||||
"Using each of the above jQuery selectors and the <code>addClass()</code> function:",
|
||||
"Add the <code>animated</code> class to all elements with type <code>button</code>.",
|
||||
"Add the <code>shake</code> class to all the buttons with class <code>.btn</code>.",
|
||||
"Add the <code>btn-primary</code> class to the button with id <code>#target1</code>."
|
||||
],
|
||||
"tests": [
|
||||
"assert(editor.match(/\\$\\s*?\\(\\s*?(?:'|\")\\s*?button\\s*?(?:'|\")/gi), 'Use the <code>$(\"button\")</code> selector.')",
|
||||
|
@ -1,32 +1,35 @@
|
||||
{
|
||||
"name": "JSON APIs and Ajax",
|
||||
"order": 0.0065,
|
||||
"order": 10.5,
|
||||
"time": "30m",
|
||||
"challenges": [
|
||||
{
|
||||
"id": "bb000000000000000000001",
|
||||
"title": "Trigger on click Events with jQuery",
|
||||
"title": "Trigger Click Events with jQuery",
|
||||
"description": [
|
||||
"With jQuery we are able to get data from APIs via Ajax.",
|
||||
"This data normally comes in the form of <code>JSON</code>.",
|
||||
"Let's get the <code>Get Message</code> button to set the text of a <code>div</code> element.",
|
||||
"Recall the <code>$(document).ready()</code> function. Remember that all code inside of it will run once the page loads.",
|
||||
"Let's make our \"Get Message\" button change the text of a <code>div</code> element.",
|
||||
"We will later use this to display the result of out API request.",
|
||||
"First, implement the Click event inside of our <code>$(document).ready()</code> function by adding this code:",
|
||||
"<code>$(\"#getMessage\").on(\"click\", function(){</code>",
|
||||
"<code>  $(\".message\").html(\"Here is the message\");</code>",
|
||||
"",
|
||||
"<code>});</code>"
|
||||
],
|
||||
"tests": [
|
||||
"assert(editor.match(/\\$\\s*?\\(\\s*?(?:'|\")\\#getMessage(?:'|\")\\s*?\\)\\s*?\\.on\\s*?\\(\\s*?(?:'|\")click(?:'|\")\\s*?\\,\\s*?function\\s*?\\(\\s*?\\)\\s*?\\{/gi), 'You should have bound the click event to the getMessage button.')",
|
||||
"assert(editor.match(/\\$\\s*?\\(\\s*?(?:'|\")\\.message(?:'|\")\\s*?\\)\\s*?\\.html\\s*?\\(\\s*?(?:'|\")Here\\sis\\sthe\\smessage(?:'|\")\\s*?\\);/gi), 'You should set te value of the #message box to be the message given in the description.')",
|
||||
"assert(editor.match(/\\n*?\\s*?\\}\\n*?\\s*?\\);/gi) && editor.match(/\\n*?\\s*?\\}\\);/gi).length >= 2, 'Make sure that you close off all of your functions.')"
|
||||
"assert(editor.match(/\\$\\s*?\\(\\s*?(?:'|\")\\#getMessage(?:'|\")\\s*?\\)\\s*?\\.on\\s*?\\(\\s*?(?:'|\")click(?:'|\")\\s*?\\,\\s*?function\\s*?\\(\\s*?\\)\\s*?\\{/gi), 'Bind the click event to the button with the ID of <code>getMessage</code>.')",
|
||||
"assert(editor.match(/\\n*?\\s*?\\}\\n*?\\s*?\\);/gi) && editor.match(/\\n*?\\s*?\\}\\);/gi).length >= 2, 'Be sure to close your functions with <code>});</code>.')"
|
||||
],
|
||||
"challengeSeed": [
|
||||
"fccss",
|
||||
" $(document).ready(function() {",
|
||||
" // Only change code below this line.",
|
||||
" ",
|
||||
" // Only change code above this line.",
|
||||
" });",
|
||||
"fcces",
|
||||
"",
|
||||
"<!-- You shouldn't need to modify code below this line -->",
|
||||
"",
|
||||
"<div class=\"container-fluid\">",
|
||||
" <div class = \"row text-center\">",
|
||||
@ -50,19 +53,62 @@
|
||||
"type": "waypoint"
|
||||
},
|
||||
{
|
||||
"id": "bb000000000000000000002",
|
||||
"title": "Create HTML from an AJAX Request",
|
||||
"id": "bb000000000000000000001",
|
||||
"title": "Change Text with Click Events",
|
||||
"description": [
|
||||
"When our Click Event happens, we can use Ajax to update an HTML element.",
|
||||
"Let's make it so that when a user clicks our \"Get Message\" button, we change the text of our <code>div</code> with the class <code>message</code> to say \"Here is the message\".",
|
||||
"We can do this by adding the following code within our Click event:",
|
||||
"<code>  $(\".message\").html(\"Here is the message\");</code>"
|
||||
],
|
||||
"tests": [
|
||||
"assert(editor.match(/\\$\\s*?\\(\\s*?(?:'|\")\\.message(?:'|\")\\s*?\\)\\s*?\\.html\\s*?\\(\\s*?(?:'|\")Here\\sis\\sthe\\smessage(?:'|\")\\s*?\\);/gi), 'You should set te value of the #message box to be the message given in the description.')"
|
||||
],
|
||||
"challengeSeed": [
|
||||
"fccss",
|
||||
" $(document).ready(function() {",
|
||||
" $(\"#getMessage\").on(\"click\", function(){",
|
||||
" // Only change code below this line.",
|
||||
"",
|
||||
"We are now going to request data from an external source. (a file on FCC for the purposes of this exercise) The request will load in the data an run the code in the function we provide the data to which is known as the callback.",
|
||||
"Once we have the JSON we can modify or display it however we like so that it can be used elsewhere in the program and shown to the end user.",
|
||||
"<code>$(\"#getMessage\").on(\"click\", function() {",
|
||||
" // Only change code above this line.",
|
||||
" });",
|
||||
" });",
|
||||
"fcces",
|
||||
"",
|
||||
"",
|
||||
"<div class=\"container-fluid\">",
|
||||
" <div class = \"row text-center\">",
|
||||
" <h2>Cat Photo Finder</h2>",
|
||||
" </div>",
|
||||
" <div class = \"row text-center\">",
|
||||
" <div class = \"col-xs-12 well message\">",
|
||||
" The message will go here",
|
||||
" </div>",
|
||||
" </div>",
|
||||
" <div class = \"row text-center\">",
|
||||
" <div class = \"col-xs-12\">",
|
||||
" <button id = \"getMessage\" class = \"btn btn-primary\">",
|
||||
" Get Message",
|
||||
" </button>",
|
||||
" </div>",
|
||||
" </div>",
|
||||
"</div>"
|
||||
],
|
||||
"challengeType": 0,
|
||||
"type": "waypoint"
|
||||
},
|
||||
{
|
||||
"id": "bb000000000000000000002",
|
||||
"title": "Get JSON with the jQuery getJSON Method",
|
||||
"description": [
|
||||
"You can also request data from an external source. This is where APIs - Application Interfaces - come into play.",
|
||||
"Most modern APIs transfer data in a format called JSON. JSON stands for JavaScript Object Notation.",
|
||||
"You've already been JSON whenever you've created JavaScript objects. JSON is just a bunch of object properties and their current values, sandwiched between a <code>{</code> and a <code>}</code>. You may hear these referred to as \"key-value pairs\".",
|
||||
"Let's get the JSON from Free Code Camp's Cat API. Here's the code you can put in your Click event to do this:",
|
||||
"<code>  $.getJSON(\"/json/cats.json?callback=\", function( json ) {</code>",
|
||||
"<code>    //Code to run when request is complete</code>",
|
||||
"<code>    $(\".message\").html(JSON.stringify(json))</code>",
|
||||
"<code>  });</code>",
|
||||
"<code>});</code>",
|
||||
"Let's make it so that the data sent from the request is appended to the .message div."
|
||||
"<code>});</code>"
|
||||
],
|
||||
"tests": [
|
||||
"assert(editor.match(/\\$\\s*?\\(\\s*?(\\\"|\\')\\#getMessage(\\\"|\\')\\s*?\\)\\s*?\\.\\s*?on\\s*?\\(\\s*?(\\\"|\\')click(\\\"|\\')\\s*?\\,\\s*?function\\s*?\\(\\s*?\\)\\s*?\\{/gi), 'You should have a click handler on the getMessage button to trigger the AJAX request.')",
|
||||
@ -76,7 +122,11 @@
|
||||
" $(document).ready(function() {",
|
||||
" ",
|
||||
" $(\"#getMessage\").on(\"click\", function(){",
|
||||
" $(\".message\").html(\"Make the result of the getJSON request appear here\")",
|
||||
" // Only change code below this line.",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
" // Only change code above this line.",
|
||||
" });",
|
||||
" ",
|
||||
" });",
|
||||
@ -107,9 +157,10 @@
|
||||
"id": "bb000000000000000000003",
|
||||
"title": "Convert JSON Data to HTML",
|
||||
"description": [
|
||||
"Now that we have the data let's re-arrange it so that it can be displayed in a user friendly way.",
|
||||
"We can use the <code>.map</code> method to iterate through the data and transform it in some way.",
|
||||
"This will allow us to perform math operations on certain parts of the data or rearrange it to make it nice to display.",
|
||||
"Now that we are getting data from a JSON API, let's display it in HTML.",
|
||||
"We can use the <code>.map()</code> method to loop through our data and modify HTML elements.",
|
||||
"First we'll declare an HTML variable. Then we'll loop through our JSON, adding more HTML to that variable. When the loop is finished, we'll render it.",
|
||||
"Here's the code that does this:",
|
||||
"<code>json.map(function(val) {</code>",
|
||||
"<code>  html = html + \"<div class = 'cat'>\"</code>",
|
||||
"<code>  for(var key in val) {</code>",
|
||||
@ -130,12 +181,12 @@
|
||||
" ",
|
||||
" var html = \"\";",
|
||||
" ",
|
||||
" // You shouldn't need to modify code above this line.",
|
||||
" // Only change code below this line.",
|
||||
" ",
|
||||
" ",
|
||||
" ",
|
||||
" ",
|
||||
" // You shouldn't need to modify code below this line.",
|
||||
" // Only change code above this line.",
|
||||
" ",
|
||||
" $(\".message\").html(html);",
|
||||
" ",
|
||||
@ -167,10 +218,11 @@
|
||||
},
|
||||
{
|
||||
"id": "bb000000000000000000004",
|
||||
"title": "ender those images!",
|
||||
"title": "Render Images from Data Sources",
|
||||
"description": [
|
||||
"Instead of just placing everything in a div we should check if the value is an image.",
|
||||
"If it is an image we should use it as an ima tag instead so that the image is rendered.",
|
||||
"In the JSON that we receive from Free Code Camp's Cat Photo API, each object has an attribute called \"imageLink\".",
|
||||
"When we're looping through these objects, let's check whether an object attribute (key) is <code>imageLink</code>. If it is, instead of outputing the image link, let's render the image.",
|
||||
"Here's the code that does this:",
|
||||
"<code>if(key === \"imageLink\") {</code>",
|
||||
"<code>  html = html + '<img class = \"' + key + '\"src = \"' + val[key] + '\">';</code>",
|
||||
"<code>} else {</code>",
|
||||
@ -197,11 +249,11 @@
|
||||
"",
|
||||
" for(var key in val){",
|
||||
"",
|
||||
" // You shouldn't need to modify code below this line",
|
||||
" // Only change code below this line.",
|
||||
" ",
|
||||
" ",
|
||||
" ",
|
||||
" // You shouldn't need to modify code above this line",
|
||||
" // Only change code above this line.",
|
||||
"",
|
||||
" }",
|
||||
" ",
|
||||
@ -241,12 +293,11 @@
|
||||
},
|
||||
{
|
||||
"id": "bb000000000000000000005",
|
||||
"title": "Prefilter your JSON",
|
||||
"title": "Prefilter JSON",
|
||||
"description": [
|
||||
"",
|
||||
"This means we should never hit API limits and it will make the process more efficient.",
|
||||
"Let's try pre-filtering the json before we map it.",
|
||||
"We can use the pre-made filter method like this to remove the cat with the id of 1.",
|
||||
"If we don't want to render every cat photo we get from our Free Code Camp's Cat Photo JSON API, we can pre-filter the json before we loop through it.",
|
||||
"Let's filter out the cat who's \"id\" key has a value of 1.",
|
||||
"Here's the code to do this:",
|
||||
"<code>json = json.filter(function(val) {</code>",
|
||||
"<code>  return(val.id !== 1);</code>",
|
||||
"<code>});</code>"
|
||||
@ -271,11 +322,11 @@
|
||||
"",
|
||||
" html = html + \"<div class = 'cat'>\"",
|
||||
"",
|
||||
" // You shouldn't need to modify code above this line",
|
||||
" // Only change code below this line.",
|
||||
" ",
|
||||
" ",
|
||||
" ",
|
||||
" // You shouldn't need to modify code below this line",
|
||||
" // Only change code above this line.",
|
||||
"",
|
||||
" for(var key in val){",
|
||||
"",
|
||||
@ -323,8 +374,9 @@
|
||||
"id": "bb000000000000000000006",
|
||||
"title": "Get Geo-location Data",
|
||||
"description": [
|
||||
"We can access the users current location by using the built in navigator in the browser.",
|
||||
"The navigator will get the users current longitude and latitude with a decent level of accuracy.",
|
||||
"Another cool thing we can do is access our user's current location. Every browser has a built in navigator that can give us this information.",
|
||||
"The navigator will get our user's current longitude and latitude.",
|
||||
"Here's some code that does this:",
|
||||
"<code>if (navigator.geolocation) {</code>",
|
||||
"<code>  navigator.geolocation.getCurrentPosition(function(position) {</code>",
|
||||
"<code>    // Do something in here with the coordinates</code>",
|
||||
@ -337,10 +389,14 @@
|
||||
],
|
||||
"challengeSeed": [
|
||||
"fccss",
|
||||
" // Only change code below this line.",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
" // Only change code above this line.",
|
||||
"fcces",
|
||||
"<div id = \"data\">",
|
||||
" <h4>You are here!</h4>",
|
||||
" <h4>You are here:</h4>",
|
||||
" ",
|
||||
"</div>"
|
||||
],
|
||||
|
@ -1,6 +1,7 @@
|
||||
{
|
||||
"name": "MongoDB",
|
||||
"order" : 19,
|
||||
"time": "3h",
|
||||
"challenges": [
|
||||
{
|
||||
"id": "bd7243d8c341eddeaeb5bd0f",
|
||||
|
@ -1,6 +1,7 @@
|
||||
{
|
||||
"name": "Node.js and Express.js",
|
||||
"order" : 18,
|
||||
"time": "20h",
|
||||
"challenges": [
|
||||
{
|
||||
"id": "bd7153d8c441eddfaeb5bd0f",
|
||||
@ -33,13 +34,7 @@
|
||||
"Complete \"Publish\"",
|
||||
"Complete \"Version\"",
|
||||
"Complete \"Publish Again\"",
|
||||
"Complete \"Dist Tag\"",
|
||||
"Complete \"Dist Tag Removal\"",
|
||||
"Complete \"Outdated\"",
|
||||
"Complete \"Update\"",
|
||||
"Complete \"RM\"",
|
||||
"Complete \"Finale\"",
|
||||
"Once you've completed these steps, move on to our next challenge."
|
||||
"Note Once you've completed these steps, you can skip the rest (which are currently buggy) and move on to our next challenge."
|
||||
],
|
||||
"type": "waypoint",
|
||||
"challengeType": 2,
|
||||
@ -103,7 +98,7 @@
|
||||
"description": [
|
||||
"Let's continue the LearnYouNode Node School challenge. For this Waypoint, we'll do challenges 8 through 10.",
|
||||
"Make sure that you are always in your project's \"workspace\" directory. You can always navigate back to this directory by running this command: <code>cd ~/workspace</code>.",
|
||||
"Return to the c9.io workspace you created Now start this tutorial by running <code>learnyounode</code>",
|
||||
"Return to the c9.io workspace you created. Now start this tutorial by running <code>learnyounode</code>",
|
||||
"You can view this Node School module's source code on GitHub at <a href='https://github.com/workshopper/learnyounode'>https://github.com/workshopper/learnyounode</a>.",
|
||||
"Complete \"HTTP Collect\"",
|
||||
"Complete \"Juggling Async\"",
|
||||
|
@ -1,6 +1,7 @@
|
||||
{
|
||||
"name": "Object Oriented and Functional Programming",
|
||||
"order": 6,
|
||||
"order": 7,
|
||||
"time": "1h",
|
||||
"note": [
|
||||
"Methods",
|
||||
"Closures",
|
||||
@ -99,7 +100,7 @@
|
||||
],
|
||||
"tests":[
|
||||
"assert(typeof(myBike.getSpeed)!=='undefined' && typeof(myBike.getSpeed) === 'function', 'message: The method getSpeed of myBike should be accessible outside the object.');",
|
||||
"assert(typeof(myBike.speed) === 'undefined', 'message: <code>myBike.speed</code> should remain undefined.');",
|
||||
"assert(typeof(myBike.speed) === 'undefined', 'message: <code>myBike.speed</code> should be undefined.');",
|
||||
"assert(typeof(myBike.addUnit) === 'undefined', 'message: <code>myBike.addUnit</code> should remain undefined.');"
|
||||
],
|
||||
"challengeSeed":[
|
||||
@ -146,10 +147,11 @@
|
||||
"A function that creates objects is called a <code>constructor</code>.",
|
||||
"You can create <code>instances</code> of an object using a <code>constructor</code>.",
|
||||
"Each new <code>instance</code> of this object <code>inherits</code> all the <code>properties</code> and <code>methods</code> of your original object.",
|
||||
"Then you can give the instance new properties."
|
||||
"Once an <code>instance</code> has been created you can add <code>properties</code> to that <code>instance</code> individually.",
|
||||
"Add an <code>engines</code> property with a number value to the <code>myCar</code> instance."
|
||||
],
|
||||
"tests":[
|
||||
"assert((new Car()).wheels === 4, 'message: The property <code>wheels</code> should still be 4 like in the object constructor.');",
|
||||
"assert((new Car()).wheels === 4, 'message: The property <code>wheels</code> should still be 4 in the object constructor.');",
|
||||
"assert(typeof((new Car()).engines) === 'undefined', 'message: There should not be a property <code>engines</code> in the object constructor.');",
|
||||
"assert(myCar.wheels === 4, 'message: The property <code>wheels</code> of myCar should equal 4.');",
|
||||
"assert(typeof(myCar.engines) === 'number', 'message: The property <code>engines</code> of myCar should be a number.');"
|
||||
@ -176,16 +178,16 @@
|
||||
"title":"Iterate over Arrays with .map",
|
||||
"difficulty":0,
|
||||
"description":[
|
||||
"The map method is one of the easiest ways to iterate through an array or object there is. Let's use it now.",
|
||||
"<code>array = array.map(function(val){</code>",
|
||||
"<code>  return val+1;</code>",
|
||||
"<code>});</code>",
|
||||
"",
|
||||
"The map method is one of the easiest ways to iterate through an array or object there is. Let's use it now.",
|
||||
"Use the map function to add 3 to every value in the variable <code>array</code>"
|
||||
"Use the map function to add 3 to every value in the variable <code>array</code>."
|
||||
],
|
||||
"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":[
|
||||
@ -198,6 +200,9 @@
|
||||
"// Only change code above this line.",
|
||||
"(function() {return array;})();"
|
||||
],
|
||||
"MDNlinks":[
|
||||
"Array.map()"
|
||||
],
|
||||
"challengeType":1,
|
||||
"type": "waypoint"
|
||||
},
|
||||
@ -206,14 +211,15 @@
|
||||
"title":"Condense arrays with .reduce",
|
||||
"difficulty":0,
|
||||
"description":[
|
||||
"Reduce can be useful for condensing an array or numbers into one value.",
|
||||
"Reduce can be useful for condensing an array of numbers into one value.",
|
||||
"<code>var singleVal = array.reduce(function(previousVal, currentVal){</code>",
|
||||
"<code>  return previousVal+currentVal;</code>",
|
||||
"<code>});</code>"
|
||||
"<code>});</code>",
|
||||
"Use the <code>reduce</code> function to sum all the values in <code>array</code> and assign it to <code>singleVal</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 be equal to the sum of all items in the <code>array</code> variable.');",
|
||||
"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];",
|
||||
@ -225,6 +231,9 @@
|
||||
"// Only change code above this line.",
|
||||
"(function() {return singleVal;})();"
|
||||
],
|
||||
"MDNlinks":[
|
||||
"Array.reduce()"
|
||||
],
|
||||
"challengeType":1,
|
||||
"type": "waypoint"
|
||||
},
|
||||
@ -233,15 +242,15 @@
|
||||
"title":"Filter Arrays with .filter",
|
||||
"difficulty":0,
|
||||
"description":[
|
||||
"filter is a useful method that can filter out values that don't match a certain criteria",
|
||||
"Filter is a useful method that can filter out values that don't match a certain criteria",
|
||||
"Let's remove all the values greater than five",
|
||||
"<code>array = array.filter(function(val) {</code>",
|
||||
"<code>  return val <= 5;</code>",
|
||||
"<code>});</code>"
|
||||
],
|
||||
"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.deepEqual(array, [1,2,3,4,5], 'message: You should have removed all the values from the array that are greater than 5.');",
|
||||
"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":[
|
||||
@ -253,6 +262,9 @@
|
||||
" // Only change code above this line.",
|
||||
"(function() {return array;})();"
|
||||
],
|
||||
"MDNlinks":[
|
||||
"Array.filter()"
|
||||
],
|
||||
"challengeType":1,
|
||||
"type": "waypoint"
|
||||
},
|
||||
@ -261,15 +273,16 @@
|
||||
"title": "Sort Arrays with .sort",
|
||||
"difficulty":0,
|
||||
"description":[
|
||||
"You can use the method sort to easily sort the values in the array alphabetically or numerically",
|
||||
"<code>var array = [1,3,2];</code>",
|
||||
"You can use the method <code>sort</code> to easily sort the values in the array alphabetically or numerically.",
|
||||
"<code>var array = [1, 3, 2];</code>",
|
||||
"<code>array = array.sort();</code>",
|
||||
"This will return <code>[1, 2, 3]</code>"
|
||||
"<code>array</code> is now <code>[1, 2, 3]</code>.",
|
||||
"Use <code>sort</code> to sort <code>array</code> alphabetically."
|
||||
],
|
||||
"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(/\\[\\'beta\\'\\,\\s\\'alpha\\'\\,\\s'charlie\\'\\];/gi), 'message: You should only be using <code>.sort</code> to modify the array.');",
|
||||
"assert(editor.getValue().match(/\\.sort\\s*\\(\\)/gi), 'message: You should have made use of the sort method.');"
|
||||
],
|
||||
"challengeSeed":[
|
||||
"var array = ['beta', 'alpha', 'charlie'];",
|
||||
@ -280,6 +293,9 @@
|
||||
" // Only change code above this line.",
|
||||
"(function() {return array;})();"
|
||||
],
|
||||
"MDNlinks":[
|
||||
"Array.sort()"
|
||||
],
|
||||
"challengeType":1,
|
||||
"type": "waypoint"
|
||||
},
|
||||
@ -287,12 +303,13 @@
|
||||
"id": "cf1111c1c16feddfaeb2bdef",
|
||||
"title": "Reverse Arrays with .reverse",
|
||||
"description": [
|
||||
"You can use the <code>.reverse()</code> function to reverse the contents of an array."
|
||||
"You can use the <code>reverse</code> function to reverse the contents of an array.",
|
||||
"Add a line of code that uses <code>reverse</code> to reverse the <code>array</code> variable."
|
||||
],
|
||||
"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(/\\[1\\,2\\,3\\,4\\,5\\,6\\,7/gi), 'message: You should return <code>[7,6,5,4,3,2,1]</code>.');"
|
||||
"assert(editor.getValue().match(/\\.reverse\\s*\\(\\)/gi), 'message: You should use the <code>reverse</code> method.');",
|
||||
"assert(editor.getValue().match(/\\[1\\,2\\,3\\,4\\,5\\,6\\,7/gi), 'message: You should only be using <code>revserse</code> to modify <code>array</code>.');"
|
||||
],
|
||||
"challengeSeed": [
|
||||
"var array = [1,2,3,4,5,6,7];",
|
||||
@ -303,6 +320,9 @@
|
||||
" // Only change code above this line.",
|
||||
"(function() {return array;})();"
|
||||
],
|
||||
"MDNlinks":[
|
||||
"Array.reverse()"
|
||||
],
|
||||
"challengeType": 1,
|
||||
"type": "waypoint"
|
||||
},
|
||||
@ -311,12 +331,13 @@
|
||||
"title": "Concatenate Strings with .concat",
|
||||
"description": [
|
||||
"<code>.concat()</code> can be used to merge the contents of two arrays into one.",
|
||||
"<code>array = array.concat(otherArray);</code>"
|
||||
"<code>array = array.concat(otherArray);</code>",
|
||||
"Use <code>.concat()</code> to concatenate <code>concatMe</code> onto the end of <code>array</code> and assign it back to array."
|
||||
],
|
||||
"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(/\\[1\\,2\\,3\\]/gi) && editor.getValue().match(/\\[4\\,5\\,6\\]/gi), 'message: You should only modify the two arrays without changing the origional ones.');"
|
||||
"assert.deepEqual(array, [1,2,3,4,5,6], 'message: You should concat the two arrays together.');",
|
||||
"assert(editor.getValue().match(/\\.concat\\s*\\(/gi), 'message: You should be using the <code>concat</code> 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 be using <code>concat</code> to modify the arrays.');"
|
||||
],
|
||||
"challengeSeed": [
|
||||
"var array = [1,2,3];",
|
||||
@ -329,6 +350,9 @@
|
||||
"// Only change code above this line.",
|
||||
"(function() {return array;})();"
|
||||
],
|
||||
"MDNlinks":[
|
||||
"Array.concat()"
|
||||
],
|
||||
"challengeType": 1,
|
||||
"type": "waypoint"
|
||||
},
|
||||
@ -338,8 +362,9 @@
|
||||
"difficulty":0,
|
||||
"description":[
|
||||
"You can use the <code>.split()</code> method to split a string into an array.",
|
||||
"split uses the argument you give to to split the string.",
|
||||
"<code>array = string.split(' ');</code>"
|
||||
"<code>.split()</code> uses the argument you pass in as a delimiter to determine which points the string should be split at.",
|
||||
"<code>var array = string.split(' ');</code>",
|
||||
"Use <code>.split()</code> to create an array of words from <code>string</code> and assign it to <code>array</code>."
|
||||
],
|
||||
"tests":[
|
||||
"assert(typeof(array) === 'object' && array.length === 5, 'message: You should split the string by its spaces.');",
|
||||
@ -354,6 +379,9 @@
|
||||
"// Only change code above this line.",
|
||||
"(function() {return array;})();"
|
||||
],
|
||||
"MDNlinks":[
|
||||
"String.split()"
|
||||
],
|
||||
"challengeType":1,
|
||||
"type": "waypoint"
|
||||
},
|
||||
@ -363,10 +391,11 @@
|
||||
"difficulty":0,
|
||||
"description":[
|
||||
"We can use the <code>.join()</code> method to join each element in an array into a string separated by whatever delimiter you provide as an argument to the join operation.",
|
||||
"<code>var joinMe = joinMe.join(\" \");</code>"
|
||||
"<code>var joinMe = joinMe.join(\" \");</code>",
|
||||
"Use the <code>.join()</code> method to create a string from <code>joinMe</code> with spaces in between each element and assign it back to <code>joinMe</code>."
|
||||
],
|
||||
"tests":[
|
||||
"assert(typeof(joinMe) === 'string' && joinMe === \"Split me into an array\", 'message: You should join the arrays by their spaces.');",
|
||||
"assert(typeof(joinMe) === 'string' && joinMe === \"Split me into an array\", 'message: You should join the elements of the array with spaces.');",
|
||||
"assert(/\\.join\\(/gi, 'message: You should use of the join method on the array.');"
|
||||
],
|
||||
"challengeSeed":[
|
||||
@ -378,6 +407,9 @@
|
||||
"// Only change code above this line.",
|
||||
"(function() {return joinMe;})();"
|
||||
],
|
||||
"MDNlinks":[
|
||||
"Array.join()"
|
||||
],
|
||||
"challengeType":1,
|
||||
"type": "waypoint"
|
||||
}
|
||||
|
@ -1,6 +1,7 @@
|
||||
{
|
||||
"name": "Upper Intermediate Algorithm Scripting",
|
||||
"order": 13,
|
||||
"time": "50h",
|
||||
"challenges": [
|
||||
{
|
||||
"id": "a2f1d72d9b908d0bd72bb9f6",
|
||||
@ -27,12 +28,20 @@
|
||||
"assert.deepEqual(bob.lastName, undefined, 'message: <code>bob.lastName</code> should return undefined.');",
|
||||
"assert.deepEqual(bob.getFirstName(), 'Bob', 'message: <code>bob.getFirstName()</code> should return \"Bob\".');",
|
||||
"assert.deepEqual(bob.getLastName(), 'Ross', 'message: <code>bob.getLastName()</code> should return \"Ross\".');",
|
||||
"assert.deepEqual(bob.getFullName(), 'Bob Ross', 'message: <code>bob.getFullName()</code> should return \"Bob Ross\".');"
|
||||
"assert.deepEqual(bob.getFullName(), 'Bob Ross', 'message: <code>bob.getFullName()</code> should return \"Bob Ross\".');",
|
||||
"assert.strictEqual((function () { bob.setFirstName(\"Haskell\"); return bob.getFullName(); })(), 'Haskell Ross', 'message: <code>bob.getFullName()</code> should return \"Haskell Ross\" after <code>bob.setFirstName(\"Haskell\")</code>.');",
|
||||
"assert.strictEqual((function () { bob.setLastName(\"Curry\"); return bob.getFullName(); })(), 'Bob Curry', 'message: <code>bob.getFullName()</code> should return \"Bob Curry\" after <code>bob.setLastName(\"Curry\")</code>.');",
|
||||
"assert.strictEqual((function () { bob.setFullName(\"Haskell Curry\"); return bob.getFullName(); })(), 'Haskell Curry', 'message: <code>bob.getFullName()</code> should return \"Haskell Curry\" after <code>bob.setFullName(\"Haskell Curry\")</code>.');",
|
||||
"assert.strictEqual((function () { bob.setFullName(\"Haskell Curry\"); return bob.getFirstName(); })(), 'Haskell', 'message: <code>bob.getFirstName()</code> should return \"Haskell\" after <code>bob.setFullName(\"Haskell Curry\")</code>.');",
|
||||
"assert.strictEqual((function () { bob.setFullName(\"Haskell Curry\"); return bob.getLastName(); })(), 'Curry', 'message: <code>bob.getLastName()</code> should return \"Curry\" after <code>bob.setFullName(\"Haskell Curry\")</code>.');"
|
||||
],
|
||||
"MDNlinks": [
|
||||
"Closures",
|
||||
"Details of the Object Model"
|
||||
],
|
||||
"solutions": [
|
||||
"var Person = function(firstAndLast) {\n\n var firstName, lastName;\n\n function updateName(str) { \n firstName = str.split(\" \")[0];\n lastName = str.split(\" \")[1]; \n }\n\n updateName(firstAndLast);\n\n this.getFirstName = function(){\n return firstName;\n };\n \n this.getLastName = function(){\n return lastName;\n };\n \n this.getFullName = function(){\n return firstName + \" \" + lastName;\n };\n \n this.setFirstName = function(str){\n firstName = str;\n };\n \n\n this.setLastName = function(str){\n lastName = str;\n };\n \n this.setFullName = function(str){\n updateName(str);\n };\n};\n\nvar bob = new Person('Bob Ross');\nbob.getFullName();"
|
||||
],
|
||||
"type": "bonfire",
|
||||
"challengeType": 5,
|
||||
"nameCn": "",
|
||||
@ -74,6 +83,9 @@
|
||||
"MDNlinks": [
|
||||
"Math.pow()"
|
||||
],
|
||||
"solutions": [
|
||||
"function orbitalPeriod(arr) {\n var GM = 398600.4418;\n var earthRadius = 6367.4447;\n var TAU = 2 * Math.PI; \n return arr.map(function(obj) {\n return {\n name: obj.name,\n orbitalPeriod: Math.round(TAU * Math.sqrt(Math.pow(obj.avgAlt+earthRadius, 3)/GM))\n };\n });\n}\n\norbitalPeriod([{name : \"sputkin\", avgAlt : 35873.5553}]);\n"
|
||||
],
|
||||
"type": "bonfire",
|
||||
"challengeType": 5,
|
||||
"nameCn": "",
|
||||
@ -105,15 +117,18 @@
|
||||
],
|
||||
"tests": [
|
||||
"assert.deepEqual(pairwise([1, 4, 2, 3, 0, 5], 7), 11, 'message: <code>pairwise([1, 4, 2, 3, 0, 5], 7)</code> should return 11.');",
|
||||
"expect(pairwise([1, 3, 2, 4], 4), 1, 'message: <code>pairwise([1, 3, 2, 4], 4), 1</code> should return 1.');",
|
||||
"expect(pairwise([1,1,1], 2), 1, 'message: <code>pairwise([1,1,1], 2)</code> should return 1.');",
|
||||
"expect(pairwise([0, 0, 0, 0, 1, 1], 1), 10, 'message: <code>pairwise([0, 0, 0, 0, 1, 1], 1)</code> should return 10.');",
|
||||
"expect(pairwise([], 100), 0, 'message: <code>pairwise([], 100)</code> should return 0.');"
|
||||
"assert.deepEqual(pairwise([1, 3, 2, 4], 4), 1, 'message: <code>pairwise([1, 3, 2, 4], 4), 1</code> should return 1.');",
|
||||
"assert.deepEqual(pairwise([1,1,1], 2), 1, 'message: <code>pairwise([1,1,1], 2)</code> should return 1.');",
|
||||
"assert.deepEqual(pairwise([0, 0, 0, 0, 1, 1], 1), 10, 'message: <code>pairwise([0, 0, 0, 0, 1, 1], 1)</code> should return 10.');",
|
||||
"assert.deepEqual(pairwise([], 100), 0, 'message: <code>pairwise([], 100)</code> should return 0.');"
|
||||
],
|
||||
"MDNlinks": [
|
||||
"Array.reduce()"
|
||||
],
|
||||
"type": "bonfire",
|
||||
"solutions": [
|
||||
"function pairwise(arr, arg) {\n var sum = 0;\n arr.forEach(function(e, i, a) {\n if (e != null) { \n var diff = arg-e;\n a[i] = null;\n var dix = a.indexOf(diff);\n if (dix !== -1) {\n sum += dix;\n sum += i;\n a[dix] = null;\n } \n }\n });\n return sum;\n}\n\npairwise([1,4,2,3,0,5], 7);\n"
|
||||
],
|
||||
"challengeType": 5,
|
||||
"nameCn": "",
|
||||
"descriptionCn": [],
|
||||
|
@ -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,8 @@ Challenge.destroyAll(function(err, info) {
|
||||
challenge.order = order;
|
||||
challenge.suborder = index + 1;
|
||||
challenge.block = block;
|
||||
challenge.isBeta = challenge.isBeta || isBeta;
|
||||
challenge.time = challengeSpec.time;
|
||||
|
||||
return challenge;
|
||||
});
|
||||
|
@ -1,6 +1,5 @@
|
||||
[
|
||||
{
|
||||
"id": "bd7157d8c441cbafaeb5bdef",
|
||||
"whatDoesNonprofitDo": "We help the many less-fortunate Jewish families in our community, by providing them with nutritious food and energy to grow, learn, work, and give them hope for a better and brighter future.",
|
||||
"websiteLink": "http://chasdeikaduri.org/",
|
||||
"name": "Chasdei Kaduri",
|
||||
@ -20,7 +19,6 @@
|
||||
"moneySaved": 60000
|
||||
},
|
||||
{
|
||||
"id": "bd7158d8c464cbafaeb4bdef",
|
||||
"whatDoesNonprofitDo": "We connect simple technology with last mile communities to reduce poverty.",
|
||||
"websiteLink": "http://kopernik.info/",
|
||||
"name": "Kopernik",
|
||||
@ -36,7 +34,6 @@
|
||||
"moneySaved": 20000
|
||||
},
|
||||
{
|
||||
"id": "bd1326d9c245cbafaeb4bdef",
|
||||
"whatDoesNonprofitDo": "We distribute biodegradable toothbrushes globally to children in need.",
|
||||
"websiteLink": "http://www.operationbrush.org/",
|
||||
"name": "Operation Brush",
|
||||
@ -52,7 +49,6 @@
|
||||
"moneySaved": 20000
|
||||
},
|
||||
{
|
||||
"id": "bd1325d8c464cbafaeb5bdef",
|
||||
"whatDoesNonprofitDo": "We are the largest roller derby league in the world with around 250 adults and 150 junior skater members plus 500+ volunteers.",
|
||||
"websiteLink": "http://www.rosecityrollers.com/about/our-charities/",
|
||||
"name": "Rose City Rollers",
|
||||
@ -68,7 +64,6 @@
|
||||
"moneySaved": 40000
|
||||
},
|
||||
{
|
||||
"id": "bd1325d8c464cbafaeb6bde1",
|
||||
"whatDoesNonprofitDo": "We provide urgently needed pediatric heart surgery and follow-up care for indigent children from developing countries",
|
||||
"websiteLink": "http://www.saveachildsheart.com/global/young-leadership-program/",
|
||||
"name": "Save a Child's Heart",
|
||||
@ -84,7 +79,6 @@
|
||||
"moneySaved": 40000
|
||||
},
|
||||
{
|
||||
"id": "bd1225d8c464cbafaeb4bdef",
|
||||
"whatDoesNonprofitDo": "We empower youth with technology by providing age appropriate resources and education.",
|
||||
"websiteLink": "http://savvycyberkids.org/",
|
||||
"name": "Savvy Cyber Kids",
|
||||
@ -100,7 +94,6 @@
|
||||
"moneySaved": 40000
|
||||
},
|
||||
{
|
||||
"id": "bd1325d8c464cbafaeb7bcef",
|
||||
"whatDoesNonprofitDo": "We bring a new edge to arts and medicine in the Bay Area through powerful live performances of new music to those who feel marginalized by their affliction.",
|
||||
"websiteLink": "http://transcendentpathways.org/",
|
||||
"name": "Transcendent Pathways",
|
||||
@ -116,8 +109,7 @@
|
||||
"moneySaved": 40000
|
||||
},
|
||||
{
|
||||
"id": "bd1325d8c464cbafaeb8bdef",
|
||||
"whatDoesNonprofitDo": "We have provide volunteer matching fairs and silent art auctions at events across Canada. Rather than bid money on artwork, participants bid volunteer hours.",
|
||||
"whatDoesNonprofitDo": "We have provide volunteer matching fairs and silent art auctions at events across Canada. Rather than bid money on artwork, participants bid volunteer hours.",
|
||||
"websiteLink": "http://www.timeraiser.ca/",
|
||||
"name": "Timeraiser",
|
||||
"endUser": "Working professionals who want to donate their time and expertise",
|
||||
@ -132,7 +124,6 @@
|
||||
"moneySaved": 40000
|
||||
},
|
||||
{
|
||||
"id": "bd1325d8c464cbafaeb7bdef",
|
||||
"whatDoesNonprofitDo": "We focus on raising funds to assist injured homeless animals.",
|
||||
"websiteLink": "http://www.peoplesavinganimals.org/",
|
||||
"name": "People Saving Animals",
|
||||
@ -150,7 +141,6 @@
|
||||
"moneySaved": 60000
|
||||
},
|
||||
{
|
||||
"id": "bd1325d8c464cbafaeb6bde2",
|
||||
"whatDoesNonprofitDo": "We preserve Florida's health by regulating septic contractors and reviewing logs of sewage collection and disposal.",
|
||||
"websiteLink": "http://www.floridahealth.gov/",
|
||||
"name": "Florida Department of Health",
|
||||
@ -168,8 +158,7 @@
|
||||
"moneySaved": 40000
|
||||
},
|
||||
{
|
||||
"id": "bd1325d8c464cbafaeb6bde3",
|
||||
"whatDoesNonprofitDo": "We strengthen the value of songwriting and independent music in Columbus, Ohio.",
|
||||
"whatDoesNonprofitDo": "We strengthen the value of songwriting and independent music in Columbus, Ohio.",
|
||||
"websiteLink": "http://columbussongwritersassociation.com",
|
||||
"name": "Columbus Songwriters Association",
|
||||
"endUser": "Songwriters and their audiences in the Columbus, Ohio community.",
|
||||
@ -184,7 +173,6 @@
|
||||
"moneySaved": 20000
|
||||
},
|
||||
{
|
||||
"id": "bd1325d8c464cbafaeb4bbb",
|
||||
"whatDoesNonprofitDo": "We leverage all the benefits of cycling to support and improve the lives of youth and teens in the Triangle region.",
|
||||
"websiteLink": "http://www.trianglebikeworks.org",
|
||||
"name": "Triangle Bike Works",
|
||||
@ -200,7 +188,6 @@
|
||||
"moneySaved": 0
|
||||
},
|
||||
{
|
||||
"id": "bd1325d8c464cbafaeb4bccc",
|
||||
"whatDoesNonprofitDo": "We work to eradicate female genital mutilation in the US and Gambia. We work with survivors and communities.",
|
||||
"websiteLink": "http://safehandsforgirls.org/",
|
||||
"name": "Safe Hands for Girls",
|
||||
@ -216,7 +203,6 @@
|
||||
"moneySaved": 0
|
||||
},
|
||||
{
|
||||
"id": "bd1325d8c464cbafaeb4beff",
|
||||
"whatDoesNonprofitDo": "We're a part of the Department of Psychiatry at Mass General Hospital. We teach an innovative way for helping people that have challenging behaviors.",
|
||||
"websiteLink": "http://www.thinkkids.org/",
|
||||
"name": "Think Kids at Massachusetts General Hospital",
|
||||
@ -232,7 +218,6 @@
|
||||
"moneySaved": 0
|
||||
},
|
||||
{
|
||||
"id": "bd1325d8c464cbaeaeb4bdef",
|
||||
"whatDoesNonprofitDo": "We enable, educate, and empower students from rural backgrounds in Uttar Pradesh, India.",
|
||||
"websiteLink": "http://www.milaan.in/",
|
||||
"name": "Milaan",
|
||||
@ -248,7 +233,6 @@
|
||||
"moneySaved": 0
|
||||
},
|
||||
{
|
||||
"id": "bd1325d8c464cbafaeb4beee",
|
||||
"whatDoesNonprofitDo": "We're committed to closing the opportunity gap for children in Baltimore City by providing high quality after school and in-school programs.",
|
||||
"websiteLink": "http://childfirstauthority.org/",
|
||||
"name": "Child First Authority",
|
||||
@ -264,52 +248,42 @@
|
||||
"moneySaved": 0
|
||||
},
|
||||
{
|
||||
"id": "bd1325d8c464cbafaeb4bdef",
|
||||
"whatDoesNonprofitDo": "SOLACE Foundation provides drug overdose prevention and awareness training as well as grief support for bereaved families.",
|
||||
"websiteLink": "https://www.facebook.com/www.solaceorangecounty.org",
|
||||
"name": "The Solace Foundation of Orange County",
|
||||
"endUser": "Donors",
|
||||
"approvedDeliverables": ["Website"],
|
||||
"approvedDeliverables": [
|
||||
"Website"
|
||||
],
|
||||
"projectDescription": "Campers will build a basic website that accepts donations.",
|
||||
"logoUrl": "http://i.imgur.com/79E3nP0.png",
|
||||
"imageUrl": "http://i.imgur.com/kCWN1iT.jpg",
|
||||
"interestedCampers": [],
|
||||
"confirmedCampers": [],
|
||||
"estimatedHours": 100
|
||||
},
|
||||
{
|
||||
"id": "bd1325d8c463cbafaeb4bdef",
|
||||
"whatDoesNonprofitDo": "We are an interdisciplinary team that works towards harmony among humans and nature through three distinct branches: sustainable agriculture, environmental education and applied and appropriate technology; focused in Líbano, Tolima, Colombia.",
|
||||
"websiteLink": "string",
|
||||
"websiteLink": "",
|
||||
"name": "QET America",
|
||||
"endUser": "Donors",
|
||||
"approvedDeliverables": ["Website"],
|
||||
"projectDescription": "Campers will build a multiple language website (English, Spanish) that accepts donations.",
|
||||
"logoUrl": "http://i.imgur.com/jPuiPOy.jpg",
|
||||
"imageUrl": "http://i.imgur.com/zaaL2pj.jpg",
|
||||
"interestedCampers": [],
|
||||
"confirmedCampers": [],
|
||||
"estimatedHours": 100
|
||||
},
|
||||
{
|
||||
"id": "bd1325d8c462cbafaeb4bdef",
|
||||
"whatDoesNonprofitDo": "1to1 Movement provides free environmental education in schools",
|
||||
"websiteLink": "http://1to1movement.org/",
|
||||
"stakeholderName": "string",
|
||||
"stakeholderEmail": "string",
|
||||
"name": "1 to 1 Movement",
|
||||
"endUser": "Pledgers",
|
||||
"approvedDeliverables": ["Web App"],
|
||||
"projectDescription": "Campers will build a simple, social, data-driven application that allows people to see the impact of their actions. User can make a pledge and track the outcome. Will make use of the D3.js visualization library.",
|
||||
"logoUrl": "http://i.imgur.com/jaqxg0O.png",
|
||||
"imageUrl": "http://i.imgur.com/GXSWTZw.jpg",
|
||||
"interestedCampers": [],
|
||||
"confirmedCampers": [],
|
||||
"estimatedHours": 300
|
||||
},
|
||||
|
||||
{
|
||||
"id": "bd1325d8c464cbcfaeb4bdef",
|
||||
"whatDoesNonprofitDo": "Our missions is to elevate the national dialogue and engage the American people around climate change policy and the promotion of real clean energy solutions in the United States.",
|
||||
"websiteLink": "http://www.usclimateplan.org/",
|
||||
"name": "US Climate Plan",
|
||||
@ -318,24 +292,17 @@
|
||||
"projectDescription": "Campers will build a basic website for sharing information, feeds from different campaign’s websites.",
|
||||
"logoUrl": "http://i.imgur.com/uAyUiMN.png",
|
||||
"imageUrl": "http://i.imgur.com/2Og5tqy.jpg",
|
||||
"interestedCampers": [],
|
||||
"confirmedCampers": [],
|
||||
"estimatedHours": 100
|
||||
},
|
||||
{
|
||||
"id": "bd1325d8c461cbafaeb4bdef",
|
||||
"whatDoesNonprofitDo": "We empower the community through improved literacy.",
|
||||
"websiteLink": "http://www.tleliteracy.com/",
|
||||
"stakeholderName": "Darlene Brown",
|
||||
"stakeholderEmail": "string",
|
||||
"name": "The Learning Exchange",
|
||||
"endUser": "string",
|
||||
"endUser": "Community members",
|
||||
"approvedDeliverables": ["Website"],
|
||||
"projectDescription": "Campers will build a simple website to replace essentialskillsquebec.com. Site will host many documents related to the Nine Essential Skills.",
|
||||
"logoUrl": "http://i.imgur.com/jXQY01H.png",
|
||||
"imageUrl": "http://i.imgur.com/iUXBpeL.jpg",
|
||||
"interestedCampers": [],
|
||||
"confirmedCampers": [],
|
||||
"estimatedHours": 100
|
||||
}
|
||||
]
|
||||
|
@ -72,9 +72,9 @@ module.exports = function(app) {
|
||||
'Feel free to email us at this address if you have ',
|
||||
'any questions about Free Code Camp.\n',
|
||||
'And if you have a moment, check out our blog: ',
|
||||
'blog.freecodecamp.com.\n\n',
|
||||
'medium.freecodecamp.com.\n\n',
|
||||
'Good luck with the challenges!\n\n',
|
||||
'- the Free Code Camp Volunteer Team'
|
||||
'- the Free Code Camp Team'
|
||||
].join('')
|
||||
};
|
||||
|
||||
|
@ -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.'
|
||||
@ -27,7 +31,11 @@ function isCertified(frontEndIds, { completedChallenges, isFrontEndCert }) {
|
||||
if (isFrontEndCert) {
|
||||
return true;
|
||||
}
|
||||
return _.every(frontEndIds, ({ id }) => _.some(completedChallenges, { id }));
|
||||
return _.every(frontEndIds, ({ id }) => {
|
||||
return _.some(completedChallenges, (challenge) => {
|
||||
return challenge.id === id || challenge._id === id;
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
export default function certificate(app) {
|
||||
@ -114,7 +122,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);
|
||||
})
|
||||
@ -128,8 +149,8 @@ export default function certificate(app) {
|
||||
}
|
||||
return res.status(200).send(
|
||||
dedent`
|
||||
Looks like you have not completed the neccessary steps,
|
||||
Please return the map
|
||||
Looks like you have not completed the neccessary steps.
|
||||
Please return to the challenge map.
|
||||
`
|
||||
);
|
||||
},
|
||||
|
@ -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',
|
||||
@ -47,12 +49,12 @@ function updateUserProgress(user, challengeId, completedChallenge) {
|
||||
let { completedChallenges } = user;
|
||||
|
||||
// migrate user challenges object to remove
|
||||
if (!user.isUniqMigrated) {
|
||||
/* if (!user.isUniqMigrated) {
|
||||
user.isUniqMigrated = true;
|
||||
|
||||
completedChallenges = user.completedChallenges =
|
||||
makeChallengesUnique(completedChallenges);
|
||||
}
|
||||
}*/
|
||||
|
||||
const indexOfChallenge = _.findIndex(completedChallenges, {
|
||||
id: challengeId
|
||||
@ -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
|
||||
@ -181,7 +186,7 @@ module.exports = function(app) {
|
||||
);
|
||||
}
|
||||
const firstChallengeOfNextBlock$ = blocks$
|
||||
.elementAtOrDefault(blockIndex + 1, {})
|
||||
.elementAt(blockIndex + 1, {})
|
||||
.map(({ challenges = [] }) => challenges[0]);
|
||||
|
||||
return blocks$
|
||||
@ -254,7 +259,7 @@ module.exports = function(app) {
|
||||
.filter((challenge) => {
|
||||
return testChallengeName.test(challenge.name);
|
||||
})
|
||||
.lastOrDefault(null)
|
||||
.last({ defaultValue: null })
|
||||
.flatMap(challenge => {
|
||||
|
||||
// Handle not found
|
||||
@ -543,12 +548,15 @@ 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,
|
||||
completed: completedCount / blockArray.length * 100
|
||||
completed: completedCount / blockArray.length * 100,
|
||||
time: blockArray[0] && blockArray[0].time || "???"
|
||||
};
|
||||
})
|
||||
.filter(({ name }) => name !== 'Hikes')
|
||||
|
@ -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(
|
||||
({ displayName, goal, amount }) => {
|
||||
req.flash('success', {
|
||||
msg: dedent`
|
||||
Congratulations, you have committed to giving
|
||||
${displayName} $${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
@ -64,23 +64,6 @@ module.exports = function(app) {
|
||||
return res.redirect('../nonprofit/' + dashedNameFull);
|
||||
}
|
||||
|
||||
// We need to create logic that verifies completion.
|
||||
// Defaulting to false for now.
|
||||
// var buttonActive = false;
|
||||
// if (
|
||||
// req.user &&
|
||||
// req.user.completedCoursewares.length > 63
|
||||
// ) {
|
||||
// var hasShownInterest =
|
||||
// nonprofit.interestedCampers.filter(function(user) {
|
||||
// return user.username === req.user.username;
|
||||
// });
|
||||
//
|
||||
// if (hasShownInterest.length === 0) {
|
||||
// buttonActive = true;
|
||||
// }
|
||||
// }
|
||||
|
||||
res.render('nonprofits/show', {
|
||||
dashedName: dashedNameFull,
|
||||
title: nonprofit.name,
|
||||
|
@ -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) {
|
||||
@ -27,11 +29,12 @@ module.exports = function(app) {
|
||||
router.get('/nonprofits', nonprofits);
|
||||
router.get('/nonprofits-form', nonprofitsForm);
|
||||
router.get('/our-sponsors', sponsors);
|
||||
router.get('/jobs-form', jobsForm);
|
||||
router.get('/unsubscribe/:email', unsubscribe);
|
||||
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 +99,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 +119,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 +140,7 @@ module.exports = function(app) {
|
||||
}
|
||||
);
|
||||
},
|
||||
nonprofits: function (callback) {
|
||||
nonprofits: function(callback) {
|
||||
Nonprofit.find(
|
||||
{ field: { name: true } },
|
||||
function(err, nonprofits) {
|
||||
@ -180,6 +183,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!');
|
||||
}
|
||||
@ -190,20 +207,6 @@ module.exports = function(app) {
|
||||
});
|
||||
}
|
||||
|
||||
function jobsForm(req, res) {
|
||||
res.render('resources/jobs-form', {
|
||||
title: 'Employer Partnership Form for Job Postings,' +
|
||||
' Recruitment and Corporate Sponsorships'
|
||||
});
|
||||
}
|
||||
|
||||
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 +250,7 @@ module.exports = function(app) {
|
||||
return next(err);
|
||||
}
|
||||
user.sendMonthlyEmail = false;
|
||||
user.save(function () {
|
||||
user.save(function() {
|
||||
if (err) {
|
||||
return next(err);
|
||||
}
|
||||
@ -302,7 +305,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 +339,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) ?
|
||||
|
@ -12,13 +12,18 @@ var Rx = require('rx'),
|
||||
validator = require('validator'),
|
||||
secrets = require('../../config/secrets');
|
||||
|
||||
var foundationDate = 1413298800000;
|
||||
var time48Hours = 172800000;
|
||||
import {
|
||||
ifNoUser401,
|
||||
ifNoUserRedirectTo
|
||||
} from '../utils/middleware';
|
||||
|
||||
var unDasherize = utils.unDasherize;
|
||||
var dasherize = utils.dasherize;
|
||||
var getURLTitle = utils.getURLTitle;
|
||||
var ifNoUser401 = require('../utils/middleware').ifNoUser401;
|
||||
const foundationDate = 1413298800000;
|
||||
const time48Hours = 172800000;
|
||||
|
||||
const unDasherize = utils.unDasherize;
|
||||
const dasherize = utils.dasherize;
|
||||
const getURLTitle = utils.getURLTitle;
|
||||
const sendNonUserToNews = ifNoUserRedirectTo('/news');
|
||||
|
||||
function hotRank(timeValue, rank) {
|
||||
/*
|
||||
@ -62,8 +67,16 @@ module.exports = function(app) {
|
||||
|
||||
router.get('/news/hot', hotJSON);
|
||||
router.get('/stories/hotStories', hotJSON);
|
||||
router.get('/stories/submit', submitNew);
|
||||
router.get('/stories/submit/new-story', preSubmit);
|
||||
router.get(
|
||||
'/stories/submit',
|
||||
sendNonUserToNews,
|
||||
submitNew
|
||||
);
|
||||
router.get(
|
||||
'/stories/submit/new-story',
|
||||
sendNonUserToNews,
|
||||
preSubmit
|
||||
);
|
||||
router.post('/stories/preliminary', ifNoUser401, newStory);
|
||||
router.post('/stories/', ifNoUser401, storySubmission);
|
||||
router.get('/news/', hot);
|
||||
@ -102,17 +115,25 @@ module.exports = function(app) {
|
||||
}
|
||||
|
||||
function submitNew(req, res) {
|
||||
if (!req.user.isGithubCool) {
|
||||
req.flash('errors', {
|
||||
msg: 'You must link GitHub with your account before you can post' +
|
||||
' on Camper News.'
|
||||
});
|
||||
return res.redirect('/news');
|
||||
}
|
||||
|
||||
return res.render('stories/index', {
|
||||
title: 'Submit a new story to Camper News',
|
||||
page: 'submit'
|
||||
});
|
||||
}
|
||||
|
||||
function preSubmit(req, res, next) {
|
||||
function preSubmit(req, res) {
|
||||
var data = req.query;
|
||||
if (typeof data.url !== 'string') {
|
||||
req.flash('errors', { msg: 'No URL supplied with story' });
|
||||
return next(new TypeError('No URL supplied with story'));
|
||||
return res.redirect('/news');
|
||||
}
|
||||
var cleanedData = cleanData(data.url);
|
||||
|
||||
@ -264,8 +285,11 @@ module.exports = function(app) {
|
||||
}
|
||||
|
||||
function newStory(req, res, next) {
|
||||
if (!req.user) {
|
||||
return next(new Error('Must be logged in'));
|
||||
if (!req.user.isGithubCool) {
|
||||
req.flash('errors', {
|
||||
msg: 'You must authenticate with Github to post to Camper News'
|
||||
});
|
||||
return res.redirect('/news');
|
||||
}
|
||||
var url = req.body.data.url;
|
||||
|
||||
|
@ -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
|
||||
});
|
||||
}
|
||||
);
|
||||
@ -259,8 +272,10 @@ module.exports = function(app) {
|
||||
return Observable.just(user);
|
||||
}
|
||||
return findUserByUsername$(username, {
|
||||
isGithubCool: true,
|
||||
isFrontEndCert: true,
|
||||
isFullStackCert: true,
|
||||
isHonest: true,
|
||||
completedChallenges: true,
|
||||
username: true,
|
||||
name: true
|
||||
@ -306,11 +321,12 @@ module.exports = function(app) {
|
||||
showFront && user.isFrontEndCert ||
|
||||
!showFront && user.isFullStackCert
|
||||
) {
|
||||
var { completedDate } = _.find(user.completedChallenges, {
|
||||
id: showFront ?
|
||||
frontEndChallangeId :
|
||||
fullStackChallangeId
|
||||
});
|
||||
var { completedDate = new Date() } =
|
||||
_.find(user.completedChallenges, {
|
||||
id: showFront ?
|
||||
frontEndChallangeId :
|
||||
fullStackChallangeId
|
||||
}) || {};
|
||||
|
||||
return res.render(
|
||||
showFront ?
|
||||
@ -329,7 +345,7 @@ module.exports = function(app) {
|
||||
`Looks like user ${username} is not Front End certified` :
|
||||
`Looks like user ${username} is not Full Stack certified`
|
||||
});
|
||||
res.redirect('/map');
|
||||
res.redirect('back');
|
||||
},
|
||||
next
|
||||
);
|
||||
|
@ -15,7 +15,7 @@
|
||||
"initial": {
|
||||
"compression": {},
|
||||
"morgan": {
|
||||
"params": "dev"
|
||||
"params": ":status :method :response-time ms - :url"
|
||||
}
|
||||
},
|
||||
"session": {
|
||||
|
@ -55,6 +55,7 @@ export default function csp() {
|
||||
return helmet.csp({
|
||||
defaultSrc: trusted,
|
||||
scriptSrc: [
|
||||
'https://*.gitter.im',
|
||||
'*.optimizely.com',
|
||||
'*.aspnetcdn.com',
|
||||
'*.d3js.org',
|
||||
@ -72,7 +73,8 @@ export default function csp() {
|
||||
imgSrc: [
|
||||
// allow all input since we have user submitted images for
|
||||
// public profile
|
||||
'*'
|
||||
'*',
|
||||
'data:'
|
||||
].concat(trusted),
|
||||
fontSrc: [
|
||||
'*.googleapis.com',
|
||||
|
@ -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"
|
||||
}
|
||||
]
|
555
server/resources/testimonials.json
Normal file
555
server/resources/testimonials.json
Normal file
@ -0,0 +1,555 @@
|
||||
[
|
||||
{
|
||||
"camper": "Meta Hirschl",
|
||||
"quote": "By building a robust and highly functional web app I was able to not only increase my confidence but was able to show potential employers what I was able to create. Both were huge for me and led me to getting a fantastic job.",
|
||||
"github": "MetaCoderHirschl",
|
||||
"linkedin": "https://www.linkedin.com/profile/view?id=ADEAAAKX2fEBfeZ1GVdOh-c0zzkYZKw38o8qzow&authType=NAME_SEARCH&authToken=hfRS&locale=en_US&srchid=147930701444634954491&srchindex=1&srchtotal=1&trk=vsrp_people_res_photo&trkInfo=VSRPsearchId%3A147930701444634954491%2CVSRPtargetId%3A43506161%2CVSRPcmpt%3Aprimary%2CVSRPnm%3Atrue%2CauthType%3ANAME_SEARCH",
|
||||
"image": "https://media.licdn.com/media/p/6/005/0ac/31c/05f0e58.jpg"
|
||||
},
|
||||
{
|
||||
"camper": "Branden Byers",
|
||||
"quote": "My goal was to become employed by the end of 2015. Instead, I ended up with a job at the beginning of 2015. This was directly related to my work at Free Code Camp.",
|
||||
"github": "brandenbyers",
|
||||
"linkedin": "https://www.linkedin.com/in/brandenbyers",
|
||||
"image": "https://media.licdn.com/mpr/mpr/shrinknp_400_400/p/4/005/0a0/1e4/378908c.jpg"
|
||||
},
|
||||
{
|
||||
"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": "Maxim Orlov",
|
||||
"quote": "I started Free Code Camp with zero knowledge of web development. 6 months later, I landed my first job as a back end engineer.",
|
||||
"github": "Maximization",
|
||||
"linkedin": "https://www.linkedin.com/profile/view?id=AAkAAAo83nwBF57LpD9mZlm5dH6OcovOpYKPs3k&authType=NAME_SEARCH&authToken=yG4h&locale=en_US&trk=tyah&trkInfo=clickedVertical%3Amynetwork%2CclickedEntityId%3A171761276%2CauthType%3ANAME_SEARCH%2Cidx%3A1-1-1%2CtarId%3A1444635014777%2Ctas%3AMaxim%20Orlov",
|
||||
"image": "https://media.licdn.com/media/AAEAAQAAAAAAAALJAAAAJGI5ZGFhODA0LWI4MzAtNDU5Ny04NjU3LTIwMjdhMmIxYjFjNg.jpg"
|
||||
},
|
||||
{
|
||||
"camper": "Alexander Black, Jr.",
|
||||
"quote": "My work on a nonprofit project gave me the opportunity to learn how to build Chrome extensions and showcase my skills as a full-stack developer.",
|
||||
"github": "alexblackjr",
|
||||
"linkedin": "https://www.linkedin.com/profile/view?id=AAkAAA553L4BgfgBR-M9RQc7x5matd6FUx3a6-I&authType=NAME_SEARCH&authToken=TW_a&locale=en_US&trk=tyah&trkInfo=clickedVertical%3Amynetwork%2CclickedEntityId%3A242867390%2CauthType%3ANAME_SEARCH%2Cidx%3A1-1-1%2CtarId%3A1444634592237%2Ctas%3Aalexander%20black%20jr",
|
||||
"image": "https://media.licdn.com/media/AAEAAQAAAAAAAANmAAAAJDQ1ZWIxMmVjLTAwNjUtNDFlNS04OWVhLTk4ZGZkNmViODkxNw.jpg"
|
||||
},
|
||||
{
|
||||
"camper": "Cristiane Henriques",
|
||||
"quote": "I am getting more work contacts after including Free Code Camp on my CV and my LinkedIn.",
|
||||
"github": "CrisHenriques",
|
||||
"linkedin": "https://www.linkedin.com/in/crishenriques",
|
||||
"image": "https://media.licdn.com/mpr/mpr/shrinknp_400_400/AAEAAQAAAAAAAAKEAAAAJGFjMTBjZWY5LTE2ZWMtNGU2OC05MTk3LTdkZjUyYWI1NjA5NQ.jpg"
|
||||
},
|
||||
{
|
||||
"camper": "Viktor Bakurin",
|
||||
"quote": "During my work on Free Code Camp's nonprofit projects, I found a MEAN stack position outside of my home country. Now I work in Budapest.",
|
||||
"github": "letalumil",
|
||||
"linkedin": "https://www.linkedin.com/profile/view?id=AAkAAAq6G3QBA1DIwFZGrS4DGqDzBDTzFjrbNQo&authType=NAME_SEARCH&authToken=QoJ0&locale=en_US&trk=tyah&trkInfo=clickedVertical%3Amynetwork%2CclickedEntityId%3A179968884%2CauthType%3ANAME_SEARCH%2Cidx%3A1-1-1%2CtarId%3A1444635040141%2Ctas%3AViktor%20Bakurin",
|
||||
"image": "https://media.licdn.com/mpr/mpr/shrinknp_400_400/AAEAAQAAAAAAAAM3AAAAJDVkZThkNjk3LWY4MTgtNGNmMS05MTZkLTkxZDljOGEzMGM5Nw.jpg"
|
||||
},
|
||||
{
|
||||
"camper": "Ashley Drake",
|
||||
"quote": "Free Code Camp helped me get my first engineering job. This amazing community made my career switch a lot easier and more fun.",
|
||||
"github": "aldraco",
|
||||
"linkedin": "https://www.linkedin.com/profile/view?id=AAkAABcdBycB1iVHvcW7N3yVK-18ES7Nrxx2jbE&authType=NAME_SEARCH&authToken=gKNN&locale=en_US&trk=tyah&trkInfo=clickedVertical%3Amynetwork%2CclickedEntityId%3A387778343%2CauthType%3ANAME_SEARCH%2Cidx%3A1-1-1%2CtarId%3A1444635725853%2Ctas%3Aashley%20",
|
||||
"image": "http://i.imgur.com/xzDoJef.jpg"
|
||||
},
|
||||
{
|
||||
"camper": "Brian Grant",
|
||||
"quote": "I've received new employment opportunities and I have not even finished Free Code Camp's first 800 hours of training yet.",
|
||||
"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%3A1444635878707%2Ctas%3Abrian%20grant",
|
||||
"image": "https://media.licdn.com/media/AAEAAQAAAAAAAANEAAAAJGY5ZjZkMDVjLTJhY2EtNDZjYS1iMDk5LTY0ZDliN2EyODUxMQ.jpg"
|
||||
},
|
||||
{
|
||||
"camper": "Thomas Joseph Izen",
|
||||
"quote": "After spending lots of time trying different sites that aim to teach people how to code, FreeCodeCamp has been different from the beginning. They provide the best and most organized track for anyone at any level to learn how to code and build an amazing, marketable portfolio.",
|
||||
"github": "TommyIzen",
|
||||
"linkedin": "https://www.linkedin.com/profile/view?id=AAkAAA79qIYB_RHmvOP59S6VPK3Lm06oG8fM6dw&authType=NAME_SEARCH&authToken=PfeR&locale=en_US&trk=tyah&trkInfo=clickedVertical%3Amynetwork%2CclickedEntityId%3A251504774%2CauthType%3ANAME_SEARCH%2Cidx%3A1-1-1%2CtarId%3A1444636112016%2Ctas%3AThomas%20%20Izen",
|
||||
"image": "https://media.licdn.com/mpr/mpr/shrinknp_400_400/AAEAAQAAAAAAAAMaAAAAJGRjZTQ4MTdmLTZmZGItNGFhNS1hNTE0LWJmYjFhZDY3YmM3MQ.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": "Robert Trammel",
|
||||
"quote": "I'm working a job integrating JavaScript into FileMaker and doing some custom web publishing for a school district. I've also have job offers from Apple and a few technology firms around the country. If it wasn't for Free Code Camp, I'd still be in the dark with some really awesome but irrelevant skills.",
|
||||
"github": "comajama",
|
||||
"linkedin": "https://www.linkedin.com/profile/view?id=AAIAABQsM30BEAI6xyAhk-OqbBNUJL0WD2uA3GE&authType=NAME_SEARCH&authToken=4xB-&trk=Skyline_click_NPS&sl=NPS%3B147930701444636308659%3B1%3B147930701444636308659%3B",
|
||||
"image": "https://media.licdn.com/media/AAEAAQAAAAAAAAIBAAAAJDI5YjRmMTRmLTFjNWItNGQ5ZC05MTNjLTA0MWQ0YjRhOTdhNQ.jpg"
|
||||
},
|
||||
{
|
||||
"camper": "Brian Atkins",
|
||||
"quote": "I'm spending less time then I am used to on Free Code Camp because people have begun to hire me to work on their projects. Free Code Camp has provided me the foundation I have needed to get these jobs.",
|
||||
"github": "BrianAtk",
|
||||
"linkedin": "https://www.linkedin.com/profile/view?id=AAkAAABtTx0BmDzmB7eDGOkAJbRw8RZdvysreso&authType=NAME_SEARCH&authToken=CecH&locale=en_US&trk=tyah&trkInfo=clickedVertical%3Amynetwork%2CclickedEntityId%3A7163677%2CauthType%3ANAME_SEARCH%2Cidx%3A1-1-1%2CtarId%3A1444636556530%2Ctas%3ABrian%20Atkins",
|
||||
"image": "https://media.licdn.com/media/p/8/000/2aa/36c/2d218a8.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": "David McGill",
|
||||
"quote": "Even if you have a CS degree like I do, you still need projects to prove to employers that you care about coding. Free Code Camp provided me with a platform for doing this. It's all laid out for you - you just have step up and step into the map!",
|
||||
"github": "dmcgill50",
|
||||
"linkedin": "https://www.linkedin.com/profile/view?id=AAkAAAEBy74BHsJCpgrbohr2dJxbdXuvMuJDx6k&authType=NAME_SEARCH&authToken=9k8t&locale=en_US&trk=tyah&trkInfo=clickedVertical%3Amynetwork%2CclickedEntityId%3A16894910%2CauthType%3ANAME_SEARCH%2Cidx%3A1-1-1%2CtarId%3A1444637012056%2Ctas%3ADavid%20McGill",
|
||||
"image": "https://media.licdn.com/mpr/mpr/shrinknp_400_400/AAEAAQAAAAAAAANdAAAAJGE4YWI5NjFiLTQ5MzUtNGQwNC04YThiLWYxMTI4NWM3YmFlMQ.jpg"
|
||||
},
|
||||
{
|
||||
"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": "Jonathan Lucas",
|
||||
"quote": "Free Code Camp has been nothing but supportive and helpful, taking me from a rather basic knowledge of front end technologies to a better, more complete understanding from a full stack perspective.",
|
||||
"github": "jonslucas",
|
||||
"linkedin": "https://www.linkedin.com/profile/view?id=AAkAAATn9H4BI7BP7MBpZ0NR1EvldkWTvAdGy2w&authType=NAME_SEARCH&authToken=hLmG&locale=en_US&trk=tyah&trkInfo=clickedVertical%3Amynetwork%2CclickedEntityId%3A82310270%2CauthType%3ANAME_SEARCH%2Cidx%3A1-1-1%2CtarId%3A1444635490853%2Ctas%3AJon%20Lucas",
|
||||
"image": "https://media.licdn.com/mpr/mpr/shrinknp_400_400/AAEAAQAAAAAAAAIcAAAAJGMxMjY3MmEwLTM0ODgtNGU3OS1hZjFiLTJjZjNhMDM3YTUyZQ.jpg"
|
||||
},
|
||||
{
|
||||
"camper": "Alex Dixon",
|
||||
"quote": "I was hired by the owner of the company, a programmer with 25 years of experience in web development. I graduated from university with a degree in English and had no programming experience prior to attending FreeCodeCamp.",
|
||||
"github": "alex-dixon",
|
||||
"linkedin": "https://www.linkedin.com/profile/view?id=AAkAABhCmLMBLAR1AXskaJXDMT-uLPZ8M7TynPQ&authType=NAME_SEARCH&authToken=k8uX&locale=en_US&trk=tyah&trkInfo=clickedVertical%3Amynetwork%2CclickedEntityId%3A407017651%2CauthType%3ANAME_SEARCH%2Cidx%3A1-1-1%2CtarId%3A1444633871133%2Ctas%3Aalex%20dixon",
|
||||
"image": "https://media.licdn.com/mpr/mpr/shrinknp_400_400/AAEAAQAAAAAAAAMcAAAAJGZhM2Y2ZTU5LWNjODAtNDM5My1hYjAzLTYyYjFlOTcwZjVmZg.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": "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": "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": "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": "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": "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": "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": "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": "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": "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": "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": "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": "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": "Normandy Real",
|
||||
"quote": "I'm doing Free Code Camp to transition from mainframe programming to front end development.",
|
||||
"github": "mandyreal",
|
||||
"linkedin": "https://www.linkedin.com/profile/view?id=AAkAAAdebIIBHfcSRnxGI-j6g5y6crfOXSg55Dc&authType=NAME_SEARCH&authToken=xLNy&locale=en_US&trk=tyah&trkInfo=clickedVertical%3Amynetwork%2CclickedEntityId%3A123628674%2CauthType%3ANAME_SEARCH%2Cidx%3A1-1-1%2CtarId%3A1444636619442%2Ctas%3ANormandy%20Real",
|
||||
"image": "https://media.licdn.com/media/AAEAAQAAAAAAAAMrAAAAJDAxMmE0ZWI1LWU0MjctNDRjYS1hNjdkLTYwZTI5NjUxMDhjYw.jpg"
|
||||
},
|
||||
{
|
||||
"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": "Travis Wouters",
|
||||
"quote": "Free Code Camp helped me add skillsets to my resume that show experience instead of knowledge without practical application.",
|
||||
"github": "",
|
||||
"linkedin": "https://www.linkedin.com/profile/view?id=AAkAAABHP0YBddxsmaf2OghV2jAy17RVMhig4RM&authType=NAME_SEARCH&authToken=a7pC&locale=en_US&trk=tyah&trkInfo=clickedVertical%3Amynetwork%2CclickedEntityId%3A4669254%2CauthType%3ANAME_SEARCH%2Cidx%3A1-1-1%2CtarId%3A1444634846844%2Ctas%3ATravis%20Wouters",
|
||||
"image": "https://media.licdn.com/media/p/8/005/07d/2f1/1792a44.jpg"
|
||||
},
|
||||
{
|
||||
"camper": "Geoff Storbeck",
|
||||
"quote": "I've been able to build tools that has helped moved my current career further and has opened up many more doors in the field.",
|
||||
"github": "storbeck",
|
||||
"linkedin": "https://www.linkedin.com/profile/view?id=AAkAAAdVQZYBHPYLt5efKwqZmiDM5SqIdH0_AR4&authType=NAME_SEARCH&authToken=EDd-&locale=en_US&trk=tyah&trkInfo=clickedVertical%3Amynetwork%2CclickedEntityId%3A123027862%2CauthType%3ANAME_SEARCH%2Cidx%3A1-1-1%2CtarId%3A1444635255807%2Ctas%3AGeoff%20Storbeck%09",
|
||||
"image": "https://media.licdn.com/media/p/1/000/124/306/339eee6.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"
|
||||
}
|
||||
]
|
@ -2,7 +2,8 @@ require('dotenv').load();
|
||||
var pmx = require('pmx');
|
||||
pmx.init();
|
||||
|
||||
var uuid = require('node-uuid'),
|
||||
var _ = require('lodash'),
|
||||
uuid = require('node-uuid'),
|
||||
assign = require('lodash').assign,
|
||||
loopback = require('loopback'),
|
||||
boot = require('loopback-boot'),
|
||||
@ -16,6 +17,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);
|
||||
@ -92,16 +94,19 @@ Object.keys(passportProviders).map(function(strategy) {
|
||||
);
|
||||
});
|
||||
|
||||
app.start = function() {
|
||||
app.start = _.once(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');
|
||||
}
|
||||
});
|
||||
};
|
||||
});
|
||||
|
||||
module.exports = app;
|
||||
|
||||
|
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,20 @@ 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.
|
||||
br
|
||||
span.text-success Only available until Oct 29!
|
||||
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
|
||||
.text-center
|
||||
a#hideTshirtNoticeButton(href='#') Hide this forever
|
||||
.spacer
|
||||
.row
|
||||
.col-xs-12.col-sm-8.col-sm-offset-2
|
||||
h3 800 Hours of Practice:
|
||||
@ -103,58 +88,57 @@ block content
|
||||
.spacer.negative-55
|
||||
|
||||
.row
|
||||
.col-xs-12.col-sm-8.col-sm-offset-2
|
||||
h3 #{challengeBlock.name}
|
||||
.hidden-xs.col-sm-3.col-md-2
|
||||
h3.text-primary.text-right.nowrap
|
||||
i.fa.fa-clock-o
|
||||
= challengeBlock.time
|
||||
.col-xs-12.col-sm-9.col-md-10
|
||||
h3 #{challengeBlock.name}  
|
||||
|
||||
|
||||
.row
|
||||
.col-xs-12
|
||||
ol
|
||||
for challenge in challengeBlock.challenges
|
||||
if challenge.completed
|
||||
.row
|
||||
.hidden-xs.col-sm-3.col-md-2.text-primary.ion-checkmark-circled.padded-ionic-icon.text-center.map-p.negative-10
|
||||
.col-xs-12.col-sm-9.col-md-10
|
||||
li.faded.map-p.negative-10
|
||||
a(href="/challenges/#{challenge.dashedName}")
|
||||
span.capitalize= challenge.type + ': '
|
||||
span= challenge.title
|
||||
span.sr-only= " Complete"
|
||||
|
||||
|
||||
else
|
||||
.row
|
||||
.hidden-xs.col-sm-3.col-md-2
|
||||
span.negative-10
|
||||
.col-xs-12.col-sm-9.col-md-10
|
||||
li.map-p.negative-10
|
||||
a(href="/challenges/#{challenge.dashedName}")
|
||||
span.capitalize= challenge.type + ': '
|
||||
span= challenge.title
|
||||
span.sr-only= " Incomplete"
|
||||
|
||||
if (challengeBlock.completed === 100)
|
||||
.button-spacer
|
||||
ol
|
||||
for challenge in challengeBlock.challenges
|
||||
if challenge.completed
|
||||
.row
|
||||
.col-xs-12.col-sm-8.col-md-6.col-sm-offset-3.col-md-offset-2.hidden
|
||||
a.btn.btn-lg.btn-block.signup-btn.map-challenge-block-share Section complete. Share your Portfolio with your friends.
|
||||
.hidden(id="#{challengeBlock.name}")
|
||||
.hidden-xs.col-sm-3.col-md-2.text-primary.ion-checkmark-circled.padded-ionic-icon.text-center.map-p.negative-10
|
||||
.col-xs-12.col-sm-9.col-md-10
|
||||
li.faded.map-p.negative-10
|
||||
a(href="/challenges/#{challenge.dashedName}")
|
||||
span.capitalize= challenge.type + ': '
|
||||
span= challenge.title
|
||||
span.sr-only= " Complete"
|
||||
|
||||
|
||||
else
|
||||
.row
|
||||
.hidden-xs.col-sm-3.col-md-2
|
||||
span.negative-10
|
||||
.col-xs-12.col-sm-9.col-md-10
|
||||
li.map-p.negative-10
|
||||
a(href="/challenges/#{challenge.dashedName}")
|
||||
span.capitalize= challenge.type + ': '
|
||||
span= challenge.title
|
||||
span.sr-only= " Incomplete"
|
||||
|
||||
if (challengeBlock.completed === 100)
|
||||
.button-spacer
|
||||
.row
|
||||
.col-xs-12.col-sm-8.col-md-6.col-sm-offset-3.col-md-offset-2.hidden
|
||||
a.btn.btn-lg.btn-block.signup-btn.map-challenge-block-share Section complete. Share your code portfolio with your friends.
|
||||
.hidden(id="#{challengeBlock.name}")
|
||||
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}') Commit 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,89 @@ 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
|
||||
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
|
||||
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.
|
||||
.col-xs-12.col-sm-6.col-sm-offset-3
|
||||
h3 Step 1: 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
|
||||
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
|
||||
.row
|
||||
.col-xs-12.col-sm-6.col-sm-offset-3
|
||||
h3 Step 2: 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')
|
||||
| $25 per month
|
||||
label.btn.btn-success
|
||||
input(type='radio' id='50-dollar-pledge' value='50' name='amount')
|
||||
| $50 per month
|
||||
.spacer
|
||||
.col-xs-12.col-sm-6.col-sm-offset-3
|
||||
h3 Step 3: Set up your monthly donation
|
||||
.row
|
||||
.col-xs-12.col-sm-6.col-sm-offset-3.text-center
|
||||
a#commit-btn-donate.btn.btn-block.btn-lg.btn-primary(href=donateUrl target='_blank') Open the #{displayName} donation page
|
||||
|
||||
.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
|
||||
.spacer
|
||||
.col-xs-12.col-sm-6.col-sm-offset-3
|
||||
h3#commit-step4-text.disabled
|
||||
Step 4: Confirm
|
||||
span#commit-step4-hidden.disabled (Do step 3 first)
|
||||
span#commit-step4-show.hidden your commitment to your goal
|
||||
.row
|
||||
.col-xs-12.col-sm-6.col-sm-offset-3.text-center
|
||||
button#commit-btn-submit.btn.btn-block.btn-lg.btn-primary.disabled Commit
|
||||
|
||||
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-lg.btn-default(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-lg.btn-default(href='/map') Maybe later
|
||||
.spacer
|
||||
script.
|
||||
$(function() {
|
||||
$('#commit-btn-donate').click(function() {
|
||||
$('#commit-btn-submit').removeClass('disabled');
|
||||
$('#commit-step4-text').removeClass('disabled');
|
||||
$('#commit-step4-hidden').hide();
|
||||
$('#commit-step4-show').removeClass('hidden');
|
||||
});
|
||||
|
||||
$('#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.
|
@ -52,7 +52,7 @@ block content
|
||||
label.btn.btn-success#trigger-reset-modal
|
||||
i.fa.fa-refresh
|
||||
| Reset
|
||||
label.btn.btn-success#trigger-help-modal
|
||||
label.btn.btn-success#challenge-help-btn
|
||||
i.fa.fa-medkit
|
||||
| Help
|
||||
label.btn.btn-success#trigger-issue-modal
|
||||
@ -106,7 +106,7 @@ block content
|
||||
if (user)
|
||||
#submit-challenge.animated.fadeIn.btn.btn-lg.btn-primary.btn-block Submit and go to my next challenge (ctrl + enter)
|
||||
if (user.progressTimestamps.length > 2)
|
||||
a.btn.btn-lg.btn-block.btn-twitter(target="_blank", href="https://twitter.com/intent/tweet?text=I%20just%20#{verb}%20%40FreeCodeCamp%20#{name}&url=http%3A%2F%2Ffreecodecamp.com/challenges/#{dashedName}&hashtags=LearnToCode, JavaScript")
|
||||
a.btn.btn-lg.btn-block.btn-twitter(target="_blank", href="https://twitter.com/intent/tweet?text=I%20just%20#{verb}%20%40FreeCodeCamp%20#{name}&url=http%3A%2F%2Ffreecodecamp.com/challenges/#{dashedName}&hashtags=LearnToCode, JavaScript", onclick="ga('send', 'event', 'twitter', 'share', 'challenge completion share');")
|
||||
i.fa.fa-twitter  
|
||||
= phrase
|
||||
else
|
||||
@ -122,7 +122,14 @@ block content
|
||||
a.btn.btn-lg.btn-primary.btn-block(href='#', data-dismiss='modal', aria-hidden='true') Cancel
|
||||
include ../partials/challenge-modals
|
||||
script.
|
||||
var MDNlinks = !{JSON.stringify(MDNlinks)};
|
||||
if (!MDNlinks.length) {
|
||||
$('#MDN-links').addClass('collapse');
|
||||
|
||||
document.addEventListener('gitter-sidecar-ready', function(e) {
|
||||
if (window.main) {
|
||||
window.main.chat.createHelpChat('freecodecamp/helpbonfires', '#challenge-help-btn', 'Bonfires Help');
|
||||
}
|
||||
});
|
||||
|
||||
var MDNlinks = !{JSON.stringify(MDNlinks)};
|
||||
if (!MDNlinks.length) {
|
||||
$('#MDN-links').addClass('collapse');
|
||||
}
|
||||
|
@ -38,7 +38,11 @@ block content
|
||||
label.btn.btn-success#trigger-reset-modal
|
||||
i.fa.fa-refresh
|
||||
| Reset
|
||||
label.btn.btn-success#trigger-help-modal
|
||||
label.btn.btn-success.hidden-sm.hidden-md.hidden-lg
|
||||
a(href='//gitter.im/freecodecamp/help')
|
||||
i.fa.fa-medkit
|
||||
| Help
|
||||
label.btn.btn-success.hidden-xs#challenge-help-btn
|
||||
i.fa.fa-medkit
|
||||
| Help
|
||||
label.btn.btn-success#trigger-issue-modal
|
||||
@ -95,3 +99,9 @@ block content
|
||||
else
|
||||
a.btn.btn-lg.btn-primary.btn-block(href='/challenges/next-challenge?id=' + challengeId) Go to my next challenge
|
||||
include ../partials/challenge-modals
|
||||
script.
|
||||
document.addEventListener('gitter-sidecar-ready', function(e) {
|
||||
if (window.main) {
|
||||
window.main.chat.createHelpChat('freecodecamp/help', '#challenge-help-btn');
|
||||
}
|
||||
});
|
||||
|
@ -43,7 +43,7 @@ block content
|
||||
label.btn.btn-success#trigger-reset-modal
|
||||
i.fa.fa-refresh
|
||||
| Reset
|
||||
label.btn.btn-success#trigger-help-modal
|
||||
label.btn.btn-success#challenge-help-btn
|
||||
i.fa.fa-medkit
|
||||
| Help
|
||||
label.btn.btn-success#trigger-issue-modal
|
||||
@ -98,7 +98,12 @@ block content
|
||||
a.animated.fadeIn.btn.btn-lg.btn-primary.btn-block(href='/challenges/next-challenge?id=' + challengeId) Go to my next challenge
|
||||
include ../partials/challenge-modals
|
||||
script.
|
||||
var MDNlinks = !{JSON.stringify(MDNlinks)};
|
||||
if (!MDNlinks.length) {
|
||||
$('#MDN-links').addClass('collapse');
|
||||
var MDNlinks = !{JSON.stringify(MDNlinks)};
|
||||
if (!MDNlinks.length) {
|
||||
$('#MDN-links').addClass('collapse');
|
||||
}
|
||||
document.addEventListener('gitter-sidecar-ready', function(e) {
|
||||
if (window.main) {
|
||||
window.main.chat.createHelpChat('freecodecamp/help', '#challenge-help-btn');
|
||||
}
|
||||
});
|
||||
|
@ -2,14 +2,13 @@ extends ../layout-wide
|
||||
block content
|
||||
.row
|
||||
.col-md-8.col-md-offset-2
|
||||
.jumbotron
|
||||
for step, index in description
|
||||
.thumbnail.challenge-step(class=index !== 0 ? 'hidden': '')
|
||||
img.gif-block.img-center.img-responsive.thumbnail(src='#{step[0]}' alt='#{step[1]}')
|
||||
.caption
|
||||
p.large-p= step[2]
|
||||
p.large-p!= step[2]
|
||||
if step[3]
|
||||
a.btn.btn-block.btn-primary.challenge-step-btn-action(id='#{index}' href='#{step[3]}' target='_blank') Go To Link
|
||||
a.btn.btn-block.btn-primary.challenge-step-btn-action(id='#{index}' href='#{step[3]}' target='_blank') Open link in new tab
|
||||
if index + 1 === description.length
|
||||
.btn.btn-block.btn-primary.challenge-step-btn-finish(id='last' class=step[3] ? 'disabled' : '') Finish challenge
|
||||
else
|
||||
@ -27,7 +26,7 @@ block content
|
||||
.spacer
|
||||
.row
|
||||
if (user)
|
||||
#challenge-step-btn-submit.animated.fadeIn.btn.btn-lg.btn-primary.btn-block Submit and go to my next challenge (ctrl + enter)
|
||||
#challenge-step-btn-submit.animated.fadeIn.btn.btn-lg.btn-primary.btn-block Submit and go to my next challenge
|
||||
else
|
||||
a.btn.btn-lg.btn-primary.btn-block(href='/challenges/next-challenge?id=' + challengeId) Go to my next challenge
|
||||
script(src=rev('/js', 'commonFramework.js'))
|
||||
|
@ -24,7 +24,7 @@ block content
|
||||
var userLoggedIn = true;
|
||||
.button-spacer
|
||||
.btn-group.input-group.btn-group-justified
|
||||
.btn.btn-success.btn-big#trigger-help-modal
|
||||
.btn.btn-success.btn-big#challenge-help-btn
|
||||
i.fa.fa-medkit
|
||||
| Get help
|
||||
.btn.btn-success.btn-big#trigger-issue-modal
|
||||
@ -74,8 +74,14 @@ block content
|
||||
script.
|
||||
$('body').bind('keypress', controlEnterHandler);
|
||||
script.
|
||||
var challenge_Id = !{JSON.stringify(challengeId)};
|
||||
var challenge_Name = !{JSON.stringify(name)};
|
||||
var challengeType = !{JSON.stringify(challengeType)};
|
||||
var dashedName = !{JSON.stringify(dashedName)};
|
||||
var challenge_Id = !{JSON.stringify(challengeId)};
|
||||
var challenge_Name = !{JSON.stringify(name)};
|
||||
var challengeType = !{JSON.stringify(challengeType)};
|
||||
var dashedName = !{JSON.stringify(dashedName)};
|
||||
document.addEventListener('gitter-sidecar-ready', function(e) {
|
||||
if (window.main) {
|
||||
window.main.chat.createHelpChat('freecodecamp/help', '#challenge-help-btn');
|
||||
}
|
||||
});
|
||||
include ../partials/challenge-modals
|
||||
|
||||
|
@ -24,7 +24,7 @@ block content
|
||||
a.btn.btn-big.btn-primary.btn-block(href='/challenges/next-challenge?id=' + challengeId) Go to my next challenge (ctrl + enter)
|
||||
.button-spacer
|
||||
.btn-group.input-group.btn-group-justified
|
||||
.btn.btn-success.btn-big#trigger-help-modal
|
||||
.btn.btn-success.btn-big#challenge-help-btn
|
||||
i.fa.fa-medkit
|
||||
| Help
|
||||
.btn.btn-success.btn-big#trigger-issue-modal
|
||||
@ -96,3 +96,23 @@ block content
|
||||
script.
|
||||
$('body').on('keypress', controlEnterHandler);
|
||||
include ../partials/challenge-modals
|
||||
script.
|
||||
document.addEventListener('gitter-sidecar-ready', function(e) {
|
||||
var challengeType = !{JSON.stringify(challengeType)};
|
||||
var room = 'freecodecamp/help';
|
||||
var title;
|
||||
|
||||
if (challengeType === '4') {
|
||||
room = 'freecodecamp/helpBasejumps';
|
||||
title = 'Basejump Help';
|
||||
}
|
||||
|
||||
if (challengeType === '3') {
|
||||
room = 'freecodecamp/helpZiplines';
|
||||
title = 'Zipline Help';
|
||||
}
|
||||
|
||||
if (window.main) {
|
||||
window.main.chat.createHelpChat(room, '#challenge-help-btn', title);
|
||||
}
|
||||
});
|
||||
|
@ -27,26 +27,27 @@ 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
|
||||
img.img-responsive.testimonial-image.img-center(src="https://s3.amazonaws.com/freecodecamp/testimonial-jen.jpg", alt="@jenthebest's testimonial image")
|
||||
.testimonial-copy Getting back on track with Free Code Camp and committing to a new career in 2015!
|
||||
h3 - @jenbestyoga
|
||||
img.img-responsive.testimonial-image.img-center(src="http://i.imgur.com/xzDoJef.jpg", alt="'s testimonial image")
|
||||
p.testimonial-copy Free Code Camp helped me get my first engineering job. This amazing community made my career switch a lot easier and more fun.
|
||||
h3 - Ashley Drake
|
||||
.col-xs-12.col-sm-12.col-md-4
|
||||
img.img-responsive.testimonial-image.img-center(src="https://s3.amazonaws.com/freecodecamp/testimonial-tate.jpg", alt="@TateThurston's testimonial image")
|
||||
.testimonial-copy Just built my company's website with skills I've learned from Free Code Camp!
|
||||
h3 - @TateThurston
|
||||
img.img-responsive.testimonial-image.img-center(src="http://i.imgur.com/wjlDigg.jpg", alt="Maxim Orlov's LinkedIn photo")
|
||||
p.testimonial-copy I started Free Code Camp with zero knowledge of web development. 6 months later, I landed my first job as a back end engineer.
|
||||
h3 - Maxim Orlov
|
||||
.col-xs-12.col-sm-12.col-md-4
|
||||
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
|
||||
img.img-responsive.testimonial-image.img-center(src="http://i.imgur.com/dE2Di78.jpg", alt="'s testimonial image")
|
||||
p.testimonial-copy Free Code Camp gives me more confidence at work. Code doesn’t look as foreign anymore.
|
||||
h3 - Qing Huang
|
||||
.spacer
|
||||
.row
|
||||
.col-xs-12.col-sm-8.col-sm-offset-2
|
||||
a.btn.btn-lg.btn-primary.btn-primary-ghost.btn-block(href='/stories') Hear from more of our campers
|
||||
.big-break
|
||||
h2 Skills you'll learn:
|
||||
.text-center.negative-35
|
||||
|
@ -10,20 +10,6 @@
|
||||
a.btn.btn-lg.btn-primary.btn-block#report-issue(name='_csrf', value=_csrf) Create my GitHub issue
|
||||
a.btn.btn-lg.btn-info.btn-block(href='#', data-dismiss='modal', aria-hidden='true') Cancel
|
||||
|
||||
#help-modal.modal(tabindex='-1')
|
||||
.modal-dialog.animated.fadeIn.fast-animation
|
||||
.modal-content
|
||||
.modal-header.challenge-list-header Need some help?
|
||||
a.close.closing-x(href='#', data-dismiss='modal', aria-hidden='true') ×
|
||||
.modal-body.text-center
|
||||
h3 Remember to use  
|
||||
a(href='//github.com/FreeCodeCamp/freecodecamp/wiki/How-to-get-help-when-you-get-stuck', target='_blank') Read-Search-Ask
|
||||
| .
|
||||
h3 If you've already read the errors and searched Google, you should ask for help.
|
||||
h3 This will take you to our help room.
|
||||
a.btn.btn-lg.btn-primary.btn-block.close-modal(href='https://gitter.im/FreeCodeCamp/help', target='_blank') Take me to the help room
|
||||
a.btn.btn-lg.btn-info.btn-block(href='#', data-dismiss='modal', aria-hidden='true') Cancel
|
||||
|
||||
#reset-modal.modal(tabindex='-1')
|
||||
.modal-dialog.animated.fadeInUp.fast-animation
|
||||
.modal-content
|
||||
|
@ -1,24 +1,27 @@
|
||||
.fcc-footer
|
||||
.col-xs-12.hidden-xs.hidden-sm
|
||||
a.ion-speakerphone(href='http://blog.freecodecamp.com', target='_blank') Blog
|
||||
a.ion-social-github(href="http://github.com/freecodecamp", target='_blank') GitHub
|
||||
a.ion-social-twitch-outline(href="/twitch")  Twitch
|
||||
a.ion-social-linkedin(href="https://www.linkedin.com/edu/school?id=166029", target='_blank')  LinkedIn
|
||||
a.ion-speakerphone(href='//medium.freecodecamp.com', target='_blank') Blog
|
||||
a.ion-social-github(href="//github.com/freecodecamp", target='_blank') GitHub
|
||||
a.ion-social-linkedin(href="//www.linkedin.com/edu/school?id=166029", target='_blank')  LinkedIn
|
||||
a.ion-social-twitter(href="//twitter.com/freecodecamp", target='_blank') Twitter
|
||||
a.ion-social-facebook(href="//facebook.com/freecodecamp") Facebook
|
||||
a.ion-social-twitter(href="http://twitter.com/freecodecamp", target='_blank') Twitter
|
||||
a.ion-social-twitch-outline(href="//twitch.tv/freecodecamp", target='_blank')  Twitch
|
||||
a.ion-locked(href="//github.com/FreeCodeCamp/freecodecamp/wiki/Free-Code-Camp's-Privacy-Policy") Privacy
|
||||
.col-xs-12.visible-xs.visible-sm
|
||||
a.ion-speakerphone(href='http://blog.freecodecamp.com', target='_blank')
|
||||
a.ion-speakerphone(href='//medium.freecodecamp.com', target='_blank')
|
||||
span.sr-only Free Code Camp's Blog
|
||||
a.ion-social-github(href="http://github.com/freecodecamp", target='_blank')
|
||||
a.ion-social-github(href="//github.com/freecodecamp", target='_blank')
|
||||
span.sr-only Free Code Camp on GitHub
|
||||
a.ion-social-twitch-outline(href="/twitch")
|
||||
span.sr-only Free Code Camp Live Pair Programming on Twitch.tv
|
||||
a.ion-social-linkedin(href="https://www.linkedin.com/edu/school?id=166029", target='_blank')
|
||||
a.ion-social-linkedin(href="//www.linkedin.com/edu/school?id=166029", target='_blank')
|
||||
span.sr-only Free Code Camp LinkedIn Alumni Network
|
||||
a.ion-social-facebook(href="//facebook.com/freecodecamp")
|
||||
span.sr-only Free Code Camp local groups on Facebook
|
||||
a.ion-social-twitter(href="http://twitter.com/freecodecamp", target='_blank')
|
||||
a.ion-social-twitter(href="//twitter.com/freecodecamp", target='_blank')
|
||||
span.sr-only Free Code Camp on Twitter
|
||||
a.ion-social-facebook(href="//facebook.com/freecodecamp", target='_blank')
|
||||
span.sr-only Free Code Camp local groups on Facebook
|
||||
a.ion-social-twitch-outline(href="/twitch", target='_blank')
|
||||
span.sr-only Free Code Camp Live Pair Programming on Twitch.tv
|
||||
a.ion-locked(href="//github.com/FreeCodeCamp/freecodecamp/wiki/Free-Code-Camp's-Privacy-Policy")
|
||||
span.sr-only Free Code Camp's Privacy Policy
|
||||
|
||||
// scripts should be moved here
|
||||
script(src="https://sidecar.gitter.im/dist/sidecar.v1.js" async defer)
|
||||
|
@ -11,10 +11,12 @@ nav.navbar.navbar-default.navbar-fixed-top.nav-height
|
||||
a.learn-btn(href='#') Learn
|
||||
li
|
||||
a(href='/map') Map
|
||||
li.hidden-xs
|
||||
a#nav-chat-btn(href='#' onclick="return false") Chat
|
||||
li.visible-xs
|
||||
a(href="//gitter.im/freecodecamp/freecodecamp" target="_blank") Chat
|
||||
li
|
||||
a(href='//gitter.im/FreeCodeCamp/FreeCodeCamp', target='_blank') Chat
|
||||
li
|
||||
a(href='/news') News
|
||||
a(href='/news', target='_blank') News
|
||||
li
|
||||
a(href='//github.com/FreeCodeCamp/freecodecamp/wiki/Home', target='_blank') Wiki
|
||||
if !user
|
||||
@ -27,3 +29,19 @@ nav.navbar.navbar-default.navbar-fixed-top.nav-height
|
||||
.hidden-xs.hidden-sm
|
||||
a(href='/' + user.username)
|
||||
img.profile-picture.float-right(src='#{user.picture}')
|
||||
script.
|
||||
$(document).ready(function() {
|
||||
$('.learn-btn').click(function(e) {
|
||||
var challengeDashedName = null;
|
||||
e.preventDefault();
|
||||
if (typeof dashedName === "string") {
|
||||
return location.reload();
|
||||
}
|
||||
if (typeof localStorage !== 'undefined') {
|
||||
challengeDashedName = localStorage.getItem('currentDashedName');
|
||||
}
|
||||
window.location = challengeDashedName ?
|
||||
'/challenges/' + challengeDashedName :
|
||||
'/map';
|
||||
});
|
||||
});
|
||||
|
@ -1,3 +1,11 @@
|
||||
script.
|
||||
(function(i,s,o,g,r,a,m){ i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
|
||||
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
|
||||
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
|
||||
})(window,document,'script','//www.google-analytics.com/analytics.js','ga');
|
||||
ga('create', 'UA-55446531-1', 'auto');
|
||||
ga('require', 'displayfeatures');
|
||||
ga('send', 'pageview');
|
||||
script(src="//cdnjs.cloudflare.com/ajax/libs/jquery/2.1.3/jquery.min.js")
|
||||
script.
|
||||
window.jQuery || document.write('<script src="/bower_components/jquery/dist/jquery.min.js"><\/script>');
|
||||
@ -29,11 +37,3 @@ script(src=rev('/js', 'main.js'))
|
||||
script(src="/bower_components/angular-bootstrap/ui-bootstrap-tpls.min.js")
|
||||
script(src="/bower_components/ramda/dist/ramda.min.js")
|
||||
script(src='/bower_components/lightbox2/dist/js/lightbox.min.js')
|
||||
script.
|
||||
(function(i,s,o,g,r,a,m){ i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
|
||||
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
|
||||
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
|
||||
})(window,document,'script','//www.google-analytics.com/analytics.js','ga');
|
||||
ga('create', 'UA-55446531-1', 'auto');
|
||||
ga('require', 'displayfeatures');
|
||||
ga('send', 'pageview');
|
||||
|
@ -1,7 +1,7 @@
|
||||
script(src="//cdnjs.cloudflare.com/ajax/libs/jquery/2.1.3/jquery.min.js")
|
||||
script(src="//cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.4/js/bootstrap.min.js")
|
||||
link(rel='stylesheet', href='/bower_components/font-awesome/css/font-awesome.min.css')
|
||||
link(rel='stylesheet', href=rev('/css', 'main.css'))
|
||||
link(rel='stylesheet', href='/css/main.css')
|
||||
link(rel='stylesheet', href='/css/Vimeo.css')
|
||||
// End **REQUIRED** includes
|
||||
|
||||
|
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
|
23
server/views/resources/stories.jade
Normal file
23
server/views/resources/stories.jade
Normal file
@ -0,0 +1,23 @@
|
||||
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= story.camper
|
||||
|
|
||||
a.fa.fa-linkedin-square.text-primary(alt="#{story.camper}'s LinkedIn Profile", href=story.linkedin, target='_blank')
|
||||
p.text-justify= story.quote
|
||||
|
||||
|
||||
if !user
|
||||
.text-center
|
||||
a.btn.btn-cta.signup-btn(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