build a functional challenge map and change navbar links

This commit is contained in:
Michael Q Larson
2015-04-03 20:05:53 -07:00
parent 3cff4e9879
commit fbeff58477
8 changed files with 193 additions and 70 deletions

6
app.js
View File

@ -43,8 +43,10 @@ var express = require('express'),
bonfireController = require('./controllers/bonfire'),
coursewareController = require('./controllers/courseware'),
wikiController = require('./controllers/wiki'),
challengeMapController = require('./controllers/challengeMap'),
/**
/**
* Stories
*/
storyController = require('./controllers/story'),
@ -247,6 +249,8 @@ app.get('/jquery-exercises', resourcesController.jqueryExercises);
app.get('/chat', resourcesController.chat);
app.get('/challenge-map', challengeMapController.challengeMap);
app.get('/live-pair-programming', function(req, res) {
res.redirect(301, '/wiki/live-stream-pair-programming-on-twitch.tv');
});

View File

@ -0,0 +1,69 @@
var async = require('async'),
User = require('../models/User'),
Bonfire = require('./../models/Bonfire'),
Story = require('./../models/Story'),
Wiki = require('./../models/Wiki'),
Nonprofit = require('./../models/Nonprofit'),
Comment = require('./../models/Comment'),
Courseware = require('./../models/Courseware'),
resources = require('./resources'),
steps = resources.steps,
secrets = require('./../config/secrets'),
bonfires = require('../seed_data/bonfires.json'),
nonprofits = require('../seed_data/nonprofits.json'),
coursewares = require('../seed_data/coursewares.json'),
wikis = require('../seed_data/wikis.json'),
moment = require('moment'),
https = require('https'),
debug = require('debug')('freecc:cntr:resources'),
cheerio = require('cheerio'),
request = require('request'),
R = require('ramda');
module.exports = {
challengeMap: function challengeMap(req, res) {
var completedBonfires = [];
var completedList = [];
if (req.user) {
completedBonfires = req.user.completedBonfires.map(function (elem) {
return elem._id;
});
}
if (req.user) {
completedList = req.user.completedCoursewares.map(function (elem) {
return elem._id;
});
}
var noDuplicateBonfires = R.uniq(completedBonfires);
var noDuplicatedCoursewares = R.uniq(completedList);
bonfireList = resources.allBonfireNames();
completedBonfireList = noDuplicateBonfires;
coursewareList = resources.allCoursewareNames();
completedCoursewareList = noDuplicatedCoursewares;
waypoints = coursewareList.filter(function(challenge) {
if (challenge.challengeType === 2) { return challenge }
});
ziplines = coursewareList.filter(function(challenge) {
if (challenge.challengeType === 3) { return challenge }
});
basejumps = coursewareList.filter(function(challenge) {
if (challenge.challengeType === 4) { return challenge }
});
console.log('completed', completedCoursewareList);
console.log('waypoints', waypoints);
res.render('challengeMap/show', {
title: "A map of all Free Code Camp's Challenges",
bonfires: bonfireList,
waypoints: waypoints,
ziplines: ziplines,
basejumps: basejumps,
completedBonfireList: completedBonfireList,
completedCoursewareList: completedCoursewareList
});
}
};

View File

@ -134,46 +134,45 @@ module.exports = {
var progressTimestamps = req.user.progressTimestamps;
var now = Date.now() || 0;
if (req.user.pointsNeedMigration) {
var challengesHash = req.user.challengesHash;
for (var key in challengesHash) {
if (challengesHash[key] > 0) {
req.user.progressTimestamps.push(challengesHash[key]);
}
}
var oldChallengeKeys = R.keys(req.user.challengesHash);
var updatedTimesFromOldChallenges = oldChallengeKeys.map(function(timeStamp) {
if (timeStamp.toString().length !== 13) {
timeStamp *= 1000;
}
return timeStamp;
});
var newTimeStamps = R.map(function(timeStamp) {
if (timeStamp.toString().length !== 13) {
timeStamp *= 1000;
}
return timeStamp;
}, req.user.progressTimestamps);
req.user.progressTimestamps = newTimeStamps;
req.user.completedCoursewares = Array.zip(updatedTimesFromOldChallenges, coursewares,
function(left, right) {
return ({
completedDate: left.timeStamp,
_id: right._id,
name: right.name
});
}).filter(function(elem) {
return elem.completedDate !== 0;
});
req.user.pointsNeedMigration = false;
req.user.save();
}
//if (req.user.pointsNeedMigration) {
// var challengesHash = req.user.challengesHash;
// for (var key in challengesHash) {
// if (challengesHash[key] > 0) {
// req.user.progressTimestamps.push(challengesHash[key]);
// }
// }
//
// var oldChallengeKeys = R.keys(req.user.challengesHash);
//
// var updatedTimesFromOldChallenges = oldChallengeKeys.map(function(timeStamp) {
// if (timeStamp.toString().length !== 13) {
// timeStamp *= 1000;
// }
// return timeStamp;
// });
//
// var newTimeStamps = R.map(function(timeStamp) {
// if (timeStamp.toString().length !== 13) {
// timeStamp *= 1000;
// }
// return timeStamp;
// }, req.user.progressTimestamps);
//
// req.user.progressTimestamps = newTimeStamps;
//
// req.user.completedCoursewares = Array.zip(updatedTimesFromOldChallenges, coursewares,
// function(left, right) {
// return ({
// completedDate: left.timeStamp,
// _id: right._id,
// name: right.name
// });
// }).filter(function(elem) {
// return elem.completedDate !== 0;
// });
// req.user.pointsNeedMigration = false;
// req.user.save();
//}
if (progressTimestamps[progressTimestamps.length - 1] <= (now - 43200)) {
req.user.progressTimestamps.push(now);
}
@ -196,7 +195,7 @@ module.exports = {
}
res.render('resources/learn-to-code', {
title: 'About Free Code Camp and Our Team of Volunteers',
title: 'About Free Code Camp',
daysRunning: daysRunning,
c3: numberWithCommas(c3),
all: all,
@ -296,6 +295,7 @@ module.exports = {
return {
name: elem.name,
difficulty: elem.difficulty,
challengeType: elem.challengeType,
_id: elem._id
};
})
@ -305,6 +305,7 @@ module.exports = {
.map (function(elem) {
return {
name: elem.name,
challengeType: elem.challengeType,
_id: elem._id
};
});

View File

@ -16,7 +16,7 @@ var coursewareSchema = new mongoose.Schema({
tests: Array,
challengeSeed: Array,
completionMessage: String, // Congratulations! You've finished our HTML and CSS track!
challengeType: Number // 0 = html, 1 = javascript only, 2 = video, 3 = bonfire, 4 = zipline, 5 = basejump
challengeType: Number // 0 = html, 1 = javascript only, 2 = video, 3 = zipline, 4 = basejump
});
module.exports = mongoose.model('Courseware', coursewareSchema);

View File

@ -41,7 +41,7 @@ block content
.col-xs-12.col-sm-12.col-md-3.text-center
.background-svg.img-center
.points-on-top
= "[ " + user.progressTimestamps.length + " ]"
= "[ " + (user ? user.progressTimestamps.length : 0) + " ]"
.row
@ -98,23 +98,27 @@ block content
.hidden-xs.col-sm-12
#cal-heatmap.img-center
script(src="//d3js.org/d3.v3.min.js")
script(src="//cdn.jsdelivr.net/cal-heatmap/3.3.10/cal-heatmap.min.js")
script.
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]
$(document).ready(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]
});
});
.row
.hidden-xs.col-sm-12.text-center

View File

@ -0,0 +1,43 @@
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
h3 Waypoints
ol.col-md-offset-2
for waypoint in waypoints
if completedCoursewareList.indexOf(waypoint._id) > -1
li.strikethrough
a(href="/challenges/#{waypoint.name}")= waypoint.name
else
li
a(href="/challenges/#{waypoint.name}")= waypoint.name
h3 Bonfires
ol.col-md-offset-2
for bonfire in bonfires
if completedBonfireList.indexOf(bonfire._id) > -1
li.strikethrough
a(href="/bonfires/#{bonfire.name}")= bonfire.name
else
li
a(href="/bonfires/#{bonfire.name}")= bonfire.name
h3 Ziplines
ol.col-md-offset-2
for zipline in ziplines
if completedCoursewareList.indexOf(zipline._id) > -1
li.strikethrough
a(href="/challenges/#{zipline.name}")= zipline.name
else
li
a(href="/challenges/#{zipline.name}")= zipline.name
h3 Basejumps
ol.col-md-offset-2
for basejump in basejumps
if completedCoursewareList.indexOf(basejump._id) > -1
li.strikethrough
a(href="/challenges/#{basejump.name}")= basejump.name
else
li
a(href="/challenges/#{basejump.name}")= basejump.name

View File

@ -12,13 +12,15 @@
.collapse.navbar-collapse
ul.nav.navbar-nav.navbar-right.hamburger-dropdown
li
a(href='/challenges') Challenges
li
a(href='/chat') Chat
a(href='/challenge-map') Challenges
if (user && user.progressTimestamps.length > 5)
li
a(href='https://gitter.im/freecodecamp/freecodecamp') Chat
else
li
a(href='/chat') Chat
li
a(href='/stories/hot') News
li
a(href='/bonfires') Bonfires
if !user
li &thinsp; &thinsp; &thinsp;
li
@ -26,9 +28,11 @@
else
li
if (user.profile.username)
a(href='/' + user.profile.username) [&nbsp;#{user.progressTimestamps.length}&nbsp;]
else
a(href='/account') [&thinsp;#{user.progressTimestamps.length}&thinsp;]
a(href='/account') [&thinsp;#{user.points}&thinsp;]
.hidden-xs
if user.profile.picture
if (user.profile.username)
@ -40,7 +44,7 @@
else
if (user.profile.username)
a(href='/' + user.profile.username)
img.profile-picture.float-right(src='https://s3.amazonaws.com/freecodecamp/camper-image-placeholder.png')
img.profile-picture.float-right(src='#{user.gravatar(60)}')
else
a(href='/account')
img.profile-picture.float-right(src='https://s3.amazonaws.com/freecodecamp/camper-image-placeholder.png')
img.profile-picture.float-right(src='#{user.gravatar(60)}')

View File

@ -1,8 +1,6 @@
script(src="//ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js")
script(src="//ajax.googleapis.com/ajax/libs/angularjs/1.3.11/angular.min.js")
script(src="//cdnjs.cloudflare.com/ajax/libs/angular-ui-bootstrap/0.12.0/ui-bootstrap-tpls.min.js")
script(src="//d3js.org/d3.v3.min.js")
script(src="//cdn.jsdelivr.net/cal-heatmap/3.3.10/cal-heatmap.min.js")
include meta
title #{title} | Free Code Camp
meta(charset='utf-8')