From 3ade925935fc70bd724643f2875d56cecbf7b36c Mon Sep 17 00:00:00 2001 From: mrockway Date: Wed, 11 Nov 2015 17:58:03 -0800 Subject: [PATCH 01/11] server side set up --- .gitignore | 1 + package.json | 25 ++++++++++++++ server.js | 92 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 118 insertions(+) create mode 100644 .gitignore create mode 100644 package.json create mode 100644 server.js diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..b512c09 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +node_modules \ No newline at end of file diff --git a/package.json b/package.json new file mode 100644 index 0000000..05253ef --- /dev/null +++ b/package.json @@ -0,0 +1,25 @@ +{ + "name": "express-todo-app", + "version": "1.0.0", + "description": "**Objective:** Use Express to make a RESTful API for a to do list. Build a client for your app that uses AJAX and Handlebars templating to `CREATE`, `READ`, `UPDATE`, and `DELETE` todos.", + "main": "server.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1", + "start": "node server.js" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/mrockway/express-todo-app.git" + }, + "author": "", + "license": "ISC", + "bugs": { + "url": "https://github.com/mrockway/express-todo-app/issues" + }, + "homepage": "https://github.com/mrockway/express-todo-app#readme", + "dependencies": { + "body-parser": "^1.14.1", + "express": "^4.13.3", + "hbs": "^4.0.0" + } +} diff --git a/server.js b/server.js new file mode 100644 index 0000000..b5c107d --- /dev/null +++ b/server.js @@ -0,0 +1,92 @@ +//require node packages +var express = require('express'); +var bodyParser = require('body-parser'); + +//set variable for express function +var app = express(); + +//set up bodyParser to extract info from URL +app.use(bodyParser.urlencoded({extended: true})); + +//seed data for to-do list +var todos = [{_id: 1, + task: "homework", + description: "finish today's homework"}, + {_id: 2, + task: "beer", + description: "drink a beer"}, + {_id: 3, + task: "dinner", + description: "make dinner"} + ]; + +//route for the index page, prior to setting up index.hbs +// app.get('/', function(req,res) { +// res.send("Hello World"); +// }); + +//get route for requesting all the todos +app.get('/api/todos', function(req,res) { + res.json(todos); +}); + +//get route for requesting a single todo +app.get('/api/todos/:id', function(req,res) { + //set variable to convert id from URL into integer + var todoId = parseInt(req.params.id); + //set variable to look for todoID within the todos array + var todoDisplay = todos.filter(function(todo) { + return todo._id === todoId; + })[0]; + res.json(todoDisplay); +}); + +//post new todo route +app.post('/api/todos', function(req,res) { + //set variable to save new todo data + var newTodo = req.body; + //check if any id's have been created and assign one + if (todos.length > 0) { + newTodo._id = todos[todos.length -1]._id +1; + } else { + newTodo._id = 1; + } + //push new todo into array + todos.push(newTodo); + //send back confirmation of todo add + return res.json(newTodo); +}); + +//update existing todo route +app.put('/api/todos/:id', function(req,res) { + //set variable to save todo ID + var todoId = parseInt(req.params.id); + var todoUpdate = todos.filter(function(todo) { + return todo._id === todoId; + })[0]; + //update task from info that gets sent over + todoUpdate.task = req.body.task; + //update description from info being sent over + todoUpdate.description = req.body.description; + //send confirmation to user of update + res.json(todoUpdate); +}); + +//delete existing todo route +app.delete('/api/todos/:id', function(req,res){ + var todoId = parseInt(req.params.id); + var todoDelete = todos.filter(function(todo) { + return todo._id === todoId; + })[0]; + //variable to keep index of todo to be deleted + var todoIndex = todos.indexOf(todoDelete); + //remove todo from array + todos.splice(todoIndex,1); + //send confirmation to user of deletion + return res.json(todoDelete); +}); + +//telling server to listen to port 3000 +app.listen(3000, function() { + console.log("Ready"); +}); \ No newline at end of file From 88ab269db3e8d06a564dd0435c2a2e21a45c5701 Mon Sep 17 00:00:00 2001 From: mrockway Date: Wed, 11 Nov 2015 18:28:04 -0800 Subject: [PATCH 02/11] setting up client side --- views/index.html | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 views/index.html diff --git a/views/index.html b/views/index.html new file mode 100644 index 0000000..6e67ff9 --- /dev/null +++ b/views/index.html @@ -0,0 +1,27 @@ + + + + + ToDo List + + + + + + +
+
+
+
+
+ + + + + + + + + + + \ No newline at end of file From 93b78864212235bce099602c7a0b918cc36ea7fc Mon Sep 17 00:00:00 2001 From: mrockway Date: Wed, 11 Nov 2015 18:29:05 -0800 Subject: [PATCH 03/11] added client side setup --- public/scripts.js | 0 public/styles.css | 3 +++ server.js | 13 ++++++++++--- 3 files changed, 13 insertions(+), 3 deletions(-) create mode 100644 public/scripts.js create mode 100644 public/styles.css diff --git a/public/scripts.js b/public/scripts.js new file mode 100644 index 0000000..e69de29 diff --git a/public/styles.css b/public/styles.css new file mode 100644 index 0000000..e680db4 --- /dev/null +++ b/public/styles.css @@ -0,0 +1,3 @@ +body { + background-color: #12CD32; +} \ No newline at end of file diff --git a/server.js b/server.js index b5c107d..7fa8f95 100644 --- a/server.js +++ b/server.js @@ -1,6 +1,7 @@ //require node packages var express = require('express'); var bodyParser = require('body-parser'); +var hbs = require('hbs'); //set variable for express function var app = express(); @@ -8,6 +9,12 @@ var app = express(); //set up bodyParser to extract info from URL app.use(bodyParser.urlencoded({extended: true})); +//set up public folder for css and js +app.use(express.static('public')); + +//set up view engine for hbs +app.set('view engine', 'hbs'); + //seed data for to-do list var todos = [{_id: 1, task: "homework", @@ -21,9 +28,9 @@ var todos = [{_id: 1, ]; //route for the index page, prior to setting up index.hbs -// app.get('/', function(req,res) { -// res.send("Hello World"); -// }); +app.get('/', function(req,res) { + res.render('index'); +}); //get route for requesting all the todos app.get('/api/todos', function(req,res) { From b75ab9484e492e428a491aaab6db1eb6a394313b Mon Sep 17 00:00:00 2001 From: mrockway Date: Wed, 11 Nov 2015 23:48:33 -0800 Subject: [PATCH 04/11] handlebars client working --- public/scripts.js | 29 +++++++++++++++++++++++++++++ public/styles.css | 4 ++-- server.js | 4 ++-- views/index.hbs | 45 +++++++++++++++++++++++++++++++++++++++++++++ views/index.html | 27 --------------------------- 5 files changed, 78 insertions(+), 31 deletions(-) create mode 100644 views/index.hbs delete mode 100644 views/index.html diff --git a/public/scripts.js b/public/scripts.js index e69de29..97ef73e 100644 --- a/public/scripts.js +++ b/public/scripts.js @@ -0,0 +1,29 @@ +console.log("10-4 little buddy"); + +//set up variable for data +// handlebars template and source +var source = $('#task-template').html(); +var template = Handlebars.compile(source); +var todoResults = []; + +//rerender page on C, U, D +function render() { + $('.todoList').empty(); + var todoHtml = template({data : data}); + $('.todoList').append(todoHtml); +} + +$.get('http://localhost:3000/api/todos/', function(data) { + todoResults = template({data : data}); + $('.todoList').append(todoResults); +}); + +$('.todoForm').on('submit',function(event) { + event.preventDefault(); + var newTask = $(this).serialize(); + $.post('http://localhost:3000/api/todos/',newTask, function(data) { + todoResults.push(newTask); + render(); + }); + +}); \ No newline at end of file diff --git a/public/styles.css b/public/styles.css index e680db4..11c10e7 100644 --- a/public/styles.css +++ b/public/styles.css @@ -1,3 +1,3 @@ body { - background-color: #12CD32; -} \ No newline at end of file + background-color: #337AB7; +} diff --git a/server.js b/server.js index 7fa8f95..7de8281 100644 --- a/server.js +++ b/server.js @@ -10,9 +10,9 @@ var app = express(); app.use(bodyParser.urlencoded({extended: true})); //set up public folder for css and js -app.use(express.static('public')); +app.use(express.static(__dirname + '/public')); -//set up view engine for hbs +//set up view engine for hbs if server side render app.set('view engine', 'hbs'); //seed data for to-do list diff --git a/views/index.hbs b/views/index.hbs new file mode 100644 index 0000000..073ee5a --- /dev/null +++ b/views/index.hbs @@ -0,0 +1,45 @@ + + + + + ToDo List + + + + + + +
+
+
+

to-do list

+
+

add to your list:

+
+ + + +
+
+
+ +
+ +
+
+ + + + + + + + + \ No newline at end of file diff --git a/views/index.html b/views/index.html deleted file mode 100644 index 6e67ff9..0000000 --- a/views/index.html +++ /dev/null @@ -1,27 +0,0 @@ - - - - - ToDo List - - - - - - -
-
-
-
-
- - - - - - - - - - - \ No newline at end of file From 299b978b73a24abc53bb45eca62250396f6609e8 Mon Sep 17 00:00:00 2001 From: mrockway Date: Thu, 12 Nov 2015 00:24:11 -0800 Subject: [PATCH 05/11] get and post working --- public/scripts.js | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/public/scripts.js b/public/scripts.js index 97ef73e..8ef1499 100644 --- a/public/scripts.js +++ b/public/scripts.js @@ -2,27 +2,32 @@ console.log("10-4 little buddy"); //set up variable for data // handlebars template and source + var source = $('#task-template').html(); var template = Handlebars.compile(source); -var todoResults = []; -//rerender page on C, U, D -function render() { +var allTasks = []; + +var render = function() { $('.todoList').empty(); - var todoHtml = template({data : data}); + var todoHtml = template({data : allTasks}); $('.todoList').append(todoHtml); -} +}; $.get('http://localhost:3000/api/todos/', function(data) { todoResults = template({data : data}); + allTasks = data; $('.todoList').append(todoResults); + return todoResults; }); $('.todoForm').on('submit',function(event) { event.preventDefault(); var newTask = $(this).serialize(); + $.post('http://localhost:3000/api/todos/',newTask, function(data) { - todoResults.push(newTask); + console.log(data); + allTasks.push(data); render(); }); From 9c2816f0b2ff43e50306e26baebd0c3abb72d67c Mon Sep 17 00:00:00 2001 From: mrockway Date: Thu, 12 Nov 2015 14:34:46 -0800 Subject: [PATCH 06/11] mongo get, add working --- models/todo.js | 13 ++++++++ server.js | 86 ++++++++++++++++++++++++++++++++++++++------------ 2 files changed, 78 insertions(+), 21 deletions(-) create mode 100644 models/todo.js diff --git a/models/todo.js b/models/todo.js new file mode 100644 index 0000000..7e00ec0 --- /dev/null +++ b/models/todo.js @@ -0,0 +1,13 @@ +var mongoose = require('mongoose'); +var Schema = mongoose.Schema; + +//this tells mongoose what kind of data can be accepted +var TodoSchema = new Schema ({ + task: String, + description: String +}); + +//this sets up the model(object) in Mongo, lets up query db +var Todo = mongoose.model('Todo', TodoSchema); + +module.exports = Todo; \ No newline at end of file diff --git a/server.js b/server.js index 7de8281..e568580 100644 --- a/server.js +++ b/server.js @@ -2,6 +2,13 @@ var express = require('express'); var bodyParser = require('body-parser'); var hbs = require('hbs'); +var mongoose = require('mongoose'); + +//connect to mongoose db +mongoose.connect('mongodb://localhost/tododb'); + +//require Todo model from the todo.js file +var Todo = require('./models/todo'); //set variable for express function var app = express(); @@ -10,7 +17,7 @@ var app = express(); app.use(bodyParser.urlencoded({extended: true})); //set up public folder for css and js -app.use(express.static(__dirname + '/public')); +app.use(express.static('public')); //set up view engine for hbs if server side render app.set('view engine', 'hbs'); @@ -27,43 +34,80 @@ var todos = [{_id: 1, description: "make dinner"} ]; +///////////////// +//API ROUTES//// +//////////////// + + //route for the index page, prior to setting up index.hbs app.get('/', function(req,res) { res.render('index'); }); //get route for requesting all the todos +// app.get('/api/todos', function(req,res) { +// res.json({todos: todos}); +// }); + +//////////////////////////// +// mongo find all todos /// +////////////////////////// app.get('/api/todos', function(req,res) { - res.json(todos); + Todo.find(function (err, allTodos) { + res.json({todos: allTodos}); + }); }); + //get route for requesting a single todo +// app.get('/api/todos/:id', function(req,res) { +// //set variable to convert id from URL into integer +// var todoId = parseInt(req.params.id); +// //set variable to look for todoID within the todos array +// var todoDisplay = todos.filter(function(todo) { +// return todo._id === todoId; +// })[0]; +// res.json(todoDisplay); +// }); + +//////////////////////////////// +// mongo find one todo item /// +////////////////////////////// app.get('/api/todos/:id', function(req,res) { - //set variable to convert id from URL into integer - var todoId = parseInt(req.params.id); - //set variable to look for todoID within the todos array - var todoDisplay = todos.filter(function(todo) { - return todo._id === todoId; - })[0]; - res.json(todoDisplay); + var todoId = req.params.id; + Todo.findOne({_id: todoId}, function(err, foundTodo){ + res.json(foundTodo); + }); }); //post new todo route +///////////////////////// +// app.post('/api/todos', function(req,res) { +// //set variable to save new todo data +// var newTodo = req.body; +// //check if any id's have been created and assign one +// if (todos.length > 0) { +// newTodo._id = todos[todos.length -1]._id +1; +// } else { +// newTodo._id = 1; +// } +// //push new todo into array +// todos.push(newTodo); +// //send back confirmation of todo add +// return res.json(newTodo); +// }); + +///////////////////////////// +// mongo create new task // +/////////////////////////// app.post('/api/todos', function(req,res) { - //set variable to save new todo data - var newTodo = req.body; - //check if any id's have been created and assign one - if (todos.length > 0) { - newTodo._id = todos[todos.length -1]._id +1; - } else { - newTodo._id = 1; - } - //push new todo into array - todos.push(newTodo); - //send back confirmation of todo add - return res.json(newTodo); + var newTodo = new Todo(req.body); + newTodo.save(function(err, savedTodo) { + res.json(savedTodo); + }); }); + //update existing todo route app.put('/api/todos/:id', function(req,res) { //set variable to save todo ID From 7faeafa95796b17a86385fa230976ec82c973d85 Mon Sep 17 00:00:00 2001 From: mrockway Date: Thu, 12 Nov 2015 14:36:58 -0800 Subject: [PATCH 07/11] mongo get, add working, update scripts. --- public/scripts.js | 64 ++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 61 insertions(+), 3 deletions(-) diff --git a/public/scripts.js b/public/scripts.js index 8ef1499..7fe6157 100644 --- a/public/scripts.js +++ b/public/scripts.js @@ -8,12 +8,16 @@ var template = Handlebars.compile(source); var allTasks = []; +$('.todoEdit').hide(); + +//refresh book list on page var render = function() { $('.todoList').empty(); var todoHtml = template({data : allTasks}); $('.todoList').append(todoHtml); }; +//get request, put books on the page $.get('http://localhost:3000/api/todos/', function(data) { todoResults = template({data : data}); allTasks = data; @@ -21,14 +25,68 @@ $.get('http://localhost:3000/api/todos/', function(data) { return todoResults; }); +//create new todo task $('.todoForm').on('submit',function(event) { event.preventDefault(); var newTask = $(this).serialize(); - $.post('http://localhost:3000/api/todos/',newTask, function(data) { console.log(data); allTasks.push(data); render(); + }); +}); + +//drop down edit form +$('.edit').on('click','.edit', function(event){ + $('.todoEdit').show(); +}); + +//update todo list +$('.todoList').on('submit', '.todoEdit', function(event){ + event.preventDefault(); + var editTask = $(this).serialize(); + console.log(editTask); + var taskId = $(this).closest('.task').attr('data-id'); + console.log(taskId); + var taskUpdate = allTasks.filter(function(task) { + return allTasks._id == taskId; + })[0]; + $.ajax({ + type: 'PUT', + url: 'http://localhost:3000/api/todos/'+taskId, + data: editTask, + success: function(data){ + allTasks.splice(allTasks.indexOf(taskUpdate), 1, data); + render(); + } + }); +}); + +//delete todo list items +$('.todoList').on('click', '.delete', function(event){ + event.preventDefault(); + var taskId = $(this).closest('.task').attr('data-id'); + console.log(taskId); + var taskRemove = allTasks.filter(function(task) { + return allTasks._id == taskId; + })[0]; + $.ajax({ + type: 'DELETE', + url: 'http://localhost:3000/api/todos/'+taskId, + success: function(data){ + allTasks.splice(allTasks.indexOf(taskRemove), 1); + render(); + } }); - -}); \ No newline at end of file +}); + + + + + + + + + + + From 3aa8252ec0b587ca2b8403732e90b88553dffc30 Mon Sep 17 00:00:00 2001 From: mrockway Date: Thu, 12 Nov 2015 20:54:30 -0800 Subject: [PATCH 08/11] mongo crud routes working --- public/scripts.js | 23 ++++++++------ public/styles.css | 5 +++ server.js | 81 ++++++++++++++++++++++++++++++----------------- views/index.hbs | 12 +++++-- 4 files changed, 81 insertions(+), 40 deletions(-) diff --git a/public/scripts.js b/public/scripts.js index 7fe6157..3be238b 100644 --- a/public/scripts.js +++ b/public/scripts.js @@ -1,3 +1,5 @@ +$(function() { + console.log("10-4 little buddy"); //set up variable for data @@ -17,10 +19,10 @@ var render = function() { $('.todoList').append(todoHtml); }; -//get request, put books on the page -$.get('http://localhost:3000/api/todos/', function(data) { - todoResults = template({data : data}); - allTasks = data; +//get request, put todos on the page +$.get('/api/todos/', function(data) { + todoResults = template({data : data.todos}); + allTasks = (data.todos); $('.todoList').append(todoResults); return todoResults; }); @@ -29,9 +31,11 @@ $.get('http://localhost:3000/api/todos/', function(data) { $('.todoForm').on('submit',function(event) { event.preventDefault(); var newTask = $(this).serialize(); - $.post('http://localhost:3000/api/todos/',newTask, function(data) { - console.log(data); + $.post('/api/todos/',newTask, function(data) { + console.log("before",allTasks); allTasks.push(data); + console.log("data",data); + console.log("after",allTasks); render(); }); }); @@ -49,11 +53,11 @@ $('.todoList').on('submit', '.todoEdit', function(event){ var taskId = $(this).closest('.task').attr('data-id'); console.log(taskId); var taskUpdate = allTasks.filter(function(task) { - return allTasks._id == taskId; + return (allTasks._id == taskId); })[0]; $.ajax({ type: 'PUT', - url: 'http://localhost:3000/api/todos/'+taskId, + url: '/api/todos/'+taskId, data: editTask, success: function(data){ allTasks.splice(allTasks.indexOf(taskUpdate), 1, data); @@ -72,7 +76,7 @@ $('.todoList').on('click', '.delete', function(event){ })[0]; $.ajax({ type: 'DELETE', - url: 'http://localhost:3000/api/todos/'+taskId, + url: '/api/todos/'+taskId, success: function(data){ allTasks.splice(allTasks.indexOf(taskRemove), 1); render(); @@ -80,6 +84,7 @@ $('.todoList').on('click', '.delete', function(event){ }); }); +}); // end of doc ready diff --git a/public/styles.css b/public/styles.css index 11c10e7..491c417 100644 --- a/public/styles.css +++ b/public/styles.css @@ -1,3 +1,8 @@ body { background-color: #337AB7; } + +.todoHeader { + color: #AAA7A7; + font-size: 50px; +} \ No newline at end of file diff --git a/server.js b/server.js index e568580..29b0c3e 100644 --- a/server.js +++ b/server.js @@ -17,32 +17,34 @@ var app = express(); app.use(bodyParser.urlencoded({extended: true})); //set up public folder for css and js -app.use(express.static('public')); +app.use(express.static(__dirname + '/public')); //set up view engine for hbs if server side render app.set('view engine', 'hbs'); -//seed data for to-do list -var todos = [{_id: 1, - task: "homework", - description: "finish today's homework"}, - {_id: 2, - task: "beer", - description: "drink a beer"}, - {_id: 3, - task: "dinner", - description: "make dinner"} - ]; +//route for the index page, prior to setting up index.hbs +app.get('/', function(req,res) { + res.render('index'); +}); + + +// //seed data for to-do list +// var todos = [{_id: 1, +// task: "homework", +// description: "finish today's homework"}, +// {_id: 2, +// task: "beer", +// description: "drink a beer"}, +// {_id: 3, +// task: "dinner", +// description: "make dinner"} +// ]; ///////////////// //API ROUTES//// //////////////// -//route for the index page, prior to setting up index.hbs -app.get('/', function(req,res) { - res.render('index'); -}); //get route for requesting all the todos // app.get('/api/todos', function(req,res) { @@ -107,22 +109,43 @@ app.post('/api/todos', function(req,res) { }); }); - -//update existing todo route app.put('/api/todos/:id', function(req,res) { - //set variable to save todo ID - var todoId = parseInt(req.params.id); - var todoUpdate = todos.filter(function(todo) { - return todo._id === todoId; - })[0]; - //update task from info that gets sent over - todoUpdate.task = req.body.task; - //update description from info being sent over - todoUpdate.description = req.body.description; - //send confirmation to user of update - res.json(todoUpdate); + var todoId = req.params.id; + + Todo.findOne({_id: todoId}, function (err, foundTodo) { + foundTodo.task = req.body.task; + foundTodo.description = req.body.description; + foundTodo.save(function (err, savedTodo) { + res.json(savedTodo); + }); + }); }); + +// //update existing todo route +// app.put('/api/todos/:id', function(req,res) { +// //set variable to save todo ID +// var todoId = parseInt(req.params.id); +// var todoUpdate = todos.filter(function(todo) { +// return todo._id === todoId; +// })[0]; +// //update task from info that gets sent over +// todoUpdate.task = req.body.task; +// //update description from info being sent over +// todoUpdate.description = req.body.description; +// //send confirmation to user of update +// res.json(todoUpdate); +// }); + +///////////////////////// +// update mongo route // +/////////////////////// +app.delete('/api/todos/:id', function(req,res){ + var todoId = (req.params.id); + Todo.findOneAndRemove({_id: todoId}, function(err, deletedTodo){ + res.json(deletedTodo); + }); +}); //delete existing todo route app.delete('/api/todos/:id', function(req,res){ var todoId = parseInt(req.params.id); diff --git a/views/index.hbs b/views/index.hbs index 073ee5a..cc09239 100644 --- a/views/index.hbs +++ b/views/index.hbs @@ -12,7 +12,7 @@
-

to-do list

+

to-do list


add to your list:

@@ -26,9 +26,17 @@
From 7bcf026dd64a69ac3bcd3369ae9742aed8a41c43 Mon Sep 17 00:00:00 2001 From: mrockway Date: Thu, 12 Nov 2015 21:00:59 -0800 Subject: [PATCH 09/11] remove old routes --- server.js | 80 +++++++++---------------------------------------------- 1 file changed, 12 insertions(+), 68 deletions(-) diff --git a/server.js b/server.js index 29b0c3e..4588bd2 100644 --- a/server.js +++ b/server.js @@ -27,29 +27,11 @@ app.get('/', function(req,res) { res.render('index'); }); - -// //seed data for to-do list -// var todos = [{_id: 1, -// task: "homework", -// description: "finish today's homework"}, -// {_id: 2, -// task: "beer", -// description: "drink a beer"}, -// {_id: 3, -// task: "dinner", -// description: "make dinner"} -// ]; - -///////////////// -//API ROUTES//// -//////////////// - +/////////////////////////// +/// MONGO API ROUTES /// +///////////////////////// -//get route for requesting all the todos -// app.get('/api/todos', function(req,res) { -// res.json({todos: todos}); -// }); //////////////////////////// // mongo find all todos /// @@ -60,18 +42,6 @@ app.get('/api/todos', function(req,res) { }); }); - -//get route for requesting a single todo -// app.get('/api/todos/:id', function(req,res) { -// //set variable to convert id from URL into integer -// var todoId = parseInt(req.params.id); -// //set variable to look for todoID within the todos array -// var todoDisplay = todos.filter(function(todo) { -// return todo._id === todoId; -// })[0]; -// res.json(todoDisplay); -// }); - //////////////////////////////// // mongo find one todo item /// ////////////////////////////// @@ -82,26 +52,11 @@ app.get('/api/todos/:id', function(req,res) { }); }); -//post new todo route -///////////////////////// -// app.post('/api/todos', function(req,res) { -// //set variable to save new todo data -// var newTodo = req.body; -// //check if any id's have been created and assign one -// if (todos.length > 0) { -// newTodo._id = todos[todos.length -1]._id +1; -// } else { -// newTodo._id = 1; -// } -// //push new todo into array -// todos.push(newTodo); -// //send back confirmation of todo add -// return res.json(newTodo); -// }); ///////////////////////////// // mongo create new task // /////////////////////////// + app.post('/api/todos', function(req,res) { var newTodo = new Todo(req.body); newTodo.save(function(err, savedTodo) { @@ -121,32 +76,21 @@ app.put('/api/todos/:id', function(req,res) { }); }); +//////////////////////////// +/// update mongo route /// +////////////////////////// -// //update existing todo route -// app.put('/api/todos/:id', function(req,res) { -// //set variable to save todo ID -// var todoId = parseInt(req.params.id); -// var todoUpdate = todos.filter(function(todo) { -// return todo._id === todoId; -// })[0]; -// //update task from info that gets sent over -// todoUpdate.task = req.body.task; -// //update description from info being sent over -// todoUpdate.description = req.body.description; -// //send confirmation to user of update -// res.json(todoUpdate); -// }); - -///////////////////////// -// update mongo route // -/////////////////////// app.delete('/api/todos/:id', function(req,res){ var todoId = (req.params.id); Todo.findOneAndRemove({_id: todoId}, function(err, deletedTodo){ res.json(deletedTodo); }); }); -//delete existing todo route + +/////////////////////////// +// mongo delete route // +////////////////////////// + app.delete('/api/todos/:id', function(req,res){ var todoId = parseInt(req.params.id); var todoDelete = todos.filter(function(todo) { From 84b516fdcaf4152e21c99faba58c220f92683721 Mon Sep 17 00:00:00 2001 From: mrockway Date: Thu, 12 Nov 2015 23:37:38 -0800 Subject: [PATCH 10/11] css styling done --- .DS_Store | Bin 0 -> 6148 bytes public/.DS_Store | Bin 0 -> 6148 bytes public/legalPad.jpg | Bin 0 -> 911448 bytes public/scripts.js | 11 +++++++++-- public/styles.css | 39 ++++++++++++++++++++++++++++++++++++--- views/index.hbs | 26 ++++++++++++++------------ 6 files changed, 59 insertions(+), 17 deletions(-) create mode 100644 .DS_Store create mode 100644 public/.DS_Store create mode 100644 public/legalPad.jpg diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..5af06d161aaf7d2dbe43ecda389a5ce7adb45159 GIT binary patch literal 6148 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 literal 0 HcmV?d00001 diff --git a/public/scripts.js b/public/scripts.js index 3be238b..1a39d86 100644 --- a/public/scripts.js +++ b/public/scripts.js @@ -10,7 +10,12 @@ var template = Handlebars.compile(source); var allTasks = []; -$('.todoEdit').hide(); + + + +$('.todoList').on('click', '.edit', function(event){ + $('.todoEdit').toggle("fast"); +}); //refresh book list on page var render = function() { @@ -24,6 +29,7 @@ $.get('/api/todos/', function(data) { todoResults = template({data : data.todos}); allTasks = (data.todos); $('.todoList').append(todoResults); + $('.todoEdit').hide(); return todoResults; }); @@ -41,7 +47,8 @@ $('.todoForm').on('submit',function(event) { }); //drop down edit form -$('.edit').on('click','.edit', function(event){ +$('.todoList').on('click','.edit', function(event){ + console.log('yes i clicked'); $('.todoEdit').show(); }); diff --git a/public/styles.css b/public/styles.css index 491c417..c13aa6c 100644 --- a/public/styles.css +++ b/public/styles.css @@ -1,8 +1,41 @@ body { - background-color: #337AB7; + background-image: url("legalpad.jpg"); + background-size: 100%; + font-family: 'Handlee', cursive; +} +#line { + color: #101010; +} +button { + margin: 10px 5px 0 0; + text-align: right; +} +.glyphicon { + top: 4px; } - .todoHeader { - color: #AAA7A7; + color: #D9534F; font-size: 50px; + top: 29px; + position: relative; +} +.todoForm { + width: 100%; + border-radius: 5px; +} +.task { + background-color: rgba(204, 204, 204, 0.52); + border-radius: 15px; + margin-bottom: 20px; +} +.todoText { + font-size: 35px; +} +.todoDescription { + font-size: 20px; +} +.todoEdit { + font-size: 15px; + margin-bottom: 15px; + width: 100%; } \ No newline at end of file diff --git a/views/index.hbs b/views/index.hbs index cc09239..888d553 100644 --- a/views/index.hbs +++ b/views/index.hbs @@ -7,6 +7,7 @@ +
@@ -20,24 +21,25 @@ +
From a03dac6294958a699702bdcb70c0d522e09c41b2 Mon Sep 17 00:00:00 2001 From: mrockway Date: Fri, 13 Nov 2015 00:09:48 -0800 Subject: [PATCH 11/11] add validator for string length --- models/todo.js | 4 ++-- public/scripts.js | 10 ---------- server.js | 2 ++ 3 files changed, 4 insertions(+), 12 deletions(-) diff --git a/models/todo.js b/models/todo.js index 7e00ec0..f054a5b 100644 --- a/models/todo.js +++ b/models/todo.js @@ -3,8 +3,8 @@ var Schema = mongoose.Schema; //this tells mongoose what kind of data can be accepted var TodoSchema = new Schema ({ - task: String, - description: String + task: {type: String, minlength: 2}, + description: {type: String, minlength: 2} }); //this sets up the model(object) in Mongo, lets up query db diff --git a/public/scripts.js b/public/scripts.js index 1a39d86..9fd27c1 100644 --- a/public/scripts.js +++ b/public/scripts.js @@ -10,9 +10,6 @@ var template = Handlebars.compile(source); var allTasks = []; - - - $('.todoList').on('click', '.edit', function(event){ $('.todoEdit').toggle("fast"); }); @@ -38,17 +35,13 @@ $('.todoForm').on('submit',function(event) { event.preventDefault(); var newTask = $(this).serialize(); $.post('/api/todos/',newTask, function(data) { - console.log("before",allTasks); allTasks.push(data); - console.log("data",data); - console.log("after",allTasks); render(); }); }); //drop down edit form $('.todoList').on('click','.edit', function(event){ - console.log('yes i clicked'); $('.todoEdit').show(); }); @@ -56,9 +49,7 @@ $('.todoList').on('click','.edit', function(event){ $('.todoList').on('submit', '.todoEdit', function(event){ event.preventDefault(); var editTask = $(this).serialize(); - console.log(editTask); var taskId = $(this).closest('.task').attr('data-id'); - console.log(taskId); var taskUpdate = allTasks.filter(function(task) { return (allTasks._id == taskId); })[0]; @@ -77,7 +68,6 @@ $('.todoList').on('submit', '.todoEdit', function(event){ $('.todoList').on('click', '.delete', function(event){ event.preventDefault(); var taskId = $(this).closest('.task').attr('data-id'); - console.log(taskId); var taskRemove = allTasks.filter(function(task) { return allTasks._id == taskId; })[0]; diff --git a/server.js b/server.js index 4588bd2..95daa77 100644 --- a/server.js +++ b/server.js @@ -60,6 +60,7 @@ app.get('/api/todos/:id', function(req,res) { app.post('/api/todos', function(req,res) { var newTodo = new Todo(req.body); newTodo.save(function(err, savedTodo) { + console.error(err); res.json(savedTodo); }); }); @@ -71,6 +72,7 @@ app.put('/api/todos/:id', function(req,res) { foundTodo.task = req.body.task; foundTodo.description = req.body.description; foundTodo.save(function (err, savedTodo) { + res.json(err); res.json(savedTodo); }); });