diff options
| author | Bobby <[email protected]> | 2022-04-30 23:20:29 -0400 |
|---|---|---|
| committer | Bobby <[email protected]> | 2022-04-30 23:20:29 -0400 |
| commit | 017e8b42d953136140e0ff6d12559b86d1a330d5 (patch) | |
| tree | 48289c81f37c10a329aa50886980961060145e46 /interface | |
| parent | 51e7b0e5912517eb8ee78f95029e948c73d69267 (diff) | |
| download | Welfare-Schemes-DMQL-017e8b42d953136140e0ff6d12559b86d1a330d5.tar.xz Welfare-Schemes-DMQL-017e8b42d953136140e0ff6d12559b86d1a330d5.zip | |
user login api
Diffstat (limited to 'interface')
| -rw-r--r-- | interface/config/db.config.js | 9 | ||||
| -rw-r--r-- | interface/controllers/users.controller.js | 18 | ||||
| -rw-r--r-- | interface/functions/index.js | 5 | ||||
| -rw-r--r-- | interface/models/index.js | 2 | ||||
| -rw-r--r-- | interface/models/users.model.js | 20 | ||||
| -rw-r--r-- | interface/package-lock.json | 223 | ||||
| -rw-r--r-- | interface/package.json | 3 | ||||
| -rw-r--r-- | interface/routes/api/index.js | 80 | ||||
| -rw-r--r-- | interface/routes/index.js | 8 | ||||
| -rw-r--r-- | interface/views/partials/navbar.ejs | 40 |
10 files changed, 402 insertions, 6 deletions
diff --git a/interface/config/db.config.js b/interface/config/db.config.js index 9118d6c..ea90d0c 100644 --- a/interface/config/db.config.js +++ b/interface/config/db.config.js @@ -1,14 +1,15 @@ +require('dotenv').config(); module.exports = { // The name of the database - database: 'WelfareSchemes', + database: process.env.DATABASE, // The username used to connect to the database - username: 'postgres', + username: process.env.USERNAME, // The password used to connect to the database - password: 'lucifer', + password: process.env.PASSWORD, // The dialect of the database you are connecting to dialect: 'postgres', // The host of the database - host: 'localhost', + host: process.env.HOST, // The port of the database port: 5432, // Setup pool of connections to the database diff --git a/interface/controllers/users.controller.js b/interface/controllers/users.controller.js new file mode 100644 index 0000000..fff4469 --- /dev/null +++ b/interface/controllers/users.controller.js @@ -0,0 +1,18 @@ +const { users } = require("../models"); +const db = require("../models"); +const citizens = db.citizens; +const op = db.Sequelize.Op; + +// Create a new user +exports.create = (username, password) => { + return users.create({ username, password }); +} + +// Get a user by their username +exports.findByUsername = (username) => { + return users.findOne({ + where: { + username: username + } + }); +} diff --git a/interface/functions/index.js b/interface/functions/index.js new file mode 100644 index 0000000..034dc80 --- /dev/null +++ b/interface/functions/index.js @@ -0,0 +1,5 @@ +const jwt = require('jsonwebtoken'); + +exports.verifyJWT = (jwtToken) => { + return jwt.verify(jwtToken, process.env.JWT_SECRET); +} diff --git a/interface/models/index.js b/interface/models/index.js index 852fb65..e799e1e 100644 --- a/interface/models/index.js +++ b/interface/models/index.js @@ -18,7 +18,9 @@ const sequelize = new Sequelize(databaseConfig.database, databaseConfig.username const db = {}; db.Sequelize = Sequelize; db.sequelize = sequelize; +db.users = require('./users.model')(Sequelize, sequelize); db.citizens = require('./citizens.model.js')(Sequelize, sequelize); db.village_master = require('./village_master.model.js')(Sequelize, sequelize); +db.bank_master = require('./bank_master.model.js')(Sequelize, sequelize); module.exports = db; diff --git a/interface/models/users.model.js b/interface/models/users.model.js new file mode 100644 index 0000000..df8b276 --- /dev/null +++ b/interface/models/users.model.js @@ -0,0 +1,20 @@ +module.exports = (Sequelize, sequelize) => { + const Users = sequelize.define("users", { + user_id: { + type: Sequelize.INTEGER, + allowNull: false, + primaryKey: true, + autoIncrement: true, + }, + username: { + type: Sequelize.STRING(155), + allowNull: false, + unique: true, + }, + password: { + type: Sequelize.STRING(155), + allowNull: false, + } + }); + return Users; +}
\ No newline at end of file diff --git a/interface/package-lock.json b/interface/package-lock.json index e4be03a..2613ab1 100644 --- a/interface/package-lock.json +++ b/interface/package-lock.json @@ -9,10 +9,13 @@ "version": "1.0.0", "license": "GPL-3.0-or-later", "dependencies": { + "bcryptjs": "^2.4.3", "body-parser": "^1.20.0", "cors": "^2.8.5", + "dotenv": "^16.0.0", "ejs": "^3.1.7", "express": "^4.17.3", + "jsonwebtoken": "^8.5.1", "pg": "^8.7.3", "pg-hstore": "^2.3.4", "sequelize": "^6.19.0" @@ -143,6 +146,11 @@ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, + "node_modules/bcryptjs": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/bcryptjs/-/bcryptjs-2.4.3.tgz", + "integrity": "sha1-mrVie5PmBiH/fNrF2pczAn3x0Ms=" + }, "node_modules/binary-extensions": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", @@ -283,6 +291,11 @@ "node": ">=8" } }, + "node_modules/buffer-equal-constant-time": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", + "integrity": "sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk=" + }, "node_modules/buffer-writer": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/buffer-writer/-/buffer-writer-2.0.0.tgz", @@ -585,6 +598,14 @@ "node": ">=8" } }, + "node_modules/dotenv": { + "version": "16.0.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.0.tgz", + "integrity": "sha512-qD9WU0MPM4SWLPJy/r2Be+2WgQj8plChsyrCNQzW/0WjvcJQiKQJ9mH3ZgB3fxbUUxgc/11ZJ0Fi5KiimWGz2Q==", + "engines": { + "node": ">=12" + } + }, "node_modules/dottie": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/dottie/-/dottie-2.0.2.tgz", @@ -596,6 +617,14 @@ "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=", "dev": true }, + "node_modules/ecdsa-sig-formatter": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", + "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", + "dependencies": { + "safe-buffer": "^5.0.1" + } + }, "node_modules/ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", @@ -1174,6 +1203,59 @@ "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=", "dev": true }, + "node_modules/jsonwebtoken": { + "version": "8.5.1", + "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz", + "integrity": "sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w==", + "dependencies": { + "jws": "^3.2.2", + "lodash.includes": "^4.3.0", + "lodash.isboolean": "^3.0.3", + "lodash.isinteger": "^4.0.4", + "lodash.isnumber": "^3.0.3", + "lodash.isplainobject": "^4.0.6", + "lodash.isstring": "^4.0.1", + "lodash.once": "^4.0.0", + "ms": "^2.1.1", + "semver": "^5.6.0" + }, + "engines": { + "node": ">=4", + "npm": ">=1.4.28" + } + }, + "node_modules/jsonwebtoken/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "node_modules/jsonwebtoken/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/jwa": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", + "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==", + "dependencies": { + "buffer-equal-constant-time": "1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/jws": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", + "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", + "dependencies": { + "jwa": "^1.4.1", + "safe-buffer": "^5.0.1" + } + }, "node_modules/keyv": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz", @@ -1200,6 +1282,41 @@ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, + "node_modules/lodash.includes": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", + "integrity": "sha1-YLuYqHy5I8aMoeUTJUgzFISfVT8=" + }, + "node_modules/lodash.isboolean": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", + "integrity": "sha1-bC4XHbKiV82WgC/UOwGyDV9YcPY=" + }, + "node_modules/lodash.isinteger": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", + "integrity": "sha1-YZwK89A/iwTDH1iChAt3sRzWg0M=" + }, + "node_modules/lodash.isnumber": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", + "integrity": "sha1-POdoEMWSjQM1IwGsKHMX8RwLH/w=" + }, + "node_modules/lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=" + }, + "node_modules/lodash.isstring": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", + "integrity": "sha1-1SfftUVuynzJu5XV2ur4i6VKVFE=" + }, + "node_modules/lodash.once": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", + "integrity": "sha1-DdOXEhPHxW34gJd9UEyI+0cal6w=" + }, "node_modules/lowercase-keys": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", @@ -2499,6 +2616,11 @@ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, + "bcryptjs": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/bcryptjs/-/bcryptjs-2.4.3.tgz", + "integrity": "sha1-mrVie5PmBiH/fNrF2pczAn3x0Ms=" + }, "binary-extensions": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", @@ -2603,6 +2725,11 @@ "fill-range": "^7.0.1" } }, + "buffer-equal-constant-time": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", + "integrity": "sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk=" + }, "buffer-writer": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/buffer-writer/-/buffer-writer-2.0.0.tgz", @@ -2824,6 +2951,11 @@ "is-obj": "^2.0.0" } }, + "dotenv": { + "version": "16.0.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.0.tgz", + "integrity": "sha512-qD9WU0MPM4SWLPJy/r2Be+2WgQj8plChsyrCNQzW/0WjvcJQiKQJ9mH3ZgB3fxbUUxgc/11ZJ0Fi5KiimWGz2Q==" + }, "dottie": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/dottie/-/dottie-2.0.2.tgz", @@ -2835,6 +2967,14 @@ "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=", "dev": true }, + "ecdsa-sig-formatter": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", + "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", + "requires": { + "safe-buffer": "^5.0.1" + } + }, "ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", @@ -3275,6 +3415,54 @@ "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=", "dev": true }, + "jsonwebtoken": { + "version": "8.5.1", + "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz", + "integrity": "sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w==", + "requires": { + "jws": "^3.2.2", + "lodash.includes": "^4.3.0", + "lodash.isboolean": "^3.0.3", + "lodash.isinteger": "^4.0.4", + "lodash.isnumber": "^3.0.3", + "lodash.isplainobject": "^4.0.6", + "lodash.isstring": "^4.0.1", + "lodash.once": "^4.0.0", + "ms": "^2.1.1", + "semver": "^5.6.0" + }, + "dependencies": { + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + } + } + }, + "jwa": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", + "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==", + "requires": { + "buffer-equal-constant-time": "1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } + }, + "jws": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", + "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", + "requires": { + "jwa": "^1.4.1", + "safe-buffer": "^5.0.1" + } + }, "keyv": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz", @@ -3298,6 +3486,41 @@ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, + "lodash.includes": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", + "integrity": "sha1-YLuYqHy5I8aMoeUTJUgzFISfVT8=" + }, + "lodash.isboolean": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", + "integrity": "sha1-bC4XHbKiV82WgC/UOwGyDV9YcPY=" + }, + "lodash.isinteger": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", + "integrity": "sha1-YZwK89A/iwTDH1iChAt3sRzWg0M=" + }, + "lodash.isnumber": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", + "integrity": "sha1-POdoEMWSjQM1IwGsKHMX8RwLH/w=" + }, + "lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=" + }, + "lodash.isstring": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", + "integrity": "sha1-1SfftUVuynzJu5XV2ur4i6VKVFE=" + }, + "lodash.once": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", + "integrity": "sha1-DdOXEhPHxW34gJd9UEyI+0cal6w=" + }, "lowercase-keys": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", diff --git a/interface/package.json b/interface/package.json index 87ca23a..d421c00 100644 --- a/interface/package.json +++ b/interface/package.json @@ -12,10 +12,13 @@ "author": "Kumar Priyansh <[email protected]>", "license": "GPL-3.0-or-later", "dependencies": { + "bcryptjs": "^2.4.3", "body-parser": "^1.20.0", "cors": "^2.8.5", + "dotenv": "^16.0.0", "ejs": "^3.1.7", "express": "^4.17.3", + "jsonwebtoken": "^8.5.1", "pg": "^8.7.3", "pg-hstore": "^2.3.4", "sequelize": "^6.19.0" diff --git a/interface/routes/api/index.js b/interface/routes/api/index.js new file mode 100644 index 0000000..bad2706 --- /dev/null +++ b/interface/routes/api/index.js @@ -0,0 +1,80 @@ +// API for logging in +const express = require("express"); +const router = express.Router(); +const jwt = require("jsonwebtoken"); +const bcyrpt = require("bcryptjs"); +const userController = require("../../controllers/users.controller"); +const { verifyJWT } = require("../../functions"); + +router.get("/verify", (req, res) => { + // get token from auth header + console.log(req.headers) + const token = req.headers.authorization; + // verify token + const decoded = verifyJWT(token.replace("Bearer ", "")); + if (decoded) { + res.status(200).json({ + message: "Token is valid", + decoded: decoded, + }); + } else { + res.status(401).json({ + message: "Token is invalid", + }); + } +}); + +router.post("/create", (req, res) => { + const { username, password } = req.body; + const saltRounds = 10; + const hash = bcyrpt.hashSync(password, saltRounds); + userController.create(username, hash).then((user) => { + const token = jwt.sign({ id: user.id }, process.env.JWT_SECRET, { + expiresIn: "1h", + }); + res.json({ + token, + user, + }); + }); +}); + +router.post("/login", (req, res) => { + const { username, password } = req.body; + // get user by username + userController.findByUsername(username).then((user) => { + if (!user) { + return res.status(400).json({ + message: "User not found", + }); + } + // check if password is correct + bcyrpt.compare(password, user.password).then((isMatch) => { + if (!isMatch) { + return res.status(400).json({ + message: "Invalid credentials", + }); + } + // generate jwt + const payload = { + id: user.id, + username: user.username, + }; + jwt.sign( + payload, + process.env.SECRET_KEY, + { + expiresIn: 3600, + }, + (err, token) => { + if (err) throw err; + res.json({ + token, + }); + } + ); + }); + }); +}); + +module.exports = router; diff --git a/interface/routes/index.js b/interface/routes/index.js index 17c2021..057e1df 100644 --- a/interface/routes/index.js +++ b/interface/routes/index.js @@ -1,14 +1,18 @@ const express = require("express"); const router = express.Router(); const citizensController = require("../controllers/citizens.controller"); +const api = require('./api'); -// Setup Hello World route +// Setup api routes +router.use('/api', api); + +// Setup main route router.get("/", (req, res) => { // Get the citizens from the database citizensController.findXCitizens().then(citizens => { res.render("index", { citizens: citizens, - title: "Hello World" + title: "Home" }); }); }); diff --git a/interface/views/partials/navbar.ejs b/interface/views/partials/navbar.ejs index 6a46ff3..2939438 100644 --- a/interface/views/partials/navbar.ejs +++ b/interface/views/partials/navbar.ejs @@ -42,7 +42,47 @@ </div> </div> </div> + <div class="right menu"> + <div class="item"> + <div class="ui icon input"> + <input type="text" placeholder="Search..."> + <i class="search link icon"></i> + </div> + </div> + <a class="ui item loginButton"> + Log in + </a> + </div> +</div> +<div class="ui modal login"> + <i class="close icon"></i> + <div class="header"> + Log in to continue + </div> + <div class="ui padded container segment" style="border: none; box-shadow: none;"> + <div class="ui form "> + <div class="field"> + <label>Username</label> + <input type="text" placeholder="Username"> + </div> + <div class="field"> + <label>Password</label> + <input type="password" placeholder="Password"> + </div> + </div> + </div> + + <div class="actions"> + <div class="ui black deny button"> + Cancel + </div> + <div class="ui positive right labeled icon button"> + Continue + <i class="checkmark icon"></i> + </div> + </div> </div> <script> $(".ui.dropdown").dropdown(); + $(".login.modal").modal("attach events", ".loginButton", "show"); </script> |
