2 |
ToDos
3 |
About Page
4 |
5 |
The only purpose of this page is to demonstrate Angular routing.
6 |
7 |
--------------------------------------------------------------------------------
/src/config.js:
--------------------------------------------------------------------------------
1 | import angular from 'angular';
2 | import uiRouter from 'angular-ui-router';
3 | import todoFactory from 'factories/todo-factory';
4 | import todosController from 'todos/todos';
5 |
6 | const app = angular.module('app', [uiRouter, todoFactory.name]);
7 |
8 | app.config(($stateProvider, $urlRouterProvider, $locationProvider) => {
9 | $urlRouterProvider.otherwise('/');
10 |
11 | $stateProvider
12 | .state('todos', {
13 | url: '/',
14 | template: require('todos/todos.html'),
15 | controller: todosController
16 | })
17 | .state('about', {
18 | url: '/about',
19 | template: require('about/about.html')
20 | });
21 |
22 | $locationProvider.html5Mode(true);
23 | });
24 |
25 | export default app;
26 |
--------------------------------------------------------------------------------
/src/css/master.scss:
--------------------------------------------------------------------------------
1 | @import 'todos.scss';
2 |
3 | .nav-link {
4 | float: right;
5 | margin-top: 20px;
6 | }
7 |
--------------------------------------------------------------------------------
/src/css/todos.scss:
--------------------------------------------------------------------------------
1 | .todos {
2 | &__create-input {
3 | margin: 0 auto 5px;
4 | width: 300px;
5 | }
6 |
7 | &__create-button {
8 | display: block;
9 | margin: 0 auto 20px;
10 | }
11 |
12 | &__task {
13 | &--completed {
14 | text-decoration: line-through;
15 | }
16 | }
17 |
18 | &__update-input {
19 | margin: 0 auto;
20 | width: 300px;
21 | }
22 | }
23 |
24 | th, td {
25 | font-size: 20px;
26 | text-align: center;
27 | }
28 |
--------------------------------------------------------------------------------
/src/factories/todo-factory.js:
--------------------------------------------------------------------------------
1 | import _ from 'lodash';
2 | import angular from 'angular';
3 |
4 | const todoFactory = angular.module('app.todoFactory', [])
5 |
6 | .factory('todoFactory', ($http) => {
7 | function getTasks($scope) {
8 | $http.get('/todos').success(response => {
9 | $scope.todos = response.todos;
10 | });
11 | }
12 |
13 | function createTask($scope, params) {
14 | if (!$scope.createTaskInput) { return; }
15 |
16 | $http.post('/todos', {
17 | task: $scope.createTaskInput,
18 | isCompleted: false,
19 | isEditing: false
20 | }).success(response => {
21 | getTasks($scope);
22 | $scope.createTaskInput = '';
23 | });
24 |
25 | // params.createHasInput = false;
26 | // $scope.createTaskInput = '';
27 | }
28 |
29 | function updateTask($scope, todo) {
30 | $http.put(`/todos/${todo._id}`, { task: todo.updatedTask }).success(response => {
31 | getTasks($scope);
32 | todo.isEditing = false;
33 | });
34 |
35 | // todo.task = todo.updatedTask;
36 | // todo.isEditing = false;
37 | }
38 |
39 | function deleteTask($scope, todoToDelete) {
40 | $http.delete(`/todos/${todoToDelete._id}`).success(response => {
41 | getTasks($scope);
42 | });
43 |
44 | // _.remove($scope.todos, todo => todo.task === todoToDelete.task);
45 | }
46 |
47 | function watchCreateTaskInput(params, $scope, val) {
48 | const createHasInput = params.createHasInput;
49 |
50 | if (!val && createHasInput) {
51 | $scope.todos.pop();
52 | params.createHasInput = false;
53 | } else if (val && !createHasInput) {
54 | $scope.todos.push({ task: val, isCompleted: false });
55 | params.createHasInput = true;
56 | } else if (val && createHasInput) {
57 | $scope.todos[$scope.todos.length - 1].task = val;
58 | }
59 | }
60 |
61 | return {
62 | getTasks,
63 | createTask,
64 | updateTask,
65 | deleteTask,
66 | watchCreateTaskInput
67 | };
68 | });
69 |
70 | export default todoFactory;
71 |
--------------------------------------------------------------------------------
/src/index.js:
--------------------------------------------------------------------------------
1 | import angular from 'angular';
2 | import appModule from 'config';
3 | import 'css/master.scss';
4 |
5 | angular.bootstrap(document, [appModule.name]);
6 |
--------------------------------------------------------------------------------
/src/server/db/db.js:
--------------------------------------------------------------------------------
1 | var mongoose = require('mongoose');
2 | mongoose.connect(process.env.MONGOLAB_URI || 'mongodb://localhost/todos');
3 |
4 | var Todo = mongoose.model('Todo', {
5 | task: String,
6 | isCompleted: Boolean,
7 | isEditing: Boolean
8 | });
9 |
10 | module.exports.Todo = Todo;
11 |
--------------------------------------------------------------------------------
/src/server/routes.js:
--------------------------------------------------------------------------------
1 | var todosRoutes = require('server/todos/routes');
2 |
3 | module.exports = function routes(app) {
4 | app.use('/todos', todosRoutes);
5 | };
--------------------------------------------------------------------------------
/src/server/todos/routes.js:
--------------------------------------------------------------------------------
1 | var mongoose = require('mongoose');
2 | var Todo = require('server/db/db').Todo;
3 | var express = require('express');
4 | var router = express.Router();
5 |
6 | router.get('/', function(req, res) {
7 | Todo.find(function(err, results) {
8 | if (err) { console.log(err); }
9 |
10 | res.send({ todos: results });
11 | });
12 | });
13 |
14 | router.post('/', function(req, res) {
15 | var todo = new Todo(req.body);
16 | todo.save(function(err) {
17 | if (err) { console.log(err); }
18 |
19 | res.send('ToDo saved');
20 | });
21 | });
22 |
23 | router.put('/:id', function(req, res) {
24 | var id = req.params.id;
25 | Todo.update({ _id: mongoose.Types.ObjectId(id) }, {
26 | $set: { task: req.body.task }
27 | }, function(err) {
28 | if (err) { console.log(err); }
29 |
30 | res.send('ToDo updated');
31 | });
32 | });
33 |
34 | router.delete('/:id', function(req, res) {
35 | var id = req.params.id;
36 | Todo.remove({ _id: mongoose.Types.ObjectId(id) }, function(err) {
37 | if (err) { console.log(err); }
38 |
39 | res.send('ToDo deleted');
40 | });
41 | });
42 |
43 | module.exports = router;
44 |
--------------------------------------------------------------------------------
/src/todos/todos.html:
--------------------------------------------------------------------------------
1 |