build a functional challenge map and change navbar links
This commit is contained in:
6
app.js
6
app.js
@ -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');
|
||||
});
|
||||
|
69
controllers/challengeMap.js
Normal file
69
controllers/challengeMap.js
Normal 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
|
||||
});
|
||||
}
|
||||
};
|
@ -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
|
||||
};
|
||||
});
|
||||
|
@ -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);
|
||||
|
@ -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
|
||||
|
43
views/challengeMap/show.jade
Normal file
43
views/challengeMap/show.jade
Normal 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
|
@ -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      
|
||||
li
|
||||
@ -26,9 +28,11 @@
|
||||
else
|
||||
li
|
||||
if (user.profile.username)
|
||||
|
||||
a(href='/' + user.profile.username) [ #{user.progressTimestamps.length} ]
|
||||
|
||||
else
|
||||
a(href='/account') [ #{user.progressTimestamps.length} ]
|
||||
a(href='/account') [ #{user.points} ]
|
||||
.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)}')
|
||||
|
@ -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')
|
||||
|
Reference in New Issue
Block a user