diff --git a/api/controllers/ChatroomController.js b/api/controllers/ChatroomController.js index 33950f7..b06807c 100644 --- a/api/controllers/ChatroomController.js +++ b/api/controllers/ChatroomController.js @@ -5,13 +5,14 @@ * @help :: See http://sailsjs.org/#!/documentation/concepts/Controllers */ + module.exports = { show: function(req, res){ Chatroom.findOne({id: req.params.chatroom}) .exec(function(err, foundChat){ if(err){ sails.log.error(err); - return res.view('error'); + return res.serverError(); } return res.view('chatroom', {chat: foundChat}); @@ -20,11 +21,29 @@ module.exports = { }, add: function(req, res){ + let notContains = ['<', '>', '\'', '\\', '/', '(', ')', '"', '}', '{', '[', ']', "*"]; + let errors = []; + + notContains.map(function(char){ + if(req.body.chatname.indexOf(char) != -1){ + valid = false; + errors.push({error: 'You can\'t use ' + char + ' in your username'}); + } + }) + + if(!valid){ + return res.view('addChatroom', {"errors": errors}) + } + + if(req.body.chatname = ''){ + return res.view('addChatroom', {"errors": [{"error": "Name of chatroom cannot be empty"}]}) + } + Chatroom.create({name: req.body.chatname}) .exec(function(err, newChat){ if(err){ sails.log.error(err); - return res.view('error'); + return res.serverError(); } newChat.members.add(req.session.userId); @@ -33,10 +52,10 @@ module.exports = { newChat.save(function(err){ if(err){ sails.log.error(err); - return res.view('error'); + return res.serverError(); } - return res.redirect('/'); + return res.redirect(sails.getUrlFor('UserController.index')); }); }) @@ -46,10 +65,11 @@ module.exports = { Chatroom.findOne({id: req.params.chatroom}) .populate('admins') .populate('members') + .populate('blocked') .exec(function(err, foundChat){ if(err){ sails.log.error(err); - return res.view('error'); + return res.serverError(); } return res.view('chatroomSettings', {chat: foundChat}); @@ -57,20 +77,34 @@ module.exports = { }) }, -//LIGO: !! functionality preferably in ONE Query, send the amount of chatroom members in request -//Smartest thing to do would be to add a policy -//Look into sum and stuff it could really slim this thing. + settingsEdit: function(req, res){ + Chatroom.findOne({id: req.params.chatroom}) + .populate('admins') + .populate('members') + .populate('blocked') + .exec(function(err, foundChat){ + if(err){ + sails.log.error(err); + return res.serverError(); + } + + return res.view('chatroomSettingsEdit', {chat: foundChat}); + + }) + }, + + leave: function(req, res){ Chatroom.findOne({id: req.params.chatroom}) .populate('members') .exec(function(err, foundChat){ if(err){ sails.log.error(err); - return res.view('error'); + return res.serverError(); } if(foundChat === undefined){ - return res.view('error'); + return res.notFound(); } if(foundChat.members.length > 1){ @@ -78,10 +112,10 @@ module.exports = { foundChat.save(function(err){ if(err){ sails.log.error(err); - return res.view('error'); + return res.serverError(); } - return res.json({"location":"/"}); + return res.redirect(sails.getUrlFor('UserController.index')); }); @@ -91,17 +125,15 @@ module.exports = { .exec(function(err, destroyedChat){ if(err){ sails.log.error(err); - return res.view('error'); + return res.serverError(); } - return res.json({"location":"/"}); + return res.redirect(sails.getUrlFor('UserController.index')); }) } }) }, - //LIGO: write chatMember service - addChatMember: function(req, res){ User.findOne({username: req.body.username}) @@ -109,18 +141,18 @@ module.exports = { .exec(function(err, foundUser){ if(err){ sails.log.error(err); - return res.view('error'); + return res.serverError(); } if(foundUser === undefined){ - return res.redirect('/'); + return res.json({"errors": [{"error": "User not found"}]}); } foundUser.chats.add(req.params.chatroom); foundUser.save(function(err){ if(err){ sails.log.error(err); - return res.view('error'); + return res.serverError(); } }) @@ -136,22 +168,22 @@ module.exports = { .exec(function(err, foundUser){ if(err){ sails.log.error(err); - return res.json({"location":"/"}); + return res.serverError(); } if(foundUser === undefined){ - return res.json({"location":"/"}); + return res.notFound(); } foundUser.chats.remove(req.params.chatroom); foundUser.save(function(err){ if(err){ sails.log.error(err); - return res.json({"location":"/"}); + return res.serverError(); } }); - return res.json({"location": req.body.origin}); + return res.ok(); }) }, @@ -162,23 +194,48 @@ module.exports = { .exec(function(err, foundUser){ if(err){ sails.log.error(err); - return res.json({"location":"/"}); + return res.serverError(); } if(foundUser === undefined){ - return res.json({"location":"/"}); + return res.notFound(); + } + + let unblock = true; + + foundUser.chats.map(function(chat){ + + if(chat.id == req.params.chatroom){ + unblock = false; + } + + return; + }); + + if(unblock){ + + foundUser.chats.add(req.params.chatroom); + foundUser.blockedFrom.remove(req.params.chatroom); + status = 'unblocked'; + + } else { + + foundUser.chats.remove(req.params.chatroom); + foundUser.blockedFrom.add(req.params.chatroom); + status = 'blocked'; } - foundUser.chats.remove(req.params.chatroom); - foundUser.blockedFrom.add(req.params.chatroom); foundUser.save(function(err){ if(err){ sails.log.error(err); - return res.json({"location":"/"}); + return res.serverError(); } - }); - return res.json({"location": req.body.origin}); + return res.ok(); + + + }); }) }, + } diff --git a/api/controllers/UserController.js b/api/controllers/UserController.js index 2aa82f7..002c955 100644 --- a/api/controllers/UserController.js +++ b/api/controllers/UserController.js @@ -7,32 +7,55 @@ module.exports = { index: function(req, res){ + User.findOne({id: req.session.userId}) .populate('chats') .exec(function(err, userAndChats){ if(err){ console.log(err); - return res.view(err); + return res.serverError(); + } + + if(_.isEmpty(userAndChats.chats)){ + return res.view('dashboard', {username: userAndChats.username}); } - return res.view('dashboard', {chats: userAndChats.chats}); + + let countQuery = 'SELECT chatroom_members__user_chats.chatroom_members AS chatroom, COUNT(chatroom_members__user_chats.chatroom_members) AS count FROM `user` INNER JOIN chatroom_members__user_chats ON user.id = chatroom_members__user_chats.user_chats GROUP BY chatroom_members__user_chats.chatroom_members'; + User.query(countQuery, [], function(err, rawResult){ + + let chatsWithCount = []; + + userAndChats.chats.map(function(chat){ + rawResult.map(function(result){ + if (result.chatroom == chat.id){ + chat.count = result.count; + chatsWithCount.push(chat); + } + }) + }); + + return res.view('dashboard', {chats: chatsWithCount, username: userAndChats.username}); + + }) + }) }, register: function(req, res){ - AuthService.register(req) - .then(function(newUser){ - return res.redirect('/'); - }) - .catch(function(err){ - sails.log.error(err); - return res.view('register', {errors: err}); - }) + AuthService.register(req) + .then(function(newUser){ + return res.redirect(sails.getUrlFor('UserController.login')); + }) + .catch(function(err){ + sails.log.error(err); + return res.view('register', {errors: err}); + }) }, login: function(req, res){ AuthService.login(req) .then(function(loggedInUser){ - return res.redirect('/'); + return res.redirect(sails.getUrlFor('UserController.index')); }) .catch(function(err){ sails.log.error(err); @@ -42,7 +65,7 @@ module.exports = { logout: function(req, res){ res.clearCookie('sid'); - return res.redirect('login'); + return res.redirect(sails.getUrlFor('UserController.login')); }, settings: function(req, res){ @@ -60,7 +83,8 @@ module.exports = { return res.view('dashboard', {chats: results}); }) .catch(function(err){ - return sails.log.error(err); + sails.log.error(err); + return res.serverError(); }); }, @@ -69,13 +93,11 @@ module.exports = { User.findOne({username: req.params.username}).exec(function(err, foundUser){ if(err){ sails.log.error(err) - return res.view('error'); + return res.serverError(); } if(foundUser == undefined || foundUser == ''){ - //LIGO: Change his into a 404 once I've made it - sails.log.error('Not a user'); - return res.view('error'); + return res.notFound(); } return res.view('userDetail', {user: foundUser}); @@ -86,16 +108,27 @@ module.exports = { User.findOne({username: req.params.username}).exec(function(err, foundUser){ if(err){ sails.log.error(err) - return res.view('error'); + return res.serverError(); } if(foundUser == undefined || foundUser == ''){ - //LIGO: Change his into a 404 once I've made it - sails.log.error('Not a user'); - return res.view('error'); + return res.notFound(); } return res.view('userDetailEdit', {user: foundUser}); }); + }, + + detailEditSave: function(req, res){ + sails.log.debug(req.body.bio); + User.update({username: req.params.username}, {bio: req.body.bio}).exec(function(err, updatedUser){ + if(err){ + sails.log.error(err) + return res.serverError(); + } + + return res.redirect(sails.getUrlFor('UserController.detailEdit').replace(':username', req.params.username)); + }) } + }; diff --git a/api/models/User.js b/api/models/User.js index 356bcff..eab686a 100644 --- a/api/models/User.js +++ b/api/models/User.js @@ -18,6 +18,7 @@ module.exports = { type: 'string', required: true, unique: true + }, password: { @@ -25,6 +26,10 @@ module.exports = { required: true }, + bio: { + type: 'string' + }, + chats: { collection: 'chatroom', via: 'members' diff --git a/api/policies/isAdmin.js b/api/policies/isAdmin.js index 273403f..15384ac 100644 --- a/api/policies/isAdmin.js +++ b/api/policies/isAdmin.js @@ -11,6 +11,10 @@ module.exports = function(req, res, next) { Chatroom.findOne({id: req.params.chatroom}) .populate('admins', {id: req.session.userId}) .exec(function(err, foundChat){ + if(err){ + sails.log.error(err); + return res.serverError(); + } if(! _.isEmpty(foundChat.admins) ){ return next(); diff --git a/api/policies/isChatMember.js b/api/policies/isChatMember.js new file mode 100644 index 0000000..67cf35a --- /dev/null +++ b/api/policies/isChatMember.js @@ -0,0 +1,26 @@ +/** + * isChatMember + * + * @module :: Policy + * @description :: Simple policy to allow members from a chat + * @docs :: http://sailsjs.org/#!/documentation/concepts/Policies + * + */ +module.exports = function(req, res, next) { + + Chatroom.findOne({id: req.params.chatroom}) + .populate('members', {id: req.session.userId}) + .exec(function(err, foundChat){ + if(err){ + sails.log.error(err); + return res.serverError(); + } + + if(! _.isEmpty(foundChat.members)){ + return next(); + } + + return res.forbidden({"errors": [{"error":"You have to be admin to perform this action"}]}); + }) + +}; diff --git a/api/policies/isNotBlocked.js b/api/policies/isNotBlocked.js index 8edb86d..55f8e00 100644 --- a/api/policies/isNotBlocked.js +++ b/api/policies/isNotBlocked.js @@ -11,7 +11,11 @@ module.exports = function(req, res, next) { Chatroom.findOne({id: req.params.chatroom}) .populate('blocked', {id: req.session.userId}) .exec(function(err, foundChat){ - + if(err){ + sails.log.error(err); + return res.serverError(); + } + if(! _.isEmpty(foundChat.blocked) ){ return res.forbidden({"errors": [{"error":"You are not allowed to enter this chatroom"}]}); } diff --git a/api/policies/isSpecifiedUser.js b/api/policies/isSpecifiedUser.js index 405a75d..b886b59 100644 --- a/api/policies/isSpecifiedUser.js +++ b/api/policies/isSpecifiedUser.js @@ -9,6 +9,11 @@ module.exports = function(req, res, next) { User.findOne({id: req.session.userId}).exec(function(err, foundUser){ + if(err){ + sails.log.error(err); + return res.serverError(); + } + if(foundUser.username === req.params.username){ return next(); } diff --git a/api/policies/sessionAuth.js b/api/policies/sessionAuth.js index e11d5d8..1588bdf 100644 --- a/api/policies/sessionAuth.js +++ b/api/policies/sessionAuth.js @@ -13,6 +13,6 @@ module.exports = function(req, res, next) { return next(); } - return res.redirect('register'); + return res.redirect(sails.getUrlFor('UserController.register')); }; diff --git a/api/responses/forbidden.js b/api/responses/forbidden.js index ca94852..0d34512 100644 --- a/api/responses/forbidden.js +++ b/api/responses/forbidden.js @@ -65,7 +65,7 @@ module.exports = function forbidden (data, options) { // If no second argument provided, try to serve the default view, // but fall back to sending JSON(P) if any errors occur. - else return res.view('403', { data: viewData, title: 'Forbidden' }, function (err, html) { + else return res.view('error', { data: viewData, title: 'Forbidden' }, function (err, html) { // If a view error occured, fall back to JSON(P). if (err) { @@ -86,4 +86,3 @@ module.exports = function forbidden (data, options) { }); }; - diff --git a/api/responses/notFound.js b/api/responses/notFound.js index 8f0cd03..a447995 100644 --- a/api/responses/notFound.js +++ b/api/responses/notFound.js @@ -70,7 +70,7 @@ module.exports = function notFound (data, options) { // If no second argument provided, try to serve the default view, // but fall back to sending JSON(P) if any errors occur. - else return res.view('404', { data: viewData, title: 'Not Found' }, function (err, html) { + else return res.view('error', { data: viewData, title: 'Not Found' }, function (err, html) { // If a view error occured, fall back to JSON(P). if (err) { @@ -91,4 +91,3 @@ module.exports = function notFound (data, options) { }); }; - diff --git a/api/responses/serverError.js b/api/responses/serverError.js index 537c248..ccd4a92 100644 --- a/api/responses/serverError.js +++ b/api/responses/serverError.js @@ -65,7 +65,7 @@ module.exports = function serverError (data, options) { // If no second argument provided, try to serve the default view, // but fall back to sending JSON(P) if any errors occur. - else return res.view('500', { data: viewData, title: 'Server Error' }, function (err, html) { + else return res.view('error', { data: viewData, title: 'Server Error' }, function (err, html) { // If a view error occured, fall back to JSON(P). if (err) { @@ -86,4 +86,3 @@ module.exports = function serverError (data, options) { }); }; - diff --git a/api/services/AuthService.js b/api/services/AuthService.js index 93e4d34..4e44da8 100644 --- a/api/services/AuthService.js +++ b/api/services/AuthService.js @@ -1,4 +1,4 @@ -const bcrypt = require('bcrypt'); +const bcrypt = require('bcryptjs'); module.exports = { @@ -9,6 +9,15 @@ module.exports = { let passMatch = true; let errors = []; + let notContains = ['<', '>', '\'', '\\', '/', '(', ')', '"', '}', '{', '[', ']', "*"]; + + notContains.map(function(char){ + if(req.body.username.indexOf(char) != -1){ + valid = false; + errors.push({error: 'You can\'t use ' + char + ' in your username'}); + } + }) + if(req.body.username == undefined || req.body.username == ''){ valid = false; errors.push({error: 'Username is required'}); diff --git a/assets/js/chatroomSettings.js b/assets/js/chatroomSettings.js index ef377a4..abbecc3 100644 --- a/assets/js/chatroomSettings.js +++ b/assets/js/chatroomSettings.js @@ -1,7 +1,4 @@ window.addEventListener('load', init); -const originURL = document.getElementById('origin').getAttribute('data-url'); -const removeURL = document.getElementById('remove').getAttribute('data-url'); -const blockURL = document.getElementById('block').getAttribute('data-url'); const chatMembers = document.getElementById('chatMembers'); function init(){ @@ -36,40 +33,20 @@ function optionsClickHandler(e){ //Leaving chatroom function leave(req) { - sendPostReq(req, false, redirectHandler); + sendPostReq(req, false); } function addChatMember(req){ const data = { username: document.getElementById('addChatMemberUsername').value, - origin: originURL } - sendPostReq(req, data, addChatMemberSucces); + sendPostReq(req, data, pageReload); } -function addChatMemberSucces(res){ - console.log(res); - - let li = document.createElement('li'); - li.innerHTML = res.username; - - let buttonRemove = document.createElement('button'); - buttonRemove.setAttribute('data-action', removeURL); - buttonRemove.setAttribute('data-username', res.username); - buttonRemove.innerHTML = "X"; - - - let buttonBlock = document.createElement('button'); - buttonBlock.setAttribute('data-action', blockURL); - buttonBlock.setAttribute('data-username', res.username); - buttonBlock.innerHTML = "block"; - - li.appendChild(buttonRemove); - li.appendChild(buttonBlock); - - chatMembers.appendChild(li); +function pageReload(){ + window.location.reload(true); } //removing chatroom member @@ -79,39 +56,49 @@ function removeChatMember(req){ } function blockChatMember(req){ - sendPostReqStandardFormat(req); + + const data = { + username: req.getAttribute('data-username') + } + + sendPostReqStandardFormat(req); + + //sendPostReq(req, data, blockChatMemberSucces(req)); } -function redirectHandler(res){ - window.location.href = window.location.origin + res.location; +function blockChatMemberSucces(button){ + + if(button.innerHTML == 'block'){ + button.innerHTML = 'unblock'; + } else { + button.innerHTML = 'block'; + } } //sending ajax request - function sendPostReqStandardFormat(req){ const data = { - username: req.getAttribute('data-username'), - origin: originURL + username: req.getAttribute('data-username') } - sendPostReq(req, data, redirectHandler); + sendPostReq(req, data, pageReload); } -function sendPostReq( req, data = false, cb){ +function sendPostReq( req, data = false, cb = false){ reqwest({ url: '/csrfToken', method: 'get', success: function(token){ let request = { - url: req.getAttribute('data-action'), - method: 'post', - data: {}, - error: function(err){ - console.log(err); - }, - success: function(res){ - console.log(res); - } + url: req.getAttribute('data-action'), + method: 'post', + data: {}, + error: function(err){ + console.log(err); + }, + success: function(res){ + console.log(res); + } }; if(data){ diff --git a/assets/styles/importer.less b/assets/styles/importer.less index 58b633c..fc51767 100644 --- a/assets/styles/importer.less +++ b/assets/styles/importer.less @@ -27,3 +27,64 @@ // @import 'pages/signup.less'; // // etc. + +/* Login & Signup content */ +.login-signup-form { + text-align: center; +} + +.login-signup-form form { + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; +} + +.login-signup-other-option { + margin: 20px; +} + +.login-signup-other-option p { + padding: 0; +} + +/* navbar */ +.nav-wrapper { + padding-left: 20px; + padding-right: 20px; +} + +/* Dashboard */ +.card-title { + padding-left: 20px; + padding-right: 5px; + padding-top: 15px; +} + +/* Error Page */ +.error-container { + display: flex; + justify-content: center; + align-items: center; + flex-direction: column; +} + +/* Sticky Footer */ +body { + display: flex; + min-height: 100vh; + flex-direction: column; +} + +main { + flex: 1 0 auto; +} + +/* Message Bar */ + +.message-field { + margin-left: 20px; + margin-right: 20px; + display: flex; + flex-direction: row; +} diff --git a/assets/styles/style.css b/assets/styles/style.css deleted file mode 100644 index d706c1a..0000000 --- a/assets/styles/style.css +++ /dev/null @@ -1,3 +0,0 @@ -body { - -} diff --git a/config/policies.js b/config/policies.js index c342c33..dca0690 100644 --- a/config/policies.js +++ b/config/policies.js @@ -60,13 +60,17 @@ module.exports.policies = { '*': ['sessionAuth'], login: true, register: true, - detailEdit: ['sessionAuth', 'isSpecifiedUser'] + detailEdit: ['sessionAuth', 'isSpecifiedUser'], + detailEditSave: ['sessionAuth', 'isSpecifiedUser'], }, ChatroomController: { - '*': ['sessionAuth', 'isNotBlocked'], - addChatMember: ['sessionAuth', 'isNotBlocked', 'isAdmin'], - removeChatMember: ['sessionAuth', 'isNotBlocked', 'isAdmin'], - blockChatMember: ['sessionAuth', 'isNotBlocked', 'isAdmin'] + '*': ['sessionAuth', 'isNotBlocked', 'isChatMember'], + add: 'sessionAuth', + create: 'sessionAuth', + settingsEdit: ['sessionAuth', 'isNotBlocked', 'isChatMember', 'isAdmin'], + addChatMember: ['sessionAuth', 'isNotBlocked', 'isChatMember', 'isAdmin'], + removeChatMember: ['sessionAuth', 'isNotBlocked', 'isChatMember', 'isAdmin'], + blockChatMember: ['sessionAuth', 'isNotBlocked', 'isChatMember', 'isAdmin'] } }; diff --git a/config/routes.js b/config/routes.js index 402dde8..bf32d25 100644 --- a/config/routes.js +++ b/config/routes.js @@ -63,6 +63,8 @@ module.exports.routes = { 'GET /chat/:chatroom/settings': 'ChatroomController.settings', + 'GET /chat/:chatroom/settings/edit': 'ChatroomController.settingsEdit', + 'POST /chat/:chatroom/leave': 'ChatroomController.leave', 'POST /chat/:chatroom/settings/addChatMember': 'ChatroomController.addChatMember', @@ -88,7 +90,9 @@ module.exports.routes = { 'GET /user/:username': 'UserController.detail', - 'GET /user/:username/edit': 'UserController.detailEdit', + 'GET /user/:username/edit': 'UserController.detailEdit', + + 'POST /user/:username/edit/save': 'UserController.detailEditSave', '/logout': 'UserController.logout' diff --git a/package-lock.json b/package-lock.json index 9abb4e1..a236b4a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -710,6 +710,11 @@ "tweetnacl": "0.14.5" } }, + "bcryptjs": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/bcryptjs/-/bcryptjs-2.4.3.tgz", + "integrity": "sha1-mrVie5PmBiH/fNrF2pczAn3x0Ms=" + }, "better-assert": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/better-assert/-/better-assert-1.0.2.tgz", diff --git a/package.json b/package.json index 8169a8e..60e19cc 100644 --- a/package.json +++ b/package.json @@ -6,6 +6,7 @@ "keywords": [], "dependencies": { "bcrypt": "^1.0.3", + "bcryptjs": "^2.4.3", "connect-mongo": "^1.3.2", "connect-redis": "^3.3.2", "ejs": "2.3.4", diff --git a/tasks/pipeline.js b/tasks/pipeline.js index 3e5320a..f6e408a 100644 --- a/tasks/pipeline.js +++ b/tasks/pipeline.js @@ -17,7 +17,7 @@ // (if you're using LESS with the built-in default config, you'll want // to change `assets/styles/importer.less` instead.) var cssFilesToInject = [ - 'styles/material-design-lite/material.min.css', + 'styles/materialize-css/dist/css/materialize.min.css', 'styles/*.css' ]; @@ -28,10 +28,10 @@ var jsFilesToInject = [ // Load sails.io before everything else 'js/dependencies/sails.io.js', + 'styles/materialize-css/dist/js/materialize.min.js', // Dependencies like jQuery, or Angular are brought in here 'js/dependencies/**/*.js', - 'styles/material-design-lite/material.min.js', // All of the rest of your client-side js files // will be injected here in no particular order. diff --git a/views/addChatroom.pug b/views/addChatroom.pug index 4e67021..24805e9 100644 --- a/views/addChatroom.pug +++ b/views/addChatroom.pug @@ -1,8 +1,18 @@ extends page-layout block content - h1 new Chat - form(method="POST") - +formField('text', 'chatname', 'insert chat name') - +formField('hidden', '_csrf')(value= _csrf) - +formField('submit')(value='create', class="mdl-button mdl-js-button mdl-button--raised mdl-js-ripple-effect") + - var title = "New Chatroom" + - links = [{"href": sails.getUrlFor('UserController.index'), "name": "cancel"}] + include template-parts/header.pug + + if errors + each e in errors + p #{e.error} + + div.container + form(method="POST") + div.input-field.col.s6 + label(for='chatname') name + +formField('text', 'chatname', 'insert chat name') + +formField('hidden', '_csrf')(value= _csrf) + +formField('submit')(value="create", class="waves-effect waves-light btn") diff --git a/views/chatroom.pug b/views/chatroom.pug index 77df929..1da205d 100644 --- a/views/chatroom.pug +++ b/views/chatroom.pug @@ -1,5 +1,10 @@ extends page-layout block content - h1 #{chat.name} - - var settingsUrl = sails.getUrlFor('ChatroomController.settings') - +a(settingsUrl.replace(':chatroom', chat.id), 'settings') + - var title = chat.name + - var links = [{"href": sails.getUrlFor('ChatroomController.settings').replace(':chatroom', chat.id), "name": "Settings"}] + include template-parts/header.pug + main + footer + div.message-field + +formField('text', 'msg') + +formField('submit', 'send')(class="waves-effect waves-light btn", id="submit", value="send") diff --git a/views/chatroomSettings.pug b/views/chatroomSettings.pug index 03f7827..6261248 100644 --- a/views/chatroomSettings.pug +++ b/views/chatroomSettings.pug @@ -1,49 +1,31 @@ extends page-layout.pug block content - - var addMemberUrl = sails.getUrlFor('ChatroomController.addChatMember') - - var leaveURL = sails.getUrlFor('ChatroomController.leave') - - var originURL = sails.getUrlFor('ChatroomController.settings') - - var removeURL = sails.getUrlFor('ChatroomController.removeChatMember') - - var blockURL = sails.getUrlFor('ChatroomController.blockChatMember') + - var title = chat.name + " | Settings" + - var links = [{"href": sails.getUrlFor('ChatroomController.settingsEdit').replace(":chatroom", chat.id), "name": "Edit"},{"href": sails.getUrlFor('ChatroomController.show').replace(":chatroom", chat.id), "name": "Back"}] + include template-parts/header.pug - div#origin(style="display:none;" data-url=originURL.replace(":chatroom", chat.id)) - div#remove(style="display:none;" data-url=removeURL.replace(":chatroom", chat.id)) - div#block(style="display:none;" data-url=blockURL.replace(":chatroom", chat.id)) - h1 Settings + - var leaveURL = sails.getUrlFor('ChatroomController.leave') + div#content.container ul#chatAdmins - h5 admins - each admin in chat.admins - li #{admin.username} - - ul#chatMembers - h5 Members + h5 Admin + each admin in chat.admins + li + small #{admin.username} + + h5 Members + table#chatMembers + each member in chat.members - li #{member.username} - button.removeChatMember( - data-action = removeURL.replace(":chatroom", chat.id), - data-username = member.username - ) X - button.blockChatMember( - data-action = blockURL.replace(":chatroom", chat.id), - data-username = member.username - ) block - - - +formField('text')(id='addChatMemberUsername', placeholder='username') - button#addChatMember( - data-action = addMemberUrl.replace(":chatroom", chat.id), - ) add - - ul - h5 blocked users - each user in chat.blocked - li #{user.username} - //LIGO: write unblock function + tr + td #{member.username} + td + each member in chat.blocked + tr + td #{member.username} + td blocked - button#leave(data-action = leaveURL.replace(":chatroom", chat.id)) leave + button#leave(data-action = leaveURL.replace(":chatroom", chat.id), class="waves-effect waves-light btn deep-orange accent-3") leave block append scripts - script(src="/js/chatroomSettings.js", - autoConnect="false" - ) + script(src="/js/chatroomSettings.js", autoConnect="false") diff --git a/views/chatroomSettingsEdit.pug b/views/chatroomSettingsEdit.pug new file mode 100644 index 0000000..a568cd4 --- /dev/null +++ b/views/chatroomSettingsEdit.pug @@ -0,0 +1,54 @@ +extends page-layout.pug +block content + - var title = chat.name + " | Settings" + - var links = [{"href": sails.getUrlFor('ChatroomController.settings').replace(":chatroom", chat.id), "name": "Back"}] + include template-parts/header.pug + if errors + each e in errors + p #{e.error} + + - var addMemberUrl = sails.getUrlFor('ChatroomController.addChatMember') + - var leaveURL = sails.getUrlFor('ChatroomController.leave') + - var originURL = sails.getUrlFor('ChatroomController.settings') + - var removeURL = sails.getUrlFor('ChatroomController.removeChatMember') + - var blockURL = sails.getUrlFor('ChatroomController.blockChatMember') + + div#content.container + ul#chatAdmins + h5 Admin + each admin in chat.admins + li + small #{admin.username} + + h5 Members + table#chatMembers + tr + td + b Usernames + td + b Block + td + b Remove + each member in chat.members + tr + td #{member.username} + td + button.blockChatMember(data-action = blockURL.replace(":chatroom", chat.id), data-username = member.username, class="waves-effect waves-light btn") block + td + button.removeChatMember(data-action = removeURL.replace(":chatroom", chat.id), data-username = member.username, class="waves-effect waves-light btn deep-orange accent-3") X + each member in chat.blocked + tr + td #{member.username} + td + button.blockChatMember(data-action = blockURL.replace(":chatroom", chat.id), data-username = member.username, class="waves-effect waves-light btn") unblock + td + button.removeChatMember(data-action = removeURL.replace(":chatroom", chat.id), data-username = member.username, class="waves-effect waves-light btn deep-orange accent-3", disabled) X + tr + +formField('text')(id='addChatMemberUsername', placeholder='username') + button#addChatMember(data-action = addMemberUrl.replace(":chatroom", chat.id), class="waves-effect waves-light btn") add + + + button#leave(data-action = leaveURL.replace(":chatroom", chat.id), class="waves-effect waves-light btn deep-orange accent-3") leave + +block append scripts + script(src="/js/chatroomSettings.js", autoConnect="false") diff --git a/views/dashboard.pug b/views/dashboard.pug index f8542f1..a9a483a 100644 --- a/views/dashboard.pug +++ b/views/dashboard.pug @@ -1,28 +1,31 @@ extends page-layout.pug block content - h1 Welcome - +a(sails.getUrlFor('UserController.settings'), 'settings') - | - | - +a(sails.getUrlFor('UserController.logout'), 'logout') - | - | - +a(sails.getUrlFor('ChatroomController.add'), 'New Chat') + - var links = [{"href": sails.getUrlFor('ChatroomController.add'), "name": "New Chat"}, {"href": sails.getUrlFor('UserController.detailEdit').replace(':username', username), "name": "Settings"},{"href": sails.getUrlFor('UserController.logout'), "name": "Logout"}] + include template-parts/header.pug - form(method='POST', action=sails.getUrlFor('UserController.dashboardSearch')) - +formField('text', 'search') - +formField('hidden', '_csrf')(value= _csrf) - +formField('submit')(value="search") + div.container + form(method='POST', action=sails.getUrlFor('UserController.dashboardSearch')) + +formField('text', 'search') + +formField('hidden', '_csrf')(value= _csrf) + +formField('submit')(class="waves-effect waves-light btn col s12", value="search") - div.chatsContainer - if chats - - var chatUrl = sails.getUrlFor('ChatroomController.show') - each chat in chats - a(href=chatUrl.replace(':chatroom', chat.id)) - h3 #{chat.name} - if chat.members - ul - each member in chat.members - li #{member.username} - + + ul.chat-container + if chats + - var chatUrl = sails.getUrlFor('ChatroomController.show') + each chat in chats + li + div.col.s4 + div.card.blue-grey.lighten-3.white-text + span.card-title #{chat.name} + div.card-action + a(href=chatUrl.replace(':chatroom', chat.id), class="teal-text") go + p #{chat.count} member(s) + if chat.members + ul + each member in chat.members + li #{member.username} + else + li + h4 No Chatrooms diff --git a/views/error.pug b/views/error.pug index a0f078f..0fd2328 100644 --- a/views/error.pug +++ b/views/error.pug @@ -1,6 +1,14 @@ -doctype -html - head - body - h1. - Something went wrong lol +extends page-layout.pug +block content + include template-parts/header.pug + div.error-container + if title + h3 #{title} + else + h3 Something went wrong lol + if data + p #{data} + + a.white-text( href=sails.getUrlFor('UserController.index')) + button.waves-effect.waves-light.btn Back to the dashboard + diff --git a/views/login.pug b/views/login.pug index 807aa3b..7dcaca8 100644 --- a/views/login.pug +++ b/views/login.pug @@ -1,19 +1,24 @@ extends page-layout.pug block content + include template-parts/header.pug if errors each e in errors p #{e.error} - - h1. - Log in + + div.login-signup-form + h3. + Log in - form(method='POST') - +formField('text', 'username', 'username') - +formField('password', 'password', 'password') - +formField('hidden', '_csrf')(value= _csrf) - +formField('submit', 'login')(class="mdl-button mdl-js-button mdl-button--raised mdl-js-ripple-effect") - + form(method='POST', class="col s12") + div.input-field.col.s6 + label(for='username') username + +formField('text', 'username') + div.input-field.col.s6 + label(for='password') password + +formField('password', 'password') + +formField('hidden', '_csrf')(value= _csrf) + +formField('submit', 'login')(class="waves-effect waves-light btn", id="submit", value="login") - div - p not a member yet? - +a( sails.getUrlFor('UserController.register'), 'sign up') + div.login-signup-other-option + p not a member yet? + +a( sails.getUrlFor('UserController.register'), 'sign up') diff --git a/views/mixins/form.pug b/views/mixins/form.pug new file mode 100644 index 0000000..b21f324 --- /dev/null +++ b/views/mixins/form.pug @@ -0,0 +1,2 @@ +mixin formField(type, name) + input(type=type, name=name, id=name)&attributes(attributes) diff --git a/views/partials/hyperlink.pug b/views/mixins/hyperlink.pug similarity index 97% rename from views/partials/hyperlink.pug rename to views/mixins/hyperlink.pug index 1903387..3ea705c 100644 --- a/views/partials/hyperlink.pug +++ b/views/mixins/hyperlink.pug @@ -1,2 +1,2 @@ -mixin a(href, text) - a(href = href)&attributes(attributes)=text +mixin a(href, text) + a(href = href)&attributes(attributes)=text diff --git a/views/page-layout.pug b/views/page-layout.pug index 86094d6..797e25a 100644 --- a/views/page-layout.pug +++ b/views/page-layout.pug @@ -5,25 +5,24 @@ html Ligo | Page //- #{title} block css - // STYLES - link(rel="stylesheet", href="/styles/material-design-lite/material.min.css") - link(rel="stylesheet", href="/styles/importer.css") - link(rel="stylesheet", href="/styles/style.css") + link(href="https://fonts.googleapis.com/icon?family=Material+Icons", rel="stylesheet") + // STYLES + link(rel="stylesheet", href="/styles/materialize-css/dist/css/materialize.min.css") + link(rel="stylesheet", href="/styles/importer.css") // STYLES END - body - header - include partials/form.pug - include partials/hyperlink.pug - div#content - block content - - footer + + body + include mixins/form.pug + include mixins/hyperlink.pug + + block content block scripts - // SCRIPTS - script(src="/js/dependencies/sails.io.js") - script(src="/js/dependencies/reqwest.min.js") - script(src="/styles/material-design-lite/material.min.js") + script(type="text/javascript", src="https://code.jquery.com/jquery-3.2.1.min.js") + // SCRIPTS + script(src="/js/dependencies/sails.io.js") + script(src="/styles/materialize-css/dist/js/materialize.min.js") + script(src="/js/dependencies/reqwest.min.js") // SCRIPTS END diff --git a/views/partials/form.pug b/views/partials/form.pug deleted file mode 100644 index 0b2117d..0000000 --- a/views/partials/form.pug +++ /dev/null @@ -1,12 +0,0 @@ -mixin formField(type, name, placeholder) - if type == submit - input( - type=type, - name=name, - placeholder=placeholder, - )&attributes(attributes) - if type != submit - input(type=type, - name=name, - placeholder=placeholder - )&attributes(attributes) diff --git a/views/register.pug b/views/register.pug index b304835..6d49a00 100644 --- a/views/register.pug +++ b/views/register.pug @@ -1,19 +1,27 @@ extends page-layout.pug block content + include template-parts/header.pug if errors each e in errors p #{e.error} + + div.login-signup-form + h1. + Sign up - h1. - Sign up - - form(method="POST") - +formField('text', 'username', 'username') - +formField('password', 'password', 'password') - +formField('password', 'repeat', 'repeat password') - +formField('hidden', '_csrf')(value= _csrf) - +formField('submit') + form(method="POST") + div.input-field.col.s6 + label(for='username') username + +formField('text', 'username') + div.input-field.col.s6 + label(for='password') password + +formField('password', 'password') + div.input-field.col.s6 + label(for='repeat') repeat password + +formField('password', 'repeat') + +formField('hidden', '_csrf')(value= _csrf) + +formField('submit')(class="waves-effect waves-light btn", id="submit", value="Sign Up") - div - p already a member? + div + p already a member? +a(sails.getUrlFor('UserController.login'), 'login') diff --git a/views/template-parts/header.pug b/views/template-parts/header.pug new file mode 100644 index 0000000..06a829f --- /dev/null +++ b/views/template-parts/header.pug @@ -0,0 +1,11 @@ +nav + div.nav-wrapper + if title + a.brand-logo(href=sails.getUrlFor('UserController.index')) Ligo | #{title} + else + a.brand-logo(href=sails.getUrlFor('UserController.index')) Ligo + if links + ul#nav-mobile.right.hide-on-med-and-down + each link in links + li + a(href= link.href) #{link.name} diff --git a/views/userDetail.pug b/views/userDetail.pug index 4cb6f72..6b08ae9 100644 --- a/views/userDetail.pug +++ b/views/userDetail.pug @@ -1,5 +1,7 @@ extends page-layout block content - h1 #{user.username} + - var links = [{"href":sails.getUrlFor('UserController.index'), "name":"Dashboard"}] + include template-parts/header.pug + h1.center #{user.username} if user.bio - p #{user.bio} + p.center #{user.bio} diff --git a/views/userDetailEdit.pug b/views/userDetailEdit.pug index 61e70b7..6beac1a 100644 --- a/views/userDetailEdit.pug +++ b/views/userDetailEdit.pug @@ -1,8 +1,16 @@ extends page-layout block content - h1 #{user.username} - small edit page - if user.bio - p #{user.bio} -//- these things need to be fields lol -//- obviously a work in progress + - var links = [{"href": sails.getUrlFor('UserController.index'), "name": "Back"}] + include template-parts/header.pug + if errors + each e in errors + p #{e.error} + + h1.center #{user.username} + form(method="POST", action=sails.getUrlFor('UserController.detailEditSave').replace(':username', user.username), class="col m6 center") + if user.bio + +formField('text', 'bio')(value= user.bio) + else + +formField('text', 'bio') + +formField('hidden', '_csrf')(value= _csrf) + +formField('submit')(class="waves-effect waves-light btn col s6 center", value="save")