├── .buildignore ├── .gitattributes ├── client ├── app │ ├── account │ │ ├── login │ │ │ ├── login.css │ │ │ ├── login.controller.js │ │ │ └── login.html │ │ ├── signup │ │ │ ├── signup.css │ │ │ ├── signup.controller.js │ │ │ └── signup.html │ │ ├── account.js │ │ └── settings │ │ │ ├── settings.controller.js │ │ │ └── settings.html │ ├── contributionRecd │ │ ├── contributionRecd.css │ │ ├── contributionRecd.controller.js │ │ ├── contributionRecd.js │ │ └── contributionRecd.html │ ├── contribution │ │ ├── contribution.css │ │ ├── contribution.js │ │ ├── contribution.html │ │ └── contribution.controller.js │ ├── main │ │ ├── main.controller.js │ │ ├── main.js │ │ ├── main.css │ │ ├── main.controller.spec.js │ │ └── main.html │ ├── submission │ │ ├── submission.css │ │ ├── submission.js │ │ ├── submission.controller.js │ │ └── submission.html │ ├── inbox │ │ ├── inbox.js │ │ ├── inbox.css │ │ ├── inbox.html │ │ └── inbox.controller.js │ ├── dashboard │ │ ├── dashboard.js │ │ ├── dashboard.css │ │ ├── dashboard.controller.js │ │ └── dashboard.html │ ├── allHelpRequest │ │ ├── allHelpRequest.js │ │ ├── allHelpRequest.css │ │ ├── allHelpRequest.controller.js │ │ └── allHelpRequest.html │ ├── help-request │ │ ├── help-request.js │ │ ├── help-request.css │ │ ├── help-request.html │ │ └── help-request.controller.js │ ├── app.css │ └── app.js ├── robots.txt ├── assets │ └── images │ │ ├── letterA.jpg │ │ └── calligraphy.png ├── components │ ├── auth │ │ ├── user.service.js │ │ ├── helpRequest.service.js │ │ ├── contribution.service.js │ │ └── auth.service.js │ ├── modal │ │ ├── modal.css │ │ ├── modal.html │ │ └── modal.service.js │ └── navbar │ │ ├── navbar.controller.js │ │ └── navbar.html ├── .jshintrc ├── favicon.ico ├── index.html └── .htaccess ├── server ├── config │ ├── secret.example │ └── dbConfig.example.js ├── .jshintrc-spec ├── .jshintrc ├── models │ ├── project.js │ ├── projectupvotes.js │ ├── contributionupvotes.js │ ├── contributions.js │ ├── projectcomments.js │ ├── contributioncomments.js │ ├── user.js │ ├── associations.js │ └── helpers.js └── app.js ├── .bowerrc ├── .floo ├── .flooignore ├── .travis.yml ├── .gitignore ├── e2e └── main │ ├── main.po.js │ └── main.spec.js ├── .editorconfig ├── bower.json ├── LICENSE ├── .yo-rc.json ├── protractor.conf.js ├── README.md ├── karma.conf.js ├── package.json ├── PRESS-RELEASE.md ├── CONTRIBUTING.md ├── STYLE-GUIDE.md ├── Gruntfile.js └── commit_history.md /.buildignore: -------------------------------------------------------------------------------- 1 | *.coffee -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | * text=auto -------------------------------------------------------------------------------- /client/app/account/login/login.css: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /client/app/contributionRecd/contributionRecd.css: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /server/config/secret.example: -------------------------------------------------------------------------------- 1 | SECRET GOES HERE -------------------------------------------------------------------------------- /client/robots.txt: -------------------------------------------------------------------------------- 1 | # robotstxt.org 2 | 3 | User-agent: * 4 | -------------------------------------------------------------------------------- /.bowerrc: -------------------------------------------------------------------------------- 1 | { 2 | "directory": "client/bower_components" 3 | } 4 | -------------------------------------------------------------------------------- /.floo: -------------------------------------------------------------------------------- 1 | { 2 | "url": "https://floobits.com/HackReactor/familythief" 3 | } -------------------------------------------------------------------------------- /.flooignore: -------------------------------------------------------------------------------- 1 | #* 2 | *.o 3 | *.pyc 4 | *~ 5 | extern/ 6 | node_modules/ 7 | tmp 8 | vendor/ -------------------------------------------------------------------------------- /client/app/account/signup/signup.css: -------------------------------------------------------------------------------- 1 | .list-group-item { 2 | font-size: 18px; 3 | border: none; 4 | } -------------------------------------------------------------------------------- /client/assets/images/letterA.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/craigsmith24/family-thief/HEAD/client/assets/images/letterA.jpg -------------------------------------------------------------------------------- /client/assets/images/calligraphy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/craigsmith24/family-thief/HEAD/client/assets/images/calligraphy.png -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: node_js 2 | node_js: 3 | - '0.10' 4 | - '0.11' 5 | before_script: 6 | - npm install -g bower grunt-cli 7 | - bower install 8 | services: mongodb -------------------------------------------------------------------------------- /client/app/contribution/contribution.css: -------------------------------------------------------------------------------- 1 | p#helpRequestText, p#contributionText { 2 | border: 3px solid green; 3 | border-radius: 10px; 4 | padding: 10px 10px; 5 | } -------------------------------------------------------------------------------- /client/app/main/main.controller.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | angular.module('familyThiefApp') 4 | .controller('MainCtrl', function ($scope, $http) { 5 | 6 | 7 | }); 8 | -------------------------------------------------------------------------------- /client/app/submission/submission.css: -------------------------------------------------------------------------------- 1 | .submission-form { 2 | margin-bottom: 40px; 3 | } 4 | 5 | .success-color { 6 | color: green; 7 | } 8 | 9 | .error-color { 10 | color: red; 11 | } -------------------------------------------------------------------------------- /server/.jshintrc-spec: -------------------------------------------------------------------------------- 1 | { 2 | "extends": ".jshintrc", 3 | "globals": { 4 | "describe": true, 5 | "it": true, 6 | "before": true, 7 | "beforeEach": true, 8 | "after": true, 9 | "afterEach": true 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | public 3 | .tmp 4 | .idea 5 | .DS_Store 6 | client/bower_components 7 | dist 8 | /server/config/local.env.js 9 | 10 | # Ingore actual db config 11 | /server/config/dbConfig.js 12 | 13 | # Ignore actual authentication secret 14 | /server/config/secret 15 | -------------------------------------------------------------------------------- /client/app/main/main.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | angular.module('familyThiefApp') 4 | .config(function ($stateProvider) { 5 | $stateProvider 6 | .state('main', { 7 | url: '/', 8 | templateUrl: 'app/main/main.html', 9 | controller: 'MainCtrl' 10 | }); 11 | }); -------------------------------------------------------------------------------- /server/.jshintrc: -------------------------------------------------------------------------------- 1 | { 2 | "node": true, 3 | "esnext": true, 4 | "bitwise": true, 5 | "eqeqeq": true, 6 | "immed": true, 7 | "latedef": "nofunc", 8 | "newcap": true, 9 | "noarg": true, 10 | "regexp": true, 11 | "undef": true, 12 | "smarttabs": true, 13 | "asi": true, 14 | "debug": true 15 | } 16 | -------------------------------------------------------------------------------- /client/app/inbox/inbox.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | angular.module('familyThiefApp') 4 | .config(function ($stateProvider) { 5 | $stateProvider 6 | .state('inbox', { 7 | url: '/inbox', 8 | templateUrl: 'app/inbox/inbox.html', 9 | controller: 'InboxCtrl', 10 | authenticate: true 11 | }); 12 | }); -------------------------------------------------------------------------------- /client/app/dashboard/dashboard.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | angular.module('familyThiefApp') 4 | .config(function ($stateProvider) { 5 | $stateProvider 6 | .state('dashboard', { 7 | url: '/dashboard', 8 | templateUrl: 'app/dashboard/dashboard.html', 9 | controller: 'DashboardCtrl', 10 | authenticate: true 11 | }); 12 | }); -------------------------------------------------------------------------------- /client/app/contribution/contribution.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | angular.module('familyThiefApp') 4 | .config(function ($stateProvider) { 5 | $stateProvider 6 | .state('contribution', { 7 | url: '/contribution', 8 | templateUrl: 'app/contribution/contribution.html', 9 | controller: 'ContributionCtrl', 10 | authenticate: true 11 | }); 12 | }); -------------------------------------------------------------------------------- /client/app/allHelpRequest/allHelpRequest.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | angular.module('familyThiefApp') 4 | .config(function ($stateProvider) { 5 | $stateProvider 6 | .state('allHelpRequest', { 7 | url: '/allHelpRequest', 8 | templateUrl: 'app/allHelpRequest/allHelpRequest.html', 9 | controller: 'AllHelpRequestCtrl', 10 | authenticate: true 11 | }); 12 | }); -------------------------------------------------------------------------------- /server/models/project.js: -------------------------------------------------------------------------------- 1 | var db = require('../config/dbConfig.js'); 2 | var Sequelize = require('sequelize'); 3 | var User = require('./user.js'); 4 | 5 | var Project = db.define('Project', 6 | { 7 | title: Sequelize.STRING, 8 | summary: Sequelize.STRING, 9 | text: Sequelize.TEXT, 10 | user_id: Sequelize.INTEGER 11 | } 12 | ); 13 | 14 | db.sync(); 15 | 16 | module.exports = Project; 17 | -------------------------------------------------------------------------------- /client/app/contributionRecd/contributionRecd.controller.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | angular.module('familyThiefApp') 4 | .controller('ContributionRecdCtrl', function ($scope, $http, User, HelpRequest) { 5 | $scope.getCurrentUser = User.getCurrentUser; 6 | 7 | $scope.helpRequest = {}; 8 | 9 | $scope.respondToHelpRequest = function() { 10 | 11 | } 12 | 13 | 14 | 15 | 16 | }); 17 | -------------------------------------------------------------------------------- /client/app/submission/submission.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | //add submission state to the app 4 | 5 | angular.module('familyThiefApp') 6 | .config(function ($stateProvider) { 7 | $stateProvider 8 | .state('submission', { 9 | url: '/submission', 10 | templateUrl: 'app/submission/submission.html', 11 | controller: 'SubmissionCtrl', 12 | authenticate: true 13 | }); 14 | }); -------------------------------------------------------------------------------- /server/models/projectupvotes.js: -------------------------------------------------------------------------------- 1 | var db = require('../config/dbConfig.js'); 2 | var Sequelize = require('sequelize'); 3 | var User = require('./user.js'); 4 | var Project = require('./project.js'); 5 | 6 | var ProjectUpvote = db.define('ProjectUpvote', 7 | { 8 | upvoter: Sequelize.INTEGER, 9 | projectupvoted: Sequelize.INTEGER 10 | 11 | } 12 | ); 13 | 14 | db.sync(); 15 | 16 | module.exports = ProjectUpvote; 17 | -------------------------------------------------------------------------------- /client/app/help-request/help-request.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | //add help-request state to the app 4 | 5 | angular.module('familyThiefApp') 6 | .config(function ($stateProvider) { 7 | $stateProvider 8 | .state('help-request', { 9 | url: '/help-request', 10 | templateUrl: 'app/help-request/help-request.html', 11 | controller: 'HelpRequestCtrl', 12 | authenticate: true 13 | }); 14 | }); -------------------------------------------------------------------------------- /client/app/allHelpRequest/allHelpRequest.css: -------------------------------------------------------------------------------- 1 | .search-list-item { 2 | padding: 5px 5px; 3 | margin-bottom: 10px; 4 | height: 100px; 5 | overflow: hidden; 6 | border: 3px solid #47a447; 7 | border-radius: 10px; 8 | width: 70%; 9 | margin: 20px auto; 10 | } 11 | 12 | .search-list-item:hover { 13 | cursor: pointer; 14 | background-color: #448BCA; 15 | } 16 | 17 | a.search-item { 18 | color: black; 19 | display: block; 20 | } -------------------------------------------------------------------------------- /server/models/contributionupvotes.js: -------------------------------------------------------------------------------- 1 | var db = require('../config/dbConfig.js'); 2 | var Sequelize = require('sequelize'); 3 | var User = require('./user.js'); 4 | var Contribution = require('./contributions.js'); 5 | 6 | var ContributionUpvote = db.define('ContributionUpvote', 7 | { 8 | upvoter: Sequelize.INTEGER, 9 | contributionupvoted: Sequelize.INTEGER 10 | 11 | } 12 | ); 13 | 14 | db.sync(); 15 | 16 | module.exports = ContributionUpvote; 17 | -------------------------------------------------------------------------------- /client/app/contributionRecd/contributionRecd.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | //add contributionRecd state to the app 4 | 5 | angular.module('familyThiefApp') 6 | .config(function ($stateProvider) { 7 | $stateProvider 8 | .state('contributionRecd', { 9 | url: '/contributionRecd', 10 | templateUrl: 'app/contributionRecd/contributionRecd.html', 11 | controller: 'ContributionRecdCtrl', 12 | authenticate: false 13 | }); 14 | }); -------------------------------------------------------------------------------- /client/app/inbox/inbox.css: -------------------------------------------------------------------------------- 1 | .mailbox-list-item { 2 | padding: 5px 5px; 3 | margin-bottom: 10px; 4 | height: 100px; 5 | overflow: hidden; 6 | border: 3px solid #47a447; 7 | border-radius: 10px; 8 | width: 70%; 9 | margin: 20px auto; 10 | } 11 | 12 | .mailbox-list-item:hover { 13 | cursor: pointer; 14 | background-color: #448BCA; 15 | } 16 | 17 | a.mailbox-item { 18 | color: black; 19 | display: block; 20 | } 21 | 22 | .unseen { 23 | border-color: red; 24 | } -------------------------------------------------------------------------------- /e2e/main/main.po.js: -------------------------------------------------------------------------------- 1 | /** 2 | * This file uses the Page Object pattern to define the main page for tests 3 | * https://docs.google.com/presentation/d/1B6manhG0zEXkC-H-tPo2vwU06JhL8w9-XCF9oehXzAQ 4 | */ 5 | 6 | 'use strict'; 7 | 8 | var MainPage = function() { 9 | this.heroEl = element(by.css('.hero-unit')); 10 | this.h1El = this.heroEl.element(by.css('h1')); 11 | this.imgEl = this.heroEl.element(by.css('img')); 12 | }; 13 | 14 | module.exports = new MainPage(); 15 | 16 | -------------------------------------------------------------------------------- /server/models/contributions.js: -------------------------------------------------------------------------------- 1 | var db = require('../config/dbConfig.js'); 2 | var Sequelize = require('sequelize'); 3 | var User = require('./user.js'); 4 | var Project = require('./project.js'); 5 | 6 | var Contribution = db.define('Contribution', 7 | { 8 | contributionText: Sequelize.TEXT, 9 | unseenHelp: Sequelize.BOOLEAN, 10 | contributor: Sequelize.INTEGER, 11 | project: Sequelize.INTEGER 12 | 13 | } 14 | ); 15 | 16 | db.sync(); 17 | 18 | module.exports = Contribution; 19 | -------------------------------------------------------------------------------- /e2e/main/main.spec.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | describe('Main View', function() { 4 | var page; 5 | 6 | beforeEach(function() { 7 | browser.get('/'); 8 | page = require('./main.po'); 9 | }); 10 | 11 | it('should include jumbotron with correct data', function() { 12 | expect(page.h1El.getText()).toBe('\'Allo, \'Allo!'); 13 | expect(page.imgEl.getAttribute('src')).toMatch(/assets\/images\/yeoman.png$/); 14 | expect(page.imgEl.getAttribute('alt')).toBe('I\'m Yeoman'); 15 | }); 16 | }); 17 | -------------------------------------------------------------------------------- /server/models/projectcomments.js: -------------------------------------------------------------------------------- 1 | var db = require('../config/dbConfig.js'); 2 | var Sequelize = require('sequelize'); 3 | var User = require('./user.js'); 4 | var Project = require('./project.js'); 5 | 6 | var ProjectComment = db.define('ProjectComment', 7 | { 8 | comment: Sequelize.STRING, 9 | unseenComment: Sequelize.BOOLEAN, 10 | commenter: Sequelize.INTEGER, 11 | projectCommented: Sequelize.INTEGER 12 | 13 | } 14 | ); 15 | 16 | db.sync(); 17 | 18 | module.exports = ProjectComment; 19 | 20 | -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | # EditorConfig helps developers define and maintain consistent 2 | # coding styles between different editors and IDEs 3 | # editorconfig.org 4 | 5 | root = true 6 | 7 | 8 | [*] 9 | 10 | # Change these settings to your own preference 11 | indent_style = space 12 | indent_size = 2 13 | 14 | # We recommend you to keep these unchanged 15 | end_of_line = lf 16 | charset = utf-8 17 | trim_trailing_whitespace = true 18 | insert_final_newline = true 19 | 20 | [*.md] 21 | trim_trailing_whitespace = false 22 | -------------------------------------------------------------------------------- /client/components/auth/user.service.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | angular.module('familyThiefApp') 4 | .factory('User', function ($resource) { 5 | return $resource('/api/users/:id/:controller', { 6 | id: '@_id' 7 | }, 8 | { 9 | changePassword: { 10 | method: 'PUT', 11 | params: { 12 | controller:'password' 13 | } 14 | }, 15 | get: { 16 | method: 'GET', 17 | params: { 18 | id:'me' 19 | } 20 | } 21 | }); 22 | }); 23 | -------------------------------------------------------------------------------- /server/config/dbConfig.example.js: -------------------------------------------------------------------------------- 1 | var Sequelize = require('sequelize'); 2 | 3 | // Here you replace someUsername and somePassword with your prefered mysql 4 | // username and password. If you would like to use something other than mysql, 5 | // go for it. Check out Sequelize's docs for more info: 6 | // http://sequelize.readthedocs.org/en/latest/ 7 | 8 | var sequelize = new Sequelize('websteamCMD', 'someUsername', 'somePassword', { 9 | host: 'localhost', 10 | dialect: 'mysql' 11 | }); 12 | 13 | module.exports = sequelize; 14 | -------------------------------------------------------------------------------- /server/models/contributioncomments.js: -------------------------------------------------------------------------------- 1 | var db = require('../config/dbConfig.js'); 2 | var Sequelize = require('sequelize'); 3 | var User = require('./user.js'); 4 | var Contribution = require('./contributions.js'); 5 | 6 | var ContributionComment = db.define('ContributionComment', 7 | { 8 | comment: Sequelize.STRING, 9 | unseenComment: Sequelize.BOOLEAN, 10 | commenter: Sequelize.INTEGER, 11 | contributionCommented: Sequelize.INTEGER 12 | 13 | } 14 | ); 15 | 16 | db.sync(); 17 | 18 | module.exports = ContributionComment; 19 | -------------------------------------------------------------------------------- /client/components/auth/helpRequest.service.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | // this service provides an abstracted interface for working with helpRequests that we can use in any controller 4 | 5 | angular.module('familyThiefApp') 6 | .factory('HelpRequest', function ($resource) { 7 | var currentHelpRequest; 8 | return $resource('/api/helpRequests/:id/:controller', { 9 | id: '@id' 10 | }, 11 | { 12 | upvote: { 13 | method: 'POST', 14 | params: { 15 | id: 'votes' 16 | } 17 | } 18 | }); 19 | }); -------------------------------------------------------------------------------- /client/app/help-request/help-request.css: -------------------------------------------------------------------------------- 1 | .contrib-list-item { 2 | padding: 5px 5px; 3 | margin-bottom: 10px; 4 | height: 100px; 5 | overflow: hidden; 6 | border: 3px solid #47a447; 7 | border-radius: 10px; 8 | } 9 | 10 | a.list-item { 11 | color: black; 12 | display: block; 13 | } 14 | 15 | #hrSummary, #hrText { 16 | border: 3px solid #47a447; 17 | border-radius: 10px; 18 | padding: 10px 10px; 19 | } 20 | 21 | .contrib-list-item:hover { 22 | cursor: pointer; 23 | background-color: #448BCA; 24 | } 25 | 26 | .contrib-list-item .title { 27 | font-size: 18px; 28 | } -------------------------------------------------------------------------------- /client/components/modal/modal.css: -------------------------------------------------------------------------------- 1 | .modal-primary .modal-header, 2 | .modal-info .modal-header, 3 | .modal-success .modal-header, 4 | .modal-warning .modal-header, 5 | .modal-danger .modal-header { 6 | color: #fff; 7 | border-radius: 5px 5px 0 0; 8 | } 9 | .modal-primary .modal-header { 10 | background: #428bca; 11 | } 12 | .modal-info .modal-header { 13 | background: #5bc0de; 14 | } 15 | .modal-success .modal-header { 16 | background: #5cb85c; 17 | } 18 | .modal-warning .modal-header { 19 | background: #f0ad4e; 20 | } 21 | .modal-danger .modal-header { 22 | background: #d9534f; 23 | } -------------------------------------------------------------------------------- /client/components/modal/modal.html: -------------------------------------------------------------------------------- 1 |
Collaborative Writing Platform
7 |
8 | {{contribution.helpRequestText}}
9 |{{contribution.contributionText}}
13 | 18 |{{comment.comment}}
21 |{{result.title}}
22 |{{result.summary}}
25 |{{result.origDate | date:'yyyy-MM-dd'}}
28 |
42 | {{helpRequest.summary}}
11 |{{helpRequest.text}}
13 |You Have {{user.numberUnseenHelps}} new help from others! 11 | 12 |
13 |Are you sure you want to delete ' + name + ' ?
', 54 | buttons: [{ 55 | classes: 'btn-danger', 56 | text: 'Delete', 57 | click: function(e) { 58 | deleteModal.close(e); 59 | } 60 | }, { 61 | classes: 'btn-default', 62 | text: 'Cancel', 63 | click: function(e) { 64 | deleteModal.dismiss(e); 65 | } 66 | }] 67 | } 68 | }, 'modal-danger'); 69 | 70 | deleteModal.result.then(function(event) { 71 | del.apply(event, args); 72 | }); 73 | }; 74 | } 75 | } 76 | }; 77 | }); 78 | -------------------------------------------------------------------------------- /client/app/help-request/help-request.controller.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | angular.module('familyThiefApp') 4 | .controller('HelpRequestCtrl', function ($scope, $http, Auth, HelpRequest, $location) { 5 | $scope.currentUser = Auth.getCurrentUser(); 6 | $scope.helpRequest = {}; 7 | $scope.newContribution = {}; 8 | $scope.helpRequest.id = Auth.getHelpRequest(); 9 | $scope.hasVoted = false; 10 | $scope.contributionSuccess = false; 11 | 12 | 13 | // grabs the appropriate helpRequest data based on property stored in Auth service 14 | $scope.getHelpRequestData = function() { 15 | HelpRequest.get({id: $scope.helpRequest.id}, function(helpRequest) { 16 | $scope.helpRequest = helpRequest; 17 | // check if current user is owner of this help request and display it differently if so 18 | if($scope.currentUser.username === $scope.helpRequest.username) { 19 | $scope.isOwner = true; 20 | } else { 21 | $scope.isOwner = false; 22 | } 23 | }); 24 | } 25 | 26 | $scope.getHelpRequestData(); 27 | 28 | $scope.respondToHelpRequest = function() { 29 | var contribText = $scope.newContribution.text; 30 | $http.post('/api/contributions', { 31 | helperUsername: $scope.currentUser.username, 32 | helpedId: Auth.getHelpRequest(), // returns the id of the currently viewed help request 33 | text: $scope.newContribution.text 34 | }) 35 | .success(function(data, status) { 36 | // make this new data display in this view 37 | $scope.helpRequest.contributions.push({ 38 | helperUsername: $scope.currentUser.username, // username of contributor 39 | id: data.id, 40 | textSnippet: contribText, 41 | username: $scope.helpRequest.username, // owner of help request 42 | origDate: data.origDate 43 | }); 44 | $scope.currentUser.contributions.push({ 45 | id: data.id, 46 | textSnippet: contribText, 47 | helperUsername: $scope.currentUser.username, 48 | origDate: data.origDate 49 | }); 50 | $scope.contributionSuccess = true; 51 | }) 52 | }; 53 | 54 | $scope.loadContribution = function(id) { 55 | Auth.setContribution(id); // sets the id of the contribution that the user is about to view 56 | $location.path('/contribution'); 57 | }; 58 | 59 | $scope.upvote = function() { 60 | if(!$scope.hasVoted) { 61 | $http.post("api/helpRequests/votes", { 62 | helpRequestId: Auth.getHelpRequest() 63 | }) 64 | .success(function(data, status) { 65 | $scope.currentUser.votes += 1; 66 | $scope.helpRequest.votes += 1; 67 | }); 68 | } 69 | } 70 | 71 | 72 | 73 | 74 | }); 75 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "family-thief", 3 | "version": "0.0.0", 4 | "main": "server/app.js", 5 | "dependencies": { 6 | "bcrypt-nodejs": "0.0.3", 7 | "body-parser": "~1.5.0", 8 | "composable-middleware": "~0.3.0", 9 | "compression": "~1.0.1", 10 | "connect-mongo": "^0.4.1", 11 | "cookie-parser": "~1.0.1", 12 | "ejs": "~0.8.4", 13 | "errorhandler": "~1.0.0", 14 | "express": "~4.0.0", 15 | "express-session": "~1.0.2", 16 | "lodash": "~2.4.1", 17 | "method-override": "~1.0.0", 18 | "morgan": "~1.0.0", 19 | "mysql": "^2.6.2", 20 | "sequelize": "~2.1.0", 21 | "serve-favicon": "~2.0.1", 22 | "readline": "0.0.7", 23 | "passport": "~0.2.1", 24 | "passport-local": "~1.0.0", 25 | "jsonwebtoken": "~5.0.0", 26 | "express-jwt": "~3.0.0" 27 | }, 28 | "devDependencies": { 29 | "grunt": "~0.4.4", 30 | "grunt-autoprefixer": "~0.7.2", 31 | "grunt-wiredep": "~1.8.0", 32 | "grunt-concurrent": "~0.5.0", 33 | "grunt-contrib-clean": "~0.5.0", 34 | "grunt-contrib-concat": "~0.4.0", 35 | "grunt-contrib-copy": "~0.5.0", 36 | "grunt-contrib-cssmin": "~0.9.0", 37 | "grunt-contrib-htmlmin": "~0.2.0", 38 | "grunt-contrib-imagemin": "~0.7.1", 39 | "grunt-contrib-jshint": "~0.10.0", 40 | "grunt-contrib-uglify": "~0.4.0", 41 | "grunt-contrib-watch": "~0.6.1", 42 | "grunt-google-cdn": "~0.4.0", 43 | "grunt-newer": "~0.7.0", 44 | "grunt-ng-annotate": "^0.2.3", 45 | "grunt-rev": "~0.1.0", 46 | "grunt-svgmin": "~0.4.0", 47 | "grunt-usemin": "~2.1.1", 48 | "grunt-env": "~0.4.1", 49 | "grunt-node-inspector": "~0.1.5", 50 | "grunt-nodemon": "~0.2.0", 51 | "grunt-angular-templates": "^0.5.4", 52 | "grunt-dom-munger": "^3.4.0", 53 | "grunt-protractor-runner": "^1.1.0", 54 | "grunt-asset-injector": "^0.1.0", 55 | "grunt-karma": "~0.8.2", 56 | "grunt-build-control": "0.4.0", 57 | "grunt-mocha-test": "~0.10.2", 58 | "jit-grunt": "^0.5.0", 59 | "time-grunt": "~0.3.1", 60 | "grunt-express-server": "~0.4.17", 61 | "grunt-open": "~0.2.3", 62 | "open": "~0.0.4", 63 | "jshint-stylish": "~0.1.5", 64 | "connect-livereload": "~0.4.0", 65 | "karma-ng-scenario": "~0.1.0", 66 | "karma-firefox-launcher": "~0.1.3", 67 | "karma-script-launcher": "~0.1.0", 68 | "karma-html2js-preprocessor": "~0.1.0", 69 | "karma-ng-jade2js-preprocessor": "^0.1.2", 70 | "karma-jasmine": "~0.1.5", 71 | "karma-chrome-launcher": "~0.1.3", 72 | "requirejs": "~2.1.11", 73 | "karma-requirejs": "~0.2.1", 74 | "karma-coffee-preprocessor": "~0.2.1", 75 | "karma-jade-preprocessor": "0.0.11", 76 | "karma-phantomjs-launcher": "~0.1.4", 77 | "karma": "~0.12.9", 78 | "karma-ng-html2js-preprocessor": "~0.1.0", 79 | "supertest": "~0.11.0", 80 | "should": "~3.3.1" 81 | }, 82 | "engines": { 83 | "node": ">=0.10.0" 84 | }, 85 | "scripts": { 86 | "start": "node server/app.js", 87 | "test": "grunt test", 88 | "update-webdriver": "node node_modules/grunt-protractor-runner/node_modules/protractor/bin/webdriver-manager update" 89 | }, 90 | "private": true 91 | } 92 | -------------------------------------------------------------------------------- /client/app/account/signup/signup.html: -------------------------------------------------------------------------------- 1 | 2 | 3 |