diff --git a/app.js b/app.js index 27092125a1..e522e412c3 100644 --- a/app.js +++ b/app.js @@ -42,7 +42,7 @@ var express = require('express'), nonprofitController = require('./controllers/nonprofits'), bonfireController = require('./controllers/bonfire'), coursewareController = require('./controllers/courseware'), - wikiController = require('./controllers/wiki'), + fieldGuideController = require('./controllers/fieldGuide'), challengeMapController = require('./controllers/challengeMap'), @@ -238,11 +238,11 @@ app.use(express.static(__dirname + '/public', { maxAge: 86400000 })); app.get('/', homeController.index); app.get('/privacy', function(req, res) { - res.redirect(301, "/wiki/free-code-camp's-privacy-policy"); + res.redirect(301, "/field-guide/free-code-camp's-privacy-policy"); }); app.get('/nonprofit-project-instructions', function(req, res) { - res.redirect(301, "/wiki/free-code-camp's-privacy-policy"); + res.redirect(301, "/field-guide/free-code-camp's-privacy-policy"); }); app.get('/jquery-exercises', resourcesController.jqueryExercises); @@ -254,31 +254,31 @@ app.get('/twitch', resourcesController.twitch); app.get('/map', challengeMapController.challengeMap); app.get('/live-pair-programming', function(req, res) { - res.redirect(301, '/wiki/live-stream-pair-programming-on-twitch.tv'); + res.redirect(301, '/field-guide/live-stream-pair-programming-on-twitch.tv'); }); app.get('/install-screenhero', function(req, res) { - res.redirect(301, '/wiki/install-screenhero'); + res.redirect(301, '/field-guide/install-screenhero'); }); app.get('/guide-to-our-nonprofit-projects', function(req, res) { - res.redirect(301, '/wiki/a-guide-to-our-nonprofit-projects'); + res.redirect(301, '/field-guide/a-guide-to-our-nonprofit-projects'); }); app.get('/chromebook', function(req, res) { - res.redirect(301, '/wiki/chromebook'); + res.redirect(301, '/field-guide/chromebook'); }); app.get('/deploy-a-website', function(req, res) { - res.redirect(301, '/wiki/deploy-a-website'); + res.redirect(301, '/field-guide/deploy-a-website'); }); app.get('/gmail-shortcuts', function(req, res) { - res.redirect(301, '/wiki/gmail-shortcuts'); + res.redirect(301, '/field-guide/gmail-shortcuts'); }); app.get('/nodeschool-challenges', function(req, res) { - res.redirect(301, '/wiki/nodeschool-challenges'); + res.redirect(301, '/field-guide/nodeschool-challenges'); }); app.get('/stats', function(req, res) { @@ -484,7 +484,7 @@ app.get('/api/trello', resourcesController.trelloCalls); * Bonfire related routes */ -app.get('/wiki/getWikiList', wikiController.showAllWikis); +app.get('/field-guide/getFieldGuideList', fieldGuideController.showAllFieldGuides); app.get('/playground', bonfireController.index); @@ -510,15 +510,15 @@ app.get('/bonfire', function(req, res) { app.post('/completed-bonfire/', bonfireController.completedBonfire); /** - * Wiki related routes + * Field Guide related routes */ -app.get('/wiki/:wikiName', wikiController.returnIndividualWiki); +app.get('/field-guide/:fieldGuideName', fieldGuideController.returnIndividualFieldGuide); -app.get('/wiki', wikiController.returnNextWiki); +app.get('/field-guide', fieldGuideController.returnNextFieldGuide); -app.post('/completed-wiki/', wikiController.completedWiki); +app.post('/completed-field-guide/', fieldGuideController.completedFieldGuide); /** diff --git a/controllers/challengeMap.js b/controllers/challengeMap.js index f8cad437cf..b858bf7385 100644 --- a/controllers/challengeMap.js +++ b/controllers/challengeMap.js @@ -2,7 +2,6 @@ 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'), @@ -12,7 +11,6 @@ var async = require('async'), 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'), diff --git a/controllers/fieldGuide.js b/controllers/fieldGuide.js new file mode 100644 index 0000000000..49b79e6bd6 --- /dev/null +++ b/controllers/fieldGuide.js @@ -0,0 +1,99 @@ +var _ = require('lodash'), + debug = require('debug')('freecc:cntr:fieldGuide'), + FieldGuide = require('./../models/FieldGuide'), + resources = require('./resources'), + R = require('ramda'); + +exports.returnIndividualFieldGuide = function(req, res, next) { + var dashedName = req.params.fieldGuideName; + + var fieldGuideName = dashedName.replace(/\-/g, ' '); + + FieldGuide.find({'name': new RegExp(fieldGuideName, 'i')}, function(err, fieldGuide) { + if (err) { + next(err); + } + + if (fieldGuide.length < 1) { + req.flash('errors', { + msg: "404: We couldn't find a field guide entry with that name. Please double check the name." + }); + + return res.redirect('/field-guide'); + } + + fieldGuide = fieldGuide.pop(); + var dashedNameFull = fieldGuide.name.toLowerCase().replace(/\s/g, '-').replace(/\?/g, ''); + if (dashedNameFull != dashedName) { + return res.redirect('../field-guide/' + dashedNameFull); + } + res.render('field-guide/show', { + title: fieldGuide.name, + fieldGuideId: fieldGuide._id, + description: fieldGuide.description.join('') + }); + }); +}; + +exports.showAllFieldGuides = function(req, res) { + var data = {}; + data.fieldGuideList = resources.allFieldGuideNames(); + data.fieldGuideIds = resources.allFieldGuideIds(); + data.completedFieldGuides = req.user.completedFieldGuides; + res.send(data); +}; + +exports.returnNextFieldGuide = function(req, res, next) { + if (!req.user) { + return res.redirect('../field-guide/how-do-i-use-this-guide?'); + } + + var completed = req.user.completedFieldGuides; + + req.user.uncompletedFieldGuides = resources.allFieldGuideIds().filter(function (elem) { + if (completed.indexOf(elem) === -1) { + return elem; + } + }); + req.user.save(); + + var uncompletedFieldGuides = req.user.uncompletedFieldGuides; + + var displayedFieldGuides = FieldGuide.find({'_id': uncompletedFieldGuides[0]}); + displayedFieldGuides.exec(function(err, fieldGuide) { + if (err) { + return next(err); + } + fieldGuide = fieldGuide.pop(); + if (fieldGuide === undefined) { + req.flash('success', { + msg: "You've read all our current Field Guide entries. You can contribute to our Field Guide here." + }); + return res.redirect('../field-guide/how-do-i-use-this-guide?'); + } + var nameString = fieldGuide.name.toLowerCase().replace(/\s/g, '-'); + return res.redirect('../field-guide/' + nameString); + }); +}; + +exports.completedFieldGuide = function (req, res, next) { + debug('params in completedFieldGuide', req.params); + var fieldGuideId = req.body.fieldGuideInfo.fieldGuideId; + + req.user.completedFieldGuides.push(fieldGuideId); + + var index = req.user.uncompletedFieldGuides.indexOf(fieldGuideId); + if (index > -1) { + req.user.progressTimestamps.push(Date.now() || 0); + req.user.uncompletedFieldGuides.splice(index, 1); + } + + req.user.save(function (err, user) { + if (err) { + return next(err); + } + if (user) { + res.send(true); + } + }); +}; diff --git a/controllers/resources.js b/controllers/resources.js index 8ec410f9dc..707b333fe7 100644 --- a/controllers/resources.js +++ b/controllers/resources.js @@ -3,7 +3,7 @@ var async = require('async'), Challenge = require('./../models/Challenge'), Bonfire = require('./../models/Bonfire'), Story = require('./../models/Story'), - Wiki = require('./../models/Wiki'), + FieldGuide = require('./../models/FieldGuide'), Nonprofit = require('./../models/Nonprofit'), Comment = require('./../models/Comment'), resources = require('./resources.json'), @@ -12,7 +12,7 @@ var async = require('async'), bonfires = require('../seed_data/bonfires.json'), nonprofits = require('../seed_data/nonprofits.json'), coursewares = require('../seed_data/coursewares.json'), - wikis = require('../seed_data/wikis.json'), + fieldGuides = require('../seed_data/field-guides.json'), moment = require('moment'), https = require('https'), debug = require('debug')('freecc:cntr:resources'), @@ -259,8 +259,8 @@ module.exports = { }); }, - allWikiIds: function() { - return wikis.map(function(elem) { + allFieldGuideIds: function() { + return fieldGuides.map(function(elem) { return { _id: elem._id, } @@ -289,8 +289,8 @@ module.exports = { }); }, - allWikiNames: function() { - return wikis.map(function(elem) { + allFieldGuideNames: function() { + return fieldGuides.map(function(elem) { return { name: elem.name } diff --git a/controllers/wiki.js b/controllers/wiki.js deleted file mode 100644 index 04d95114ce..0000000000 --- a/controllers/wiki.js +++ /dev/null @@ -1,99 +0,0 @@ -var _ = require('lodash'), - debug = require('debug')('freecc:cntr:wiki'), - Wiki = require('./../models/Wiki'), - resources = require('./resources'), - R = require('ramda'); - -exports.returnIndividualWiki = function(req, res, next) { - var dashedName = req.params.wikiName; - - var wikiName = dashedName.replace(/\-/g, ' '); - - Wiki.find({'name': new RegExp(wikiName, 'i')}, function(err, wiki) { - if (err) { - next(err); - } - - if (wiki.length < 1) { - req.flash('errors', { - msg: "404: We couldn't find a wiki entry with that name. Please double check the name." - }); - - return res.redirect('/wiki'); - } - - wiki = wiki.pop(); - var dashedNameFull = wiki.name.toLowerCase().replace(/\s/g, '-').replace(/\?/g, ''); - if (dashedNameFull != dashedName) { - return res.redirect('../wiki/' + dashedNameFull); - } - res.render('wiki/show', { - title: wiki.name, - wikiId: wiki._id, - description: wiki.description.join('') - }); - }); -}; - -exports.showAllWikis = function(req, res) { - var data = {}; - data.wikiList = resources.allWikiNames(); - data.wikiIds = resources.allWikiIds(); - data.completedWikis = req.user.completedWikis; - res.send(data); -}; - -exports.returnNextWiki = function(req, res, next) { - if (!req.user) { - return res.redirect('../wiki/how-do-i-use-this-guide?'); - } - - var completed = req.user.completedWikis; - - req.user.uncompletedWikis = resources.allWikiIds().filter(function (elem) { - if (completed.indexOf(elem) === -1) { - return elem; - } - }); - req.user.save(); - - var uncompletedWikis = req.user.uncompletedWikis; - - var displayedWikis = Wiki.find({'_id': uncompletedWikis[0]}); - displayedWikis.exec(function(err, wiki) { - if (err) { - return next(err); - } - wiki = wiki.pop(); - if (wiki === undefined) { - req.flash('success', { - msg: "You've read all our current Wiki entries. You can contribute to our Wiki here." - }); - return res.redirect('../wiki/how-do-i-use-this-guide?'); - } - var nameString = wiki.name.toLowerCase().replace(/\s/g, '-'); - return res.redirect('../wiki/' + nameString); - }); -}; - -exports.completedWiki = function (req, res, next) { - debug('params in completedWiki', req.params); - var wikiId = req.body.wikiInfo.wikiId; - - req.user.completedWikis.push(wikiId); - - var index = req.user.uncompletedWikis.indexOf(wikiId); - if (index > -1) { - req.user.progressTimestamps.push(Date.now() || 0); - req.user.uncompletedWikis.splice(index, 1); - } - - req.user.save(function (err, user) { - if (err) { - return next(err); - } - if (user) { - res.send(true); - } - }); -}; diff --git a/models/Wiki.js b/models/FieldGuide.js similarity index 66% rename from models/Wiki.js rename to models/FieldGuide.js index e7eb8a183b..b705f44774 100644 --- a/models/Wiki.js +++ b/models/FieldGuide.js @@ -1,7 +1,7 @@ var mongoose = require('mongoose'); var secrets = require('../config/secrets'); -var wikiSchema = new mongoose.Schema({ +var fieldGuideSchema = new mongoose.Schema({ name: { type: String, unique: false @@ -12,4 +12,4 @@ var wikiSchema = new mongoose.Schema({ } }); -module.exports = mongoose.model('Wiki', wikiSchema); +module.exports = mongoose.model('FieldGuide', fieldGuideSchema); diff --git a/models/User.js b/models/User.js index d511c4a897..36e9c87f78 100644 --- a/models/User.js +++ b/models/User.js @@ -127,8 +127,8 @@ var userSchema = new mongoose.Schema({ verified: Boolean } ], - completedWikis: [], - uncompletedWikis: [], + completedFieldGuides: [], + uncompletedFieldGuides: [], currentStreak: { type: Number, default: 0 diff --git a/public/js/main.js b/public/js/main.js index 00081f0f4b..14db8f7f1b 100644 --- a/public/js/main.js +++ b/public/js/main.js @@ -52,18 +52,18 @@ $(document).ready(function() { } } - function completedWiki(wikiId) { + function completedFieldGuide(fieldGuideId) { if ($('.signup-btn-nav').length < 1) { $.post( - '/completed-wiki', + '/completed-field-guide', { - wikiInfo: { - wikiId: wikiId + fieldGuideInfo: { + fieldGuideId: fieldGuideId } }, function(res) { if (res) { - window.location.href = '/wiki' + window.location.href = '/field-guide' } }); } @@ -78,9 +78,10 @@ $(document).ready(function() { }); - $('.next-wiki-button').on('click', function() { - var wikiId = $('#wikiId').text(); - completedWiki(wikiId); + $('.next-field-guide-button').on('click', function() { + console.log('click'); + var fieldGuideId = $('#fieldGuideId').text(); + completedFieldGuide(fieldGuideId); }); $("img").error(function () { diff --git a/seed_data/wikis.json b/seed_data/field-guides.json similarity index 100% rename from seed_data/wikis.json rename to seed_data/field-guides.json diff --git a/seed_data/seed.js b/seed_data/seed.js index 5a131cc4d9..95c35b328f 100644 --- a/seed_data/seed.js +++ b/seed_data/seed.js @@ -1,12 +1,12 @@ require('dotenv').load(); var Bonfire = require('../models/Bonfire.js'), Courseware = require('../models/Courseware.js'), - Wiki = require('../models/Wiki.js'), + FieldGuide = require('../models/FieldGuide.js'), Nonprofit = require('../models/Nonprofit.js'), mongoose = require('mongoose'), secrets = require('../config/secrets'), coursewares = require('./coursewares.json'), - wikis = require('./wikis.json'), + fieldGuides = require('./field-guides.json'), nonprofits = require('./nonprofits.json'), bonfires = require('./bonfires.json'); @@ -61,13 +61,13 @@ Courseware.remove({}, function(err, data) { console.log('coursewares'); }); -Wiki.remove({}, function(err, data) { +FieldGuide.remove({}, function(err, data) { if (err) { console.error(err); } else { console.log('Deleted ', data); } - Wiki.create(wikis, function(err, data) { + FieldGuide.create(fieldGuides, function(err, data) { if (err) { console.log(err); } else { @@ -75,7 +75,7 @@ Wiki.remove({}, function(err, data) { } CompletionMonitor(); }); - console.log('wikis'); + console.log('field guides'); }); Nonprofit.remove({}, function(err, data) { diff --git a/views/wiki/show.jade b/views/field-guide/show.jade similarity index 81% rename from views/wiki/show.jade rename to views/field-guide/show.jade index 1f9782a2e9..5a568642dc 100644 --- a/views/wiki/show.jade +++ b/views/field-guide/show.jade @@ -1,7 +1,7 @@ extends ../layout block content script. - var challengeName = 'Wiki View'; + var challengeName = 'Field Guide View'; .col-xs-12.col-sm-12.col-md-12 .panel.panel-info .panel-heading.text-center @@ -15,7 +15,7 @@ block content .spacer .col-xs-12.col-sm-6.col-sm-offset-3 .text-center - .next-wiki-button.btn.btn-primary.btn-big.btn-block Next article (ctrl + enter) + .next-fieldGuide-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 .spacer @@ -30,13 +30,13 @@ block content .modal-header.all-list-header Wiki Articles a.close.closing-x(href='#', data-dismiss='modal', aria-hidden='true') × .modal-body - include ../partials/wikis - #wikiId.hidden= wikiId + include ../partials/field-guide + #fieldGuideId.hidden= fieldGuideId script. $(document).ready(function() { $('body').keydown(function(e) { if (e.ctrlKey && e.keyCode == 13) { - $('.next-wiki-button').click(); + $('.next-field-guide-button').click(); } }); }); diff --git a/views/partials/wikis.jade b/views/partials/field-guide.jade similarity index 51% rename from views/partials/wikis.jade rename to views/partials/field-guide.jade index 6e6d817fd1..7af5c02fc9 100644 --- a/views/partials/wikis.jade +++ b/views/partials/field-guide.jade @@ -1,5 +1,5 @@ h3 - ol#wikiList + ol#fieldGuideList script(src='/js/lib/ramda/ramda.min.js') script. var getLinkedName = function getLinkedName(name) { @@ -8,22 +8,22 @@ h3 return name.toLowerCase().replace(/\s/g, '-').replace(/\?/g, ''); } $.ajax({ - url: '/wiki/getWikiList', + url: '/field-guide/getFieldGuideList', type: 'GET' }) .success( function(data) { var docfrag = document.createDocumentFragment(); - for (var i = 0; i < data.wikiList.length; i++) { + for (var i = 0; i < data.fieldGuideList.length; i++) { var li = document.createElement("li"); - // strike through wikis previously read - var linkedName = getLinkedName(data.wikiList[i].name); - if (data.completedWikis.indexOf(data.wikiIds[i]) > -1) { - $(li).html("" + data.wikiList[i].name + ""); + // strike through field guides previously read + var linkedName = getLinkedName(data.fieldGuideList[i].name); + if (data.completedFieldGuides.indexOf(data.fieldGuideIds[i]) > -1) { + $(li).html("" + data.fieldGuideList[i].name + ""); } else { - $(li).html("" + data.wikiList[i].name + ""); + $(li).html("" + data.fieldGuideList[i].name + ""); } docfrag.appendChild(li); }; - $('#wikiList').append(docfrag); + $('#fieldGuideList').append(docfrag); }); diff --git a/views/partials/navbar.jade b/views/partials/navbar.jade index 17901f93ca..e85e2b20e0 100644 --- a/views/partials/navbar.jade +++ b/views/partials/navbar.jade @@ -18,7 +18,7 @@ li a(href='/stories/hot') News li - a(href='/wiki') Field Guide + a(href='/field-guide') Field Guide if !user li       li