diff options
| -rw-r--r-- | assets/css/creative.css | 7 | ||||
| -rw-r--r-- | assets/css/style.css | 2 | ||||
| -rw-r--r-- | node_simple.js | 3 | ||||
| -rw-r--r-- | routes/admin.js | 72 | ||||
| -rw-r--r-- | routes/index.js | 1 | ||||
| -rw-r--r-- | routes/user.js | 122 | ||||
| -rw-r--r-- | views/admin.hbs | 12 | ||||
| -rw-r--r-- | views/user_profile_alt.hbs | 3 | ||||
| -rw-r--r-- | views/user_solutions.hbs | 180 |
9 files changed, 214 insertions, 188 deletions
diff --git a/assets/css/creative.css b/assets/css/creative.css index 54e1cbb..45f388b 100644 --- a/assets/css/creative.css +++ b/assets/css/creative.css @@ -376,5 +376,12 @@ header .header-content .header-content-inner hr { background-color: #d9edf7; color: #3170a6; } +/******************Alert Changes**************/ +.custom-Alert{ + text-align: center; + margin: 30px 12% 30px 12%; + box-shadow: 2px 4px 5px 0 rgba(0,0,0,0.1); +} + /********************************************/ diff --git a/assets/css/style.css b/assets/css/style.css index d9bf06b..eb683b1 100644 --- a/assets/css/style.css +++ b/assets/css/style.css @@ -51,7 +51,7 @@ main .search h2{ box-sizing: border-box; background: white url('../images/search_icon.png') no-repeat 9px 9px; background-size: 20px 20px; - padding: 12px 20px 12px 40px; + padding: 0; } .search input, .search button.search-button { diff --git a/node_simple.js b/node_simple.js index 2eab34c..165eb22 100644 --- a/node_simple.js +++ b/node_simple.js @@ -330,7 +330,6 @@ exports.retrieve_userComments_history = function (username, callback) { // get a connection mongoFactory.getConnection(uri).then(function (db) { - console.log("for Each here"); var solutions = db.collection('solutions'); var exams = db.collection('exams'); var mylist = []; @@ -367,9 +366,7 @@ exports.retrieve_userComments_history = function (username, callback) { }); function doCall() { - console.log("Am i inside the doCall()"); callback(true, mylist); - console.log("IN NODE SIMPLE: " + mylist); } diff --git a/routes/admin.js b/routes/admin.js index 027722d..24c5910 100644 --- a/routes/admin.js +++ b/routes/admin.js @@ -9,7 +9,9 @@ var csrfProtection = csrf(); router.use(csrfProtection); // router is protected router.get('/', isAdmin, function(req,res){ + console.log(req.session.messages); res.render('admin', {csrfToken: req.csrfToken()}); + req.session.messages = null; }); /* Adds exam from front-end */ @@ -36,15 +38,16 @@ router.post('/add/exam', function(req,res){ upload_date, // String uploaded_by]; // String - dbFile.add_exam(fields, questions_list, function(examAdded, statusMessage){ + dbFile.add_exam(fields, questions_list, function(examAdded, statusMsg){ if(examAdded){ - console.log("Success!"); + req.session.messages = {success : statusMsg}; }else{ - console.log("Failed!"); + req.session.messages = {error : statusMsg}; } - console.log(statusMessage); + console.log(statusMsg); + res.redirect('/admin'); }); - res.redirect('/admin'); + }); /* Adds course from front-end */ @@ -52,15 +55,16 @@ router.post('/add/course', function(req,res){ var course_code = req.body.course_code, title = req.body.title; - dbFile.add_course(course_code, title, function(courseAdded, statusMessage){ + dbFile.add_course(course_code, title, function(courseAdded, statusMsg){ if(courseAdded){ - console.log("Success!"); + req.session.messages = {success : statusMsg}; }else{ - console.log("Failure!"); + req.session.messages = {error : statusMsg}; } - console.log("Status message: " + statusMessage) + console.log(statusMsg); + res.redirect('/admin'); }); - res.redirect('/admin'); + }); /* Add a new admin, redirect to admin panel */ @@ -72,18 +76,16 @@ router.post('/add/admin', function(req,res){ password: passport_file.encryptPassword(req.body.password) }; - dbFile.addAdmin(admin_data, function(success, error, message){ + dbFile.addAdmin(admin_data, function(success, error, statusMsg){ if(success){ - console.log("Success!"); - }else if(error){ - console.log("Error!"); + req.session.messages = {success : statusMsg}; }else{ - console.log("Admin already exists."); + req.session.messages = {error : statusMsg}; } - console.log(message); + console.log(statusMsg); + res.redirect('/admin'); }); - res.redirect('/admin'); }); /* Remove an exam route, redirect to admin panel */ @@ -95,48 +97,46 @@ router.post('/remove/exam', function(req,res){ campus = req.body.campus; var fields = [course_code, year, term, type]; - console.log(fields); - dbFile.remove_exam(fields, - function(examRemoved, statusMessage){ + + dbFile.remove_exam(fields, function(examRemoved, statusMsg){ if(examRemoved){ - console.log("Success."); + req.session.messages = {success : statusMsg}; } else { - console.log("Failed."); + req.session.messages = {error : statusMsg}; } - console.log(statusMessage); + console.log(statusMsg); + res.redirect('/admin'); }); - - res.redirect('/admin'); }); /* Remove a course route, redirect to admin panel */ router.post('/remove/course', function(req,res){ var course_code = req.body.course_code; - dbFile.remove_course(course_code, function(courseRemoved, statusMessage){ + dbFile.remove_course(course_code, function(courseRemoved, statusMsg){ if(courseRemoved){ - console.log("Success."); + req.session.messages = {success : statusMsg}; } else { - console.log("Failed."); + req.session.messages = {error : statusMsg}; } - console.log(statusMessage); + console.log(statusMsg); + res.redirect('/admin'); }); - - res.redirect('/admin'); }); /* Remove a user route, redirect to admin panel */ router.post('/remove/user', function(req,res){ var username = req.body.username; - dbFile.remove_user(username, function(userRemoved, statusMessage){ + dbFile.remove_user(username, function(userRemoved, statusMsg){ if(userRemoved){ - console.log("Success."); + req.session.messages = {success : statusMsg}; } else { - console.log("Failed."); + req.session.messages = {error : statusMsg}; } - console.log(statusMessage); + console.log(statusMsg); + res.redirect('/admin'); }); - res.redirect('/admin'); + }); diff --git a/routes/index.js b/routes/index.js index 283b196..6218dd1 100644 --- a/routes/index.js +++ b/routes/index.js @@ -201,6 +201,7 @@ router.get('/solutions/:exam_id/:q_num', function (req, res) { soln.commentCount = soln.comments.length; }); res.render('user_solutions', {query: solutions, examID: examID, qID: qID, csrfToken: req.csrfToken()}); + req.session.messages = null; }); }); diff --git a/routes/user.js b/routes/user.js index b0b2d47..e3340e0 100644 --- a/routes/user.js +++ b/routes/user.js @@ -26,7 +26,6 @@ router.get('/user_profile', loggedIn, isUser, function(req, res, next) { var comments = []; var inbox = []; function getComments() { - console.log('in getComments'); return new Promise(function(resolve, reject) { dbFile.retrieve_userComments_history(req.user.user_name, function (success, object) { if (!success) { @@ -58,7 +57,6 @@ router.get('/user_profile', loggedIn, isUser, function(req, res, next) { }); } function getMail(){ - console.log('ing getMail'); return new Promise(function(resolve, reject) { dbFile.checkMailbox(req.user.user_name, function(success, error, data, message){ @@ -98,60 +96,6 @@ router.get('/user_profile', loggedIn, isUser, function(req, res, next) { //res.render('user_profile_alt', {comments : comments, inbox: inbox, csrfToken: req.csrfToken()}); }); -/* Adds a solution into the database, redirect to exam/question/solution page */ -router.post('/submit_solution/:examID/:qID', function(req,res){ - // Get required fields from body - // Populate this data - /* var Data = { - exam_id: fields[0], - q_id: fields[1], - text: fields[2], - votes: 0, - comments: [], - author: fields[3] - };*/ - - var examID = req.params.examID; - var qID = req.params.qID; - - var text = req.body.solution, - votes = 0, - comments = [], - author = req.user.user_name; - - var fields = [examID, qID, text, author]; - console.log(fields); - // Add to database - dbFile.add_solution(fields, function(addedSolution, statusMsg){ - if(addedSolution){ - console.log("Success!"); - }else{ - console.log("Failed to add solution!"); - } - console.log(statusMsg); - - //Redirect to solutions page again - res.redirect('/solutions/' + examID + '/' + qID); - - }); - -}); - -/* Routed here from Solutions page (add solution button) -* Renders add_solution page for response.*/ -router.get('/add_solution/:examID/:qID', function (req, res, next) { - var examID = req.params.examID; - var qID = req.params.qID; - - // Must be a logged in user to access - if(req.isAuthenticated()){ - res.render('add_solutions', {csrfToken: req.csrfToken(), examID: examID, qID: qID}); - } else { - res.redirect('/'); // Change this to go back to the solutions page - } - -}); - router.get('/signup', loggedOut, function(req, res, next) { res.render('signup', {csrfToken: req.csrfToken(), success: req.session.success, errors: req.session.errors}); req.session.errors = null; @@ -241,7 +185,7 @@ router.post('/user_profile/send_message', loggedIn, function(req, res, next) { date: current_date }; - console.log(mail_data); + //console.log(mail_data); dbFile.sendMail(mail_data, function(success, error, message) { if ((!success && !error) || (error)) { req.session.messages = {error : message}; @@ -259,6 +203,59 @@ router.post('/user_profile/send_message', loggedIn, function(req, res, next) { }); +/* Adds a solution into the database, redirect to exam/question/solution page */ +router.post('/submit_solution/:examID/:qID', function(req,res){ + // Get required fields from body + // Populate this data + /* var Data = { + exam_id: fields[0], + q_id: fields[1], + text: fields[2], + votes: 0, + comments: [], + author: fields[3] + };*/ + + var examID = req.params.examID; + var qID = req.params.qID; + + var text = req.body.solution, + votes = 0, + comments = [], + author = req.user.user_name; + + var fields = [examID, qID, text, author]; + console.log(fields); + // Add to database + dbFile.add_solution(fields, function(addedSolution, statusMsg){ + if(addedSolution){ + req.session.messages = {success : statusMsg}; + }else{ + req.session.messages = {error : statusMsg}; + } + //Redirect to solutions page again + res.redirect('/solutions/' + examID + '/' + qID); + + }); + +}); + +/* Routed here from Solutions page (add solution button) + * Renders add_solution page for response.*/ +router.get('/add_solution/:examID/:qID', function (req, res, next) { + var examID = req.params.examID; + var qID = req.params.qID; + + // Must be a logged in user to access + if(req.isAuthenticated()){ + res.render('add_solutions', {csrfToken: req.csrfToken(), examID: examID, qID: qID}); + } else { + var message = "Must be logged in to add a solution!"; + req.session.messages = {error : message}; + res.redirect('/solutions/' + examID + '/' + qID); + } + +}); // Authentication check in code router.post('/comment/submit/:examID/:qID/:solID', function(req, res, next){ @@ -270,18 +267,19 @@ router.post('/comment/submit/:examID/:qID/:solID', function(req, res, next){ // Must be a logged in user to access var fields = [comment, username]; if(req.isAuthenticated()){ - dbFile.add_comment(solutionID, fields, function(commentAdded, statusMessage){ + dbFile.add_comment(solutionID, fields, function(commentAdded, statusMsg){ if(commentAdded){ - console.log("Success!"); + req.session.messages = {success : statusMsg}; } else{ - console.log("Failed to add comment!"); + req.session.messages = {error : statusMsg}; } - console.log(statusMessage); res.redirect('/solutions/' + examID + '/' + qID); }); } else { //User not logged in - res.redirect('/'); // Change this to go back to the solutions page with "need to be logged in msg" + var message = "Must be logged in to comment!"; + req.session.messages = {error : message}; + res.redirect('/solutions/' + examID + '/' + qID); } }); diff --git a/views/admin.hbs b/views/admin.hbs index b821dc3..12c2ba9 100644 --- a/views/admin.hbs +++ b/views/admin.hbs @@ -3,6 +3,18 @@ <div class="row"> <!-- Admin control Panel ---> <div class="col-xs-12 col-sm-12 col-md-8 col-md-offset-2 col-xs-offset-0 col-sm-offset-0 toppad cpnl-details"> + {{# if messages.success }} + <section class="alert alert-success custom-Alert"> + <!-- Change those to banners later --> + <h4>{{ messages.success }}</h4> + </section> + {{ else }} + {{# if messages.error }} + <section class="alert alert-danger custom-Alert"> + <h4>{{ messages.error }}</h4> + </section> + {{/if}} + {{/if}} <!-- Admin Control Panel Menu --> <nav class="navbar navbar-custom"> diff --git a/views/user_profile_alt.hbs b/views/user_profile_alt.hbs index c97c77c..7297b63 100644 --- a/views/user_profile_alt.hbs +++ b/views/user_profile_alt.hbs @@ -3,8 +3,7 @@ <div class="row"> <!-- User Profile details --> -<div class="col-xs-12 col-sm-12 col-md-6 col-lg-6 col-xs-offset-0 -col-sm-offset-0 col-md-offset-3 col-lg-offset-3 toppad prf-details"> +<div class="col-xs-12 col-sm-12 col-md-8 col-md-offset-2 col-xs-offset-0 col-sm-offset-0 toppad prf-details"> <!-- User Profile Menu --> <nav class="navbar navbar-custom"> diff --git a/views/user_solutions.hbs b/views/user_solutions.hbs index b00b098..fac0301 100644 --- a/views/user_solutions.hbs +++ b/views/user_solutions.hbs @@ -1,103 +1,115 @@ <main id="solutions-main"> <div class='search solutions-container container'> <div> + {{# if messages.success }} + <section class="alert alert-success custom-Alert"> + <!-- Change those to banners later --> + <h4>{{ messages.success }}</h4> + </section> + {{ else }} + {{# if messages.error }} + <section class="alert alert-danger custom-Alert"> + <h4>{{ messages.error }}</h4> + </section> + {{/if}} + {{/if}} -<!-- Add Solution button and path --> -<div class="row top-sol"> - <a href="/user/add_solution/{{examID}}/{{qID}}"> - <button class="col-xs-4 col-sm-2 col-md-2 col-lg-2 - col-xs-offset-4 col-sm-offset-5 col-md-offset-2 - col-lg-offset-2 rounded" id="add-solution"> - <h3>Add a solution</h3> - </button> - </a> - <!-- Replace p below with breadcrumbs later --> - <p class="col-xs-12 col-sm-12 col-md-6 show-path"> - CSC148 > Winter 2015 > Question 1 - </p> -</div> + <!-- Add Solution button and path --> + <div class="row top-sol"> + <a href="/user/add_solution/{{examID}}/{{qID}}"> + <button class="col-xs-4 col-sm-2 col-md-2 col-lg-2 + col-xs-offset-4 col-sm-offset-5 col-md-offset-2 + col-lg-offset-2 rounded" id="add-solution"> + <h3>Add a solution</h3> + </button> + </a> -<!-- Solution 1 Example --> -{{#each query}} - <div class="row"> - <section id="sol-" class="col-md-10 col-md-offset-1 rounded"> - <div class="post-info"> - <div class=""> - <img class="img-responsive img-circle user-image" src="/assets/images/misc/user1.jpeg"> - <p class="username">{{this.author}}</p> - </div> + <!-- Replace p below with breadcrumbs later --> + <p class="col-xs-12 col-sm-12 col-md-6 show-path"> + CSC148 > Winter 2015 > Question 1 + </p> + </div> - <div class="pull-right"> - <div class="voting"> - <form action="/user/solution/vote/{{../examID}}/{{../qID}}/{{this._id}}" method="post"> - <input type="hidden" name="vote" value="up"/> - <button class="upvote" type="submit"><img src="/assets/images/up_arrow.png"></button> - <input type="hidden" name="_csrf" value="{{../csrfToken }}"> - </form> - <form action="/user/solution/vote/{{../examID}}/{{../qID}}/{{this._id}}" method="post"> - <input type="hidden" name="vote" value="down"/> - <button class="downvote"><img src="/assets/images/down_arrow.png"></button> - <input type="hidden" name="_csrf" value="{{../csrfToken }}"> - </form> - <p class="num-votes">{{this.votes}}</p> + <!-- Solution 1 Example --> + {{#each query}} + <div class="row"> + <section id="sol-" class="col-md-10 col-md-offset-1 rounded"> + <div class="post-info"> + <div class=""> + <img class="img-responsive img-circle user-image" src="/assets/images/misc/user1.jpeg"> + <p class="username">{{this.author}}</p> </div> - </div> - </div> - <div class="user-sol"> - <h3>Solution</h3> - <p>{{this.text}}</p> - </div> + <div class="pull-right"> + <div class="voting"> + <form action="/user/solution/vote/{{../examID}}/{{../qID}}/{{this._id}}" method="post"> + <input type="hidden" name="vote" value="up"/> + <button class="upvote" type="submit"><img src="/assets/images/up_arrow.png"></button> + <input type="hidden" name="_csrf" value="{{../csrfToken }}"> + </form> + <form action="/user/solution/vote/{{../examID}}/{{../qID}}/{{this._id}}" method="post"> + <input type="hidden" name="vote" value="down"/> + <button class="downvote"><img src="/assets/images/down_arrow.png"></button> + <input type="hidden" name="_csrf" value="{{../csrfToken }}"> + </form> + <p class="num-votes">{{this.votes}}</p> + </div> + </div> + </div> - <div class="comments"> - <h3> - <a data-toggle="collapse" href="#com{{@index}}"> - <span> - {{this.commentCount}} - </span> - comments - <span class="caret"></span> - </a> - </h3> + <div class="user-sol"> + <h3>Solution</h3> + <p>{{this.text}}</p> + </div> - <div id="com{{@index}}" class="panel-collapse collapse"> - <ul class="list-group"> - {{#each this.comments}} - <li class="list-group-item"> - <img src="/assets/images/misc/user3.jpeg" - class="img-responsive img-circle comment-user-img"> - <p class="comment-username"> - <a href="/user_profile"> - {{this.by}} - </a> - , {{this.date}} - </p> - <p class="user-comment">{{this.text}}</p> - </li> - {{/each}} + <div class="comments"> + <h3> + <a data-toggle="collapse" href="#com{{@index}}"> + <span> + {{this.commentCount}} + </span> + comments + <span class="caret"></span> + </a> + </h3> - <form action="/user/comment/submit/{{../examID}}/{{../qID}}/{{this._id}}" method="post"> - <div class="form-group"> - <textarea type="text" - class="form-control" - placeholder="Enter comment" - name="comment"> + <div id="com{{@index}}" class="panel-collapse collapse"> + <ul class="list-group"> + {{#each this.comments}} + <li class="list-group-item"> + <img src="/assets/images/misc/user3.jpeg" + class="img-responsive img-circle comment-user-img"> + <p class="comment-username"> + <a href="/user_profile"> + {{this.by}} + </a> + , {{this.date}} + </p> + <p class="user-comment">{{this.text}}</p> + </li> + {{/each}} - </textarea> - </div> - <input type="hidden" name="_csrf" value="{{../csrfToken }}"> - <button type="submit" class="btn btn-primary">Submit</button> - </form> + <form action="/user/comment/submit/{{../examID}}/{{../qID}}/{{this._id}}" method="post"> + <div class="form-group"> + <textarea type="text" + class="form-control" + placeholder="Enter comment" + name="comment"> - </ul> - </div> + </textarea> + </div> + <input type="hidden" name="_csrf" value="{{../csrfToken }}"> + <button type="submit" class="btn btn-primary">Submit</button> + </form> - </div> - </section> - </div> -{{/each}} + </ul> + </div> + </div> + </section> + </div> + {{/each}} </div> </div> |
