Added start of individual post view and post lists view, wired upvoting functionality for individual posts

pull/161/head
Nathan Leniz 2015-03-03 22:03:33 +09:00
parent 94bbb7a4a5
commit 4b84b49d07
8 changed files with 307 additions and 26 deletions

220
.eslintrc Normal file
View File

@ -0,0 +1,220 @@
{
"ecmaFeatures": {
"jsx": true
},
"env": {
"browser": true,
"mocha": true,
"node": true
},
"globals": {
"window": true,
"$": true,
"ga": true,
"jQuery": true
},
"rules": {
"no-comma-dangle": 2,
"no-cond-assign": 2,
"no-console": 0,
"no-constant-condition": 2,
"no-control-regex": 2,
"no-debugger": 2,
"no-dupe-keys": 2,
"no-empty": 2,
"no-empty-class": 2,
"no-ex-assign": 2,
"no-extra-boolean-cast": 2,
"no-extra-parens": 0,
"no-extra-semi": 2,
"no-func-assign": 2,
"no-inner-declarations": 2,
"no-invalid-regexp": 2,
"no-irregular-whitespace": 2,
"no-negated-in-lhs": 2,
"no-obj-calls": 2,
"no-regex-spaces": 2,
"no-reserved-keys": 0,
"no-sparse-arrays": 2,
"no-unreachable": 2,
"use-isnan": 2,
"valid-jsdoc": 2,
"valid-typeof": 2,
"block-scoped-var": 2,
"complexity": 0,
"consistent-return": 2,
"curly": 2,
"default-case": 1,
"dot-notation": 0,
"eqeqeq": 1,
"guard-for-in": 1,
"no-alert": 1,
"no-caller": 2,
"no-div-regex": 2,
"no-else-return": 0,
"no-empty-label": 2,
"no-eq-null": 1,
"no-eval": 2,
"no-extend-native": 2,
"no-extra-bind": 2,
"no-fallthrough": 2,
"no-floating-decimal": 2,
"no-implied-eval": 2,
"no-iterator": 2,
"no-labels": 2,
"no-lone-blocks": 2,
"no-loop-func": 1,
"no-multi-spaces": 1,
"no-multi-str": 2,
"no-native-reassign": 2,
"no-new": 2,
"no-new-func": 2,
"no-new-wrappers": 2,
"no-octal": 2,
"no-octal-escape": 2,
"no-process-env": 0,
"no-proto": 2,
"no-redeclare": 1,
"no-return-assign": 2,
"no-script-url": 2,
"no-self-compare": 2,
"no-sequences": 2,
"no-unused-expressions": 2,
"no-void": 1,
"no-warning-comments": [
1,
{
"terms": [
"fixme"
],
"location": "start"
}
],
"no-with": 2,
"radix": 2,
"vars-on-top": 0,
"wrap-iife": [2, "any"],
"yoda": 0,
"strict": 0,
"no-catch-shadow": 2,
"no-delete-var": 2,
"no-label-var": 2,
"no-shadow": 0,
"no-shadow-restricted-names": 2,
"no-undef": 2,
"no-undef-init": 2,
"no-undefined": 1,
"no-unused-vars": 2,
"no-use-before-define": 0,
"handle-callback-err": 2,
"no-mixed-requires": 0,
"no-new-require": 2,
"no-path-concat": 2,
"no-process-exit": 2,
"no-restricted-modules": 0,
"no-sync": 0,
"brace-style": [
2,
"1tbs",
{ "allowSingleLine": true }
],
"camelcase": 1,
"comma-spacing": [
2,
{
"before": false,
"after": true
}
],
"comma-style": [
2, "last"
],
"consistent-this": 0,
"eol-last": 2,
"func-names": 0,
"func-style": 0,
"key-spacing": [
2,
{
"beforeColon": false,
"afterColon": true
}
],
"max-nested-callbacks": 0,
"new-cap": 0,
"new-parens": 2,
"no-array-constructor": 2,
"no-inline-comments": 1,
"no-lonely-if": 1,
"no-mixed-spaces-and-tabs": 2,
"no-multiple-empty-lines": [
1,
{ "max": 2 }
],
"no-nested-ternary": 2,
"no-new-object": 2,
"no-space-before-semi": 2,
"no-spaced-func": 2,
"no-ternary": 0,
"no-trailing-spaces": 1,
"no-underscore-dangle": 0,
"no-wrap-func": 2,
"one-var": 0,
"operator-assignment": 0,
"padded-blocks": 0,
"quote-props": 0,
"quotes": [
2,
"single",
"avoid-escape"
],
"semi": [
2,
"always"
],
"sort-vars": 0,
"space-after-keywords": [
2,
"always",
{ "checkFunctionKeyword": false }
],
"space-after-function-names": "never",
"space-before-blocks": [
2,
"always"
],
"space-in-brackets": 0,
"space-in-parens": 0,
"space-infix-ops": 2,
"space-return-throw-case": 2,
"space-unary-ops": [
1,
{
"words": true,
"nonwords": false
}
],
"spaced-line-comment": [
2,
"always",
{ "exceptions": ["-"] }
],
"wrap-regex": 1,
"max-depth": 0,
"max-len": [
1,
80,
2
],
"max-params": 0,
"max-statements": 0,
"no-bitwise": 1,
"no-plusplus": 0
}
}

2
.gitignore vendored
View File

@ -23,3 +23,5 @@ node_modules
.DS_Store
Thumbs.db
bower_components
.eslintignore
.eslintrc

4
app.js
View File

@ -292,6 +292,10 @@ app.get(
'/stories/:storyName',
storyController.returnIndividualStory
);
app.post(
'/stories/upvote/:id',
storyController.upvote
);
/**
* Challenge related routes

View File

@ -50,9 +50,10 @@ exports.returnIndividualStory = function(req, res, next) {
story = story.pop();
var dashedNameFull = story.headline.toLowerCase().replace(/\s/g, '-');
if (dashedNameFull != dashedName) {
if (dashedNameFull !== dashedName) {
return res.redirect('../stories/' + dashedNameFull);
}
debug('Story id is', story._id);
res.render('post/show', {
title: story.headline,
@ -61,7 +62,21 @@ exports.returnIndividualStory = function(req, res, next) {
body: story.body,
rank: story.rank,
upVotes: story.upVotes,
comments: story.comments
comments: story.comments,
id: story._id
});
});
};
exports.upvote = function(req, res, next) {
var data = req.params.id;
Story.find({'_id': data}, function(err, story) {
if (err) {
throw err;
}
story = story.pop();
story.rank++;
story.save();
return res.send(story);
});
};

View File

@ -744,6 +744,10 @@ iframe.iphone {
margin-bottom: -4px;
}
.story-list li {
padding-bottom: 5px;
}
//uncomment this to see the dimensions of all elements outlined in red
//* {
// border-color: red;

View File

@ -120,6 +120,27 @@ $(document).ready(function() {
$('#brief-instructions').show();
$('#long-instructions').hide();
});
var upvoteHandler = function () {
var _id = storyId;
$.ajax({
type: 'POST',
url: '/stories/upvote/' + _id,
beforeSend: function() {
$('#upvote').unbind('click');
},
error: function(xhr, textStatus, errorThrown) {
console.log('got error');
$('#upvote').bind('click', upvoteHandler);
},
success: function (data, textStatus, xhr) {
console.log(data);
$('#storyRank').text(data.rank);
}
});
};
$('#upvote').on('click', upvoteHandler);
});
var profileValidation = angular.module('profileValidation',['ui.bootstrap']);

View File

@ -1,22 +1,23 @@
h2
ul#story-list Top Stories
h3
script(src="https://cdn.jsdelivr.net/ramda/0.10.0/ramda.min.js")
script.
var getLinkedName = function getLinkedName(name) {
return name.toLowerCase().replace(/\s/g, '-');
}
$.ajax({
url: '/stories/index',
type: 'GET'
})
.success(
function(data) {
for (var i = 0; i < data.length; i++) {
var li = document.createElement('li');
var linkedName = getLinkedName(data[i].headline);
h3
ul#story-list.story-list
$(li).html("<a href='/stories/" + linkedName + "'>" + data[i].headline + "</a></li>");
$(li).appendTo($('#story-list'));
}
});
script(src="https://cdn.jsdelivr.net/ramda/0.10.0/ramda.min.js")
script.
var getLinkedName = function getLinkedName(name) {
return name.toLowerCase().replace(/\s/g, '-');
}
$.ajax({
url: '/stories/index',
type: 'GET'
})
.success(
function(data) {
for (var i = 0; i < data.length; i++) {
var li = document.createElement('li');
var linkedName = getLinkedName(data[i].headline);
var rank = data[i].rank;
$(li).html("<div class='row text-center'><div class='col-xs-3 text-right'><i class='ion-arrow-up-b'></i></div><div class='col-xs-6'><a href='/stories/" + linkedName + "'>" + data[i].headline + "</a></div><div class='col-xs-3'></div></div><div class='row text-center'><div class='col-xs-3 text-right'>" + rank + "</div><div class='col-xs-6'>" + data[i].author.username + "</div><div class='col-xs-3'></div></div></li>");
$(li).appendTo($('#story-list'));
}
});

View File

@ -1,8 +1,22 @@
extends ../layout
block content
h1= title
h3= body
h5= rank
script.
var challengeName = 'Story';
var storyId = !{JSON.stringify(id)};
.jumbotron
.row
.col-xs-2(style='position: relative; top: 50%; -webkit-transform: translateY(50%); -ms-transform: translateY(50%);transform: translateY(50%);')
h3#storyRank= rank
.col-xs-10.text-center
h1= title
.row
.col-xs-2
h3
a#upvote
i.ion-arrow-up-b
.col-xs-10.text-center
h3= body