aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKumar Damani <kumar.damani@mail.utoronto.ca>2016-08-03 18:30:06 +0000
committerKumar Damani <kumar.damani@mail.utoronto.ca>2016-08-03 18:30:06 +0000
commitf383a85f8ed569821ea0e929139dcd68c5541519 (patch)
treee21ca3c635e0bf6aaa124a7954451a09237121c4
all files
-rw-r--r--README.md14
-rw-r--r--app/models/todo.js8
-rw-r--r--app/routes.js56
-rw-r--r--package.json14
-rw-r--r--public/css/style.css7
-rw-r--r--public/index.html72
-rw-r--r--public/js/app.js1
-rw-r--r--public/js/controllers/todoController.js44
-rw-r--r--public/js/services/todoService.js16
-rw-r--r--server.js30
10 files changed, 262 insertions, 0 deletions
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..c0f3ccd
--- /dev/null
+++ b/README.md
@@ -0,0 +1,14 @@
+## Requirements
+
+- [Node and npm](http://nodejs.org)
+
+## Installation
+
+1. Clone the repository: `git clone git@github.com:scotch-io/node-todo`
+2. Install the application: `npm install`
+3. Place your own MongoDB URI in `config/database.js`
+3. Start the server: `node server.js`
+4. View in browser at `http://localhost:8080`
+
+
+
diff --git a/app/models/todo.js b/app/models/todo.js
new file mode 100644
index 0000000..02f4088
--- /dev/null
+++ b/app/models/todo.js
@@ -0,0 +1,8 @@
+var mongoose = require('mongoose');
+
+module.exports = mongoose.model('todoCollect', {
+ text: {
+ type: String,
+ default: ''
+ }
+}); \ No newline at end of file
diff --git a/app/routes.js b/app/routes.js
new file mode 100644
index 0000000..7b596dc
--- /dev/null
+++ b/app/routes.js
@@ -0,0 +1,56 @@
+// get the todos collection
+var todoCollect = require('./models/todo');
+
+
+// use mongo to get all the items in db
+function getTodos (res) {
+ todoCollect.find(function (err, todos) {
+ if (err) res.send(err);
+
+ res.json(todos); // return all todos in JSON format
+ // console.log(todos);
+ });
+}
+
+
+// ===========================API===============================
+module.exports = function (app) {
+
+ // get all items
+ app.get('/api/todos', function (req, res) {
+ getTodos(res);
+ });
+
+ // create an item
+ app.post('/api/todos', function (req, res) {
+
+ // add item to the list
+ todoCollect.create({
+ text: req.body.text,
+ done: false
+ }, function (err, todo) {
+ if (err) res.send(err);
+
+ // 'refresh' to-do list
+ getTodos(res);
+ });
+
+ });
+
+ // delete item
+ app.delete('/api/todos/:todo_id', function (req, res) {
+ todoCollect.remove({
+ _id: req.params.todo_id
+ }, function (err, todo) {
+ if (err) res.send(err);
+
+ // 'refresh' to-do list
+ getTodos(res);
+ });
+ });
+
+ // load the static html file for now
+ app.get('*', function (req, res) {
+ res.sendFile(__dirname + '/public/index.html');
+ });
+}; \ No newline at end of file
diff --git a/package.json b/package.json
new file mode 100644
index 0000000..29b783b
--- /dev/null
+++ b/package.json
@@ -0,0 +1,14 @@
+{
+ "name": "One MEAN To-do List",
+ "version": "0.0.1",
+ "description": "a to-do List.",
+ "main": "server.js",
+ "author": "Kumar Damani",
+ "dependencies": {
+ "body-parser": "^1.4.3",
+ "express": "^4.13.4",
+ "method-override": "^2.1.3",
+ "mongoose": "^4.4.12",
+ "morgan": "^1.1.1"
+ }
+}
diff --git a/public/css/style.css b/public/css/style.css
new file mode 100644
index 0000000..31b3391
--- /dev/null
+++ b/public/css/style.css
@@ -0,0 +1,7 @@
+body {
+ padding-top:50px;
+}
+
+#todo-list {
+ margin-bottom:30px;
+}
diff --git a/public/index.html b/public/index.html
new file mode 100644
index 0000000..61548a5
--- /dev/null
+++ b/public/index.html
@@ -0,0 +1,72 @@
+<!doctype html>
+<html ng-app="toDoList">
+<head>
+ <!-- META -->
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width, initial-scale=1"> <!-- set mobile viewport -->
+
+ <title>A Simple To-do List</title>
+
+ <!-- CSS -->
+ <link rel="stylesheet" href="//netdna.bootstrapcdn.com/bootstrap/3.0.0/css/bootstrap.min.css">
+ <link rel="stylesheet" href="//netdna.bootstrapcdn.com/font-awesome/4.0.3/css/font-awesome.min.css">
+
+ <!--Custom CSS-->
+ <link rel="stylesheet" href="css/style.css">
+
+ <!-- SCRIPTS -->
+ <script src="//ajax.googleapis.com/ajax/libs/angularjs/1.2.16/angular.min.js"></script> <!-- load angular -->
+ <script src="js/controllers/todoController.js"></script> <!-- load controller -->
+ <script src="js/services/todoService.js"></script> <!-- load todoService -->
+ <script src="js/app.js"></script> <!-- load main application -->
+</head>
+
+<!-- controller -->
+<body ng-controller="mainController">
+ <section class="container">
+
+ <!-- Title -->
+ <article class="jumbotron text-center">
+ <h1>You have <span class="label label-primary">{{ todos.length }}</span> to-dos</h1>
+ </article>
+
+ <!-- List -->
+ <section id="todo-list" class="row">
+ <section class="col-sm-4 col-sm-offset-4">
+
+
+ <!-- fetch all the todo items -->
+ <article class="checkbox" ng-repeat="todo in todos">
+ <label>
+ <input type="checkbox" ng-click="deleteTodo(todo._id)"><strong>{{ todo.text }}</strong>
+ </label>
+ </article>
+
+ <!-- loading circle icon via (bootstrap)-->
+ <p class="text-center" ng-show="loading">
+ <span class="fa fa-spinner fa-spin fa-3x"></span>
+ </p>
+
+ </section>
+ </section>
+
+ <!-- Add form -->
+ <section id="todo-form" class="row">
+ <section class="col-sm-8 col-sm-offset-2 text-center">
+ <form>
+ <article class="form-group">
+
+ <!-- attach to formData.text in (angular) -->
+ <input type="text" class="form-control input-lg text-center" placeholder="Eg: Watch the Simpsons -- again " ng-model="formData.text">
+ </article>
+
+ <!-- createTodo to create new item -->
+ <button type="submit" class="btn btn-primary btn-lg" ng-click="createTodo()">Add</button>
+ </form>
+ </section>
+ </section>
+
+ </section>
+
+</body>
+</html>
diff --git a/public/js/app.js b/public/js/app.js
new file mode 100644
index 0000000..01ec9be
--- /dev/null
+++ b/public/js/app.js
@@ -0,0 +1 @@
+angular.module('toDoList', ['todoController', 'todoService']);
diff --git a/public/js/controllers/todoController.js b/public/js/controllers/todoController.js
new file mode 100644
index 0000000..eb73feb
--- /dev/null
+++ b/public/js/controllers/todoController.js
@@ -0,0 +1,44 @@
+angular.module('todoController', [])
+
+ // inject service factory into our controller
+ .controller('mainController', ['$scope','$http','Todos', function($scope, $http, Todos) {
+ $scope.formData = {};
+ $scope.loading = true;
+
+ // on first visit 'refresh' the todo list
+ Todos.get()
+ .success(function(data) {
+ $scope.todos = data;
+ $scope.loading = false;
+ });
+
+ // when submitting the add form, send formdata to api
+ $scope.createTodo = function() {
+
+ // validate the formData to make sure that something is there
+ if ($scope.formData.text != undefined) {
+ $scope.loading = true;
+
+ Todos.create($scope.formData)
+
+ // if successful creation, 'refresh' todo list
+ .success(function(data) {
+ $scope.loading = false;
+ $scope.formData = ""; // clear the form
+ $scope.todos = data; // assign our new list of todo
+ });
+ }
+ };
+
+ // delete a todo when pressed checkbox
+ $scope.deleteTodo = function(id) {
+ $scope.loading = true;
+
+ Todos.delete(id)
+ // if successful, 'refresh' the list with latest data
+ .success(function(data) {
+ $scope.loading = false;
+ $scope.todos = data;
+ });
+ };
+ }]); \ No newline at end of file
diff --git a/public/js/services/todoService.js b/public/js/services/todoService.js
new file mode 100644
index 0000000..649c61f
--- /dev/null
+++ b/public/js/services/todoService.js
@@ -0,0 +1,16 @@
+angular.module('todoService', [])
+
+ // use the api
+ .factory('Todos', ['$http', function($http) {
+ return {
+ get : function() {
+ return $http.get('/api/todos');
+ },
+ create : function(data) {
+ return $http.post('/api/todos', data);
+ },
+ delete : function(id) {
+ return $http.delete('/api/todos/' + id);
+ }
+ }
+ }]); \ No newline at end of file
diff --git a/server.js b/server.js
new file mode 100644
index 0000000..18ea468
--- /dev/null
+++ b/server.js
@@ -0,0 +1,30 @@
+// set up the app
+var express = require('express');
+var app = express();
+var mongoose = require('mongoose'); // for mongodb
+var port = process.env.PORT || 3000; // the port
+// var database = require('./config/database'); // load the database configuration (uri)
+// var morgan = require('morgan'); // for debugging
+var bodyParser = require('body-parser'); // for ease of use
+var methodOverride = require('method-override'); // just in case
+
+// set up for functionality
+mongoose.connect('mongodb://test:admin@ds139665.mlab.com:39665/to_list'); // connect to mongodb
+// mongoose.connect('mongodb://localhost/2701'); // connect to mongodb
+
+app.use(express.static('./public')); // set the static files location /public/img will be /img for users
+// app.use(morgan('dev')); // log every request to the console
+app.use(bodyParser.urlencoded({'extended': 'true'})); // parse application ...url
+app.use(bodyParser.json()); // parse application/json
+app.use(bodyParser.json({type: 'application/vnd.api+json'})); // parse application/vnd.api+json as json
+app.use(methodOverride('X-HTTP-Method-Override')); // override with the X-HTTP-Method-Override header in the request
+
+
+// connect with api
+require('./app/routes.js')(app);
+
+// start the app
+app.listen(port);
+console.log("Listening on port " + port);
+
+