Resolve merge conflicts
This commit is contained in:
26
app.js
26
app.js
@ -81,7 +81,6 @@ app.set('port', process.env.PORT || 3000);
|
||||
app.set('views', path.join(__dirname, 'views'));
|
||||
app.set('view engine', 'jade');
|
||||
|
||||
|
||||
if (process.env.NODE_ENV === 'production') {
|
||||
app.use(forceDomain({
|
||||
hostname: 'www.freecodecamp.com'
|
||||
@ -312,9 +311,6 @@ app.get('/nodeschool-challenges', function(req, res) {
|
||||
});
|
||||
|
||||
|
||||
app.get('/news', function(req, res) {
|
||||
res.redirect(301, '/stories/hot');
|
||||
});
|
||||
app.get('/learn-to-code', challengeMapController.challengeMap);
|
||||
app.get('/about', function(req, res) {
|
||||
res.redirect(301, '/map');
|
||||
@ -437,13 +433,6 @@ app.get(
|
||||
storyController.recentJSON
|
||||
);
|
||||
|
||||
app.get(
|
||||
'/stories/',
|
||||
function(req, res) {
|
||||
res.redirect(302, '/stories/hot');
|
||||
}
|
||||
);
|
||||
|
||||
app.get(
|
||||
'/stories/comments/:id',
|
||||
storyController.comments
|
||||
@ -485,28 +474,17 @@ app.post(
|
||||
);
|
||||
|
||||
app.get(
|
||||
'/stories/hot',
|
||||
'/news/',
|
||||
storyController.hot
|
||||
);
|
||||
|
||||
app.get(
|
||||
'/stories/recent',
|
||||
storyController.recent
|
||||
);
|
||||
|
||||
|
||||
app.get(
|
||||
'/stories/search',
|
||||
storyController.search
|
||||
);
|
||||
|
||||
app.post(
|
||||
'/stories/search',
|
||||
storyController.getStories
|
||||
);
|
||||
|
||||
app.get(
|
||||
'/stories/:storyName',
|
||||
'/news/:storyName',
|
||||
storyController.returnIndividualStory
|
||||
);
|
||||
|
||||
|
@ -432,7 +432,7 @@ module.exports = {
|
||||
var urlImage = metaImage.attr('content') ? metaImage.attr('content') : '';
|
||||
var metaTitle = $('title');
|
||||
var description = metaDescription.attr('content') ? metaDescription.attr('content') : '';
|
||||
result.title = metaTitle.text().length < 141 ? metaTitle.text() : metaTitle.text().slice(0, 137) + " ...";
|
||||
result.title = metaTitle.text().length < 90 ? metaTitle.text() : metaTitle.text().slice(0, 87) + "...";
|
||||
result.image = urlImage;
|
||||
result.description = description;
|
||||
callback(null, result);
|
||||
|
@ -131,13 +131,13 @@ exports.returnIndividualStory = function(req, res, next) {
|
||||
msg: "404: We couldn't find a story with that name. Please double check the name."
|
||||
});
|
||||
|
||||
return res.redirect('/stories/');
|
||||
return res.redirect('/news/');
|
||||
}
|
||||
|
||||
story = story.pop();
|
||||
var dashedNameFull = story.storyLink.toLowerCase().replace(/\s/g, '-');
|
||||
if (dashedNameFull !== dashedName) {
|
||||
return res.redirect('../stories/' + dashedNameFull);
|
||||
return res.redirect('../news/' + dashedNameFull);
|
||||
}
|
||||
|
||||
var userVoted = false;
|
||||
@ -285,7 +285,7 @@ exports.newStory = function(req, res, next) {
|
||||
});
|
||||
return res.json({
|
||||
alreadyPosted: true,
|
||||
storyURL: '/stories/' + story.pop().storyLink
|
||||
storyURL: '/news/' + story.pop().storyLink
|
||||
});
|
||||
}
|
||||
resources.getURLTitle(url, processResponse);
|
||||
|
@ -27,10 +27,21 @@ html {
|
||||
overflow-x: hidden;
|
||||
}
|
||||
|
||||
input[type=checkbox]
|
||||
{
|
||||
/* Double-sized Checkboxes */
|
||||
-ms-transform: scale(2); /* IE */
|
||||
-moz-transform: scale(2); /* FF */
|
||||
-webkit-transform: scale(2); /* Safari and Chrome */
|
||||
-o-transform: scale(2); /* Opera */
|
||||
padding: 10px;
|
||||
}
|
||||
|
||||
body.full-screen-body-background {
|
||||
background-color: #eeeeee;
|
||||
}
|
||||
|
||||
|
||||
body.top-and-bottom-margins {
|
||||
padding-top: 80px;
|
||||
margin-bottom: 60px;
|
||||
@ -85,6 +96,10 @@ h1, h2, h3, h4, h5, h6, p, li {
|
||||
height: 100px;
|
||||
}
|
||||
|
||||
.darker-background {
|
||||
background-color: #dedede;
|
||||
}
|
||||
|
||||
/**/
|
||||
|
||||
.btn-cta {
|
||||
@ -95,7 +110,14 @@ h1, h2, h3, h4, h5, h6, p, li {
|
||||
font-size: 28px;
|
||||
}
|
||||
|
||||
.btn {
|
||||
.btn, .shadow {
|
||||
white-space: normal;
|
||||
-webkit-box-shadow: 2px 4px 1px rgba(0, 0, 0, 0.3);
|
||||
-moz-box-shadow: 2px 4px 1px rgba(0, 0, 0, 0.3);
|
||||
box-shadow: 2px 4px 1px rgba(0, 0, 0, 0.3);
|
||||
}
|
||||
|
||||
.btn, .shadow {
|
||||
white-space: normal;
|
||||
-webkit-box-shadow: 2px 4px 1px rgba(0, 0, 0, 0.3);
|
||||
-moz-box-shadow: 2px 4px 1px rgba(0, 0, 0, 0.3);
|
||||
@ -902,12 +924,46 @@ iframe.iphone {
|
||||
// background-color: #e5e5e5;
|
||||
//}
|
||||
|
||||
.media-news {
|
||||
width: 100%;
|
||||
.news-box {
|
||||
@media (min-width: 768px) {
|
||||
margin-top: -40px;
|
||||
}
|
||||
@media (max-width: 767px) {
|
||||
padding: 5px;
|
||||
border-color: @brand-info;
|
||||
border-width: 1px;
|
||||
border-style: solid;
|
||||
border-radius: 5px;
|
||||
width: 100%;
|
||||
float: left;
|
||||
}
|
||||
}
|
||||
|
||||
.story-headline {
|
||||
font-size: 20px;
|
||||
margin-left: 14px;
|
||||
margin-top: -5px;
|
||||
}
|
||||
|
||||
.story-byline {
|
||||
margin-top: 5px;
|
||||
font-size: 14px;
|
||||
}
|
||||
|
||||
.media-stories {
|
||||
margin-left: 20px;
|
||||
}
|
||||
|
||||
hr {
|
||||
-moz-border-bottom-colors: none;
|
||||
-moz-border-image: none;
|
||||
-moz-border-left-colors: none;
|
||||
-moz-border-right-colors: none;
|
||||
-moz-border-top-colors: none;
|
||||
border-color: @gray;
|
||||
border-style: solid none;
|
||||
border-width: 1px 0;
|
||||
margin: 18px 0;
|
||||
}
|
||||
|
||||
#reply-to-main-post, #upvote {
|
||||
@ -943,6 +999,19 @@ iframe.iphone {
|
||||
height: 40px;
|
||||
}
|
||||
|
||||
.news-number {
|
||||
font-size: 30px;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.mobile-story-image {
|
||||
border-radius: 5px;
|
||||
width: 100%;
|
||||
@media (max-width: 768px) {
|
||||
margin-right: 5px;
|
||||
}
|
||||
}
|
||||
|
||||
.alert a {
|
||||
text-decoration: underline;
|
||||
}
|
||||
@ -969,6 +1038,9 @@ iframe.iphone {
|
||||
margin-right: -20px;
|
||||
}
|
||||
|
||||
.border-radius-5 {
|
||||
border-radius: 5px;
|
||||
}
|
||||
|
||||
//uncomment this to see the dimensions of all elements outlined in red
|
||||
//* {
|
||||
|
0
public/js/lib/stories/stories.js
Normal file
0
public/js/lib/stories/stories.js
Normal file
@ -31,10 +31,6 @@ $(document).ready(function() {
|
||||
.addClass('animated fadeInDown');
|
||||
});
|
||||
|
||||
$('.step-text').on('click', function() {
|
||||
$(this).parent().parent().parent().children().children('input').trigger('click');
|
||||
});
|
||||
|
||||
$('.challenge-list-checkbox').on('change', function() {
|
||||
var checkboxId = $(this).parent().parent().attr('id');
|
||||
if ($(this).is(":checked")) {
|
||||
@ -269,7 +265,7 @@ $(document).ready(function() {
|
||||
$('#story-submit').bind('click', storySubmitButtonHandler);
|
||||
})
|
||||
.done(function (data, textStatus, xhr) {
|
||||
window.location = '/stories/' + JSON.parse(data).storyLink;
|
||||
window.location = '/news/' + JSON.parse(data).storyLink;
|
||||
});
|
||||
|
||||
};
|
||||
|
@ -1,661 +0,0 @@
|
||||
[
|
||||
{
|
||||
"name": "Learn how Free Code Camp Works",
|
||||
"time": 2,
|
||||
"video": "114486344",
|
||||
"challengeNumber": 0,
|
||||
"steps": [
|
||||
"Watch this 1-minute video, or simply read this summary.",
|
||||
"Welcome to Free Code Camp. We're a community of busy people learning to code.",
|
||||
"We built this community because learning to code is hard. But anyone who can stay motivated can learn to code. And the best way to stay motivated is to code with friends.",
|
||||
"To maximize accessibility, all our challenges are self-paced, browser-based, and free.",
|
||||
"All of us start with the same 100 hours of interactive coding challenges. These cover Computer Science and databases. They also cover in-demand JavaScript tools like jQuery, Node.js and MongoDB.",
|
||||
"Once we have a basic understanding of web development, we'll spend another 900 hours putting that theory into practice. We'll build full stack solutions for nonprofits.",
|
||||
"By the end of this process, we'll be good at coding. We'll have a portfolio of apps with happy users to prove it. We'll also have an alumni network of fellow coders and nonprofits ready to serve as references.",
|
||||
"If you make it through Free Code Camp, you will be able to get a coding job. There are far more job openings out there than there are qualified coders to fill them.",
|
||||
"Also, for every pure coding job, there are at least 5 additional jobs that require some coding skills. So even if you decide not to pursue coding as a career, you'll still walk away with a valuable job skill.",
|
||||
"There are 3 keys to succeeding in our community: do the challenges, make friends, and find a routine.",
|
||||
"Now it's time to join our chatroom. Click the \"I've completed this challenge\" button to move on to your next challenge."
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Join Our Chat Room",
|
||||
"time": 5,
|
||||
"video": "124555254",
|
||||
"challengeNumber": 1,
|
||||
"steps": [
|
||||
"Now we're going to join the Free Code Camp chat room. You can come here any time of day to hang out, ask questions, or find another camper to pair program with.",
|
||||
"Make sure your Free Code Camp account includes your email address. You can do this here: <a href='/account' target='_blank'>http://freecodecamp.com/account</a>.",
|
||||
"Click this link, which will email you an invite to Free Code Camp's Slack chat room: <a href='/api/slack' target='_blank'>http://freecodecamp.com/api/slack</a>.",
|
||||
"Now check your email and click the link in the email from Slack",
|
||||
"Complete the sign up process, then update your biographical information and upload an image. A picture of your face works best. This is how people will see you in the chat room, so put your best foot forward.",
|
||||
"Now enter the general chat room and introduce yourself to our chat room by typing: \"hello world!\".",
|
||||
"Tell your fellow campers how you found Free Code Camp. Also tell us why you want to learn to code.",
|
||||
"Keep the chat room open while you work through the other challenges. That way you ask for help if you get stuck on a challenge. You can also socialize when you feel like taking a break.",
|
||||
"You can also access this chat room by clicking the \"Chat\" button in the upper right hand corner."
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Check out Camper News",
|
||||
"time": 5,
|
||||
"video": "124553410",
|
||||
"challengeNumber": 2,
|
||||
"steps": [
|
||||
"Camper News is the best place for our campers to share and discuss helpful links.",
|
||||
"Click \"News\" in the upper right hand corner.",
|
||||
"You'll see a variety of links that have been submitted. Click on the \"Discuss\" button under one of them.",
|
||||
"You can upvote links. This will push the link up the rankings of hot links.",
|
||||
"You an also comment on a link. If someone responds to your comment, you'll get an email notification so you can come back and respond to them.",
|
||||
"You can also submit links. You can modify the link's headline and also leave an initial comment about the link.",
|
||||
"You can view the portfolio pages of any camper who has posted links or comments on Camper News. Just click on their photo.",
|
||||
"When you submit a link, you'll get a point. You will also get a point each time someone upvotes your link."
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Build a Personal Website",
|
||||
"time": 60,
|
||||
"video": "114627406",
|
||||
"challengeNumber": 3,
|
||||
"steps": [
|
||||
"There are tons of interactive HTML and CSS tutorials out there, but Nathan Bashaw and Christine Bower's Dash tutorials - which they built for General Assembly - are our favorite.",
|
||||
"Go to <a href='https://dash.generalassemb.ly/projects/annas-website-1' target='_blank'>https://dash.generalassemb.ly/projects/annas-website-1</a> and get started with your first project."]
|
||||
},
|
||||
{
|
||||
"name": "Build a Responsive Blog Theme",
|
||||
"time": 60,
|
||||
"video": "114578441",
|
||||
"challengeNumber": 4,
|
||||
"steps": [
|
||||
"Next, let's learn about responsive web design and continue learning about HTML and CSS.",
|
||||
"A responsive website will automatically adapt to changes in your browser's width. This means that you can make one version of a website that will look good on desktop, tablet and phone.",
|
||||
"Later, we'll use Twitter's Bootstrap CSS framework to build responsive websites.",
|
||||
"You can check it out here: <a href='http://getbootstrap.com/' target='_blank'>http://getbootstrap.com/</a>.",
|
||||
"Go to <a href='https://dash.generalassemb.ly/projects/jeffs-blog-1' target='_blank'>https://dash.generalassemb.ly/projects/jeffs-blog-1</a> and complete the second project."
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Build a Small Business Website",
|
||||
"time": 60,
|
||||
"video": "114578438",
|
||||
"challengeNumber": 5,
|
||||
"steps": [
|
||||
"Ready for some more HTML and CSS fundamentals?",
|
||||
"Go to <a href='https://dash.generalassemb.ly/projects/eshas-restaurant-1' target='_blank'>https://dash.generalassemb.ly/projects/eshas-restaurant-1</a> and complete the third project."]
|
||||
},
|
||||
{
|
||||
"name": "Tweak HTML and CSS in CodePen",
|
||||
"time": 10,
|
||||
"video": "110752744",
|
||||
"challengeNumber": 6,
|
||||
"steps": [
|
||||
"Now we're going to learn how to use a tool called CodePen, which lets you experiment with HTML and CSS, and even create single-page web applications, right in your browser!",
|
||||
"Go to <a href='http://www.newsweek.com/' target='_blank'>http://www.newsweek.com/</a>",
|
||||
"Change the window size. Note that Newsweek.com is using <strong>Responsive Design</strong>.",
|
||||
"Right-click an area of the page that doesn't have any HTML elements on it, then choose 'view page source'.",
|
||||
"Select all the text, then copy it.",
|
||||
"Go to <a href='http://codepen.io/pen/' target='_blank'>http://codepen.io/pen/</a>",
|
||||
"Paste the HTML you copied from Newsweek.com into the HTML field of CodePen.",
|
||||
"You now have your own customizable version of the Newsweek.com website. See if you can change some of the text and images."
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Build a CSS Robot",
|
||||
"time": 60,
|
||||
"video": "114578436",
|
||||
"challengeNumber": 7,
|
||||
"steps": [
|
||||
"Now let's learn some more CSS, and a small amount of a JavaScript-based tool called jQuery.",
|
||||
"Go to <a href='https://dash.generalassemb.ly/projects/cotbots-1' target='_blank'>https://dash.generalassemb.ly/projects/cotbots-1</a> and complete the fourth project."]
|
||||
},
|
||||
{
|
||||
"name": "Get Started with jQuery",
|
||||
"time": 30,
|
||||
"video": "114578435",
|
||||
"challengeNumber": 8,
|
||||
"steps": [
|
||||
"jQuery is a powerful tool for manipulating HTML elements.",
|
||||
"It's a lot easier to use than JavaScript itself, so we'll learn it first.",
|
||||
"It's also extremely popular with employers, so we're going to learn it well.",
|
||||
"Code School has an excellent free course that will walk us through the basics of jQuery.",
|
||||
"Go to <a href='http://try.jquery.com/levels/1/challenges/1' target='_blank'>http://try.jquery.com/levels/1/challenges/1</a> and complete the first section."
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Traverse the DOM",
|
||||
"time": 30,
|
||||
"video": "114591805",
|
||||
"challengeNumber": 9,
|
||||
"steps": [
|
||||
"Now let's learn more about DOM traversal - that is, moving from one HTML element to the next.",
|
||||
"Go to <a href='http://try.jquery.com/levels/2/challenges/1' target='_blank'>http://try.jquery.com/levels/2/challenges/1</a> and complete the second section."
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Work with the DOM",
|
||||
"time": 30,
|
||||
"video": "114591804",
|
||||
"challengeNumber": 10,
|
||||
"steps": [
|
||||
"Let's learn some more advanced ways to use jQuery to manipulate the DOM.",
|
||||
"Go to <a href='http://try.jquery.com/levels/3/challenges/1' target='_blank'>http://try.jquery.com/levels/3/challenges/1</a> and complete the third section."
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Listen for DOM Events",
|
||||
"time": 30,
|
||||
"video": "114591802",
|
||||
"challengeNumber": 11,
|
||||
"steps": [
|
||||
"Now let's learn how to use jQuery Listeners. These will \"listen\" for something to happen, and then trigger a subsequent event",
|
||||
"Go to <a href='http://try.jquery.com/levels/4/challenges/1' target='_blank'>http://try.jquery.com/levels/4/challenges/1</a> and complete the fourth section."
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Use jQuery for Styling",
|
||||
"time": 30,
|
||||
"video": "114591801",
|
||||
"challengeNumber": 12,
|
||||
"steps": [
|
||||
"Finally, let's use jQuery to manipulate the way websites look by changing the CSS of elements.",
|
||||
"Go to <a href='http://try.jquery.com/levels/5/challenges/1' target='_blank'>http://try.jquery.com/levels/5/challenges/1</a> and complete the fifth section."
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Build a MadLibs Game",
|
||||
"time": 60,
|
||||
"video": "114591799",
|
||||
"challengeNumber": 13,
|
||||
"steps": [
|
||||
"Now that we've built a foundation in jQuery, let's go back to Dash and do its last challenge.",
|
||||
"If you aren't familiar with Mad Libs, they basically involve inserting random nouns, adjectives and verbs into stories. The stories that result are often hilarious.",
|
||||
"Go to <a href='https://dash.generalassemb.ly/projects/mad-libs-1' target='_blank'>https://dash.generalassemb.ly/projects/mad-libs-1</a> and complete the fifth project."
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Discover Chrome's DevTools",
|
||||
"time": 90,
|
||||
"video": "110752743",
|
||||
"challengeNumber": 14,
|
||||
"steps": [
|
||||
"It's time to learn the most powerful tool your browser has - the Development Tools!",
|
||||
"If you aren't already using Chrome, you'll want to download it here: <a href='http://www.google.com/chrome/' target='_blank'>http://www.google.com/chrome/</a>. While it's true that Firefox has a tool called Firebug that is very similar to Chrome's DevTools, we will use Chrome for this challenge.",
|
||||
"Note that this course, jointly produced by Google and Code School, is technologically impressive, but occasionally buggy. If you encounter a bug, just ignore it and keep going.",
|
||||
"Go to <a href='http://discover-devtools.codeschool.com' target='_blank'>http://discover-devtools.codeschool.com</a> and complete this short course."
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Tackle jQuery Exercises",
|
||||
"time": 60,
|
||||
"video": "113173612",
|
||||
"challengeNumber": 15,
|
||||
"steps": [
|
||||
"We've built some special jQuery challenges to help you reinforce your knowledge of this fundamental skill.",
|
||||
"There are many correct ways to solve each of these exercises. After you complete the challenge, you can compare your solution with our solution by pressing the \"#solution-button\" button.",
|
||||
"Go to <a href='http://freecodecamp.com/jquery-exercises' target='_blank'>http://freecodecamp.com/jquery-exercises</a> and complete the exercises."
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Customize Bootstrap",
|
||||
"time": 15,
|
||||
"video": "110752741",
|
||||
"challengeNumber": 16,
|
||||
"steps": [
|
||||
"Let's learn a little more about Twitter's responsive CSS framework, Bootstrap, and how we can add some custom themes to it.",
|
||||
"Go to <a href='http://getbootstrap.com/components/' target='_blank'>http://getbootstrap.com/components/</a>",
|
||||
"Right-click an area of the page that doesn't have any HTML elements on it, then choose 'view page source'.",
|
||||
"Select all the text, then copy it.",
|
||||
"Go to <a href='http://codepen.io/pen/' target='_blank'>http://codepen.io/pen/</a>",
|
||||
"Paste the HTML you copied from GetBootStrap.com into the HTML field of CodePen.",
|
||||
"Go to <a href='http://bootswatch.com/' target='_blank'>http://bootswatch.com/</a>",
|
||||
"Decide which theme you want to use.",
|
||||
"Click the down arrow next to the download button and choose 'bootstrap.css'.",
|
||||
"Select all the text, then copy it.",
|
||||
"Go back to CodePen and paste the CSS you copied from Bootswatch.com into the CSS field of CodePen.",
|
||||
"Your Bootswatch CSS should now be applied to the HTML from the GetBootStrap page.",
|
||||
"This page is currently using a two-column layout, with the main content on the left and additional navigation on the right. See if you can make it a one-column layout."
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Inject Animation into CSS",
|
||||
"time": 15,
|
||||
"video": "110752740",
|
||||
"challengeNumber": 17,
|
||||
"steps": [
|
||||
"You may have noticed some sites have cool animations. Actually, animating DOM elements is pretty straightforward if you use a CSS library called Animate.css.",
|
||||
"Go to <a href='http://daneden.github.io/animate.css/' target='_blank'>http://daneden.github.io/animate.css/</a> and try out some of the CSS animations.",
|
||||
"Go to <a href='http://codepen.io/ossia/pen/bGegt' target='_blank'>http://codepen.io/ossia/pen/bGegt</a>.",
|
||||
"Press the \"Fork\" button. This will fork, meaning create a copy of, the CodePen.",
|
||||
"Click the gear in the CSS column.",
|
||||
"Click \"Add another resource\" and start typing \"animate.css\". Click on the dropdown results to autocomplete it.",
|
||||
"Now that you have Animate.css enabled, use jQuery and the \"toggleClass\" method to add an animated class to all h1 elements when you click the \"Press Me\" button."
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Learn Basic Computer Science",
|
||||
"time": 120,
|
||||
"video": "114628241",
|
||||
"challengeNumber": 18,
|
||||
"steps": [
|
||||
"Stanford has an excellent free online Computer Science curriculum. This interactive course uses a modified version of JavaScript. It will cover a lot of concepts quickly.",
|
||||
"Note that Harvard also has an excellent introduction to computer science course called CS50, but it takes more than 100 hours to complete, and doesn't use JavaScript.",
|
||||
"Despite being completely self-paced, Stanford's CS101 course is broken up into weeks. Each of the following challenges will address one of those weeks.",
|
||||
"Go to <a href='https://class.stanford.edu/courses/Engineering/CS101/Summer2014/courseware/z54/z1/' target='_blank'>https://class.stanford.edu/courses/Engineering/CS101/Summer2014/courseware/z54/z1/</a> and complete the first week's course work."
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Learn Loops",
|
||||
"time": 120,
|
||||
"video": "114597348",
|
||||
"challengeNumber": 19,
|
||||
"steps": [
|
||||
"Now let's tackle week 2 of Stanford's Intro to Computer Science course.",
|
||||
"This will introduce us to loops, a fundamental feature of every programming language.",
|
||||
"Go to <a href='https://class.stanford.edu/courses/Engineering/CS101/Summer2014/courseware/z100/a7a70ce6e4724c58862ee6007284face/' target='_blank'>https://class.stanford.edu/courses/Engineering/CS101/Summer2014/courseware/z100/a7a70ce6e4724c58862ee6007284face/</a> and complete Week 2."
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Learn Computer Hardware",
|
||||
"time": 120,
|
||||
"video": "114597347",
|
||||
"challengeNumber": 20,
|
||||
"steps": [
|
||||
"Week 3 of Stanford's Intro to Computer Science covers computer hardware and explains Moore's law of exponential growth in the price-performance of processors.",
|
||||
"This challenge will also give you an understanding of how bits and bytes work.",
|
||||
"Go to <a href='https://class.stanford.edu/courses/Engineering/CS101/Summer2014/courseware/z143/z101/' target='_blank'>https://class.stanford.edu/courses/Engineering/CS101/Summer2014/courseware/z143/z101/</a> and complete Week 3."
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Learn Computer Networking",
|
||||
"time": 120,
|
||||
"video": "114604811",
|
||||
"challengeNumber": 21,
|
||||
"steps": [
|
||||
"Now that you've learned about computer hardware, it's time to learn about the software that runs on top of it.",
|
||||
"Particularly important, you will learn about networks and TCP/IP - the protocol that powers the internet.",
|
||||
"Go to <a href='https://class.stanford.edu/courses/Engineering/CS101/Summer2014/courseware/z187/z144/' target='_blank'>https://class.stanford.edu/courses/Engineering/CS101/Summer2014/courseware/z187/z144/</a> and complete Week 4."
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Learn Boolean Logic",
|
||||
"time": 120,
|
||||
"video": "114604812",
|
||||
"challengeNumber": 22,
|
||||
"steps": [
|
||||
"Now we'll do some more table exercises and learn boolean logic.",
|
||||
"We'll also learn the difference between digital data and analog data.",
|
||||
"Go to <a href='https://class.stanford.edu/courses/Engineering/CS101/Summer2014/courseware/z208/z188/' target='_blank'>https://class.stanford.edu/courses/Engineering/CS101/Summer2014/courseware/z208/z188/</a> and complete Week 5."
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Learn Computer Security",
|
||||
"time": 120,
|
||||
"video": "114604813",
|
||||
"challengeNumber": 23,
|
||||
"steps": [
|
||||
"We're almost done with Stanford's Introduction to Computer Science course!",
|
||||
"We'll learn about one of the most important inventions of the 20th century - spreadsheets.",
|
||||
"We'll also learn about Computer Security and some of the more common vulnerabilities software systems have.",
|
||||
"Go to <a href='https://class.stanford.edu/courses/Engineering/CS101/Summer2014/courseware/z229/z213/' target='_blank'>https://class.stanford.edu/courses/Engineering/CS101/Summer2014/courseware/z229/z213/</a> and complete Week 6, the final week of the course."
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Build an Adventure Game",
|
||||
"time": 60,
|
||||
"video": "114604814",
|
||||
"challengeNumber": 24,
|
||||
"steps": [
|
||||
"Now that you understand some Computer Science fundamentals, let's focus on programming JavaScript!",
|
||||
"We're going to work through Codecademy's famous interactive JavaScript course.",
|
||||
"This course will teach us some JavaScript fundamentals while guiding us through the process of building interesting web apps, all within Codecademy's learner-friendly environment!",
|
||||
"Go to <a href='http://www.codecademy.com/courses/getting-started-v2/0/1' target='_blank'>http://www.codecademy.com/courses/getting-started-v2/0/1</a> and complete the section.",
|
||||
"Be sure to also complete this section: <a href='http://www.codecademy.com/courses/javascript-beginner-en-x9DnD/0/1' target='_blank'>http://www.codecademy.com/courses/javascript-beginner-en-x9DnD/0/1</a>."
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Build Rock Paper Scissors",
|
||||
"time": 60,
|
||||
"video": "114604815",
|
||||
"challengeNumber": 25,
|
||||
"steps": [
|
||||
"Now we'll learn how JavaScript functions work, and use them to build a simple Rock Paper Scissors game.",
|
||||
"Go to <a href='http://www.codecademy.com/courses/javascript-beginner-en-6LzGd/0/1' target='_blank'>http://www.codecademy.com/courses/javascript-beginner-en-6LzGd/0/1</a> and complete the section.",
|
||||
"Be sure to also complete this section: <a href='http://www.codecademy.com/courses/javascript-beginner-en-Bthev-mskY8/0/1' target='_blank'>http://www.codecademy.com/courses/javascript-beginner-en-Bthev-mskY8/0/1</a>."
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Learn JavaScript For Loops",
|
||||
"time": 60,
|
||||
"video": "114614220",
|
||||
"challengeNumber": 26,
|
||||
"steps": [
|
||||
"Let's learn more about the loops that make virtually all programs possible - the \"For Loop\" and \"While Loop\". First, we'll learn the For Loop.",
|
||||
"Go to <a href='http://www.codecademy.com/courses/javascript-beginner-en-NhsaT/0/1' target='_blank'>http://www.codecademy.com/courses/javascript-beginner-en-NhsaT/0/1web</a> and complete both the both For and While loop section.",
|
||||
"Be sure to also complete this section: <a href='http://www.codecademy.com/courses/javascript-beginner-en-XEDZA/0/1' target='_blank'>http://www.codecademy.com/courses/javascript-beginner-en-XEDZA/0/1</a>."
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Learn JavaScript While Loops",
|
||||
"time": 60,
|
||||
"video": "114612889",
|
||||
"challengeNumber": 27,
|
||||
"steps": [
|
||||
|
||||
"Go to <a href='http://www.codecademy.com/courses/javascript-beginner-en-ASGIv/0/1' target='_blank'>http://www.codecademy.com/courses/javascript-beginner-en-ASGIv/0/1</a> and complete the section.",
|
||||
"Be sure to also complete this section: <a href='http://www.codecademy.com/courses/javascript-beginner-en-mrTNH-6VIZ9/0/1' target='_blank'>http://www.codecademy.com/courses/javascript-beginner-en-mrTNH-6VIZ9/0/1</a>."
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Learn Control Flow",
|
||||
"time": 60,
|
||||
"video": "114612888",
|
||||
"challengeNumber": 28,
|
||||
"steps": [
|
||||
"Much of human reasoning can be broken down into what we call Boolean Logic. Lucky for us, computers can think the same way! Let's learn how to instruct our computers by writing \"If Statements\" and \"Else Statements\".",
|
||||
"We'll also learn some advanced \"Control Flow\" principals, such as ways we can exit loops early.",
|
||||
"Go to <a href='http://www.codecademy.com/courses/javascript-beginner-en-qDwp0/0/1' target='_blank'>http://www.codecademy.com/courses/javascript-beginner-en-qDwp0/0/1</a> and complete the section.",
|
||||
"Be sure to also complete this section: <a href='http://www.codecademy.com/courses/javascript-beginner-en-ZA2rb/0/1' target='_blank'>http://www.codecademy.com/courses/javascript-beginner-en-ZA2rb/0/1</a>."
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Build a Contact List",
|
||||
"time": 60,
|
||||
"video": "114612887",
|
||||
"challengeNumber": 29,
|
||||
"steps": [
|
||||
"Up to this point, you've been working mostly with strings and numbers. Now we're going to learn more complicated data structures, like \"Arrays\" and \"Objects\".",
|
||||
"Go to <a href='http://www.codecademy.com/courses/javascript-beginner-en-9Sgpi/0/1' target='_blank'>http://www.codecademy.com/courses/javascript-beginner-en-9Sgpi/0/1</a> and complete the section.",
|
||||
"Be sure to also complete this section: <a href='http://www.codecademy.com/courses/javascript-beginner-en-3bmfN/0/1' target='_blank'>http://www.codecademy.com/courses/javascript-beginner-en-3bmfN/0/1</a>."
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Build an Address Book",
|
||||
"time": 60,
|
||||
"video": "114612885",
|
||||
"challengeNumber": 30,
|
||||
"steps": [
|
||||
"Let's learn more about objects.",
|
||||
"Go to <a href='http://www.codecademy.com/courses/spencer-sandbox/0/1' target='_blank'>http://www.codecademy.com/courses/spencer-sandbox/0/1</a> and complete the section.",
|
||||
"Be sure to also complete this section: <a href='http://www.codecademy.com/courses/building-an-address-book/0/1?curriculum_id=506324b3a7dffd00020bf661' target='_blank'>http://www.codecademy.com/courses/building-an-address-book/0/1?curriculum_id=506324b3a7dffd00020bf661</a>."
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Build a Cash Register",
|
||||
"time": 60,
|
||||
"video": "114612882",
|
||||
"challengeNumber": 31,
|
||||
"steps": [
|
||||
"In this final Codecademy section, we'll learn even more about JavaScript objects.",
|
||||
"Go to <a href='http://www.codecademy.com/courses/objects-ii/0/1' target='_blank'>http://www.codecademy.com/courses/objects-ii/0/1</a> and complete this section.",
|
||||
"Be sure to also complete the final section: <a href='http://www.codecademy.com/courses/close-the-super-makert/0/1' target='_blank'>http://www.codecademy.com/courses/close-the-super-makert/0/1</a>."
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Get Help the Hacker Way",
|
||||
"time": 30,
|
||||
"video": "111500801",
|
||||
"challengeNumber": 32,
|
||||
"steps": [
|
||||
"Watch the video to learn the RSAP (Read, Search, Ask, Post) methodology for getting help.",
|
||||
"Try an intelligent Google query that involves JavaScript and filters for this year (since JavaScript changes).",
|
||||
"Go to <a href='http://stackoverflow.com/' target='_blank'>http://stackoverflow.com/</a> and view the recent questions.",
|
||||
"Go to <a href='http://webchat.freenode.net/' target='_blank'>http://webchat.freenode.net/</a> and create an IRC account.",
|
||||
"Join the #LearnJavaScript chat room and introduce yourself as a Free Code Camp student.",
|
||||
"Finally, we have a special chat room specifically for getting help with tools you learn through Free Code Camp Challenges. Go to <a href='https://gitter.im/FreeCodeCamp/Help' target='_blank'>https://gitter.im/FreeCodeCamp/Help</a>. Keep this chat open while you work on the remaining challenges.",
|
||||
"Now you have several ways of getting help when you're stuck."
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Learn Regular Expressions",
|
||||
"time": 60,
|
||||
"video": "112547802",
|
||||
"challengeNumber": 33,
|
||||
"steps": [
|
||||
"You can use a Regular Expression, or \"Regex\", to select specific types of characters in text.",
|
||||
"Check out <a href='http://www.regexr.com' target='_blank'>http://www.regexr.com</a>. It's a Regular Expression Sandbox.",
|
||||
"Now go to <a href='http://www.regexone.com' target='_blank'>http://www.regexone.com</a> and complete the tutorial and exercises 1 - 6.",
|
||||
"Note that you can click \"continue\" to move on to the next step as soon as all the tasks have green check marks beside them. You can often do this just by using the wildcard \"dot\" operator, but try to use the techniques that each lesson recommends."
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Pair Program on Bonfires",
|
||||
"time": 60,
|
||||
"video": "119657641",
|
||||
"challengeNumber": 34,
|
||||
"steps": [
|
||||
"OK, we're finally ready to start pair programming!",
|
||||
"Pair Programming is where two people code together on the same computer. It is an efficient way to collaborate, and widely practiced at software companies. Pair Programming is one of the core concepts of \"Agile\" Software Development, which you will hear more about later.",
|
||||
"Many people use Skype or Google Hangouts to pair program, but if you talk with professional software engineers, they will tell you that it's not really pair programming unless both people have the ability to use the keyboard and mouse.",
|
||||
"The most popular tool for pair programming is Screen Hero. You can download Screen Hero for <a href='http://links.screenhero.com/e/c/eyJlbWFpbF9pZCI6Ik1qQTNNem9XQkNJQ1pBQUNjd0FYQVZrVEdnRkxNamtfX0JWZEdGVEpSZkVCWlRwbFpXRTBNamM0WVMxaE56SmlMVEV4WlRRdE9HUXpZUzFpWXpVNE1HRTJNalkxTldNNk1UUTJNVEEyQUE9PSIsInBvc2l0aW9uIjowLCJocmVmIjoiaHR0cDovL2RsLnNjcmVlbmhlcm8uY29tL3NtYXJ0ZG93bmxvYWQvZklYQU1UUUJBTEtQQkhQTC9TY3JlZW5oZXJvLnppcD9zb3VyY2U9d2ViIn0=' target='_blank'>Mac</a> or <a href='http://links.screenhero.com/e/c/eyJlbWFpbF9pZCI6Ik1qQTNNem9XQkNJQ1pBQUNjd0FYQVZrVEdnRkxNamtfX0JWZEdGVEpSZkVCWlRwbFpXRTBNamM0WVMxaE56SmlMVEV4WlRRdE9HUXpZUzFpWXpVNE1HRTJNalkxTldNNk1UUTJNVEEyQUE9PSIsInBvc2l0aW9uIjoxLCJocmVmIjoiaHR0cDovL2RsLnNjcmVlbmhlcm8uY29tL3NtYXJ0ZG93bmxvYWQvZklYQU1UUUJBTEtQQkhQTC9TY3JlZW5oZXJvLXNldHVwLmV4ZSJ9' target='_blank'>Windows</a>. Create your new user account from within the app.",
|
||||
"We have a special chat room for people ready to pair program. Go to <a href='https://gitter.im/FreeCodeCamp/LetsPair' target='_blank'>https://gitter.im/FreeCodeCamp/LetsPair</a> and type \"Hello Pair Programmers!\"",
|
||||
"If someone is available, they will be your \"pair\" - the person you pair programming with.",
|
||||
"If no one gets back to you in the first few minutes, don't worry. There will be lots of opportunities to pair program in the future.",
|
||||
"If someone does get back to you, private message them and ask for the email address they used to register Screen Hero.",
|
||||
"Add them as a new contact in Screen Hero, then click the monitor-looking button to attempt to share your screen with them.",
|
||||
"Once the Screen Hero session starts, your screen's margins will glow orange. You are now sharing your screen.",
|
||||
"Your pair will have their own cursor, and will be able to type text on his or her and keyboard.",
|
||||
"Now it's time to tackle our Bonfires.",
|
||||
"Go to <a href='http://freecodecamp.com/bonfires' target='_blank'>http://freecodecamp.com/bonfires</a> and start working through our Bonfire challenges.",
|
||||
"Once you you finish pair programming, end the session in Screen Hero session.",
|
||||
"Congratulations! You have completed your first pair programming session.",
|
||||
"Try to pair program with different campers until you've completed all the Bonfire challenges. This is a big time investment, but the JavaScript practice you'll get, along with the scripting and algorithm experience, are well worth it!",
|
||||
"You can complete Bonfire challenges while you continue to work through Free Code Camp's challenges. Take your time.",
|
||||
"Mark this challenge as complete and move on."
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Manage Source Code with Git",
|
||||
"time": 30,
|
||||
"video": "114635309",
|
||||
"challengeNumber": 35,
|
||||
"steps": [
|
||||
"Revision Control Systems like Git ensure that, no matter how you experiment with your code, you can always roll back your app to a stable previous state.",
|
||||
"Git is also a great way to share and contribute to open source software.",
|
||||
"Go to <a href='https://www.codeschool.com/courses/try-git' target='_blank'>https://www.codeschool.com/courses/try-git</a> and complete this short interactive course."
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Get Started with Node.js",
|
||||
"time": 45,
|
||||
"video": "114686471",
|
||||
"challengeNumber": 36,
|
||||
"steps": [
|
||||
"Note that this Code School course is no longer free. We have free alternatives to this course <a href='/nodeschool-challenges' target='_blank'>here</a>.",
|
||||
"Now that we understand some Computer Science and JavaScript programming, you're ready to move on to Full-stack JavaScript!",
|
||||
"The first step is to familiarize ourselves Node.js, the JavaScript-based web server that most full-stack JavaScript apps use.",
|
||||
"When you're ready, go to <a href='http://campus.codeschool.com/courses/real-time-web-with-node-js/level/1/video/1' target='_blank'>http://campus.codeschool.com/courses/real-time-web-with-node-js/level/1/video/1</a> and complete the first chapter."
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Try Node.js Events",
|
||||
"time": 45,
|
||||
"video": "114684206",
|
||||
"challengeNumber": 37,
|
||||
"steps": [
|
||||
"Note that this Code School course is no longer free. We have free alternatives to this course <a href='/nodeschool-challenges' target='_blank'>here</a>.",
|
||||
"One of the reasons Node.js is so fast is that it is \"evented.\" It processes events in an asynchronous manner.",
|
||||
"As a result, Node.js relies on asynchronous callbacks.",
|
||||
"We'll learn more about how events and callbacks work in this exciting Code School lesson.",
|
||||
"Go to <a href='http://campus.codeschool.com/courses/real-time-web-with-node-js/level/2/video/1' target='_blank'>http://campus.codeschool.com/courses/real-time-web-with-node-js/level/2/video/1</a> and complete the section."
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Try Node.js Streams",
|
||||
"time": 45,
|
||||
"video": "114684209",
|
||||
"challengeNumber": 38,
|
||||
"steps": [
|
||||
"Note that this Code School course is no longer free. We have free alternatives to this course <a href='/nodeschool-challenges' target='_blank'>here</a>.",
|
||||
"In this Code School lesson, we'll learn about streaming data back and forth between the client to the server.",
|
||||
"We'll also learn about FS, or File System, an important Node.js module for streaming data.",
|
||||
"Go to <a href='http://campus.codeschool.com/courses/real-time-web-with-node-js/level/3/video/1' target='_blank'>http://campus.codeschool.com/courses/real-time-web-with-node-js/level/3/video/1</a> and complete the section."
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Learn how Node.js Modules Work",
|
||||
"time": 45,
|
||||
"video": "114684213",
|
||||
"challengeNumber": 39,
|
||||
"steps": [
|
||||
"Note that this Code School course is no longer free. We have free alternatives to this course <a href='/nodeschool-challenges' target='_blank'>here</a>.",
|
||||
"One of the most exciting features of Node.js is NPM - Node Package Manager",
|
||||
"With NPM, you quickly install any of thousands of Node.js modules into your app, and it will automatically handle the other modules that each module dependends upon downstream.",
|
||||
"In this lesson, we'll learn how to include these modules in our Node.js app by requiring them as variables.",
|
||||
"Go to <a href='http://campus.codeschool.com/courses/real-time-web-with-node-js/level/4/video/1' target='_blank'>http://campus.codeschool.com/courses/real-time-web-with-node-js/level/4/video/1</a> and complete the section."
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Start an Express.js Server",
|
||||
"time": 45,
|
||||
"video": "114684247",
|
||||
"challengeNumber": 40,
|
||||
"steps": [
|
||||
"Note that this Code School course is no longer free. We have free alternatives to this course <a href='/nodeschool-challenges' target='_blank'>here</a>.",
|
||||
"We'll complete Code School's Express.js course shortly after completing this course, but this challenge will give you a quick tour of the Express.js framework.",
|
||||
"Go to <a href='http://campus.codeschool.com/courses/real-time-web-with-node-js/level/5/video/1' target='_blank'>http://campus.codeschool.com/courses/real-time-web-with-node-js/level/5/video/1</a> and complete the section."
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Use Socket.io",
|
||||
"time": 45,
|
||||
"video": "114684530",
|
||||
"challengeNumber": 41,
|
||||
"steps": [
|
||||
"Note that this Code School course is no longer free. We have free alternatives to this course <a href='/nodeschool-challenges' target='_blank'>here</a>.",
|
||||
"Go to <a href='http://campus.codeschool.com/courses/real-time-web-with-node-js/level/6/video/1' target='_blank'>http://campus.codeschool.com/courses/real-time-web-with-node-js/level/6/video/1</a> and complete the section."
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Use Redis to Persist Data",
|
||||
"time": 45,
|
||||
"video": "114684532",
|
||||
"challengeNumber": 42,
|
||||
"steps": [
|
||||
"Note that this Code School course is no longer free. We have free alternatives to this course <a href='/nodeschool-challenges' target='_blank'>here</a>.",
|
||||
"Redis is a key-value store, which is a type of non-relational database. It's one of the fastest and easiest ways to persist data.",
|
||||
"Even though we'll ultimately use MongoDB and other technologies to persist data, Redis is quite easy to learn and is still worth learning.",
|
||||
"Go to <a href='http://campus.codeschool.com/courses/real-time-web-with-node-js/level/7/video/1' target='_blank'>http://campus.codeschool.com/courses/real-time-web-with-node-js/level/7/video/1</a> and complete the section."
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Dive Deeper into Express.js",
|
||||
"time": 45,
|
||||
"video": "114684533",
|
||||
"challengeNumber": 43,
|
||||
"steps": [
|
||||
"Note that this Code School course is no longer free. We have free alternatives to this course <a href='/nodeschool-challenges' target='_blank'>here</a>.",
|
||||
"Go to <a href='http://campus.codeschool.com/courses/building-blocks-of-express-js/level/1/video/1' target='_blank'>http://campus.codeschool.com/courses/building-blocks-of-express-js/level/1/video/1</a> and complete the section."
|
||||
]
|
||||
},
|
||||
{
|
||||
|
||||
"name": "Setup Express.js Middleware",
|
||||
"time": 45,
|
||||
"video": "114684535",
|
||||
"challengeNumber": 44,
|
||||
"steps": [
|
||||
"Note that this Code School course is no longer free. We have free alternatives to this course <a href='/nodeschool-challenges' target='_blank'>here</a>.",
|
||||
"Express.js makes extensive use of middleware - a stack of functions that run sequentially in response to a specific event.",
|
||||
"Let's learn how to incorporate modules and middleware into our Express.js app.",
|
||||
"Go to <a href='http://campus.codeschool.com/courses/building-blocks-of-express-js/level/2/video/1' target='_blank'>http://campus.codeschool.com/courses/building-blocks-of-express-js/level/2/video/1</a> and complete the section."
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Take Advantage of Parameters",
|
||||
"time": 45,
|
||||
"video": "114684537",
|
||||
"challengeNumber": 45,
|
||||
"steps": [
|
||||
"Note that this Code School course is no longer free. We have free alternatives to this course <a href='/nodeschool-challenges' target='_blank'>here</a>.",
|
||||
"Have you ever noticed a question mark in your browser's address bar, followed by a series of strings? Those are parameters. Parameters are an efficient way to pass information to the server between page loads.",
|
||||
"We'll learn about parameters, along with a powerful Express.js feature called Dynamic Routing, in this exciting Code School lesson.",
|
||||
"Go to <a href='http://campus.codeschool.com/courses/building-blocks-of-express-js/level/3/video/1' target='_blank'>http://campus.codeschool.com/courses/building-blocks-of-express-js/level/3/video/1</a> and complete the section."
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Add the Body Parser",
|
||||
"time": 45,
|
||||
"video": "114684720",
|
||||
"challengeNumber": 46,
|
||||
"steps": [
|
||||
"Note that this Code School course is no longer free. We have free alternatives to this course <a href='/nodeschool-challenges' target='_blank'>here</a>.",
|
||||
"Now we'll add the Body Parser module to Express.js. Body Parser is a powerful middleware that helps with routing.",
|
||||
"We'll also learn more about HTTP Requests, such as Post and Delete.",
|
||||
"Go to <a href='http://campus.codeschool.com/courses/building-blocks-of-express-js/level/4/video/1' target='_blank'>http://campus.codeschool.com/courses/building-blocks-of-express-js/level/4/video/1</a> and complete the section."
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Configure Routes in Express.js",
|
||||
"time": 45,
|
||||
"video": "114684724",
|
||||
"challengeNumber": 47,
|
||||
"steps": [
|
||||
"Note that this Code School course is no longer free. We have free alternatives to this course <a href='/nodeschool-challenges' target='_blank'>here</a>.",
|
||||
"For this last Code School Express.js challenge, we'll refactor our routes.",
|
||||
"Go to <a href='http://campus.codeschool.com/courses/building-blocks-of-express-js/level/5/video/1' target='_blank'>http://campus.codeschool.com/courses/building-blocks-of-express-js/level/5/video/1</a> and complete the section."
|
||||
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Try MongoDB",
|
||||
"time": 30,
|
||||
"video": "114685061",
|
||||
"challengeNumber": 48,
|
||||
"steps": [
|
||||
"Please Note that MongoDB has discontinued this course. We are working on finding a replacement for it. Please mark this challenge complete and move on to the next challenge. Thank you for your patience."
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Get Started with Angular.js",
|
||||
"time": 45,
|
||||
"video": "114684726",
|
||||
"challengeNumber": 49,
|
||||
"steps": [
|
||||
"Code School has a short, free Angular.js course. This will give us a quick tour of Angular.js's mechanics and features.",
|
||||
"In this course, we'll build a virtual shop entirely in Angular.js.",
|
||||
"Go to <a href='http://campus.codeschool.com/courses/shaping-up-with-angular-js/level/1/section/1/video/1' target='_blank'>http://campus.codeschool.com/courses/shaping-up-with-angular-js/level/1/section/1/video/1</a> and complete the section."
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Apply Angular.js Directives",
|
||||
"time": 45,
|
||||
"video": "114684727",
|
||||
"challengeNumber": 50,
|
||||
"steps": [
|
||||
"Directives serve as markers in your HTML. When Angular.js compiles your HTML, it will can alter the behavior of DOM elements based on the directives you've used.",
|
||||
"Let's learn how these powerful directives work, and how to use them to make your web apps more dynamic",
|
||||
"Go to <a href='http://campus.codeschool.com/courses/shaping-up-with-angular-js/level/2/section/1/video/1' target='_blank'>http://campus.codeschool.com/courses/shaping-up-with-angular-js/level/2/section/1/video/1</a> and complete the section."
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Power Forms with Angular.js",
|
||||
"time": 45,
|
||||
"video": "114684729",
|
||||
"challengeNumber": 51,
|
||||
"steps": [
|
||||
"One area where Angular.js really shines is its powerful web forms.",
|
||||
"Learn how to create reactive Angular.js forms, including real-time form validation.",
|
||||
"Go to <a href='http://campus.codeschool.com/courses/shaping-up-with-angular-js/level/3/section/1/video/1' target='_blank'>http://campus.codeschool.com/courses/shaping-up-with-angular-js/level/3/section/1/video/1</a> and complete the section."
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Customize Angular.js Directives",
|
||||
"time": 45,
|
||||
"video": "114685062",
|
||||
"challengeNumber": 52,
|
||||
"steps": [
|
||||
"Now we'll learn how to modify existing Angular.js directives, and even build directives of your own.",
|
||||
"Go to <a href='http://campus.codeschool.com/courses/shaping-up-with-angular-js/level/4/section/1/video/1' target='_blank'>http://campus.codeschool.com/courses/shaping-up-with-angular-js/level/4/section/1/video/1</a> and complete the section."
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Create Angular.js Services",
|
||||
"time": 45,
|
||||
"video": "114685060",
|
||||
"challengeNumber": 53,
|
||||
"steps": [
|
||||
"Services are functions that you can use and reuse throughout your Angular.js app to get things done.",
|
||||
"We'll learn how to use services in this final Code School Angular.js challenge.",
|
||||
"Go to <a href='http://campus.codeschool.com/courses/shaping-up-with-angular-js/level/5/section/1/video/1' target='_blank'>http://campus.codeschool.com/courses/shaping-up-with-angular-js/level/5/section/1/video/1</a> and complete the section."
|
||||
]
|
||||
}
|
||||
]
|
@ -133,7 +133,6 @@
|
||||
"If you don't already have a Codecademy account, create one here: <a href='http://www.codecademy.com' target='_blank'>http://www.codecademy.com</a>.",
|
||||
"Go to <a href='http://www.codecademy.com/en/skills/make-a-website/topics/html-elements' target='_blank'>http://www.codecademy.com/en/skills/make-a-website/topics/html-elements</a> and complete the section.",
|
||||
"Once you're done, mark this Waypoint complete and move on the next Waypoint."
|
||||
|
||||
],
|
||||
"challengeType": 2,
|
||||
"tests": []
|
||||
@ -528,35 +527,11 @@
|
||||
"challengeType": 2,
|
||||
"tests": []
|
||||
},
|
||||
{
|
||||
"_id": "bd7153d8c441eddfaeb5bdff",
|
||||
"name": "Start a Node.js Server",
|
||||
"difficulty": 0.39,
|
||||
"challengeSeed": "114685061",
|
||||
"description": [
|
||||
"We'll build this Waypoint on Cloud 9, a powerful online code editor with a full Ubuntu Linux workspace, all running in the cloud.",
|
||||
"If you don't already have Cloud 9 account, create one now at <a href='http://c9.io' target='_blank'>http://c9.io</a>.",
|
||||
"Open up <a href='http://c9.io' target='_blank'>http://c9.io</a> and sign in to your account.",
|
||||
"Click on Create New Workspace at the top right of the c9.io page, then click on the \"Create a new workspace\" popup that appears below it the button after you click on it.",
|
||||
"Give your workspace a name.",
|
||||
"Choose Node.js in the selection area below the name field",
|
||||
"Click the Create button",
|
||||
"Wait for the workspace to finish processing and select it on the left sidebar, below the Create New Workspace button",
|
||||
"Click the \"Start Editing\" button.",
|
||||
"In the lower right hand corner you should see a terminal window. In this window use the following commands. You don't need to know what these mean at this point.",
|
||||
"Run this command: <code>sudo npm install learnyounode -g</code>",
|
||||
"Now start this tutorial by running <code>learnyounode</code>",
|
||||
"Note that you can resize the c9.io's windows by dragging their borders.",
|
||||
"Follow the directions and work through all of the the tutorial's steps before moving on."
|
||||
],
|
||||
"challengeType": 2,
|
||||
"tests": []
|
||||
},
|
||||
{
|
||||
"_id": "bd7153d8c441eddfaeb5bd0f",
|
||||
"name": "Manage Packages with NPM",
|
||||
"difficulty": 0.40,
|
||||
"challengeSeed": "114685061",
|
||||
"difficulty": 0.39,
|
||||
"challengeSeed": "126433450",
|
||||
"description": [
|
||||
"We'll build this Waypoint on Cloud 9, a powerful online code editor with a full Ubuntu Linux workspace, all running in the cloud.",
|
||||
"If you don't already have Cloud 9 account, create one now at <a href='http://c9.io' target='_blank'>http://c9.io</a>.",
|
||||
@ -576,11 +551,35 @@
|
||||
"challengeType": 2,
|
||||
"tests": []
|
||||
},
|
||||
{
|
||||
"_id": "bd7153d8c441eddfaeb5bdff",
|
||||
"name": "Start a Node.js Server",
|
||||
"difficulty": 0.40,
|
||||
"challengeSeed": "126411561",
|
||||
"description": [
|
||||
"We'll build this Waypoint on Cloud 9, a powerful online code editor with a full Ubuntu Linux workspace, all running in the cloud.",
|
||||
"If you don't already have Cloud 9 account, create one now at <a href='http://c9.io' target='_blank'>http://c9.io</a>.",
|
||||
"Open up <a href='http://c9.io' target='_blank'>http://c9.io</a> and sign in to your account.",
|
||||
"Click on Create New Workspace at the top right of the c9.io page, then click on the \"Create a new workspace\" popup that appears below it the button after you click on it.",
|
||||
"Give your workspace a name.",
|
||||
"Choose Node.js in the selection area below the name field",
|
||||
"Click the Create button",
|
||||
"Wait for the workspace to finish processing and select it on the left sidebar, below the Create New Workspace button",
|
||||
"Click the \"Start Editing\" button.",
|
||||
"In the lower right hand corner you should see a terminal window. In this window use the following commands. You don't need to know what these mean at this point.",
|
||||
"Run this command: <code>sudo npm install learnyounode -g</code>",
|
||||
"Now start this tutorial by running <code>learnyounode</code>",
|
||||
"Note that you can resize the c9.io's windows by dragging their borders.",
|
||||
"Follow the directions and work through all of the the tutorial's steps before moving on."
|
||||
],
|
||||
"challengeType": 2,
|
||||
"tests": []
|
||||
},
|
||||
{
|
||||
"_id": "bd7153d8c441eddfaeb5bd1f",
|
||||
"name": "Build Web Apps with Express.js",
|
||||
"difficulty": 0.41,
|
||||
"challengeSeed": "114685061",
|
||||
"challengeSeed": "126411559",
|
||||
"description": [
|
||||
"We'll build this Waypoint on Cloud 9, a powerful online code editor with a full Ubuntu Linux workspace, all running in the cloud.",
|
||||
"If you don't already have Cloud 9 account, create one now at <a href='http://c9.io' target='_blank'>http://c9.io</a>.",
|
||||
@ -623,7 +622,7 @@
|
||||
"Pair Programming is where two people code together on the same computer. It is an efficient way to collaborate, and widely practiced at software companies. Pair Programming is one of the core concepts of \"Agile\" Software Development, which you will hear more about later.",
|
||||
"Many people use Skype or Google Hangouts to pair program, but if you talk with professional software engineers, they will tell you that it's not really pair programming unless both people have the ability to use the keyboard and mouse.",
|
||||
"The most popular tool for pair programming is Screen Hero. You can download Screen Hero for <a href='http://links.screenhero.com/e/c/eyJlbWFpbF9pZCI6Ik1qQTNNem9XQkNJQ1pBQUNjd0FYQVZrVEdnRkxNamtfX0JWZEdGVEpSZkVCWlRwbFpXRTBNamM0WVMxaE56SmlMVEV4WlRRdE9HUXpZUzFpWXpVNE1HRTJNalkxTldNNk1UUTJNVEEyQUE9PSIsInBvc2l0aW9uIjowLCJocmVmIjoiaHR0cDovL2RsLnNjcmVlbmhlcm8uY29tL3NtYXJ0ZG93bmxvYWQvZklYQU1UUUJBTEtQQkhQTC9TY3JlZW5oZXJvLnppcD9zb3VyY2U9d2ViIn0=' target='_blank'>Mac</a> or <a href='http://links.screenhero.com/e/c/eyJlbWFpbF9pZCI6Ik1qQTNNem9XQkNJQ1pBQUNjd0FYQVZrVEdnRkxNamtfX0JWZEdGVEpSZkVCWlRwbFpXRTBNamM0WVMxaE56SmlMVEV4WlRRdE9HUXpZUzFpWXpVNE1HRTJNalkxTldNNk1UUTJNVEEyQUE9PSIsInBvc2l0aW9uIjoxLCJocmVmIjoiaHR0cDovL2RsLnNjcmVlbmhlcm8uY29tL3NtYXJ0ZG93bmxvYWQvZklYQU1UUUJBTEtQQkhQTC9TY3JlZW5oZXJvLXNldHVwLmV4ZSJ9' target='_blank'>Windows</a>. Create your new user account from within the app.",
|
||||
"We have a special chat room for people ready to pair program. Go to our Slack chatroom and navigate to the # letspair channel and type \"Hello Pair Programmers!\"",
|
||||
"We have a special chat room for people ready to pair program. Go to our Slack chatroom and navigate to the #letspair channel and type \"Hello Pair Programmers!\"",
|
||||
"If someone is available, they will be your \"pair\" - the person you pair programming with.",
|
||||
"If no one gets back to you in the first few minutes, don't worry. There will be lots of opportunities to pair program in the future.",
|
||||
"If someone does get back to you, private message them and ask for the email address they used to register Screen Hero.",
|
||||
@ -664,7 +663,7 @@
|
||||
"_id": "bd7158d8c442eddfaeb5bd1f",
|
||||
"name": "Zipline: Use the Twitch.tv JSON API",
|
||||
"difficulty": 1.01,
|
||||
"challengeSeed": "125658022",
|
||||
"challengeSeed": "126411564",
|
||||
"description": [
|
||||
"<span class='text-info'>Objective:</span> Build a <a href='http://codepen.io' target='_blank'>CodePen.io</a> that successfully reverse-engineers this: <a href='http://codepen.io/GeoffStorbeck/full/GJKRxZ' target='_blank'>http://codepen.io/GeoffStorbeck/full/GJKRxZ</a>.",
|
||||
"<span class='text-info'>Rule #1:</span> Don't look at the example project's code. Figure it out for yourself.",
|
||||
@ -679,7 +678,7 @@
|
||||
"<span class='text-info'>Hint:</span> The relevant documentation about this API call is here: <a href='https://github.com/justintv/Twitch-API/blob/master/v3_resources/streams.md#get-streamschannel' target='_blank'>https://github.com/justintv/Twitch-API/blob/master/v3_resources/streams.md#get-streamschannel</a>.",
|
||||
"<span class='text-info'>Hint:</span> Here's an array of the Twitch.tv usernames of people who regularly stream coding: <code>[\"freecodecamp\", \"storbeck\", \"terakilobyte\", \"habathcx\",\"notmichaelmcdonald\",\"RobotCaleb\",\"comster404\",\"brunofin\",\"thomasballinger\",\"joe_at_underflow\",\"noobs2ninjas\",\"mdwasp\",\"beohoff\",\"xenocomagain\"]</code>",
|
||||
"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, click this button and paste in a link to your CodePen project. Otherwise, we'll review it before you start your nonprofit projects.<a class='btn btn-primary btn-block' href='https://twitter.com/intent/tweet?text=Check%20out%20the%20project%20I%20just%20built%20with%20%40FreeCodeCamp:%20%0A%20%23LearnToCode%20%23JavaScript' target='_blank'>Click here then add your link to your tweet's text</a>"
|
||||
"If you'd like immediate feedback on your project, click this button and paste in a link to your CodePen project. Otherwise, we'll review it before you start your nonprofit projects.<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:%20%0A%20%23LearnToCode%20%23JavaScript' target='_blank'>Click here then add your link to your tweet's text</a>"
|
||||
],
|
||||
"challengeType": 3,
|
||||
"tests": []
|
||||
@ -688,7 +687,7 @@
|
||||
"_id": "bd7158d8c442eddfaeb5bd13",
|
||||
"name": "Zipline: Build a Random Quote Machine",
|
||||
"difficulty": 1.02,
|
||||
"challengeSeed": "125658022",
|
||||
"challengeSeed": "126415122",
|
||||
"description": [
|
||||
"<span class='text-info'>Objective:</span> Build a <a href='http://codepen.io' target='_blank'>CodePen.io</a> that successfully reverse-engineers this: <a href='http://codepen.io/AdventureBear/full/vEoVMw' target='_blank'>http://codepen.io/AdventureBear/full/vEoVMw</a>.",
|
||||
"<span class='text-info'>Rule #1:</span> Don't look at the example project's code. Figure it out for yourself.",
|
||||
@ -698,7 +697,7 @@
|
||||
"<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.",
|
||||
"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, click this button and paste in a link to your CodePen project. Otherwise, we'll review it before you start your nonprofit projects.<a class='btn btn-primary btn-block' href='https://twitter.com/intent/tweet?text=Check%20out%20the%20project%20I%20just%20built%20with%20%40FreeCodeCamp:%20%0A%20%23LearnToCode%20%23JavaScript' target='_blank'>Click here then add your link to your tweet's text</a>"
|
||||
"If you'd like immediate feedback on your project, click this button and paste in a link to your CodePen project. Otherwise, we'll review it before you start your nonprofit projects.<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:%20%0A%20%23LearnToCode%20%23JavaScript' target='_blank'>Click here then add your link to your tweet's text</a>"
|
||||
],
|
||||
"challengeType": 3,
|
||||
"tests": []
|
||||
@ -707,21 +706,19 @@
|
||||
"_id": "bd7158d8c442eddfaeb5bd10",
|
||||
"name": "Zipline: Show the Local Weather",
|
||||
"difficulty": 1.03,
|
||||
"challengeSeed": "125658022",
|
||||
"challengeSeed": "126415127",
|
||||
"description": [
|
||||
"<span class='text-info'>Objective:</span> Build a <a href='http://codepen.io' target='_blank'>CodePen.io</a> 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'>Rule #1:</span> Don't look at the example project's code. 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.",
|
||||
"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 see the weather in my current zipcode.",
|
||||
"<span class='text-info'>User Story:</span> As a user, I can see the weather in my current location.",
|
||||
"<span class='text-info'>Bonus User Story:</span> As a user, I can see an icon depending on the temperature..",
|
||||
"<span class='text-info'>Bonus User Story:</span> As a user, I see a different background image depending on the temperature (e.g. snowy mountain, hot desert).",
|
||||
"<span class='text-info'>Bonus User Story:</span> As a user, I can push a button to toggle between Fahrenheit and Celsius.",
|
||||
"<span class='text-info'>Hint:</span> Get a zipcode's weather (in Kelvin) at <code>http://api.openweathermap.org/data/2.5/weather?q=99705</code>.",
|
||||
"<span class='text-info'>Hint:</span> Get your current user's zipcode (based on their IP address) with this line of jQuery: <code>$.get(\"http://ipinfo.io\", function(response) {}, \"jsonp\");</code>",
|
||||
"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, click this button and paste in a link to your CodePen project. Otherwise, we'll review it before you start your nonprofit projects.<a class='btn btn-primary btn-block' href='https://twitter.com/intent/tweet?text=Check%20out%20the%20project%20I%20just%20built%20with%20%40FreeCodeCamp:%20%0A%20%23LearnToCode%20%23JavaScript' target='_blank'>Click here then add your link to your tweet's text</a>"
|
||||
"If you'd like immediate feedback on your project, click this button and paste in a link to your CodePen project. Otherwise, we'll review it before you start your nonprofit projects.<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:%20%0A%20%23LearnToCode%20%23JavaScript' target='_blank'>Click here then add your link to your tweet's text</a>"
|
||||
],
|
||||
"challengeType": 3,
|
||||
"tests": []
|
||||
@ -730,20 +727,20 @@
|
||||
"_id": "bd7158d8c442eddfaeb5bd18",
|
||||
"name": "Zipline: Stylize Stories on Camper News",
|
||||
"difficulty": 1.04,
|
||||
"challengeSeed": "125658022",
|
||||
"challengeSeed": "126415129",
|
||||
"description": [
|
||||
"<span class='text-info'>Objective:</span> Build a <a href='http://codepen.io' target='_blank'>CodePen.io</a> that successfully reverse-engineers this: <a href='http://codepen.io/GeoffStorbeck/full/Wveezv' target='_blank'>http://codepen.io/GeoffStorbeck/full/Wveezv</a>.",
|
||||
"<span class='text-info'>Rule #1:</span> Don't look at the example project's code. 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.",
|
||||
"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 see browse recent posts on Camper News.",
|
||||
"<span class='text-info'>User Story:</span> As a user, I can click on a link on that post to be taken to the story's original URL.",
|
||||
"<span class='text-info'>User Story:</span> As a user, I can click on a link on that post and be taken to the post's discussion page.",
|
||||
"<span class='text-info'>User Story:</span> As a user, I can browse recent posts from Camper News.",
|
||||
"<span class='text-info'>User Story:</span> As a user, I can click on a post to be taken to the story's original URL.",
|
||||
"<span class='text-info'>User Story:</span> As a user, I can click a link to go directly to the post's discussion page.",
|
||||
"<span class='text-info'>Bonus User Story:</span> As a user, I can see how many upvotes each story has.",
|
||||
"<span class='text-info'>Hint:</span> Here's the Camper News Hot Stories API endpoint: <code>http://www.freecodecamp.com/stories/hotStories</code>.",
|
||||
"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, click this button and paste in a link to your CodePen project. Otherwise, we'll review it before you start your nonprofit projects.<a class='btn btn-primary btn-block' href='https://twitter.com/intent/tweet?text=Check%20out%20the%20project%20I%20just%20built%20with%20%40FreeCodeCamp:%20%0A%20%23LearnToCode%20%23JavaScript' target='_blank'>Click here then add your link to your tweet's text</a>"
|
||||
"If you'd like immediate feedback on your project, click this button and paste in a link to your CodePen project. Otherwise, we'll review it before you start your nonprofit projects.<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:%20%0A%20%23LearnToCode%20%23JavaScript' target='_blank'>Click here then add your link to your tweet's text</a>"
|
||||
],
|
||||
"challengeType": 3,
|
||||
"tests": []
|
||||
@ -752,19 +749,19 @@
|
||||
"_id": "bd7158d8c442eddfaeb5bd19",
|
||||
"name": "Zipline: Wikipedia Viewer",
|
||||
"difficulty": 1.05,
|
||||
"challengeSeed": "125658022",
|
||||
"challengeSeed": "126415131",
|
||||
"description": [
|
||||
"<span class='text-info'>Objective:</span> Build a <a href='http://codepen.io' target='_blank'>CodePen.io</a> that successfully reverse-engineers this: <a href='http://codepen.io/GeoffStorbeck/full/MwgQea' target='_blank'>http://codepen.io/GeoffStorbeck/full/MwgQea</a>.",
|
||||
"<span class='text-info'>Rule #1:</span> Don't look at the example project's code. 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.",
|
||||
"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 search wikipedia entries with a text box and see the resulting wikipedia entry.",
|
||||
"<span class='text-info'>Bonus User Story:</span>As a user, I can see a random wikipedia entry.",
|
||||
"<span class='text-info'>Bonus User Story:</span>As a user, when I type in the search box, I can see a dropdown with autocomplete options for matching wikipedia entries.",
|
||||
"<span class='text-info'>User Story:</span> As a user, I can search Wikipedia entries in a search box and see the resulting Wikipedia entries.",
|
||||
"<span class='text-info'>Bonus User Story:</span>As a user, I can click a button to see a random Wikipedia entry.",
|
||||
"<span class='text-info'>Bonus User Story:</span>As a user, when I type in the search box, I can see a dropdown menu with autocomplete options for matching Wikipedia entries.",
|
||||
"<span class='text-info'>Hint:</span> Here's an entry on using Wikipedia's API: <code>http://www.mediawiki.org/wiki/API:Main_page</code>.",
|
||||
"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, click this button and paste in a link to your CodePen project. Otherwise, we'll review it before you start your nonprofit projects.<a class='btn btn-primary btn-block' href='https://twitter.com/intent/tweet?text=Check%20out%20the%20project%20I%20just%20built%20with%20%40FreeCodeCamp:%20%0A%20%23LearnToCode%20%23JavaScript' target='_blank'>Click here then add your link to your tweet's text</a>"
|
||||
"If you'd like immediate feedback on your project, click this button and paste in a link to your CodePen project. Otherwise, we'll review it before you start your nonprofit projects.<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:%20%0A%20%23LearnToCode%20%23JavaScript' target='_blank'>Click here then add your link to your tweet's text</a>"
|
||||
],
|
||||
"challengeType": 3,
|
||||
"tests": []
|
||||
@ -773,18 +770,18 @@
|
||||
"_id": "bd7158d8c442eddfaeb5bd0f",
|
||||
"name": "Zipline: Build a Pomodoro Clock",
|
||||
"difficulty": 1.06,
|
||||
"challengeSeed": "125658022",
|
||||
"challengeSeed": "126411567",
|
||||
"description": [
|
||||
"<span class='text-info'>Objective:</span> Build a <a href='http://codepen.io' target='_blank'>CodePen.io</a> that successfully reverse-engineers this: <a href='http://codepen.io/GeoffStorbeck/full/RPbGxZ/' target='_blank'>http://codepen.io/GeoffStorbeck/full/RPbGxZ/</a>.",
|
||||
"<span class='text-info'>Rule #1:</span> Don't look at the example project's code. 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.",
|
||||
"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 start a 25 minute pomodoro, and the timer will go off once 25 minutes have elapsed.",
|
||||
"<span class='text-info'>User Story:</span> As a user, I can start a 25 minute pomodoro, and the timer will go off once 25 minutes has elapsed.",
|
||||
"<span class='text-info'>Bonus User Story:</span> As a user, I can reset the clock for my next pomodoro.",
|
||||
"<span class='text-info'>Bonus User Story:</span> As a user, I can customize the length of each pomodoro.",
|
||||
"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, click this button and paste in a link to your CodePen project. Otherwise, we'll review it before you start your nonprofit projects.<a class='btn btn-primary btn-block' href='https://twitter.com/intent/tweet?text=Check%20out%20the%20project%20I%20just%20built%20with%20%40FreeCodeCamp:%20%0A%20%23LearnToCode%20%23JavaScript' target='_blank'>Click here then add your link to your tweet's text</a>"
|
||||
"If you'd like immediate feedback on your project, click this button and paste in a link to your CodePen project. Otherwise, we'll review it before you start your nonprofit projects.<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:%20%0A%20%23LearnToCode%20%23JavaScript' target='_blank'>Click here then add your link to your tweet's text</a>"
|
||||
],
|
||||
"challengeType": 3,
|
||||
"tests": []
|
||||
@ -793,7 +790,7 @@
|
||||
"_id": "bd7158d8c442eddfaeb5bd17",
|
||||
"name": "Zipline: Build a JavaScript Calculator",
|
||||
"difficulty": 1.07,
|
||||
"challengeSeed": "125658022",
|
||||
"challengeSeed": "126411565",
|
||||
"description": [
|
||||
"<span class='text-info'>Objective:</span> Build a <a href='http://codepen.io' target='_blank'>CodePen.io</a> that successfully reverse-engineers this: <a href='http://codepen.io/GeoffStorbeck/full/zxgaqw' target='_blank'>http://codepen.io/GeoffStorbeck/full/zxgaqw</a>.",
|
||||
"<span class='text-info'>Rule #1:</span> Don't look at the example project's code. Figure it out for yourself.",
|
||||
@ -802,9 +799,9 @@
|
||||
"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 it 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 clear button, and the calculator will tell me the correct output.",
|
||||
"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, click this button and paste in a link to your CodePen project. Otherwise, we'll review it before you start your nonprofit projects.<a class='btn btn-primary btn-block' href='https://twitter.com/intent/tweet?text=Check%20out%20the%20project%20I%20just%20built%20with%20%40FreeCodeCamp:%20%0A%20%23LearnToCode%20%23JavaScript' target='_blank'>Click here then add your link to your tweet's text</a>"
|
||||
"If you'd like immediate feedback on your project, click this button and paste in a link to your CodePen project. Otherwise, we'll review it before you start your nonprofit projects.<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:%20%0A%20%23LearnToCode%20%23JavaScript' target='_blank'>Click here then add your link to your tweet's text</a>"
|
||||
],
|
||||
"challengeType": 3,
|
||||
"tests": []
|
||||
@ -813,7 +810,7 @@
|
||||
"_id": "bd7158d8c442eddfaeb5bd1c",
|
||||
"name": "Zipline: Build a Tic Tac Toe Game",
|
||||
"difficulty": 1.08,
|
||||
"challengeSeed": "125658022",
|
||||
"challengeSeed": "126415123",
|
||||
"description": [
|
||||
"<span class='text-info'>Objective:</span> Build a <a href='http://codepen.io' target='_blank'>CodePen.io</a> that successfully reverse-engineers this: <a href='http://codepen.io/alex-dixon/full/JogOpQ/' target='_blank'>http://codepen.io/alex-dixon/full/JogOpQ/</a>.",
|
||||
"<span class='text-info'>Rule #1:</span> Don't look at the example project's code. Figure it out for yourself.",
|
||||
@ -825,7 +822,7 @@
|
||||
"<span class='text-info'>Bonus User Story:</span> As a user, my game will reset as soon as it's over so I can play again.",
|
||||
"<span class='text-info'>Bonus User Story:</span> As a user, I can choose whether I want to play as X or O.",
|
||||
"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, click this button and paste in a link to your CodePen project. Otherwise, we'll review it before you start your nonprofit projects.<a class='btn btn-primary btn-block' href='https://twitter.com/intent/tweet?text=Check%20out%20the%20project%20I%20just%20built%20with%20%40FreeCodeCamp:%20%0A%20%23LearnToCode%20%23JavaScript' target='_blank'>Click here then add your link to your tweet's text</a>"
|
||||
"If you'd like immediate feedback on your project, click this button and paste in a link to your CodePen project. Otherwise, we'll review it before you start your nonprofit projects.<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:%20%0A%20%23LearnToCode%20%23JavaScript' target='_blank'>Click here then add your link to your tweet's text</a>"
|
||||
],
|
||||
"challengeType": 3,
|
||||
"tests": []
|
||||
@ -834,53 +831,53 @@
|
||||
"_id": "bd7158d8c443eddfaeb5bcef",
|
||||
"name": "Get Set for Basejumps",
|
||||
"difficulty": 2.00,
|
||||
"challengeSeed": "123488494",
|
||||
"challengeSeed": "126433451",
|
||||
"description": [
|
||||
"<span class='text-info'>Objective:</span> Get the MEAN stack running on Cloud 9, push your code to GitHub, and deploy it to Heroku.",
|
||||
"We'll build our Basejumps on Cloud 9, a powerful online code editor with a full Ubuntu Linux workspace, all running in the cloud.",
|
||||
"If you don't already have Cloud 9 account, create one now at <a href='http://c9.io'>http://c9.io</a>.",
|
||||
"If you don't already have Cloud 9 account, create one now at <a href='http://c9.io' target='_blank'>http://c9.io</a>.",
|
||||
"Now let's get your development environment ready for a new Angular-Fullstack application provided by Yeoman.",
|
||||
"Open up <a href='http://c9.io'>http://c9.io</a> and sign in to your account.",
|
||||
"Open up <a href='http://c9.io' target='_blank'>http://c9.io</a> and sign in to your account.",
|
||||
"Click on Create New Workspace at the top right of the c9.io page, then click on the \"Create a new workspace\" popup that appears below it the button after you click on it.",
|
||||
"Give your workspace a name.",
|
||||
"Choose Node.js in the selection area below the name field",
|
||||
"Click the Create button",
|
||||
"Wait for the workspace to finish processing and select it on the left sidebar, below the Create New Workspace button",
|
||||
"Choose Node.js in the selection area below the name field.",
|
||||
"Click the Create button.",
|
||||
"Wait for the workspace to finish processing and select it on the left sidebar, below the Create New Workspace button.",
|
||||
"Click the \"Start Editing\" button.",
|
||||
"In the lower right hand corner you should see a terminal window. In this window use the following commands. You don't need to know what these mean at this point.",
|
||||
"<code>rm -rf * && npm install -g yo grunt grunt-cli generator-angular-fullstack && yo angular-fullstack</code>",
|
||||
"Never run this command on your local machine. But in your Cloud 9 terminal window, run: <code>rm -rf * && echo \"export NODE_PATH=$NODE_PATH:/home/ubuntu/.nvm/v0.10.35/lib/node_modules\" >> ~/.bashrc && source ~/.bashrc && npm install -g yo grunt grunt-cli generator-angular-fullstack && yo angular-fullstack</code>",
|
||||
"Yeoman will prompt you to answer some questions. Answer them like this:",
|
||||
"What would you like to write scripts with? JavaScript",
|
||||
"What would you like to write markup with? HTML",
|
||||
"What would you like to write stylesheets with? CSS",
|
||||
"What Angular router would you like to use? ngRoute",
|
||||
"Would you like to include Bootstrap? Yes",
|
||||
"Would you like to include UI Bootstrap? Yes",
|
||||
"Would you like to use MongoDB with Mongoose for data modeling? Yes",
|
||||
"Would you scaffold out an authentication boilerplate? Yes",
|
||||
"Would you like to include additional oAuth strategies? Twitter",
|
||||
"Would you like to use socket.io? No",
|
||||
"May bower anonymously report usage statistics to improve the tool over time? (Y/n) Y",
|
||||
"What would you like to write scripts with? <span class='text-success'>JavaScript</span>",
|
||||
"What would you like to write markup with? <span class='text-success'>HTML</span>",
|
||||
"What would you like to write stylesheets with? <span class='text-success'>CSS</span>",
|
||||
"What Angular router would you like to use? <span class='text-success'>ngRoute</span>",
|
||||
"Would you like to include Bootstrap? <span class='text-success'>Yes</span>",
|
||||
"Would you like to include UI Bootstrap? <span class='text-success'>Yes</span>",
|
||||
"Would you like to use MongoDB with Mongoose for data modeling? <span class='text-success'>Yes</span>",
|
||||
"Would you scaffold out an authentication boilerplate? <span class='text-success'>Yes</span>",
|
||||
"Would you like to include additional oAuth strategies? <span class='text-success'>Twitter</span>",
|
||||
"Would you like to use socket.io? <span class='text-success'>No</span>",
|
||||
"May bower anonymously report usage statistics to improve the tool over time? (Y/n) <span class='text-success'>Y</span>",
|
||||
"You may get an error similar to <code> ERR! EEXIST, open ‘/home/ubuntu/.npm</code>. This is caused when Cloud9 runs out of memory and kills an install. If you get this, simply re-run this process with the command <code>yo angular-fullstack</code>. You will then be asked a few questions regarding the re-install. Answer them as follows:",
|
||||
"Existing .yo-rc configuration found, would you like to use it? (Y/n) Y",
|
||||
"Overwrite client/favicon.ico? (Ynaxdh) Y",
|
||||
"Existing .yo-rc configuration found, would you like to use it? (Y/n) <span class='text-success'>Y</span>",
|
||||
"Overwrite client/favicon.ico? (Ynaxdh) <span class='text-success'>Y</span>",
|
||||
"To finish the installation run the commands: <code>bower install && npm install</code>",
|
||||
"To start MongoDB, run the following commands in your terminal: <code>mkdir data && echo 'mongod --bind_ip=$IP --dbpath=data --nojournal --rest \"$@\"' > mongod && chmod a+x mongod && ./mongod</code>",
|
||||
"You will want to open up a new terminal to work from by clicking on the + icon and select New Terminal",
|
||||
"Start the application by running the following command in your new terminal window: <code>grunt serve</code>",
|
||||
"Wait for the following message to appear: <code>xdg-open: no method available for opening 'http://localhost:8080' </code>. Now you can open the internal Cloud9 browser. To launch the browser select Preview in the toolbar then select the dropdown option Preview Running Application.",
|
||||
"Turn the folder in which your application is running into a Git repository by running the following commands: <code>git init && git add . && git commit -am 'initial commit'</code>.",
|
||||
"Create a new Github repository by signing in to <a href='http://github.com'>http://github.com</a> and clicking on the + button next to your username in the upper-right hand side of your screen, then selecting \"New Repository\"",
|
||||
"Create a new Github repository by signing in to <a href='http://github.com' target='_blank'>http://github.com</a> and clicking on the + button next to your username in the upper-right hand side of your screen, then selecting \"New Repository\".",
|
||||
"Enter a project name, then click the \"Create Repository\" button.",
|
||||
"Find the \"...or push an existing repository from the command line\" section and click the Copy to Clipboard button beside it.",
|
||||
"Paste the commands from your clipboard into the Cloud9 terminal prompt. This will push your changes to your repository on Cloud 9 up to Github.",
|
||||
"Check back on your Github profile to verify the changes were successfully pushed up to Github.",
|
||||
"Now let's push your code to Heroku. If you don't already have a Heroku account, create one at <a href=http://heroku.com>http://heroku.com</a>. You shouldn't be charged for anything, but you will need to add your credit card information to your Heroku before you will be able to use Heroku's free MongoLab add on.",
|
||||
"Now let's push your code to Heroku. If you don't already have a Heroku account, create one at <a href='http://heroku.com' target='_blank'>http://heroku.com</a>. You shouldn't be charged for anything, but you will need to add your credit card information to your Heroku before you will be able to use Heroku's free MongoLab add on.",
|
||||
"Before you publish to Heroku, you should free up as much memory as possible on Cloud9. In each of the Cloud9 terminal prompt tabs where MongoDB and Grunt are running, press the <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:add mongolab</code>.",
|
||||
"As you build your app, you should frequently commit changes to your codebase. You can do this by running <code>git commit -am \"your commit message\"</code>. Note that you should replace \"your commit message\" with a brief summary of the changes you made to your 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 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>.",
|
||||
"Now you're ready to move on to your first Basejump. Click the \"I've completed this challenge\" button and enter the URLs for both your Github repository and your live app running on Heroku. If you pair programmed with a friend, enter his or her Free Code Camp username as well so that you both get credit for completing it."
|
||||
],
|
||||
@ -899,15 +896,15 @@
|
||||
"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>.",
|
||||
"Here are the specific User Stories you should implement for this Basejump:",
|
||||
"<span class='text-info'>User Story:</span> As an authenticated user, I can keep my polls and come back later to access them.",
|
||||
"<span class='text-info'>User Story:</span> As an authenticated user, can share my polls with my friends.",
|
||||
"<span class='text-info'>User Story:</span> As an authenticated user, I can share my polls with my friends.",
|
||||
"<span class='text-info'>User Story:</span> As an authenticated user, I can see the aggregate results of my polls.",
|
||||
"<span class='text-info'>User Story:</span> As an authenticated user, I can delete polls that I decide I don't want anymore.",
|
||||
"<span class='text-info'>User Story:</span> As an authenticated user, I can create a poll with any number of possible items.",
|
||||
"<span class='text-info'>Bonus User Story:</span> As an unauthenticated user, I can see everyone's polls, but not be able to vote.",
|
||||
"<span class='text-info'>Bonus User Story:</span> As an unauthenticated or authenticated user, I can see the in chart form. (This could be implemented using Chart.js or Google Charts.)",
|
||||
"<span class='text-info'>Bonus User Story:</span> As an authenticated user, if I don't like the options on a poll I can create a new option.",
|
||||
"<span class='text-info'>Bonus User Story:</span> As an unauthenticated user, I can see everyone's polls, but I can't vote on anything.",
|
||||
"<span class='text-info'>Bonus User Story:</span> As an unauthenticated or authenticated user, I can see the results of polls in chart form. (This could be implemented using Chart.js or Google Charts.)",
|
||||
"<span class='text-info'>Bonus User Story:</span> As an authenticated user, if I don't like the options on a poll, I can create a new option.",
|
||||
"Once you've finished implementing these user stories, click the \"I've completed this challenge\" button and enter the URLs for both your Github repository and your live app running on Heroku. If you pair programmed with a friend, enter his or her Free Code Camp username as well so that you both get credit for completing it.",
|
||||
"If you'd like immediate feedback on your project, click this button and paste in a link to your Heroku project. Otherwise, we'll review it before you start your nonprofit projects.<a class='btn btn-primary btn-block' href='https://twitter.com/intent/tweet?text=Check%20out%20the%20project%20I%20just%20built%20with%20%40FreeCodeCamp:%20%0A%20%23LearnToCode%20%23JavaScript' target='_blank'>Click here then add your link to your tweet's text</a>"
|
||||
"If you'd like immediate feedback on your project, click this button and paste in a link to your Heroku project. Otherwise, we'll review it before you start your nonprofit projects.<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:%20%0A%20%23LearnToCode%20%23JavaScript' target='_blank'>Click here then add your link to your tweet's text</a>"
|
||||
],
|
||||
"challengeType": 4,
|
||||
"tests": []
|
||||
@ -928,7 +925,7 @@
|
||||
"<span class='text-info'>User Story:</span> As an authenticated user, I can remove myself from a bar if I no longer want to go there.",
|
||||
"<span class='text-info'>Bonus User Story:</span> As an unauthenticated user, when I login I should not have to search again.",
|
||||
"Once you've finished implementing these user stories, click the \"I've completed this challenge\" button and enter the URLs for both your Github repository and your live app running on Heroku. If you pair programmed with a friend, enter his or her Free Code Camp username as well so that you both get credit for completing it.",
|
||||
"If you'd like immediate feedback on your project, click this button and paste in a link to your Heroku project. Otherwise, we'll review it before you start your nonprofit projects.<a class='btn btn-primary btn-block' href='https://twitter.com/intent/tweet?text=Check%20out%20the%20project%20I%20just%20built%20with%20%40FreeCodeCamp:%20%0A%20%23LearnToCode%20%23JavaScript' target='_blank'>Click here then add your link to your tweet's text</a>"
|
||||
"If you'd like immediate feedback on your project, click this button and paste in a link to your Heroku project. Otherwise, we'll review it before you start your nonprofit projects.<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:%20%0A%20%23LearnToCode%20%23JavaScript' target='_blank'>Click here then add your link to your tweet's text</a>"
|
||||
],
|
||||
"challengeType": 4,
|
||||
"tests": []
|
||||
@ -944,12 +941,12 @@
|
||||
"As you build your app, you should frequently commit changes to your codebase. You can do this by running <code>git commit -am \"your commit message\"</code>. Note that you should replace \"your commit message\" with a brief summary of the changes you made to your code.",
|
||||
"You can push these new commits to Github by running <code>git push origin master</code>, and to Heroku by running <code>grunt --force && grunt buildcontrol:heroku</code>.",
|
||||
"Here are the specific User Stories you should implement for this Basejump:",
|
||||
"<span class='text-info'>User Story:</span> As a user, I can view a graph displaying the recent trend line for all added stocks.",
|
||||
"<span class='text-info'>User Story:</span> As a user, I can view a graph displaying the recent trend lines for each added stock.",
|
||||
"<span class='text-info'>User Story:</span> As a user, I can add new stocks by their symbol name.",
|
||||
"<span class='text-info'>User Story:</span> As a user, I can remove stocks.",
|
||||
"<span class='text-info'>Bonus User Story:</span> As a user, I can see changes in real-time when any other user adds or removes a stock.",
|
||||
"Once you've finished implementing these user stories, click the \"I've completed this challenge\" button and enter the URLs for both your Github repository and your live app running on Heroku. If you pair programmed with a friend, enter his or her Free Code Camp username as well so that you both get credit for completing it.",
|
||||
"If you'd like immediate feedback on your project, click this button and paste in a link to your Heroku project. Otherwise, we'll review it before you start your nonprofit projects.<a class='btn btn-primary btn-block' href='https://twitter.com/intent/tweet?text=Check%20out%20the%20project%20I%20just%20built%20with%20%40FreeCodeCamp:%20%0A%20%23LearnToCode%20%23JavaScript' target='_blank'>Click here then add your link to your tweet's text</a>"
|
||||
"If you'd like immediate feedback on your project, click this button and paste in a link to your Heroku project. Otherwise, we'll review it before you start your nonprofit projects.<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:%20%0A%20%23LearnToCode%20%23JavaScript' target='_blank'>Click here then add your link to your tweet's text</a>"
|
||||
],
|
||||
"challengeType": 4,
|
||||
"tests": []
|
||||
@ -968,16 +965,16 @@
|
||||
"<span class='text-info'>User Story:</span> As an authenticated user, I can view all books posted by every user.",
|
||||
"<span class='text-info'>User Story:</span> As an authenticated user, I can add a new book.",
|
||||
"<span class='text-info'>User Story:</span> As an authenticated user, I can update my settings to store my full name, city, and state.",
|
||||
"<span class='text-info'>Bonus User Story:</span> As an authenticated user, I should be able to propose a trade and wait for the other user to accept the trade.",
|
||||
"<span class='text-info'>Bonus User Story:</span> As an authenticated user, I can propose a trade and wait for the other user to accept the trade.",
|
||||
"Once you've finished implementing these user stories, click the \"I've completed this challenge\" button and enter the URLs for both your Github repository and your live app running on Heroku. If you pair programmed with a friend, enter his or her Free Code Camp username as well so that you both get credit for completing it.",
|
||||
"If you'd like immediate feedback on your project, click this button and paste in a link to your Heroku project. Otherwise, we'll review it before you start your nonprofit projects.<a class='btn btn-primary btn-block' href='https://twitter.com/intent/tweet?text=Check%20out%20the%20project%20I%20just%20built%20with%20%40FreeCodeCamp:%20%0A%20%23LearnToCode%20%23JavaScript' target='_blank'>Click here then add your link to your tweet's text</a>"
|
||||
"If you'd like immediate feedback on your project, click this button and paste in a link to your Heroku project. Otherwise, we'll review it before you start your nonprofit projects.<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:%20%0A%20%23LearnToCode%20%23JavaScript' target='_blank'>Click here then add your link to your tweet's text</a>"
|
||||
],
|
||||
"challengeType": 4,
|
||||
"tests": []
|
||||
},
|
||||
{
|
||||
"_id": "bd7158d8c443eddfaeb5bdee",
|
||||
"name": "Basejump: Build a Pintrest Clone",
|
||||
"name": "Basejump: Build a Pinterest Clone",
|
||||
"difficulty": 2.05,
|
||||
"challengeSeed": "123488494",
|
||||
"description": [
|
||||
@ -986,17 +983,16 @@
|
||||
"As you build your app, you should frequently commit changes to your codebase. You can do this by running <code>git commit -am \"your commit message\"</code>. Note that you should replace \"your commit message\" with a brief summary of the changes you made to your code.",
|
||||
"You can push these new commits to Github by running <code>git push origin master</code>, and to Heroku by running <code>grunt --force && grunt buildcontrol:heroku</code>.",
|
||||
"Here are the specific User Stories you should implement for this Basejump:",
|
||||
"<span class='text-info'>User Story:</span> As an unauthenticated user, I should be able to login with Twitter.",
|
||||
"<span class='text-info'>User Story:</span> As an authenticated user, I should be able to link to images.",
|
||||
"<span class='text-info'>User Story:</span> As an authenticated user, I should be able to delete images that I've linked to.",
|
||||
"<span class='text-info'>User Story:</span> As an authenticated user, I should be able to see a pintrest style wall of all the images I've linked to.",
|
||||
"<span class='text-info'>User Story:</span> As an unauthenticated user, I should be able to browse other user's wall of images.",
|
||||
"<span class='text-info'>User Story:</span> As an unauthenticated user, I can login with Twitter.",
|
||||
"<span class='text-info'>User Story:</span> As an authenticated user, I can link to images.",
|
||||
"<span class='text-info'>User Story:</span> As an authenticated user, I can delete images that I've linked to.",
|
||||
"<span class='text-info'>User Story:</span> As an authenticated user, I can see a Pinterest-style wall of all the images I've linked to.",
|
||||
"<span class='text-info'>User Story:</span> As an unauthenticated user, I can browse other users' walls of images.",
|
||||
"<span class='text-info'>User Story:</span> As an unauthenticated user, I can see everyone's polls, but not be able to vote.",
|
||||
"<span class='text-info'>Bonus User Story:</span> As an authenticated user, if I upload an image that is broken, it will be replaced by a placeholder image. (can use jQuery broken image detection)",
|
||||
"<span class='text-info'>Bonus User Story:</span> As an authenticated user, if I don't like the options on a poll I can create a new option.",
|
||||
"<span class='text-info'>Hint:</span> <a href='http://masonry.desandro.com/'>Masonry.js</a> is a library that allows for Pintrest-style image grids.",
|
||||
"<span class='text-info'>Hint:</span> <a href='http://masonry.desandro.com/' target='_blank'>Masonry.js</a> is a library that allows for Pinterest-style image grids.",
|
||||
"Once you've finished implementing these user stories, click the \"I've completed this challenge\" button and enter the URLs for both your Github repository and your live app running on Heroku. If you pair programmed with a friend, enter his or her Free Code Camp username as well so that you both get credit for completing it.",
|
||||
"If you'd like immediate feedback on your project, click this button and paste in a link to your Heroku project. Otherwise, we'll review it before you start your nonprofit projects.<a class='btn btn-primary btn-block' href='https://twitter.com/intent/tweet?text=Check%20out%20the%20project%20I%20just%20built%20with%20%40FreeCodeCamp:%20%0A%20%23LearnToCode%20%23JavaScript' target='_blank'>Click here then add your link to your tweet's text</a>"
|
||||
"If you'd like immediate feedback on your project, click this button and paste in a link to your Heroku project. Otherwise, we'll review it before you start your nonprofit projects.<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:%20%0A%20%23LearnToCode%20%23JavaScript' target='_blank'>Click here then add your link to your tweet's text</a>"
|
||||
],
|
||||
"challengeType": 4,
|
||||
"tests": []
|
||||
|
@ -46,10 +46,10 @@
|
||||
},
|
||||
{
|
||||
"_id": "bd7158d9c441eddfaeb5bd2f",
|
||||
"name": "What are the advantages of Free Code Camp?",
|
||||
"name": "What are the main advantages of Free Code Camp?",
|
||||
"description": [
|
||||
"<div class=\"col-xs-12 col-sm-10 col-sm-offset-1\">",
|
||||
"<h3>",
|
||||
"<h3>Our main advantage is that we're accessible to busy adults who want to change careers. Specifically, we're:",
|
||||
" <ul>",
|
||||
" <li>• Free</li>",
|
||||
" <li>• Self-paced</li>",
|
||||
@ -66,17 +66,17 @@
|
||||
"<div class=\"col-xs-12 col-sm-10 col-sm-offset-1\">",
|
||||
"<h2>Our free, self-paced, browser-based program takes about 1,600 hours to complete.",
|
||||
"<div class='spacer'></div>",
|
||||
"<img class='img-center img-responsive' alt='First you'll do about 200 hours of lessons. These are our \"Waypoints\".' src='https://s3.amazonaws.com/freecodecamp/curriculum-diagram-waypoints.jpg'/>",
|
||||
"<img class='img-center img-responsive' alt='An image of a table showing the different segments of Free Code Camp's curriculum. This one shows that first you'll do about 200 hours of lessons. These are our \"Waypoints\".' src='https://s3.amazonaws.com/freecodecamp/curriculum-diagram-waypoints.jpg'/>",
|
||||
"<div class='spacer'></div>",
|
||||
"<img class='img-center img-responsive' alt='Next you'll write algorithms for 200 hours. These are our \"Bonfires\"' src='https://s3.amazonaws.com/freecodecamp/curriculum-diagram-bonfires.jpg'/>",
|
||||
"<img class='img-center img-responsive' alt='An image of a table showing the different segments of Free Code Camp's curriculum. This one shows that next you'll write algorithms for 200 hours. These are our \"Bonfires\"' src='https://s3.amazonaws.com/freecodecamp/curriculum-diagram-bonfires.jpg'/>",
|
||||
"<div class='spacer'></div>",
|
||||
"<img class='img-center img-responsive' alt='Next you'll write algorithms for 200 hours. These are our \"Ziplines\"' src='https://s3.amazonaws.com/freecodecamp/curriculum-diagram-ziplines.jpg'/>",
|
||||
"<img class='img-center img-responsive' alt='An image of a table showing the different segments of Free Code Camp's curriculum. This one shows that next you'll write algorithms for 200 hours. These are our \"Ziplines\"' src='https://s3.amazonaws.com/freecodecamp/curriculum-diagram-ziplines.jpg'/>",
|
||||
"<div class='spacer'></div>",
|
||||
"<img class='img-center img-responsive' alt='Next you'll write algorithms for 200 hours. These are our \"Basejumps\"' src='https://s3.amazonaws.com/freecodecamp/curriculum-diagram-basejumps.jpg'/>",
|
||||
"<img class='img-center img-responsive' alt='An image of a table showing the different segments of Free Code Camp's curriculum. This one shows that next you'll write algorithms for 200 hours. These are our \"Basejumps\"' src='https://s3.amazonaws.com/freecodecamp/curriculum-diagram-basejumps.jpg'/>",
|
||||
"<div class='spacer'></div>",
|
||||
"<img class='img-center img-responsive' alt='Finally you build full stack JavaScript apps for nonprofits for 600 hours. These are our \"Nonprofit Projects\"' src='https://s3.amazonaws.com/freecodecamp/curriculum-diagram-nonprofit-projects.jpg'/>",
|
||||
"<img class='img-center img-responsive' alt='An image of a table showing the different segments of Free Code Camp's curriculum. This one shows that finally you build full stack JavaScript apps for nonprofits for 600 hours. These are our \"Nonprofit Projects\"' src='https://s3.amazonaws.com/freecodecamp/curriculum-diagram-nonprofit-projects.jpg'/>",
|
||||
"<div class='spacer'></div>",
|
||||
"<img class='img-center img-responsive' alt='This gives you a total of 1,600 hours of coding experience.' src='https://s3.amazonaws.com/freecodecamp/curriculum-diagram-full.jpg'/>",
|
||||
"<img class='img-center img-responsive' alt='An image of a table showing the different segments of Free Code Camp's curriculum. This one shows that all of these sections summed up for a total of 1,600 hours of coding experience.' src='https://s3.amazonaws.com/freecodecamp/curriculum-diagram-full.jpg'/>",
|
||||
"</div>"
|
||||
]
|
||||
},
|
||||
@ -117,7 +117,6 @@
|
||||
" <ul>",
|
||||
" <li class=\"landing-p\">• JavaScript - the one programming language that all web browsers use</li>",
|
||||
" <li class=\"landing-p\">• Algorithms - step-by-step recipes for getting things done</li>",
|
||||
" <li class=\"landing-p\">• Automated Testing - write tests to test the limits of your code</li>",
|
||||
" </ul>",
|
||||
" </p>",
|
||||
" <p class=\"landing-p\">Finally you'll learn Agile Methodologies and Full Stack JavaScript to build projects for nonprofits:",
|
||||
@ -191,6 +190,39 @@
|
||||
"</div>"
|
||||
]
|
||||
},
|
||||
{
|
||||
"_id": "bd7158d9c436eddfaeb5bd2f",
|
||||
"name": "How do I get help when I get stuck?",
|
||||
"description": [
|
||||
"<div class=\"col-xs-12 col-sm-10 col-sm-offset-1\">",
|
||||
"<h3>When you get stuck, remember: RSAP.</h3>",
|
||||
"<p>",
|
||||
" <ol>",
|
||||
" <li><span class='text-info'>Read</span> the documentation or error</li>",
|
||||
" <li><span class='text-info'>Search</span> Google</li>",
|
||||
" <li><span class='text-info'>Ask</span> your friends for help</li>",
|
||||
" <li><span class='text-info'>Post</span> on Stack Overflow</li>",
|
||||
" </ol>",
|
||||
"</p>",
|
||||
"<p>This is the most time-efficient way to handle being stuck, and it's the most respectful of other people's time, too.</p>",
|
||||
"<p>Most of the time, you'll solve your problem after just one or two steps of this algorithm.</p>",
|
||||
"<p>We have a special chat room just for getting help: <a href='https://freecode.slack.com/messages/help/' target='_blank'>https://freecode.slack.com/messages/help/</a></p>",
|
||||
"<p>Also, if you need to post on Stack Overflow, be sure to read their guide to asking good questions: <a href='http://stackoverflow.com/help/how-to-ask' target='_blank'>http://stackoverflow.com/help/how-to-ask</a>.</p>",
|
||||
"<p>Learning to code is hard. But it's a lot easier if you ask for help when you need it!</p>",
|
||||
"</div>"
|
||||
]
|
||||
},
|
||||
{
|
||||
"_id": "bd7158d9c436eddfaeb5bd3f",
|
||||
"name": "Can I jump around in this Field Guide?",
|
||||
"description": [
|
||||
"<div class=\"col-xs-12 col-sm-10 col-sm-offset-1\">",
|
||||
"<h3>This Field Guide was designed as a reference for you. You shouldn't try to read it all today.</h3>",
|
||||
"<h3>Feel free to come back any time and jump around, reading any articles that seem interesting to you at the time.</h3>",
|
||||
"<h3>If you're currently doing our \"Browse our Field Guide\" Waypoint, go ahead and mark that challenge complete and move on to your next Waypoint.</h3>",
|
||||
"</div>"
|
||||
]
|
||||
},
|
||||
{
|
||||
"_id": "bd7158d9c436eddfaeb5bdef",
|
||||
"name": "If Free Code Camp is free, how does it make money?",
|
||||
@ -214,6 +246,7 @@
|
||||
]
|
||||
},
|
||||
{
|
||||
<<<<<<< HEAD
|
||||
"_id": "bd7158d9c436eddfaeb5bd2f",
|
||||
"name": "How do I get help when I get stuck?",
|
||||
"description": [
|
||||
@ -238,12 +271,16 @@
|
||||
{
|
||||
"_id": "bd7159d9c442eddfaeb5bdef",
|
||||
"name": "Global Mac Keyboard Shortcuts",
|
||||
=======
|
||||
"_id": "bd7158d9c442eddfaeb5bdef",
|
||||
"name": "How do I best use the Global Control Shortcuts for Mac?",
|
||||
>>>>>>> f17d8abf015930ec01d9a701c5f8241966344432
|
||||
"description": [
|
||||
"<div class=\"col-xs-12 col-sm-10 col-sm-offset-1\">",
|
||||
"<h2 class='text-center'></h2>",
|
||||
"<h2 class='text-center'>These Global Control Shortcuts for Mac will save you hours by speeding up your typing</h2><br>",
|
||||
"<div class=\"embed-responsive embed-responsive-16by9\"><iframe src=\"//player.vimeo.com/video/107073108\" class=\"embed-responsive-item\"></iframe></div>",
|
||||
"<div class=\"text-left\">",
|
||||
" <h3>These global shortcuts work everywhere on a Mac:",
|
||||
" <h3>These global shortcuts work everywhere on a Mac:</h3>",
|
||||
" <ul>",
|
||||
" <li>Control + F = Forward</li>",
|
||||
" <li>Control + B = Backward</li>",
|
||||
@ -260,9 +297,9 @@
|
||||
},
|
||||
{
|
||||
"_id": "bd7158d9c445eddfaeb5bdef",
|
||||
"name": "Gmail Zero Inbox Shortcuts",
|
||||
"name": "How can I get to Inbox Zero with Gmail Shortcuts?",
|
||||
"description": [
|
||||
"<h2 class='text-center'>These Gmail Shortcuts will save you hours and help you get to Zero Inbox</h2><br/>",
|
||||
"<h2 class='text-center'>These Gmail Shortcuts will save you hours and help you get to Zero Inbox.</h2><br/>",
|
||||
"<div class=\"embed-responsive embed-responsive-16by9\">",
|
||||
" <iframe src=\"//player.vimeo.com/video/115194016\" class=\"embed-responsive-item\"></iframe>",
|
||||
"</div>",
|
||||
@ -287,10 +324,10 @@
|
||||
},
|
||||
{
|
||||
"_id": "bd7158d9c446eddfaeb5bdef",
|
||||
"name": "A Guide to our Nonprofit Projects",
|
||||
"name": "How do Free Code Camp's Nonprofit Projects work?",
|
||||
"description": [
|
||||
"<div class='col-xs-12 col-sm-10 col-sm-offset-1'>",
|
||||
"<h2>Building nonprofit projects is the main way that our campers learn full stack JavaScript and agile software development. Once you complete the Free Code Camp challenges and Bonfire challenges, you'll begin this process.</p>",
|
||||
"<p>Building nonprofit projects is the main way that our campers learn full stack JavaScript and agile software development. Once you complete the Free Code Camp challenges and Bonfire challenges, you'll begin this process.</p>",
|
||||
"<p>Once you've finished all the challenges, click the \"I'm done with all the challenges\" button, which will become enabled. We will prompt you for your email address, then give you further instructions on our  <a href=\"http://www.freecodecamp.com/nonprofit-project-instructions\">Nonprofit Projects Instructions page</a>.</p>",
|
||||
"<p>We will add you to our  <a href=\"https://trello.com/b/BA3xVpz9/nonprofit-projects\">Nonprofit Project Trello board</a>.</p>",
|
||||
"<h2>Starting with the end in mind</h2>",
|
||||
@ -298,7 +335,7 @@
|
||||
"<p>You'll continue to work on nonprofit projects until you've built a sufficiently impressive portfolio and references to start your job search. Your portfolio will ultimately have three to five nonprofit projects. We estimate that the 900 hours of nonprofit projects you're going to complete, in addition to the 100 hours of challenges you've already completed, will be enough to qualify you for your first coding job. This will produce a much broader portfolio than a traditional coding bootcamp, which generally only has one or two capstone projects.</p>",
|
||||
"<h2>Choosing your first Nonprofit Project</h2>",
|
||||
"<p>We've categorized all the nonprofit projects by estimated time investment per camper: 100 hours, 200 hours, and 300 hours. These are only rough estimates.</p>",
|
||||
"<p>Example: if you and the camper you're paired up with (your pair) each stated you could work 20 hours per week (on the  <a href=\"http://goo.gl/forms/f61dLt67t8\">form you filled out</a>). If the project is a 100 hour per camper project, you should be able to complete it in about 5 weeks.</p>",
|
||||
"<p>Example: if you and the camper you're paired up with (your pair) each stated you could work 20 hours per week. If the project is a 100 hour per camper project, you should be able to complete it in about 5 weeks.</p>",
|
||||
"<p>Our team of nonprofit project camp counselors will match you and your pair based on:",
|
||||
" <ol>",
|
||||
" <li>Your estimated time commitment (10, 20 or 40 hours per week)</li>",
|
||||
@ -359,20 +396,18 @@
|
||||
},
|
||||
{
|
||||
"_id": "bd7158d9c447eddfaeb5bdef",
|
||||
"name": "Install Screenhero",
|
||||
"name": "How do I install Screenhero?",
|
||||
"description": [
|
||||
"<div class='text-center'>",
|
||||
"<h2><a href=\"http://links.screenhero.com/e/c/eyJlbWFpbF9pZCI6Ik1qQTNNem9XQkNJQ1pBQUNjd0FYQVZrVEdnRkxNamtfX0JWZEdGVEpSZkVCWlRwbFpXRTBNamM0WVMxaE56SmlMVEV4WlRRdE9HUXpZUzFpWXpVNE1HRTJNalkxTldNNk1UUTJNVEEyQUE9PSIsInBvc2l0aW9uIjowLCJocmVmIjoiaHR0cDovL2RsLnNjcmVlbmhlcm8uY29tL3NtYXJ0ZG93bmxvYWQvZklYQU1UUUJBTEtQQkhQTC9TY3JlZW5oZXJvLnppcD9zb3VyY2U9d2ViIn0=\">Download for Mac</a></h2>",
|
||||
"<h2><a href=\"http://links.screenhero.com/e/c/eyJlbWFpbF9pZCI6Ik1qQTNNem9XQkNJQ1pBQUNjd0FYQVZrVEdnRkxNamtfX0JWZEdGVEpSZkVCWlRwbFpXRTBNamM0WVMxaE56SmlMVEV4WlRRdE9HUXpZUzFpWXpVNE1HRTJNalkxTldNNk1UUTJNVEEyQUE9PSIsInBvc2l0aW9uIjoxLCJocmVmIjoiaHR0cDovL2RsLnNjcmVlbmhlcm8uY29tL3NtYXJ0ZG93bmxvYWQvZklYQU1UUUJBTEtQQkhQTC9TY3JlZW5oZXJvLXNldHVwLmV4ZSJ9\"> Download for Windows</a></h2>",
|
||||
"<p>You can learn more about using Screen Hero by taking  <a href=\"http://www.freecodecamp.com/challenges/34\">Challenge 34.</a></p>",
|
||||
"<p>Screen Hero was recently acquired by a collaboration tool called Slack.</p>",
|
||||
"It's still available and free, but will go away in the indefinite future. We'll replace it.</p>",
|
||||
"<h2>You'll use Screen Hero in <a href='/challenges/pair-program-on-bonfires'>http://freecodecamp.com/challenges/pair-program-on-bonfires</a></h2>",
|
||||
"</div>"
|
||||
]
|
||||
},
|
||||
{
|
||||
"_id": "bd7158d9c451eddfaeb5bded",
|
||||
"name": "Bonfire Style Guide",
|
||||
"name": "What is the style guide for Bonfires?",
|
||||
"description": [
|
||||
"<div class='col-xs-12 col-sm-10 col-sm-offset-1'>",
|
||||
"<h3>Writing Bonfire challenges is a great way to exercise your own problem solving and testing abilities. Follow this process closely to maximize the chances of us accepting your bonfire.</h3>",
|
||||
@ -407,7 +442,7 @@
|
||||
},
|
||||
{
|
||||
"_id": "bd7158d9c451eddfaeb5bdef",
|
||||
"name": "The Free Code Camp Privacy Policy",
|
||||
"name": "What is Free Code Camp Privacy Policy?",
|
||||
"description": [
|
||||
"<div class='col-xs-12 col-sm-10 col-sm-offset-1'>",
|
||||
"<p>Free Code Camp is committed to respecting the privacy of visitors to our web sites and web applications. The guidelines below explain how we protect the privacy of visitors to FreeCodeCamp.com and its features.</p>",
|
||||
|
@ -18,11 +18,8 @@ function storyLinkCleanup(cb) {
|
||||
console.log(i++);
|
||||
this.pause();
|
||||
story.storyLink = story.storyLink.
|
||||
replace(/\'/g, '').
|
||||
replace(/\"/g, '').
|
||||
replace(/,/g, '').
|
||||
replace(/\s+/g, ' ').
|
||||
replace(/[^a-z0-9\s]/gi, '').
|
||||
replace(/\s+/g, ' ').
|
||||
toLowerCase().
|
||||
trim();
|
||||
story.save(function (err) {
|
||||
|
@ -2,162 +2,161 @@ extends ../layout
|
||||
block content
|
||||
script.
|
||||
var challengeName = 'Profile View';
|
||||
.col-xs-12.col-sm-12.col-md-12
|
||||
.panel.panel-info
|
||||
.panel-heading.text-center
|
||||
h1 #{username}'s portfolio
|
||||
.panel-body
|
||||
if (user && user.profile.username === username)
|
||||
.row.text-center
|
||||
.col-xs-12.col-sm-10.col-sm-offset-1
|
||||
a.btn.btn-big.btn-primary.btn-block(href="/account") Update my portfolio page or manage my account
|
||||
.spacer
|
||||
.col-xs-12.col-sm-10.col-sm-offset-1
|
||||
a.btn.btn-big.btn-success.btn-block(href="/signout") Sign out of Free Code Camp
|
||||
.spacer
|
||||
.row
|
||||
.col-xs-12
|
||||
.col-xs-12.col-sm-12.col-md-5
|
||||
if picture
|
||||
img.img-center.img-responsive.public-profile-img(src=picture)
|
||||
else
|
||||
img.img-center.img-responsive.public-profile-img(src='https://s3.amazonaws.com/freecodecamp/camper-image-placeholder.png')
|
||||
h1.text-center.negative-5
|
||||
- if (twitterHandle)
|
||||
a.ion-social-twitter.text-primary(title="@#{username}'s Twitter Profile", href="http://twitter.com/#{twitterHandle}", target='_blank')
|
||||
- if (githubProfile)
|
||||
a.ion-social-github.text-primary(title="@#{username}'s GitHub Profile", href=githubProfile, target='_blank')
|
||||
- if (linkedinProfile)
|
||||
a.ion-social-linkedin.text-primary(title="@#{username}'s LinkedIn Profile", href=linkedinProfile, target='_blank')
|
||||
- if (codepenProfile)
|
||||
a.ion-social-codepen.text-primary(title="@#{username}'s CodePen Profile", href=codepenProfile, target='_blank')
|
||||
.visible-md.visible-lg
|
||||
.col-xs-12.col-sm-12.col-md-4.text-justify
|
||||
h1.flat-top.wrappable= name
|
||||
h3.flat-top.bolded.wrappable= location
|
||||
h4.flat-top.wrappable= bio
|
||||
.visible-xs.visible-sm
|
||||
.col-xs-12.col-sm-12.col-md-4.text-center
|
||||
h1.flat-top.wrappable= name
|
||||
h3.flat-top.bolded.wrappable= location
|
||||
h4.flat-top.wrappable= bio
|
||||
.col-xs-12.col-sm-12.col-md-3.text-center
|
||||
.background-svg.img-center
|
||||
.points-on-top
|
||||
= "[ " + (user ? user.progressTimestamps.length : 0) + " ]"
|
||||
.panel.panel-info
|
||||
.panel-heading.text-center
|
||||
h1 #{username}'s portfolio
|
||||
.panel-body
|
||||
if (user && user.profile.username === username)
|
||||
.row.text-center
|
||||
.col-xs-12.col-sm-10.col-sm-offset-1
|
||||
a.btn.btn-big.btn-primary.btn-block(href="/account") Update my portfolio page or manage my account
|
||||
.spacer
|
||||
.col-xs-12.col-sm-10.col-sm-offset-1
|
||||
a.btn.btn-big.btn-success.btn-block(href="/signout") Sign out of Free Code Camp
|
||||
.spacer
|
||||
.row
|
||||
.col-xs-12
|
||||
.col-xs-12.col-sm-12.col-md-5
|
||||
if picture
|
||||
img.img-center.img-responsive.public-profile-img(src=picture)
|
||||
else
|
||||
img.img-center.img-responsive.public-profile-img(src='https://s3.amazonaws.com/freecodecamp/camper-image-placeholder.png')
|
||||
h1.text-center.negative-5
|
||||
- if (twitterHandle)
|
||||
a.ion-social-twitter.text-primary(title="@#{username}'s Twitter Profile", href="http://twitter.com/#{twitterHandle}", target='_blank')
|
||||
- if (githubProfile)
|
||||
a.ion-social-github.text-primary(title="@#{username}'s GitHub Profile", href=githubProfile, target='_blank')
|
||||
- if (linkedinProfile)
|
||||
a.ion-social-linkedin.text-primary(title="@#{username}'s LinkedIn Profile", href=linkedinProfile, target='_blank')
|
||||
- if (codepenProfile)
|
||||
a.ion-social-codepen.text-primary(title="@#{username}'s CodePen Profile", href=codepenProfile, target='_blank')
|
||||
.visible-md.visible-lg
|
||||
.col-xs-12.col-sm-12.col-md-4.text-justify
|
||||
h1.flat-top.wrappable= name
|
||||
h3.flat-top.bolded.wrappable= location
|
||||
h4.flat-top.wrappable= bio
|
||||
.visible-xs.visible-sm
|
||||
.col-xs-12.col-sm-12.col-md-4.text-center
|
||||
h1.flat-top.wrappable= name
|
||||
h3.flat-top.bolded.wrappable= location
|
||||
h4.flat-top.wrappable= bio
|
||||
.col-xs-12.col-sm-12.col-md-3.text-center
|
||||
.background-svg.img-center
|
||||
.points-on-top
|
||||
= "[ " + (user ? user.progressTimestamps.length : 0) + " ]"
|
||||
|
||||
|
||||
.row
|
||||
.col-xs-12
|
||||
if (website1Title && website1Link && website1Image)
|
||||
.row
|
||||
.col-xs-12.col-md-5
|
||||
img.img-center.img-responsive.portfolio-image(src=website1Image, alt="@#{username}'s #{website1Title}")
|
||||
.col-xs-12.col-md-7
|
||||
h3.text-center.wrappable.flat-top= website1Title
|
||||
a.btn.btn-lg.btn-block.btn-info(href=website1Link, target='_blank')
|
||||
i.fa.icon-beaker
|
||||
| Try it out
|
||||
br
|
||||
if (website1Title && website1Link && !website1Image)
|
||||
.col-xs-12.col-md-12
|
||||
.row
|
||||
.col-xs-12
|
||||
if (website1Title && website1Link && website1Image)
|
||||
.row
|
||||
.col-xs-12.col-md-5
|
||||
img.img-center.img-responsive.portfolio-image(src=website1Image, alt="@#{username}'s #{website1Title}")
|
||||
.col-xs-12.col-md-7
|
||||
h3.text-center.wrappable.flat-top= website1Title
|
||||
a.btn.btn-lg.btn-block.btn-info(href=website1Link, target='_blank')
|
||||
i.fa.icon-beaker
|
||||
| Try it out
|
||||
br
|
||||
if (website2Title && website2Link && website2Image)
|
||||
.row
|
||||
.col-xs-12.col-md-5
|
||||
img.img-responsive.portfolio-image.img-center(src=website2Image, alt="@#{username}'s #{website2Title}")
|
||||
.col-xs-12.col-md-7
|
||||
h3.text-center.wrappable.flat-top= website2Title
|
||||
a.btn.btn-lg.btn-block.btn-info(href=website2Link, target='_blank')
|
||||
i.fa.icon-beaker
|
||||
| Try it out
|
||||
br
|
||||
if (website1Title && website1Link && !website1Image)
|
||||
.col-xs-12.col-md-12
|
||||
h3.text-center.wrappable.flat-top= website1Title
|
||||
a.btn.btn-lg.btn-block.btn-info(href=website1Link, target='_blank')
|
||||
i.fa.icon-beaker
|
||||
| Try it out
|
||||
br
|
||||
if (website2Title && website2Link && !website2Image)
|
||||
.col-xs-12.col-md-12
|
||||
if (website2Title && website2Link && website2Image)
|
||||
.row
|
||||
.col-xs-12.col-md-5
|
||||
img.img-responsive.portfolio-image.img-center(src=website2Image, alt="@#{username}'s #{website2Title}")
|
||||
.col-xs-12.col-md-7
|
||||
h3.text-center.wrappable.flat-top= website2Title
|
||||
a.btn.btn-lg.btn-block.btn-info(href=website2Link, target='_blank')
|
||||
i.fa.icon-beaker
|
||||
| Try it out
|
||||
br
|
||||
if (website3Title && website3Link && website3Image)
|
||||
.row
|
||||
.col-xs-12.col-md-5
|
||||
img.img-responsive.portfolio-image.img-center(src=website3Image, alt="@#{username}'s #{website1Title}")
|
||||
.col-xs-12.col-md-7
|
||||
h3.text-center.wrappable.flat-top= website3Title
|
||||
a.btn.btn-lg.btn-block.btn-info(href=website3Link, target='_blank')
|
||||
i.fa.icon-beaker
|
||||
| Try it out
|
||||
if (website3Title && website3Link && !website3Image)
|
||||
.col-xs-12.col-md-12
|
||||
br
|
||||
if (website2Title && website2Link && !website2Image)
|
||||
.col-xs-12.col-md-12
|
||||
h3.text-center.wrappable.flat-top= website2Title
|
||||
a.btn.btn-lg.btn-block.btn-info(href=website2Link, target='_blank')
|
||||
i.fa.icon-beaker
|
||||
| Try it out
|
||||
br
|
||||
if (website3Title && website3Link && website3Image)
|
||||
.row
|
||||
.col-xs-12.col-md-5
|
||||
img.img-responsive.portfolio-image.img-center(src=website3Image, alt="@#{username}'s #{website1Title}")
|
||||
.col-xs-12.col-md-7
|
||||
h3.text-center.wrappable.flat-top= website3Title
|
||||
a.btn.btn-lg.btn-block.btn-info(href=website3Link, target='_blank')
|
||||
i.fa.icon-beaker
|
||||
| Try it out
|
||||
if (website3Title && website3Link && !website3Image)
|
||||
.col-xs-12.col-md-12
|
||||
h3.text-center.wrappable.flat-top= website3Title
|
||||
a.btn.btn-lg.btn-block.btn-info(href=website3Link, target='_blank')
|
||||
i.fa.icon-beaker
|
||||
| Try it out
|
||||
|
||||
.hidden-xs.col-sm-12
|
||||
script(src="//d3js.org/d3.v3.min.js")
|
||||
script(src="//cdn.jsdelivr.net/cal-heatmap/3.3.10/cal-heatmap.min.js")
|
||||
#cal-heatmap.img-center
|
||||
script.
|
||||
$(document).ready(function() {
|
||||
setTimeout(function() {
|
||||
var cal = new CalHeatMap();
|
||||
var calendar = !{JSON.stringify(calender)};
|
||||
cal.init({
|
||||
itemSelector: "#cal-heatmap",
|
||||
domain: "month",
|
||||
subDomain: "day",
|
||||
data: calendar,
|
||||
cellSize: 15,
|
||||
align: 'center',
|
||||
cellRadius: 3,
|
||||
cellPadding: 2,
|
||||
tooltip: true,
|
||||
range: 4,
|
||||
start: new Date().setDate(new Date().getDate() - 90),
|
||||
legendColors: ["#cccccc", "#215f1e"],
|
||||
legend: [1, 2, 3]
|
||||
});
|
||||
}, 300);
|
||||
});
|
||||
.row
|
||||
.hidden-xs.col-sm-12.text-center
|
||||
.row.text-primary
|
||||
h4.col-sm-6.text-right Longest Streak: #{longestStreak}
|
||||
h4.col-sm-6.text-left Current Streak: #{currentStreak}
|
||||
.hidden-xs.col-sm-12
|
||||
script(src="//d3js.org/d3.v3.min.js")
|
||||
script(src="//cdn.jsdelivr.net/cal-heatmap/3.3.10/cal-heatmap.min.js")
|
||||
#cal-heatmap.img-center
|
||||
script.
|
||||
$(document).ready(function() {
|
||||
setTimeout(function() {
|
||||
var cal = new CalHeatMap();
|
||||
var calendar = !{JSON.stringify(calender)};
|
||||
cal.init({
|
||||
itemSelector: "#cal-heatmap",
|
||||
domain: "month",
|
||||
subDomain: "day",
|
||||
data: calendar,
|
||||
cellSize: 15,
|
||||
align: 'center',
|
||||
cellRadius: 3,
|
||||
cellPadding: 2,
|
||||
tooltip: true,
|
||||
range: 4,
|
||||
start: new Date().setDate(new Date().getDate() - 90),
|
||||
legendColors: ["#cccccc", "#215f1e"],
|
||||
legend: [1, 2, 3]
|
||||
});
|
||||
}, 300);
|
||||
});
|
||||
.row
|
||||
.hidden-xs.col-sm-12.text-center
|
||||
.row.text-primary
|
||||
h4.col-sm-6.text-right Longest Streak: #{longestStreak}
|
||||
h4.col-sm-6.text-left Current Streak: #{currentStreak}
|
||||
|
||||
- if (challenges.length > 0)
|
||||
.col-sm-12
|
||||
table.table.table-striped
|
||||
thead
|
||||
tr
|
||||
th.col-xs-4 Challenge
|
||||
th.col-xs-2 Completed
|
||||
th.col-xs-6 Link
|
||||
for challenge in challenges
|
||||
tr
|
||||
td.col-xs-4= challenge.name
|
||||
td.col-xs-2= moment(challenge.completedDate, 'x').format("MMM DD, YYYY")
|
||||
td.col-xs-6
|
||||
a(href=challenge.solution) View my solution
|
||||
- if (challenges.length > 0)
|
||||
.col-sm-12
|
||||
table.table.table-striped
|
||||
thead
|
||||
tr
|
||||
th.col-xs-4 Challenge
|
||||
th.col-xs-2 Completed
|
||||
th.col-xs-6 Link
|
||||
for challenge in challenges
|
||||
tr
|
||||
td.col-xs-4= challenge.name
|
||||
td.col-xs-2= moment(challenge.completedDate, 'x').format("MMM DD, YYYY")
|
||||
td.col-xs-6
|
||||
a(href=challenge.solution) View my solution
|
||||
|
||||
br
|
||||
- if (bonfires.length > 0)
|
||||
.col-sm-12
|
||||
table.table.table-striped
|
||||
thead
|
||||
tr
|
||||
th.col-xs-4 Bonfire
|
||||
th.col-xs-2 Completed
|
||||
th.col-xs-6 Solution
|
||||
for bonfire in bonfires
|
||||
tr
|
||||
td.col-xs-4= bonfire.name
|
||||
td.col-xs-2= moment(bonfire.completedDate, 'x').format("MMM DD, YYYY")
|
||||
td.col-xs-6= bonfire.solution
|
||||
br
|
||||
br
|
||||
- if (bonfires.length > 0)
|
||||
.col-sm-12
|
||||
table.table.table-striped
|
||||
thead
|
||||
tr
|
||||
th.col-xs-4 Bonfire
|
||||
th.col-xs-2 Completed
|
||||
th.col-xs-6 Solution
|
||||
for bonfire in bonfires
|
||||
tr
|
||||
td.col-xs-4= bonfire.name
|
||||
td.col-xs-2= moment(bonfire.completedDate, 'x').format("MMM DD, YYYY")
|
||||
td.col-xs-6= bonfire.solution
|
||||
br
|
||||
|
@ -1,116 +1,114 @@
|
||||
extends ../layout
|
||||
block content
|
||||
.col-xs-12.col-sm-12.col-md-12
|
||||
.panel.panel-info
|
||||
.panel-heading.text-center
|
||||
h1 Challenge Map
|
||||
.panel-body
|
||||
.col-xs-12
|
||||
if (Math.random() > 0.99)
|
||||
img.img-responsive.img-center(src='https://s3.amazonaws.com/freecodecamp/wide-social-banner-dino.png')
|
||||
else
|
||||
img.img-responsive.img-center(src='https://s3.amazonaws.com/freecodecamp/wide-social-banner.png')
|
||||
.col-xs-12.col-md-8.col-md-offset-2
|
||||
h2.text-center
|
||||
span.text-primary #{camperCount}  
|
||||
| campers have joined our community
|
||||
br
|
||||
| since we launched  
|
||||
span.text-primary #{daysRunning}  
|
||||
| days ago.
|
||||
h2
|
||||
span.fa.fa-flag
|
||||
| Waypoints (200 hours of lessons)
|
||||
.panel.panel-info
|
||||
.panel-heading.text-center
|
||||
h1 Challenge Map
|
||||
.panel-body
|
||||
if (Math.random() > 0.99)
|
||||
img.img-responsive.img-center.border-radius-5(src='https://s3.amazonaws.com/freecodecamp/wide-social-banner-dino.png')
|
||||
else
|
||||
img.img-responsive.img-center.border-radius-5(src='https://s3.amazonaws.com/freecodecamp/wide-social-banner.png')
|
||||
.col-xs-12.col-md-8.col-md-offset-2
|
||||
h2.text-center
|
||||
span.text-primary #{camperCount}  
|
||||
| campers have joined our community
|
||||
br
|
||||
| since we launched  
|
||||
span.text-primary #{daysRunning}  
|
||||
| days ago.
|
||||
h2
|
||||
span.fa.fa-flag
|
||||
| Waypoints (200 hours of lessons)
|
||||
|
||||
.col-xs-12
|
||||
h3.negative-15
|
||||
ol
|
||||
for waypoint in waypoints
|
||||
if completedCoursewareList.indexOf(waypoint._id) > -1
|
||||
.row
|
||||
.hidden-xs.col-sm-3.col-md-2.text-primary.ion-checkmark-circled.padded-ionic-icon.text-center
|
||||
.col-xs-12.col-sm-9.col-md-10
|
||||
li.faded
|
||||
a(href="/challenges/#{waypoint.name}")= waypoint.name
|
||||
.col-xs-12.no-right-padding
|
||||
h3.negative-15
|
||||
ol
|
||||
for waypoint in waypoints
|
||||
if completedCoursewareList.indexOf(waypoint._id) > -1
|
||||
.row
|
||||
.hidden-xs.col-sm-3.col-md-2.text-primary.ion-checkmark-circled.padded-ionic-icon.text-center
|
||||
.col-xs-12.col-sm-9.col-md-10
|
||||
li.faded
|
||||
a(href="/challenges/#{waypoint.name}")= waypoint.name
|
||||
|
||||
else
|
||||
.row
|
||||
.hidden-xs.col-sm-3.col-md-2
|
||||
span
|
||||
.col-xs-12.col-sm-9.col-md-10
|
||||
li
|
||||
a(href="/challenges/#{waypoint.name}")= waypoint.name
|
||||
h2
|
||||
span.ion-bonfire
|
||||
| Bonfires (200 hours of JavaScript algorithm practice)
|
||||
.col-xs-12
|
||||
h3.negative-15
|
||||
ol
|
||||
for bonfire in bonfires
|
||||
if completedBonfireList.indexOf(bonfire._id) > -1
|
||||
.row
|
||||
.hidden-xs.col-sm-3.col-md-2.text-primary.ion-checkmark-circled.padded-ionic-icon.text-center
|
||||
.col-xs-12.col-sm-9.col-md-10
|
||||
li.faded
|
||||
a(href="/bonfires/#{bonfire.name}")= bonfire.name
|
||||
else
|
||||
.row
|
||||
.hidden-xs.col-sm-3.col-md-2
|
||||
span
|
||||
.col-xs-12.col-sm-9.col-md-10
|
||||
li
|
||||
a(href="/bonfires/#{bonfire.name}")= bonfire.name
|
||||
h2
|
||||
span.fa.fa-angle-double-right
|
||||
| Ziplines (200 hours of front end development)
|
||||
.col-xs-12
|
||||
h3.negative-15
|
||||
ol
|
||||
for zipline in ziplines
|
||||
if completedCoursewareList.indexOf(zipline._id) > -1
|
||||
.row
|
||||
.hidden-xs.col-sm-3.col-md-2.text-primary.ion-checkmark-circled.padded-ionic-icon.text-center
|
||||
.col-xs-12.col-sm-9.col-md-10
|
||||
li.faded
|
||||
a(href="/challenges/#{zipline.name}")= zipline.name
|
||||
else
|
||||
.row
|
||||
.hidden-xs.col-sm-3.col-md-2
|
||||
span
|
||||
.col-xs-12.col-sm-9.col-md-10
|
||||
li
|
||||
a(href="/challenges/#{zipline.name}")= zipline.name
|
||||
h2
|
||||
span.fa.fa-level-down
|
||||
| Basejumps (200 hours of full stack development)
|
||||
.col-xs-12
|
||||
h3.negative-15
|
||||
ol
|
||||
for basejump in basejumps
|
||||
if completedCoursewareList.indexOf(basejump._id) > -1
|
||||
.row
|
||||
.hidden-xs.col-sm-3.col-md-2.text-primary.ion-checkmark-circled.padded-ionic-icon.text-center
|
||||
.col-xs-12.col-sm-9.col-md-10
|
||||
li.faded
|
||||
a(href="/challenges/#{basejump.name}")= basejump.name
|
||||
else
|
||||
.row
|
||||
.hidden-xs.col-sm-3.col-md-2
|
||||
span
|
||||
.col-xs-12.col-sm-9.col-md-10
|
||||
li
|
||||
a(href="/challenges/#{basejump.name}")= basejump.name
|
||||
h2
|
||||
span.ion-ios-heart Nonprofit Projects (800 hours of real-world experience)*
|
||||
h3.negative-15
|
||||
ul
|
||||
else
|
||||
.row
|
||||
.hidden-xs.col-sm-3.col-md-2
|
||||
span
|
||||
.col-xs-12.col-sm-9.col-md-10
|
||||
li
|
||||
a(href="/nonprofits/directory") Browse our nonprofit projects
|
||||
p * Complete all Waypoints, Bonfires, Ziplines and Basejumps to be assigned your first nonprofit project
|
||||
a(href="/challenges/#{waypoint.name}")= waypoint.name
|
||||
h2
|
||||
span.ion-bonfire
|
||||
| Bonfires (200 hours of JavaScript algorithm practice)
|
||||
.col-xs-12
|
||||
h3.negative-15
|
||||
ol
|
||||
for bonfire in bonfires
|
||||
if completedBonfireList.indexOf(bonfire._id) > -1
|
||||
.row
|
||||
.hidden-xs.col-sm-3.col-md-2.text-primary.ion-checkmark-circled.padded-ionic-icon.text-center
|
||||
.col-xs-12.col-sm-9.col-md-10
|
||||
li.faded
|
||||
a(href="/bonfires/#{bonfire.name}")= bonfire.name
|
||||
else
|
||||
.row
|
||||
.hidden-xs.col-sm-3.col-md-2
|
||||
span
|
||||
.col-xs-12.col-sm-9.col-md-10
|
||||
li
|
||||
a(href="/bonfires/#{bonfire.name}")= bonfire.name
|
||||
h2
|
||||
span.fa.fa-angle-double-right
|
||||
| Ziplines (200 hours of front end development)
|
||||
.col-xs-12
|
||||
h3.negative-15
|
||||
ol
|
||||
for zipline in ziplines
|
||||
if completedCoursewareList.indexOf(zipline._id) > -1
|
||||
.row
|
||||
.hidden-xs.col-sm-3.col-md-2.text-primary.ion-checkmark-circled.padded-ionic-icon.text-center
|
||||
.col-xs-12.col-sm-9.col-md-10
|
||||
li.faded
|
||||
a(href="/challenges/#{zipline.name}")= zipline.name
|
||||
else
|
||||
.row
|
||||
.hidden-xs.col-sm-3.col-md-2
|
||||
span
|
||||
.col-xs-12.col-sm-9.col-md-10
|
||||
li
|
||||
a(href="/challenges/#{zipline.name}")= zipline.name
|
||||
h2
|
||||
span.fa.fa-level-down
|
||||
| Basejumps (200 hours of full stack development)
|
||||
.col-xs-12
|
||||
h3.negative-15
|
||||
ol
|
||||
for basejump in basejumps
|
||||
if completedCoursewareList.indexOf(basejump._id) > -1
|
||||
.row
|
||||
.hidden-xs.col-sm-3.col-md-2.text-primary.ion-checkmark-circled.padded-ionic-icon.text-center
|
||||
.col-xs-12.col-sm-9.col-md-10
|
||||
li.faded
|
||||
a(href="/challenges/#{basejump.name}")= basejump.name
|
||||
else
|
||||
.row
|
||||
.hidden-xs.col-sm-3.col-md-2
|
||||
span
|
||||
.col-xs-12.col-sm-9.col-md-10
|
||||
li
|
||||
a(href="/challenges/#{basejump.name}")= basejump.name
|
||||
h2
|
||||
span.ion-ios-heart Nonprofit Projects (800 hours of real-world experience)*
|
||||
h3.negative-15
|
||||
ul
|
||||
.row
|
||||
.hidden-xs.col-sm-3.col-md-2
|
||||
span
|
||||
.col-xs-12.col-sm-9.col-md-10
|
||||
li
|
||||
a(href="/nonprofits/directory") Browse our nonprofit projects
|
||||
p * Complete all Waypoints, Bonfires, Ziplines and Basejumps to be assigned your first nonprofit project
|
||||
|
||||
#announcementModal.modal(tabindex='-1')
|
||||
.modal-dialog.animated.fadeInUp.fast-animation
|
||||
@ -118,7 +116,11 @@ block content
|
||||
.modal-header.challenge-list-header Join our Saturday Summit!
|
||||
a.close.closing-x(href='#', data-dismiss='modal', aria-hidden='true') ×
|
||||
.modal-body
|
||||
<<<<<<< HEAD
|
||||
h3.text-left Saturday at Noon EDT: We'll live-stream our Saturday Summit on Twitch.tv. Join us as our community turns 200 days old. We'll have Nonprofit Project demos from 6 of our campers.  
|
||||
=======
|
||||
h3.text-left Saturday at Noon EDT: We'll live-stream our Saturday Summit on Twitch.tv Join us as our community turns 200 days old. We'll have Nonprofit Project demos from 6 of our campers.  
|
||||
>>>>>>> f17d8abf015930ec01d9a701c5f8241966344432
|
||||
a(href='http://www.freecodecamp.com/twitch', target='_blank') Add it to your calendar here
|
||||
| .
|
||||
a.btn.btn-lg.btn-info.btn-block(name='_csrf', value=_csrf, aria-hidden='true', href='http://twitch.tv/freecodecamp', target='_blank') Follow us on Twitch.tv
|
||||
|
@ -8,9 +8,9 @@ block content
|
||||
ol
|
||||
for step, index in details
|
||||
.row.checklist-element(id="#{dashedName + index}")
|
||||
.col-xs-2.col-sm-1.col-md-2.padded-ionic-icon.text-center
|
||||
.col-xs-3.col-sm-1.col-md-2.padded-ionic-icon.text-center
|
||||
input(type='checkbox' class='challenge-list-checkbox')
|
||||
.col-xs-10.col-sm-11.col-md-10
|
||||
.col-xs-9.col-sm-11.col-md-10
|
||||
li
|
||||
.step-text!= step
|
||||
.col-xs-12.col-sm-12.col-md-8
|
||||
@ -67,6 +67,7 @@ block content
|
||||
$('#complete-courseware-dialog').bind('keypress', modalControlEnterHandler);
|
||||
|
||||
- if (user.progressTimestamps.length > 2)
|
||||
.button-spacer
|
||||
a.animated.fadeIn.btn.btn-lg.btn-block.btn-twitter(href="https://twitter.com/intent/tweet?text=I%20just%20#{verb}%20%40FreeCodeCamp%20Challenge:%20#{name}&url=http%3A%2F%2Ffreecodecamp.com/challenges/#{dashedName}&hashtags=LearnToCode, JavaScript" target="_blank")
|
||||
i.fa.fa-twitter  
|
||||
= phrase
|
||||
|
@ -8,9 +8,9 @@ block content
|
||||
ol
|
||||
for step, index in details
|
||||
.row.checklist-element(id="#{dashedName + index}")
|
||||
.col-xs-2.col-sm-1.col-md-2.padded-ionic-icon.text-center
|
||||
.col-xs-3.col-sm-1.col-md-2.padded-ionic-icon.text-center
|
||||
input(type='checkbox' class='challenge-list-checkbox')
|
||||
.col-xs-10.col-sm-11.col-md-10
|
||||
.col-xs-9.col-sm-11.col-md-10
|
||||
li
|
||||
.step-text!= step
|
||||
.col-xs-12.col-sm-12.col-md-8
|
||||
@ -35,13 +35,13 @@ block content
|
||||
var controlEnterHandler = function (e) {
|
||||
$('body').unbind('keypress');
|
||||
if (e.ctrlKey && e.keyCode == 13) {
|
||||
$('#complete-courseware-dialog').modal('show');
|
||||
$('#complete-zipline-or-basejump-dialog').modal('show');
|
||||
} else {
|
||||
$('body').bind('keypress', controlEnterHandler);
|
||||
}
|
||||
};
|
||||
var modalControlEnterHandler = function (e) {
|
||||
$('#complete-courseware-dialog').unbind('keypress');
|
||||
$('#complete-zipline-or-basejump-dialog').unbind('keypress');
|
||||
if (e.ctrlKey && e.keyCode == 13) {
|
||||
$('#next-courseware-button').click();
|
||||
} else {
|
||||
@ -83,6 +83,7 @@ block content
|
||||
$('#complete-zipline-or-basejump-dialog').on('keypress', modalControlEnterHandler);
|
||||
|
||||
- if (user.progressTimestamps.length > 2)
|
||||
.button-spacer
|
||||
a.animated.fadeIn.btn.btn-lg.btn-block.btn-twitter(target="_blank")
|
||||
i.fa.fa-twitter  
|
||||
= phrase
|
||||
|
@ -2,27 +2,24 @@ extends ../layout
|
||||
block content
|
||||
script.
|
||||
var challengeName = 'Field Guide View';
|
||||
.col-xs-12.col-sm-12.col-md-12
|
||||
.panel.panel-info
|
||||
.panel-heading.text-center
|
||||
h1= title
|
||||
.panel-body
|
||||
.row
|
||||
.col-xs-12
|
||||
div!= description
|
||||
.spacer
|
||||
.spacer
|
||||
.spacer
|
||||
.col-xs-12.col-sm-6.col-sm-offset-3
|
||||
.text-center
|
||||
if user
|
||||
.next-field-guide-button.btn.btn-primary.btn-big.btn-block Next article (ctrl + enter)
|
||||
.ten-pixel-break
|
||||
#showAllButton.btn.btn-info.btn-big.btn-block Show me all articles
|
||||
if !user
|
||||
.ten-pixel-break
|
||||
a.btn.btn-big.signup-btn.btn-block(href="/login") Start learning to code (it's free)
|
||||
.panel.panel-info.no-padding
|
||||
.panel-heading.text-center
|
||||
h1= title
|
||||
.panel-body
|
||||
div!= description
|
||||
.spacer
|
||||
.spacer
|
||||
.spacer
|
||||
.col-xs-12.col-sm-6.col-sm-offset-3
|
||||
.text-center
|
||||
if user
|
||||
.next-field-guide-button.btn.btn-primary.btn-big.btn-block Next article (ctrl + enter)
|
||||
.ten-pixel-break
|
||||
#showAllButton.btn.btn-info.btn-big.btn-block Show me all articles
|
||||
if !user
|
||||
.ten-pixel-break
|
||||
a.btn.btn-big.signup-btn.btn-block(href="/login") Start learning to code (it's free)
|
||||
.spacer
|
||||
#show-all-dialog.modal(tabindex='-1')
|
||||
.modal-dialog.animated.fadeInUp.fast-animation
|
||||
.modal-content
|
||||
|
@ -2,77 +2,76 @@ extends ../layout
|
||||
block content
|
||||
script.
|
||||
var challengeName = 'Nonprofits View';
|
||||
.col-xs-12.col-sm-12.col-md-12
|
||||
.panel.panel-info
|
||||
.panel-heading.text-center= title
|
||||
.panel-body
|
||||
.row
|
||||
.col-xs-12.col-sm-10.col-sm-offset-1
|
||||
.row
|
||||
.panel.panel-info
|
||||
.panel-heading.text-center= title
|
||||
.panel-body
|
||||
.row
|
||||
.col-xs-12.col-sm-10.col-sm-offset-1
|
||||
.row
|
||||
.col-xs-12
|
||||
img.img-center.img-responsive(src=imageUrl)
|
||||
.spacer
|
||||
.row
|
||||
.col-xs-12.col-sm-4
|
||||
img.img-responsive(src=logoUrl)
|
||||
.col-xs-12.col-sm-8
|
||||
.col-xs-12
|
||||
img.img-center.img-responsive(src=imageUrl)
|
||||
.spacer
|
||||
.row
|
||||
.col-xs-12.col-sm-4
|
||||
img.img-responsive(src=logoUrl)
|
||||
.col-xs-12.col-sm-8
|
||||
.col-xs-12
|
||||
h4= whatDoesNonprofitDo
|
||||
h4
|
||||
a(href=websiteLink)= websiteLink
|
||||
.spacer
|
||||
h3 Project Description:
|
||||
.col-xs-12
|
||||
h4.negative-15 #{projectDescription} (About #{estimatedHours} hours per camper)
|
||||
.spacer
|
||||
h3 This project involves building:
|
||||
h4.negative-15.col-xs-12
|
||||
if (approvedWebsite)
|
||||
.ion-android-globe Website
|
||||
if (approvedDonor)
|
||||
.ion-card Donor Management System
|
||||
if (approvedInventory)
|
||||
.ion-ios-box Inventory Management System
|
||||
if (approvedVolunteer)
|
||||
.ion-android-calendar Volunteer Management System
|
||||
if (approvedForm)
|
||||
.ion-ios-list Webform
|
||||
if (approvedCommunity)
|
||||
.ion-ios-people Community Management System
|
||||
if (approvedELearning)
|
||||
.ion-university E-learning Platform
|
||||
if (approvedOther)
|
||||
.ion-settings Other tools
|
||||
h3 Project Status: #{currentStatus}
|
||||
if (interestedCampers && interestedCampers.length > 0)
|
||||
h3 Interested campers:
|
||||
.col-xs-12.text-left
|
||||
for interestedCamper in interestedCampers
|
||||
a(href='/' + interestedCamper.username class="interested-camper-image")
|
||||
img.profile-picture.float-right(src=interestedCamper.picture)
|
||||
if (assignedCampers && assignedCampers.length > 0)
|
||||
h3 Assigned campers:
|
||||
.col-xs-12.text-left
|
||||
for assignedCamper in assignedCampers
|
||||
a(href='/' + assignedCamper.username class="interested-camper-image")
|
||||
img.profile-picture.float-right(src=assignedCamper.picture)
|
||||
.spacer
|
||||
if (!buttonActive)
|
||||
.col-xs-12.col-sm-8.col-sm-offset-2
|
||||
.text-center
|
||||
a.btn.btn-primary.btn-big.btn-block.disabled(href='/nonprofits/interested-in-nonprofit/#{dashedName}') I'm interested in building this project *
|
||||
p * Complete all our Bonfires, Ziplines, and Basejumps to unlock this.
|
||||
#showAllButton.btn.btn-info.btn-big.btn-block Show all Nonprofits Projects
|
||||
if (buttonActive)
|
||||
.col-xs-12.col-sm-8.col-sm-offset-2
|
||||
.text-center
|
||||
a.btn.btn-primary.btn-big.btn-block(href='/nonprofits/interested-in-nonprofit/#{dashedName}') I'm interested in building this project
|
||||
#showAllButton.btn.btn-info.btn-big.btn-block Show all Nonprofits Projects
|
||||
.row
|
||||
.col-xs-12.text-center
|
||||
if !user
|
||||
a.btn.btn-cta.signup-btn.btn-primary(href="/login") Start learning to code (it's free)
|
||||
h4= whatDoesNonprofitDo
|
||||
h4
|
||||
a(href=websiteLink)= websiteLink
|
||||
.spacer
|
||||
h3 Project Description:
|
||||
.col-xs-12
|
||||
h4.negative-15 #{projectDescription} (About #{estimatedHours} hours per camper)
|
||||
.spacer
|
||||
h3 This project involves building:
|
||||
h4.negative-15.col-xs-12
|
||||
if (approvedWebsite)
|
||||
.ion-android-globe Website
|
||||
if (approvedDonor)
|
||||
.ion-card Donor Management System
|
||||
if (approvedInventory)
|
||||
.ion-ios-box Inventory Management System
|
||||
if (approvedVolunteer)
|
||||
.ion-android-calendar Volunteer Management System
|
||||
if (approvedForm)
|
||||
.ion-ios-list Webform
|
||||
if (approvedCommunity)
|
||||
.ion-ios-people Community Management System
|
||||
if (approvedELearning)
|
||||
.ion-university E-learning Platform
|
||||
if (approvedOther)
|
||||
.ion-settings Other tools
|
||||
h3 Project Status: #{currentStatus}
|
||||
if (interestedCampers && interestedCampers.length > 0)
|
||||
h3 Interested campers:
|
||||
.col-xs-12.text-left
|
||||
for interestedCamper in interestedCampers
|
||||
a(href='/' + interestedCamper.username class="interested-camper-image")
|
||||
img.profile-picture.float-right(src=interestedCamper.picture)
|
||||
if (assignedCampers && assignedCampers.length > 0)
|
||||
h3 Assigned campers:
|
||||
.col-xs-12.text-left
|
||||
for assignedCamper in assignedCampers
|
||||
a(href='/' + assignedCamper.username class="interested-camper-image")
|
||||
img.profile-picture.float-right(src=assignedCamper.picture)
|
||||
.spacer
|
||||
if (!buttonActive)
|
||||
.col-xs-12.col-sm-8.col-sm-offset-2
|
||||
.text-center
|
||||
a.btn.btn-primary.btn-big.btn-block.disabled(href='/nonprofits/interested-in-nonprofit/#{dashedName}') I'm interested in building this project *
|
||||
p * Complete all our Bonfires, Ziplines, and Basejumps to unlock this.
|
||||
#showAllButton.btn.btn-info.btn-big.btn-block Show all Nonprofit Projects
|
||||
if (buttonActive)
|
||||
.col-xs-12.col-sm-8.col-sm-offset-2
|
||||
.text-center
|
||||
a.btn.btn-primary.btn-big.btn-block(href='/nonprofits/interested-in-nonprofit/#{dashedName}') I'm interested in building this project
|
||||
#showAllButton.btn.btn-info.btn-big.btn-block Show all Nonprofit Projects
|
||||
.row
|
||||
.col-xs-12.text-center
|
||||
if !user
|
||||
a.btn.btn-cta.signup-btn.btn-primary(href="/login") Start learning to code (it's free)
|
||||
.spacer
|
||||
#show-all-dialog.modal(tabindex='-1')
|
||||
.modal-dialog.animated.fadeInUp.fast-animation
|
||||
.modal-content
|
||||
|
@ -25,7 +25,7 @@ nav.navbar.navbar-default.navbar-fixed-top.nav-height
|
||||
li
|
||||
a(href='/challenges/join-our-chat-room') Chat
|
||||
li
|
||||
a(href='/stories/hot') News
|
||||
a(href='/news') News
|
||||
li
|
||||
a(href='/field-guide') Field Guide
|
||||
if !user
|
||||
|
@ -8,7 +8,7 @@ block content
|
||||
.big-break
|
||||
.col-xs-12.col-sm-12.col-md-12
|
||||
.embed-responsive.embed-responsive-16by9
|
||||
iframe.embed-responsive-item(src='https://www.youtube.com/embed/KOs0m_AhkXA')
|
||||
iframe.embed-responsive-item(src='//player.vimeo.com/video/126228100')
|
||||
.big-break
|
||||
h2 Our process:
|
||||
.row
|
||||
|
@ -8,7 +8,7 @@ block content
|
||||
.big-break
|
||||
.col-xs-12.col-sm-12.col-md-12
|
||||
.embed-responsive.embed-responsive-16by9
|
||||
iframe.embed-responsive-item(src='https://www.youtube.com/embed/KOs0m_AhkXA')
|
||||
iframe.embed-responsive-item(src='//player.vimeo.com/video/126228100')
|
||||
.big-break
|
||||
h2 Your opportunity:
|
||||
.row
|
||||
|
@ -60,7 +60,7 @@ urlset(xmlns="http://www.sitemaps.org/schemas/sitemap/0.9")
|
||||
//- Stories
|
||||
each story in stories
|
||||
url
|
||||
loc #{appUrl}/stories/#{story.replace(/\s/g, '-')}
|
||||
loc #{appUrl}/news/#{story.replace(/\s/g, '-')}
|
||||
lastmod= now
|
||||
changefreq daily
|
||||
priority= 0.9
|
||||
|
@ -96,6 +96,7 @@
|
||||
$('#comment-to-comment-textinput').keyup(function (e) {
|
||||
if (e.which === 13 || e === 13) {
|
||||
$('#submit-comment-to-comment').click();
|
||||
$('#submit-comment-to-edit').click();
|
||||
}
|
||||
var text_length = $('#comment-to-comment-textinput').val().length;
|
||||
var text_remaining = text_max - text_length;
|
||||
|
@ -1,55 +1,69 @@
|
||||
.spacer
|
||||
.col-xs-12
|
||||
#story-list.story-list
|
||||
.spacer
|
||||
#story-list.story-list
|
||||
|
||||
script(src="https://cdn.jsdelivr.net/ramda/0.10.0/ramda.min.js")
|
||||
script.
|
||||
script(src="https://cdn.jsdelivr.net/ramda/0.10.0/ramda.min.js")
|
||||
script.
|
||||
|
||||
var getLinkedName = function getLinkedName(name) {
|
||||
return name.trim().toLowerCase().replace(/\s/g, '-');
|
||||
}
|
||||
$.ajax({
|
||||
url: '/stories/hotStories',
|
||||
type: 'GET'
|
||||
})
|
||||
.success(
|
||||
function(data) {
|
||||
for (var i = 0; i < data.length; i++) {
|
||||
var div = document.createElement('div');
|
||||
var linkedName = getLinkedName(data[i].storyLink);
|
||||
var rank = data[i].rank;
|
||||
var getLinkedName = function getLinkedName(name) {
|
||||
return name.trim().toLowerCase().replace(/\s/g, '-');
|
||||
}
|
||||
$.ajax({
|
||||
url: '/stories/hotStories',
|
||||
type: 'GET'
|
||||
})
|
||||
.success(
|
||||
function(data) {
|
||||
for (var i = 0; i < data.length; i++) {
|
||||
var div = document.createElement('div');
|
||||
var linkedName = getLinkedName(data[i].storyLink);
|
||||
var rank = data[i].rank;
|
||||
|
||||
$(div)
|
||||
.html(
|
||||
"<div class='col-xs-12 text-left'>" +
|
||||
"<h2 class='col-xs-1 col-sm-1 positive-5'>" +
|
||||
(i + 1) +
|
||||
"</h2>" +
|
||||
"<div class='col-xs-2 col-sm-1'>" +
|
||||
"<a href='/" + data[i].author.username + "'>" +
|
||||
"<img src='" + data[i].author.picture + "' class='img-news'/>" +
|
||||
$(div)
|
||||
.html(
|
||||
"<div class='visible-xs row'>" +
|
||||
"<div class='visible-xs col-sm-1 col-md-1'>" +
|
||||
"<a href='" + data[i].link + "'>" +
|
||||
"<img class='mobile-story-image img-responsive' src='" + (!!data[i].image ? data[i].image : data[i].author.picture) + "'/>" +
|
||||
"</a>" +
|
||||
"</div>" +
|
||||
"<div class='visible-xs'>" +
|
||||
"<div class='col-xs-12 text-center'>" +
|
||||
rank + (rank > 1 ? " points" : " point") + " · posted " +
|
||||
moment(data[i].timePosted).fromNow() +
|
||||
" by <a href='/" + data[i].author.username + "'>@" + data[i].author.username + "</a> " +
|
||||
"</div>" +
|
||||
"<div class='col-xs-12'>" +
|
||||
"<br><a class='btn btn-no-shadow btn-primary btn-block btn-primary-ghost' href='/news/" + linkedName + "'>discuss</a>" +
|
||||
"</div>" +
|
||||
"</div>" +
|
||||
"</div>" +
|
||||
"<div class='hidden-xs row media-stories'>" +
|
||||
"<div class='media'>" +
|
||||
"<div class='media-left'>" +
|
||||
"<a href='/'" + data[i].author.username + "'>" +
|
||||
"<img class='img-news' src='" + data[i].author.picture + "'/>" +
|
||||
"</a>" +
|
||||
"</div>" +
|
||||
"<div class='col-xs-9 col-sm-10'>" +
|
||||
"<div class='row'>" +
|
||||
"<div class='story-headline col-xs-12'>" +
|
||||
"<h2 class='media-body'>" +
|
||||
"<div class='media-body-wrapper'>" +
|
||||
"<div class='story-headline'>" +
|
||||
"<a href='" + data[i].link + "' target='_blank'>" +
|
||||
data[i].headline +
|
||||
"</a>" +
|
||||
"</div>" +
|
||||
"<div class='col-xs-12'>" +
|
||||
"<span>" +
|
||||
"<a class='btn btn-no-shadow btn-primary btn-xs btn-primary-ghost' href='/stories/" + linkedName + "'>discuss</a> · " +
|
||||
rank + (rank > 1 ? " points" : " point") + " · posted " +
|
||||
moment(data[i].timePosted).fromNow() +
|
||||
" by <a href='/" + data[i].author.username + "'>@" + data[i].author.username + "</a> " +
|
||||
"</span>" +
|
||||
"<div class='story-byline col-xs-12 wrappable'>" +
|
||||
"<a class='btn btn-no-shadow btn-primary btn-xs btn-primary-ghost' href='/news/" + linkedName + "'>discuss</a> · " +
|
||||
rank + (rank > 1 ? " points" : " point") + " · posted " +
|
||||
moment(data[i].timePosted).fromNow() +
|
||||
" by <a href='/" + data[i].author.username + "'>@" + data[i].author.username + "</a> " +
|
||||
"</div>" +
|
||||
"</div>" +
|
||||
"</div>" +
|
||||
"</div>"
|
||||
);
|
||||
$(div).addClass('story-list')
|
||||
$(div).appendTo($('#story-list'));
|
||||
}
|
||||
});
|
||||
"</h2>" +
|
||||
"</div>" +
|
||||
"</div>"
|
||||
);
|
||||
$(div).addClass('story-list news-box')
|
||||
$(div).appendTo($('#story-list'));
|
||||
}
|
||||
});
|
||||
|
@ -19,8 +19,6 @@ block content
|
||||
.spacer
|
||||
if (page === 'hot')
|
||||
include ./hot-stories
|
||||
if (page === 'recent')
|
||||
include ./new-stories
|
||||
if (page === 'submit')
|
||||
if (user)
|
||||
include ./preliminary-submit
|
||||
@ -29,8 +27,6 @@ block content
|
||||
.text-center
|
||||
a.btn.btn-cta.signup-btn.btn-primary(href="/login") Sign in to post your story (it's free)
|
||||
.spacer
|
||||
if (page === 'search')
|
||||
include ./search-stories
|
||||
if (page === 'storySubmission')
|
||||
include ./submit-story
|
||||
if (page === 'show')
|
||||
|
@ -1,43 +1,69 @@
|
||||
.col-xs-12
|
||||
|
||||
a.btn.btn-primary.btn-big.btn-block(href='/stories/submit' class="#{ page === 'hot' ? '' : 'hidden' }") Submit a Code-related Link
|
||||
a.btn.btn-success.btn-big.btn-block(href='/stories/hot' class="#{ (page === 'show' || page === 'submit' || page === 'storySubmission') ? '' : 'hidden' }") Show all Links
|
||||
//.visible-xs.visible-sm
|
||||
// .btn-group.input-group.btn-group-justified(data-toggle='buttons')
|
||||
// label.btn.btn-primary.btn-big(class="#{ page === 'hot' ? 'active' : '' }")
|
||||
// input#option1(href='/stories/hot', type='radio', name='options')
|
||||
// i.ion-ios-pulse-strong
|
||||
// label.btn.btn-primary.btn-big(class="#{ page === 'recent' ? 'active' : '' }")
|
||||
// input#option2(href='/stories/recent', type='radio', name='options')
|
||||
// i.ion-ios-clock
|
||||
// label.btn.btn-primary.btn-big(class="#{ page === 'submit' ? 'active' : page === 'storySubmission' ? 'active' : '' }")
|
||||
// input#option3(href='/stories/submit', type='radio', name='options')
|
||||
// i.ion-plus-circled
|
||||
// label.btn.btn-primary.btn-big(class="#{ page === 'search' ? 'active' : '' }")
|
||||
// input#option4(href='/stories/search', type='radio', name='options')
|
||||
// i.ion-search
|
||||
//.visible-md.visible-lg
|
||||
// .btn-group.input-group.btn-group-justified(data-toggle='buttons')
|
||||
// label.btn.btn-primary.btn-big(class="#{ page === 'hot' ? 'active' : '' }")
|
||||
// input#option1(href='/stories/hot', type='radio', name='options')
|
||||
// i.ion-ios-pulse-strong  
|
||||
// | Hot
|
||||
// label.btn.btn-primary.btn-big(class="#{ page === 'recent' ? 'active' : '' }")
|
||||
// input#option2(href='/stories/recent', type='radio', name='options')
|
||||
// i.ion-ios-clock  
|
||||
// | New
|
||||
// label.btn.btn-primary.btn-big(class="#{ page === 'submit' ? 'active' : page === 'storySubmission' ? 'active' : '' }")
|
||||
// input#option3(href='/stories/submit', type='radio', name='options')
|
||||
// i.ion-plus-circled  
|
||||
// | Submit
|
||||
// label.btn.btn-primary.btn-big(class="#{ page === 'search' ? 'active' : '' }")
|
||||
// input#option4(href='/stories/search', type='radio', name='options')
|
||||
// i.ion-search  
|
||||
// | Search
|
||||
|
||||
script.
|
||||
$('label').on('click', function() {
|
||||
window.location = ($(this).children('input').attr('href'));
|
||||
});
|
||||
|
||||
.row
|
||||
.col-xs-12.col-sm-9
|
||||
.input-group
|
||||
input#searchArea.big-text-field.field-responsive.form-control(type='text', placeholder='Search our links')
|
||||
span.input-group-btn
|
||||
button#searchbutton.btn.btn-big.btn-primary.btn-responsive(type='button') Search
|
||||
.visible-xs
|
||||
.button-spacer
|
||||
.col-xs-12.col-sm-3
|
||||
span
|
||||
a.btn.btn-primary.btn-big.btn-block.btn-responsive(href='/stories/submit' class="#{ page === 'hot' ? '' : 'hidden' }") Submit
|
||||
span
|
||||
a.btn.btn-success.btn-big.btn-block.btn-responsive(href='/news/' class="#{ (page !== 'hot') ? '' : 'hidden' }") All
|
||||
.spacer
|
||||
#search-results
|
||||
.spacer
|
||||
#story-list
|
||||
ul#stories
|
||||
script.
|
||||
$('#searchArea').keypress(function (event) {
|
||||
if (event.keyCode === 13 || event.which === 13) {
|
||||
executeSearch();
|
||||
$('#searchArea').focus();
|
||||
event.preventDefault();
|
||||
}
|
||||
});
|
||||
$('#searchbutton').on('click', function () {
|
||||
executeSearch();
|
||||
});
|
||||
function executeSearch() {
|
||||
$('#stories').empty();
|
||||
var searchTerm = $('#searchArea').val();
|
||||
var getLinkedName = function getLinkedName(name) {
|
||||
return name.toLowerCase().replace(/\s/g, '-');
|
||||
}
|
||||
$.post('/stories/search',
|
||||
{
|
||||
data: {
|
||||
searchValue: searchTerm
|
||||
}
|
||||
})
|
||||
.fail(function (xhr, textStatus, errorThrown) {
|
||||
})
|
||||
.done(function (data, textStatus, xhr) {
|
||||
for (var i = 0; i < data.length; i++) {
|
||||
var div = document.createElement('div');
|
||||
var linkedName = getLinkedName(data[i].storyLink);
|
||||
var rank = data[i].rank;
|
||||
$(div).html(
|
||||
"<div class='row text-left'>" +
|
||||
"<div class='col-xs-4 col-sm-2 col-md-1'>" +
|
||||
"<a href='" + data[i].link + "' target='_blank'>" +
|
||||
"<img src='" + data[i].author.picture + "' class='img-responsive mobile-story-image'/>" +
|
||||
"</div>" +
|
||||
"<div class='col-xs-8 col-sm-10 col-md-11 text-center'>" +
|
||||
"<div class='story-headline'>" +
|
||||
"<a href='/stories/" + linkedName + "'>"
|
||||
+ data[i].storyLink +
|
||||
"</a><br>" +
|
||||
"</div>" +
|
||||
"Posted " +
|
||||
moment(data[i].timePosted).fromNow() +
|
||||
" by <a href='/" + data[i].author.username + "'>@" + data[i].author.username + "</a> " +
|
||||
"</div>" +
|
||||
"</div>")
|
||||
$(div).appendTo($('#search-results'));
|
||||
}
|
||||
});
|
||||
}
|
||||
|
@ -1,9 +1,7 @@
|
||||
.col-xs-12
|
||||
.spacer
|
||||
div(ng-controller="URLSubmitController")
|
||||
|
||||
form.input-group(name='URLSubmit')
|
||||
input#story-url.big-text-field.field-responsive.form-control(placeholder='Paste your link here', name='link', type='url', ng-model='possibleURL' autofocus)
|
||||
input#story-url.big-text-field.field-responsive.form-control(placeholder='Paste your link here', name='link', type='url', ng-model='possibleURL', required='required', autofocus)
|
||||
span.input-group-btn
|
||||
button#preliminary-story-submit.btn.btn-big.btn-primary.btn-responsive(type='button', ng-disabled='URLSubmit.link.$invalid') Submit
|
||||
div(ng-show="URLSubmit.link.$error.url && !URLsubmit.link.$pristine")
|
||||
@ -52,4 +50,4 @@
|
||||
return this.id;
|
||||
})
|
||||
.get()
|
||||
.join('&');
|
||||
.join('&');
|
||||
|
@ -1,73 +0,0 @@
|
||||
.col-xs-12
|
||||
.spacer
|
||||
h1.text-center Search
|
||||
.input-group
|
||||
input#searchArea.big-text-field.field-responsive.form-control(type='text', placeholder='Search our links', autofocus)
|
||||
span.input-group-btn
|
||||
button#searchbutton.btn.btn-big.btn-primary.btn-responsive(type='button') Search
|
||||
.spacer
|
||||
|
||||
#story-list
|
||||
ul#stories
|
||||
script.
|
||||
$('#searchArea').keypress(function(event) {
|
||||
if (event.keyCode === 13 || event.which === 13) {
|
||||
executeSearch();
|
||||
$('#searchArea').focus();
|
||||
event.preventDefault();
|
||||
}
|
||||
});
|
||||
$('#searchbutton').on('click', function() {
|
||||
executeSearch();
|
||||
});
|
||||
function executeSearch() {
|
||||
$('#stories').empty();
|
||||
var searchTerm = $('#searchArea').val();
|
||||
var getLinkedName = function getLinkedName(name) {
|
||||
return name.toLowerCase().replace(/\s/g, '-');
|
||||
}
|
||||
$.post('/stories/search',
|
||||
{
|
||||
data: {
|
||||
searchValue: searchTerm
|
||||
}
|
||||
})
|
||||
.fail(function (xhr, textStatus, errorThrown) {
|
||||
})
|
||||
.done(function (data, textStatus, xhr) {
|
||||
for (var i = 0; i < data.length; i++) {
|
||||
var li = document.createElement('li');
|
||||
var linkedName = getLinkedName(data[i].storyLink);
|
||||
var rank = data[i].rank;
|
||||
|
||||
$(li).html(
|
||||
"<div class='row text-left'>" +
|
||||
"<div class='col-xs-3 col-sm-1'>" +
|
||||
"<div class='story-up-votes'>" +
|
||||
"<span>" + rank + "</span>" +
|
||||
"</div>" +
|
||||
"</div>" +
|
||||
"<div class='col-xs-2 col-sm-1'>" +
|
||||
"<img src='" + data[i].author.picture + "' class='img-responsive'/>" +
|
||||
"</div>" +
|
||||
"<div class='col-xs-7 col-sm-10'>" +
|
||||
"<div class='row'>" +
|
||||
"<div class='col-xs-12'>" +
|
||||
"<a href='/stories/" + linkedName + "'>"
|
||||
+ data[i].storyLink +
|
||||
"</a>" +
|
||||
"</div>" +
|
||||
"<div class='col-xs-12'>" +
|
||||
"<span>Posted " +
|
||||
moment(data[i].timePosted).fromNow() +
|
||||
" by <a href='/" + data[i].author.username + "'>@" + data[i].author.username + "</a> " +
|
||||
"</div>" +
|
||||
"</div>" +
|
||||
"</div>" +
|
||||
"</div>" +
|
||||
"</li>");
|
||||
$(li).appendTo($('#stories'));
|
||||
}
|
||||
});
|
||||
|
||||
}
|
||||
|
@ -1,79 +1,77 @@
|
||||
.spacer
|
||||
script.
|
||||
var storyId = !{JSON.stringify(id)};
|
||||
var originalStoryLink = !{JSON.stringify(originalStoryLink)};
|
||||
var originalStoryAuthorEmail = !{JSON.stringify(originalStoryAuthorEmail)};
|
||||
var comments = !{JSON.stringify(comments)};
|
||||
var upVotes = !{JSON.stringify(upVotes)};
|
||||
var image = !{JSON.stringify(image)};
|
||||
var hasUserVoted = !{JSON.stringify(hasUserVoted)};
|
||||
.spacer
|
||||
script.
|
||||
var storyId = !{JSON.stringify(id)};
|
||||
var originalStoryLink = !{JSON.stringify(originalStoryLink)};
|
||||
var originalStoryAuthorEmail = !{JSON.stringify(originalStoryAuthorEmail)};
|
||||
var comments = !{JSON.stringify(comments)};
|
||||
var upVotes = !{JSON.stringify(upVotes)};
|
||||
var image = !{JSON.stringify(image)};
|
||||
var hasUserVoted = !{JSON.stringify(hasUserVoted)};
|
||||
|
||||
h3.row
|
||||
.col-xs-2.col-sm-1
|
||||
a(href="/" + author.username)
|
||||
img(src="#{author.picture}", class='img-news')
|
||||
.col-xs-10.col-sm-10
|
||||
.col-xs-12.negative-28
|
||||
a(href="#{link}", target="_blank")
|
||||
h3= title
|
||||
h6
|
||||
.col-xs-12.positive-15.hidden-element#image-display
|
||||
.media
|
||||
.media-left
|
||||
img.url-preview.media-object(src="#{image}", alt="#{storyMetaDescription}")
|
||||
.media-body
|
||||
.col-xs-12.col-sm-12.col-md-6
|
||||
h4= storyMetaDescription
|
||||
.col-xs-12
|
||||
h4= description
|
||||
.negative-5
|
||||
a#reply-to-main-post.btn.btn-no-shadow.btn-primary.btn-xs.btn-primary-ghost Reply
|
||||
|  ·  
|
||||
if !hasUserVoted
|
||||
a#upvote.btn.btn-no-shadow.btn-primary.btn-xs.btn-primary-ghost Upvote
|
||||
|  · 
|
||||
else
|
||||
a#upvote.btn.disabled.btn-no-shadow.btn-primary.btn-xs.btn-primary-ghost Upvoted!
|
||||
|  · 
|
||||
span#storyRank= rank + (rank > 1 ? " points" : " point")
|
||||
h3.row
|
||||
.col-xs-2.col-sm-1
|
||||
a(href="/" + author.username)
|
||||
img(src="#{author.picture}", class='img-news')
|
||||
.col-xs-10.col-sm-10
|
||||
.col-xs-12.negative-28
|
||||
a(href="#{link}", target="_blank")
|
||||
h3= title
|
||||
h6
|
||||
.col-xs-12.positive-15.hidden-element#image-display
|
||||
.media
|
||||
.media-left
|
||||
img.url-preview.media-object(src="#{image}", alt="#{storyMetaDescription}")
|
||||
.media-body
|
||||
.col-xs-12.col-sm-12.col-md-6
|
||||
h4= storyMetaDescription
|
||||
.col-xs-12
|
||||
h4= description
|
||||
.negative-5
|
||||
a#reply-to-main-post.btn.btn-no-shadow.btn-primary.btn-xs.btn-primary-ghost Reply
|
||||
|  ·  
|
||||
if !hasUserVoted
|
||||
a#upvote.btn.btn-no-shadow.btn-primary.btn-xs.btn-primary-ghost Upvote
|
||||
|  · 
|
||||
span Posted #{timeAgo}
|
||||
span  by 
|
||||
a(href="/" + author.username) @#{author.username}
|
||||
else
|
||||
a#upvote.btn.disabled.btn-no-shadow.btn-primary.btn-xs.btn-primary-ghost Upvoted!
|
||||
|  · 
|
||||
span#storyRank= rank + (rank > 1 ? " points" : " point")
|
||||
|  · 
|
||||
span Posted #{timeAgo}
|
||||
span  by 
|
||||
a(href="/" + author.username) @#{author.username}
|
||||
|
||||
if (user !== null)
|
||||
.col-xs-12#reply-area
|
||||
.hidden-element#initial-comment-submit
|
||||
form.form-horizontal.control-label-story-submission
|
||||
.col-xs-12
|
||||
.input-group
|
||||
input#comment-box.big-text-field.field-responsive.form-control(type='text', placeholder='Enter your reply', autofocus)
|
||||
span.input-group-btn
|
||||
button#comment-button.btn.btn-big.btn-primary.btn-responsive(type='button') Send
|
||||
span.spacer.pull-left#textarea_feedback
|
||||
if (user !== null)
|
||||
.col-xs-12#reply-area
|
||||
.hidden-element#initial-comment-submit
|
||||
form.form-horizontal.control-label-story-submission
|
||||
.col-xs-12
|
||||
.input-group
|
||||
input#comment-box.big-text-field.field-responsive.form-control(type='text', placeholder='Enter your reply', autofocus)
|
||||
span.input-group-btn
|
||||
button#comment-button.btn.btn-big.btn-primary.btn-responsive(type='button') Send
|
||||
span.spacer.pull-left#textarea_feedback
|
||||
|
||||
script.
|
||||
if (image) {
|
||||
$('#image-display').removeClass('hidden-element')
|
||||
script.
|
||||
if (image) {
|
||||
$('#image-display').removeClass('hidden-element')
|
||||
}
|
||||
$('#reply-to-main-post').on('click', function() {
|
||||
if (!isLoggedIn) {
|
||||
window.location.href = '/signin';
|
||||
return;
|
||||
}
|
||||
$('#reply-to-main-post').on('click', function() {
|
||||
if (!isLoggedIn) {
|
||||
window.location.href = '/signin';
|
||||
return;
|
||||
}
|
||||
$('#initial-comment-submit').removeClass('hidden-element');
|
||||
$(this).unbind('click');
|
||||
$('.comment-to-comment-formgroup').empty();
|
||||
});
|
||||
var text_max = 140;
|
||||
$('#textarea_feedback').html(text_max + ' characters remaining');
|
||||
$('#comment-box').keyup(function (e) {
|
||||
if (e.which === 13 || e === 13) {
|
||||
$('#comment-button').click();
|
||||
}
|
||||
var text_length = $('#comment-box').val().length;
|
||||
var text_remaining = text_max - text_length;
|
||||
$('#textarea_feedback').html(text_remaining + ' characters remaining');
|
||||
});
|
||||
include ./comments
|
||||
$('#initial-comment-submit').removeClass('hidden-element');
|
||||
$(this).unbind('click');
|
||||
$('.comment-to-comment-formgroup').empty();
|
||||
});
|
||||
var text_max = 140;
|
||||
$('#textarea_feedback').html(text_max + ' characters remaining');
|
||||
$('#comment-box').keyup(function (e) {
|
||||
if (e.which === 13 || e === 13) {
|
||||
$('#comment-button').click();
|
||||
}
|
||||
var text_length = $('#comment-box').val().length;
|
||||
var text_remaining = text_max - text_length;
|
||||
$('#textarea_feedback').html(text_remaining + ' characters remaining');
|
||||
});
|
||||
include ./comments
|
||||
|
@ -16,12 +16,12 @@
|
||||
.col-xs-12.col-md-1
|
||||
label.control-label.control-label-story-submission(for='name') Title
|
||||
.col-xs-12.col-md-11
|
||||
input#story-title.form-control(placeholder='Type a headline for your link here', name='Title', maxlength='90' autofocus)
|
||||
// input#story-title.form-control(placeholder='Type a headline for your link here', name='Title', maxlength='90' ng-model='submitStory.title.Title',required='required', autocomplete="off" autofocus)
|
||||
//.col-xs-12.col-md-11.col-md-offset-1(ng-cloak, ng-show="submitStory.title.$error.required")
|
||||
// alert(type='danger')
|
||||
// span.ion-close-circled
|
||||
// | A headline is required to submit.
|
||||
|
||||
input#story-title.form-control(placeholder='Type a headline for your link here', name='Title', maxlength='90' ng-model='submitStory.title',required='required', autocomplete="off", ng-init='submitStory.title="#{storyTitle}"' autofocus)
|
||||
.col-xs-12.col-md-11.col-md-offset-1(ng-cloak, ng-show="submitStory.title.$error.required")
|
||||
alert(type='danger')
|
||||
span.ion-close-circled
|
||||
| A headline is required to submit.
|
||||
.form-group
|
||||
.col-xs-12.col-md-1
|
||||
label.control-label.control-label-story-submission(for='name') Comment
|
||||
@ -43,7 +43,7 @@
|
||||
.row
|
||||
.form-group
|
||||
|
||||
button.btn.btn-big.btn-block.btn-primary#story-submit(type='submit', ng-disabled='submitStory.$invalid') Submit
|
||||
button.btn.btn-big.btn-block.btn-primary#story-submit(type='submit', ng-disabled='submitStory.$invalid || !submitStory') Submit
|
||||
script.
|
||||
$('#story-url').val(storyURL).attr('disabled', 'disabled');
|
||||
$('#story-title').val(storyTitle);
|
||||
|
Reference in New Issue
Block a user