diff --git a/.eslintrc b/.eslintrc new file mode 100644 index 0000000000..a167df14d6 --- /dev/null +++ b/.eslintrc @@ -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 + } +} \ No newline at end of file diff --git a/.gitignore b/.gitignore index 002acaf376..01824e83b9 100644 --- a/.gitignore +++ b/.gitignore @@ -23,3 +23,5 @@ node_modules .DS_Store Thumbs.db bower_components +.eslintignore +.eslintrc diff --git a/app.js b/app.js index a4365992f8..a5c3f8e4bf 100644 --- a/app.js +++ b/app.js @@ -292,6 +292,10 @@ app.get( '/stories/:storyName', storyController.returnIndividualStory ); +app.post( + '/stories/upvote/:id', + storyController.upvote +); /** * Challenge related routes diff --git a/controllers/story.js b/controllers/story.js index e454a91ea2..f4cf67ed5d 100644 --- a/controllers/story.js +++ b/controllers/story.js @@ -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); + }); +}; diff --git a/public/css/main.less b/public/css/main.less index 9885b31d57..b6099f52c6 100644 --- a/public/css/main.less +++ b/public/css/main.less @@ -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; diff --git a/public/js/main.js b/public/js/main.js index aa5b28a913..1613a8cfd4 100644 --- a/public/js/main.js +++ b/public/js/main.js @@ -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']); diff --git a/views/post/posts.jade b/views/post/posts.jade index ffe7d0e438..067f8321ae 100644 --- a/views/post/posts.jade +++ b/views/post/posts.jade @@ -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("" + data[i].headline + ""); - $(li).appendTo($('#story-list')); - } - }); \ No newline at end of file + 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("
" + data[i].headline + "
" + rank + "
" + data[i].author.username + "
"); + $(li).appendTo($('#story-list')); + } + }); \ No newline at end of file diff --git a/views/post/show.jade b/views/post/show.jade index f8fdb58a61..5e190f0909 100644 --- a/views/post/show.jade +++ b/views/post/show.jade @@ -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 +