diff --git a/.gitignore b/.gitignore index 7e55289..0940ac5 100755 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,9 @@ # Environment variables .env +#vscode files +.vscode + # Node modules node_modules/ diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..c8a7ed4 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,4 @@ +{ + "editor.fontFamily": "Monocraft", + "editor.fontLigatures": true +} \ No newline at end of file diff --git a/app.js b/app.js index dd07121..d776381 100644 --- a/app.js +++ b/app.js @@ -7,12 +7,11 @@ const bcrypt = require('bcrypt'); const joi = require('joi'); require('dotenv').config(); - const app = express(); const port = process.env.PORT || 3000; -const mongoURI = process.env.mongoURI || "mongodb://localhost:27017/"; -const database = process.env.database || "knoldus"; // Database name +const mongoURI = process.env.mongoURI; +const database = process.env.database; // Database name const secret = process.env.secret || "123-secret-xyz"; /*** Sessions ***/ diff --git a/src/auth/authentication.js b/src/auth/authentication.js index 21ba26a..a540751 100644 --- a/src/auth/authentication.js +++ b/src/auth/authentication.js @@ -1,4 +1,5 @@ const status = require("../util/statuses"); +const session = require("express-session"); const bcrypt = require('bcrypt'); const joi = require("joi"); const salt = 12; diff --git a/src/auth/middleware.js b/src/auth/middleware.js index bf1ed0a..3c12f61 100644 --- a/src/auth/middleware.js +++ b/src/auth/middleware.js @@ -13,7 +13,7 @@ const userRoutes = userRouter.stack.map((layer) => layer.route.path.split("/")[1 const createMiddleware = (users) => { return async (req, res, next) => { // Redirect not found pages to 404 page - if (!userRoutes.includes(req.url.substring(1))) { + if (!userRoutes.includes(req.url.split("/")[1])) { return res.status(status.NotFound).redirect("/notFound"); } diff --git a/src/public/scripts/calcExchange.js b/src/public/scripts/calcExchange.js new file mode 100644 index 0000000..29956e8 --- /dev/null +++ b/src/public/scripts/calcExchange.js @@ -0,0 +1,3 @@ +let rate = document.getElementsByClassName("countryButton").value; + +document.getElementById("exchange").innerHTML \ No newline at end of file diff --git a/src/public/scripts/geolocation.js b/src/public/scripts/geolocation.js index ebe001b..26f2e1a 100644 --- a/src/public/scripts/geolocation.js +++ b/src/public/scripts/geolocation.js @@ -1,24 +1,71 @@ function getLocation() { if (navigator.geolocation) { - navigator.geolocation.getCurrentPosition(success, error); + navigator.geolocation.getCurrentPosition(getLatestExchange, error); } } -function success(position) { - const { latitude, longitude } = position.coords; +function update(data) { + document.getElementById("loading").style = "display: none"; + document.getElementById("currencyExchange").style = "display: flex"; - fetch("api/location" , { - method: "POST", - headers: { - "Content-Type": "application/json" - }, - body: JSON.stringify({ latitude, longitude }) - }).then(res => res.json()) - .then(data => { - console.log(data.results[0].formatted_address); - }) + document.getElementById("yourFlag").src = `/static/svgs/flags/${data.data.country}.svg` + document.getElementById("yourFlag").alt = data.data.country; + document.getElementById("flagTag").innerHTML = `(${data.data.country})`; + + document.getElementById("exchangeFlag").src = `/static/svgs/flags/USD.svg`; + document.getElementById("exchangeFlag").alt = "USD"; + document.getElementById("exFlagTag").innerHTML = "(USD)"; + + document.getElementById("dropdown-country-button").value = data.data.toCurrencyRates["USD"]; + + updateExchange(document.getElementById("dropdown-country-button").value); + + const dropdown = document.getElementById("dropdown"); + let countries = Object.keys(data.data.toCurrencyRates); + + countries.forEach(item => { + if (dropdown.querySelector(`button[value="${data.data.toCurrencyRates[item]}"]`)) { + return; + } + + const listItem = document.createElement("li"); + listItem.innerHTML = ``; + + dropdown.appendChild(listItem); + }); + + console.log(data); +} + +function switchButton(clickedButton) { + document.getElementById("dropdown-country-button").value = clickedButton.value; + updateExchange(document.getElementById("dropdown-country-button").value); + + document.getElementById("dropdown-country-button").innerHTML = clickedButton.innerHTML + + ` + + `; +} + +function updateExchange(exRate) { + document.getElementById("exchange").innerHTML = "$1.00 = $" +`${(1 * exRate).toFixed(2)}`; +} + +async function getLatestExchange(position) { + let lat = position.coords.latitude; + let lon = position.coords.longitude; + const res = await fetch(`/exRates/${lat}/${lon}`); + const data = await res.json(); + + update(data); } function error(err) { console.error("Geolocation error: ", err); -} +} \ No newline at end of file diff --git a/src/public/svgs/assets.svg b/src/public/svgs/assets.svg new file mode 100644 index 0000000..824466d --- /dev/null +++ b/src/public/svgs/assets.svg @@ -0,0 +1,4 @@ + \ No newline at end of file diff --git a/src/public/svgs/dashboard.svg b/src/public/svgs/dashboard.svg new file mode 100644 index 0000000..e10e231 --- /dev/null +++ b/src/public/svgs/dashboard.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/public/svgs/flags/AUD.svg b/src/public/svgs/flags/AUD.svg new file mode 100644 index 0000000..96e8076 --- /dev/null +++ b/src/public/svgs/flags/AUD.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/src/public/svgs/flags/BGN.svg b/src/public/svgs/flags/BGN.svg new file mode 100644 index 0000000..af2d0d0 --- /dev/null +++ b/src/public/svgs/flags/BGN.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/public/svgs/flags/BRL.svg b/src/public/svgs/flags/BRL.svg new file mode 100644 index 0000000..fe1d416 --- /dev/null +++ b/src/public/svgs/flags/BRL.svg @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/public/svgs/flags/CAD.svg b/src/public/svgs/flags/CAD.svg new file mode 100644 index 0000000..c9b23b4 --- /dev/null +++ b/src/public/svgs/flags/CAD.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/public/svgs/flags/CHF.svg b/src/public/svgs/flags/CHF.svg new file mode 100644 index 0000000..b42d670 --- /dev/null +++ b/src/public/svgs/flags/CHF.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/src/public/svgs/flags/CNY.svg b/src/public/svgs/flags/CNY.svg new file mode 100644 index 0000000..10d3489 --- /dev/null +++ b/src/public/svgs/flags/CNY.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/src/public/svgs/flags/CZK.svg b/src/public/svgs/flags/CZK.svg new file mode 100644 index 0000000..7913de3 --- /dev/null +++ b/src/public/svgs/flags/CZK.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/public/svgs/flags/DKK.svg b/src/public/svgs/flags/DKK.svg new file mode 100644 index 0000000..563277f --- /dev/null +++ b/src/public/svgs/flags/DKK.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/public/svgs/flags/GBP.svg b/src/public/svgs/flags/GBP.svg new file mode 100644 index 0000000..7991383 --- /dev/null +++ b/src/public/svgs/flags/GBP.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/public/svgs/flags/HKD.svg b/src/public/svgs/flags/HKD.svg new file mode 100644 index 0000000..4fd55bc --- /dev/null +++ b/src/public/svgs/flags/HKD.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/src/public/svgs/flags/HUF.svg b/src/public/svgs/flags/HUF.svg new file mode 100644 index 0000000..baddf7f --- /dev/null +++ b/src/public/svgs/flags/HUF.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/public/svgs/flags/IDR.svg b/src/public/svgs/flags/IDR.svg new file mode 100644 index 0000000..3b7c8fc --- /dev/null +++ b/src/public/svgs/flags/IDR.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/public/svgs/flags/ILS.svg b/src/public/svgs/flags/ILS.svg new file mode 100644 index 0000000..f43be7e --- /dev/null +++ b/src/public/svgs/flags/ILS.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/src/public/svgs/flags/INR.svg b/src/public/svgs/flags/INR.svg new file mode 100644 index 0000000..bc47d74 --- /dev/null +++ b/src/public/svgs/flags/INR.svg @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/public/svgs/flags/ISK.svg b/src/public/svgs/flags/ISK.svg new file mode 100644 index 0000000..a6588af --- /dev/null +++ b/src/public/svgs/flags/ISK.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/src/public/svgs/flags/JPY.svg b/src/public/svgs/flags/JPY.svg new file mode 100644 index 0000000..cc1c181 --- /dev/null +++ b/src/public/svgs/flags/JPY.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/src/public/svgs/flags/KRW.svg b/src/public/svgs/flags/KRW.svg new file mode 100644 index 0000000..6947eab --- /dev/null +++ b/src/public/svgs/flags/KRW.svg @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/public/svgs/flags/MXN.svg b/src/public/svgs/flags/MXN.svg new file mode 100644 index 0000000..5a67d62 --- /dev/null +++ b/src/public/svgs/flags/MXN.svg @@ -0,0 +1,382 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/public/svgs/flags/MYR.svg b/src/public/svgs/flags/MYR.svg new file mode 100644 index 0000000..115f864 --- /dev/null +++ b/src/public/svgs/flags/MYR.svg @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/public/svgs/flags/NOK.svg b/src/public/svgs/flags/NOK.svg new file mode 100644 index 0000000..a5f2a15 --- /dev/null +++ b/src/public/svgs/flags/NOK.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/public/svgs/flags/NZD.svg b/src/public/svgs/flags/NZD.svg new file mode 100644 index 0000000..935d8a7 --- /dev/null +++ b/src/public/svgs/flags/NZD.svg @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/public/svgs/flags/PHP.svg b/src/public/svgs/flags/PHP.svg new file mode 100644 index 0000000..b910e24 --- /dev/null +++ b/src/public/svgs/flags/PHP.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/src/public/svgs/flags/PLN.svg b/src/public/svgs/flags/PLN.svg new file mode 100644 index 0000000..0fa5145 --- /dev/null +++ b/src/public/svgs/flags/PLN.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/src/public/svgs/flags/RON.svg b/src/public/svgs/flags/RON.svg new file mode 100644 index 0000000..fda0f7b --- /dev/null +++ b/src/public/svgs/flags/RON.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/public/svgs/flags/RUB.svg b/src/public/svgs/flags/RUB.svg new file mode 100644 index 0000000..cf24301 --- /dev/null +++ b/src/public/svgs/flags/RUB.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/public/svgs/flags/SEK.svg b/src/public/svgs/flags/SEK.svg new file mode 100644 index 0000000..8ba745a --- /dev/null +++ b/src/public/svgs/flags/SEK.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/public/svgs/flags/SGD.svg b/src/public/svgs/flags/SGD.svg new file mode 100644 index 0000000..c4dd4ac --- /dev/null +++ b/src/public/svgs/flags/SGD.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/src/public/svgs/flags/THB.svg b/src/public/svgs/flags/THB.svg new file mode 100644 index 0000000..1e93a61 --- /dev/null +++ b/src/public/svgs/flags/THB.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/public/svgs/flags/TRY.svg b/src/public/svgs/flags/TRY.svg new file mode 100644 index 0000000..b96da21 --- /dev/null +++ b/src/public/svgs/flags/TRY.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/src/public/svgs/flags/USD.svg b/src/public/svgs/flags/USD.svg new file mode 100644 index 0000000..9cfd0c9 --- /dev/null +++ b/src/public/svgs/flags/USD.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/src/public/svgs/flags/ZAR.svg b/src/public/svgs/flags/ZAR.svg new file mode 100644 index 0000000..d563adb --- /dev/null +++ b/src/public/svgs/flags/ZAR.svg @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/src/public/svgs/more.svg b/src/public/svgs/more.svg new file mode 100644 index 0000000..d0b697f --- /dev/null +++ b/src/public/svgs/more.svg @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/src/public/svgs/plans.svg b/src/public/svgs/plans.svg new file mode 100644 index 0000000..70fb205 --- /dev/null +++ b/src/public/svgs/plans.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/router/user.js b/src/router/user.js index 5cde315..72fdbfc 100644 --- a/src/router/user.js +++ b/src/router/user.js @@ -1,5 +1,7 @@ +const getRates = require("../util/exchangeRate"); const status = require("../util/statuses"); const ObjectId = require('mongodb').ObjectId; +const session = require("express-session"); const bcrypt = require("bcrypt"); const joi = require("joi"); const salt = 12; @@ -16,7 +18,6 @@ const getAssetSchema = (type) => { switch (type) { case "other": assetSchema = joi.object({ - ownerId: joi.string().alphanum().required(), type: joi.string().valid("other", "stock", "saving").required(), name: joi.string().alphanum().min(3).max(30).required(), value: joi.number().min(0).required(), @@ -27,7 +28,6 @@ const getAssetSchema = (type) => { break; case "saving": assetSchema = joi.object({ - ownerId: joi.string().alphanum().required(), type: joi.string().valid("other", "stock", "saving").required(), name: joi.string().alphanum().min(3).max(30).required(), value: joi.number().min(0).required(), @@ -36,7 +36,6 @@ const getAssetSchema = (type) => { break; case "stock": assetSchema = joi.object({ - ownerId: joi.string().alphanum().required(), type: joi.string().valid("other", "stock", "saving").required(), ticker: joi.string().alphanum().min(3).max(5).required(), price: joi.number().min(0).required(), @@ -64,12 +63,21 @@ module.exports = (middleware, users, plans, assets) => { router.use(middleware); router.get('/home', async (req, res) => { - res.render('dashboard', { user: req.session.user }); + // if no session with geoData + if (!req.session.geoData) { + req.session.geoData = { + country: null, + toCurrencyRates: [], + }; + } + + res.render('dashboard', { user: req.user, geoData: req.session.geoData }); + return res.status(status.Ok); }); router.get('/assets', async (req, res) => { - let userAssets = await assets.find({ "ownerId": req.session.user._id }).toArray(); + let userAssets = await assets.find({ userId: new ObjectId(req.session.user._id) }).toArray(); res.render('assets', { user: req.session.user, errMessage: req.session.errMessage, assets: userAssets }); return res.status(status.Ok); }); @@ -323,6 +331,7 @@ module.exports = (middleware, users, plans, assets) => { } let newAsset = { + userId: new ObjectId(req.session.user._id), ...req.body, updatedAt: new Date(), }; @@ -365,7 +374,7 @@ module.exports = (middleware, users, plans, assets) => { return res.redirect("/assets"); } - if (req.body.ownerId != req.session.user._id) { + if (req.body.userId != req.session.user._id) { req.session.errMessage = "Cannot change asset owner", res.status(status.BadRequest); return res.redirect("/assets"); @@ -411,14 +420,14 @@ module.exports = (middleware, users, plans, assets) => { { "_id": id } ).then((result) => { if (result.deletedCount === 0) { - console.log(`Asset not found: ${req.body.id}`); - req.session.errMessage = "Unable to delete asset"; + console.error(`Asset not found: ${req.body.id}`); + req.session.errMessage = "Unable to delete asset. Please try again."; return res.status(status.NotFound).redirect("/assets"); } if (!result.acknowledged) { - console.error("Error updating asset: ", err); - req.session.errMessage = "An error occurred while saving your information. Please try again."; + console.error("Error deleting asset: ", err); + req.session.errMessage = "An error occurred while deleting an asset. Please try again."; return res.status(status.InternalServerError).redirect("/assets"); } @@ -426,11 +435,65 @@ module.exports = (middleware, users, plans, assets) => { return res.status(status.Ok).redirect("/assets"); }).catch((err) => { - console.error("Error updating asset: ", err); - req.session.errMessage = "An error occurred while saving your information. Please try again."; + console.error("Error deleting asset: ", err); + req.session.errMessage = "An error occurred while deleting an asset. Please try again."; return res.status(status.InternalServerError).redirect("/assets"); }); }); + router.post("/deleteUser", (req, res) => { + // not as critical if results aren't as expected only if crashing + assets.deleteMany({ userId: new ObjectId(req.session.user._id) }).catch((err) => { + console.error("Error deleting user assets: ", err); + req.session.errMessage = "An error occured while deleting your account. Please try again."; + return res.status(status.InternalServerError).redirect("/profile"); + }); + + plans.deleteMany({ userId: new ObjectId(req.session.user._id) }).catch((err) => { + console.error("Error deleting user assets: ", err); + req.session.errMessage = "An error occured while deleting your account. Please try again."; + return res.status(status.InternalServerError).redirect("/profile"); + }); + + users.deleteOne( + { _id: new ObjectId(req.session.user._id) }, + ).then((result) => { + if (result.deletedCount === 0) { + console.error(`User not found: ${req.body.id}`); + req.session.errMessage = "Unabled to delete account. Please try again."; + return res.status(status.NotFound).redirect("/profile"); + } + + if (!result.acknowledged) { + console.error("Error deleting user: ", err); + req.session.errMessage = "An error occured while deleting your account. Please try again."; + return res.status(status.InternalServerError).redirect("/profile"); + } + + // Direct to logout to destroy session + req.session.destroy(); + return res.status(status.Ok).redirect("/signup"); + }).catch((err) => { + console.error("Error deleting user: ", err); + req.session.errMessage = "An error occured while deleting your account. Please try again."; + return res.status(status.InternalServerError).redirect("/profile"); + }); + }); + router.get("/exRates/:lat/:lon", async (req, res) => { + if (!req.session.geoData.country) { + const response = await fetch(`https://maps.googleapis.com/maps/api/geocode/json?latlng=${req.params.lat},${req.params.lon}&result_type=country&key=${process.env.geolocation_api}`); + const data = await response.json(); + + country = data.results[0].formatted_address; + let results = await getRates(country); + req.session.geoData = { + country: results.abbreviation, + toCurrencyRates: results.exRates + } + } + + return res.status(status.Ok).send({ data: req.session.geoData }); + }) + return router; }; diff --git a/src/util/countries.json b/src/util/countries.json new file mode 100644 index 0000000..039a74c --- /dev/null +++ b/src/util/countries.json @@ -0,0 +1,132 @@ +{ + "countries": [ + { + "country": "United States", + "currency_abbreviation": "USD" + }, + { + "country": "Eurozone", + "currency_abbreviation": "EUR" + }, + { + "country": "United Kingdom", + "currency_abbreviation": "GBP" + }, + { + "country": "Japan", + "currency_abbreviation": "JPY" + }, + { + "country": "Switzerland", + "currency_abbreviation": "CHF" + }, + { + "country": "Canada", + "currency_abbreviation": "CAD" + }, + { + "country": "Australia", + "currency_abbreviation": "AUD" + }, + { + "country": "China", + "currency_abbreviation": "CNY" + }, + { + "country": "India", + "currency_abbreviation": "INR" + }, + { + "country": "Russia", + "currency_abbreviation": "RUB" + }, + { + "country": "Brazil", + "currency_abbreviation": "BRL" + }, + { + "country": "Mexico", + "currency_abbreviation": "MXN" + }, + { + "country": "South Korea", + "currency_abbreviation": "KRW" + }, + { + "country": "Indonesia", + "currency_abbreviation": "IDR" + }, + { + "country": "Bulgaria", + "currency_abbreviation": "BGN" + }, + { + "country": "Czech Republic", + "currency_abbreviation": "CZK" + }, + { + "country": "Denmark", + "currency_abbreviation": "DKK" + }, + { + "country": "Hong Kong", + "currency_abbreviation": "HKD" + }, + { + "country": "Hungary", + "currency_abbreviation": "HUF" + }, + { + "country": "Israel", + "currency_abbreviation": "ILS" + }, + { + "country": "Iceland", + "currency_abbreviation": "ISK" + }, + { + "country": "Malaysia", + "currency_abbreviation": "MYR" + }, + { + "country": "Norway", + "currency_abbreviation": "NOK" + }, + { + "country": "New Zealand", + "currency_abbreviation": "NZD" + }, + { + "country": "Philippines", + "currency_abbreviation": "PHP" + }, + { + "country": "Poland", + "currency_abbreviation": "PLN" + }, + { + "country": "Romania", + "currency_abbreviation": "RON" + }, + { + "country": "Sweden", + "currency_abbreviation": "SEK" + }, + { + "country": "Singapore", + "currency_abbreviation": "SGD" + }, + { + "country": "Thailand", + "currency_abbreviation": "THB" + }, + { + "country": "Turkey", + "currency_abbreviation": "TRY" + }, + { + "country": "South Africa", + "currency_abbreviation": "ZAR" + } + ] +} \ No newline at end of file diff --git a/src/util/exchangeRate.js b/src/util/exchangeRate.js new file mode 100644 index 0000000..2f5658d --- /dev/null +++ b/src/util/exchangeRate.js @@ -0,0 +1,18 @@ +const countries = require("./countries.json").countries; + +async function getRates(country) { + let abbr; + countries.forEach(c => { + if (c.country === country) { + abbr = c.currency_abbreviation; + } + }); + + const res = await fetch(`https://api.frankfurter.dev/v1/latest?base=${abbr}`); + const data = await res.json(); + let rates = data.rates; + + return { exRates: rates, abbreviation: abbr }; +} + +module.exports = getRates; \ No newline at end of file diff --git a/src/views/assets.ejs b/src/views/assets.ejs index 630cab2..cec34b0 100644 --- a/src/views/assets.ejs +++ b/src/views/assets.ejs @@ -38,7 +38,6 @@
- @@ -72,7 +71,6 @@ - @@ -100,7 +98,6 @@ - @@ -279,7 +276,7 @@ - + <% if (asset.type != "stock") { %> diff --git a/src/views/dashboard.ejs b/src/views/dashboard.ejs index 106e60d..214d975 100644 --- a/src/views/dashboard.ejs +++ b/src/views/dashboard.ejs @@ -2,20 +2,14 @@ <%- include("./partials/header") %>
-

Welcome: <%= user.name %> -

+ type="button">Add Asset - Create new plan - + type="button">Create new plan
@@ -35,8 +29,7 @@

Make this percent bar or graph or something -  than last - week +  than lastweek

@@ -106,5 +99,15 @@
+ + + + + + <%- include("./partials/navBar") %> <%- include("./partials/footer") %> diff --git a/src/views/partials/fileHeader.ejs b/src/views/partials/fileHeader.ejs index 35b60ed..b15b69c 100644 --- a/src/views/partials/fileHeader.ejs +++ b/src/views/partials/fileHeader.ejs @@ -7,4 +7,4 @@ RCalculator - \ No newline at end of file + \ No newline at end of file diff --git a/src/views/partials/footer.ejs b/src/views/partials/footer.ejs index fabc132..110cbe0 100644 --- a/src/views/partials/footer.ejs +++ b/src/views/partials/footer.ejs @@ -1,11 +1,10 @@ - \ No newline at end of file diff --git a/src/views/partials/header.ejs b/src/views/partials/header.ejs index 4dd5854..f48549f 100644 --- a/src/views/partials/header.ejs +++ b/src/views/partials/header.ejs @@ -1,10 +1,76 @@ +
-