diff --git a/app.js b/app.js index 6553a2c..95486c3 100755 --- a/app.js +++ b/app.js @@ -56,6 +56,7 @@ import editProductRouter from "./routes/edit_product.js"; import dashboardRouter from "./routes/admin/admin_dashboard.js"; import newCategoryRouter from "./routes/admin/new_category.js"; import editCategoryRouter from "./routes/admin/edit_category.js"; +import usersRouter from "./routes/admin/admin_users.js"; // Access for kiosk import kioskKeypadRouter from "./routes/kiosk_keypad.js"; import kioskShopRouter from "./routes/kiosk_shop.js"; @@ -165,6 +166,7 @@ app.use("/admin_invoice", invoiceRouter); app.use("/admin_payments", paymentsRouter); app.use("/new_category", newCategoryRouter); app.use("/edit_category", editCategoryRouter); +app.use("/admin_users", usersRouter); // Access for kiosk app.use("/kiosk_keypad", kioskKeypadRouter); app.use("/kiosk_shop", kioskShopRouter); diff --git a/public/javascripts/admin_users.js b/public/javascripts/admin_users.js new file mode 100644 index 0000000..c6463ac --- /dev/null +++ b/public/javascripts/admin_users.js @@ -0,0 +1,39 @@ +// Initialize DataTables +// dom customizes header paging, search and export +// columndefs makes id unsortable, sortabledate hidden, date linked for filtering and displays currency next to price +// sort by date by default +document.addEventListener("DOMContentLoaded", function () { + $("#table-users").DataTable({ + dom: + "<'row'<'col-sm-12 col-md-4'l><'col-sm-12 col-md-4'f><'col-sm-12 col-md-4'B>>" + + "<'row'<'col-sm-12'tr>>" + + "<'row'<'col-sm-12 col-md-5'i><'col-sm-12 col-md-7'p>>", + buttons: [ + { + extend: "print", + exportOptions: { + columns: [1, 2, 3, 4, 5, 6, 7, 8], + }, + }, + "copyHtml5", + "excelHtml5", + "csvHtml5", + { + extend: "pdfHtml5", + exportOptions: { + columns: [1, 2, 3, 4, 5, 6, 7, 8], + }, + }, + ], + language: { + url: "/datatables/cs.json", + searchPlaceholder: "Hledaný výraz", + }, + lengthMenu: [ + [10, 25, 50, -1], + [10, 25, 50, "Vše"], + ], + order: [[0, "asc"]], + stateSave: false, + }); +}); diff --git a/routes/add_products.js b/routes/add_products.js index ec771bc..2c06d6d 100644 --- a/routes/add_products.js +++ b/routes/add_products.js @@ -1,76 +1,76 @@ -import { Router } from 'express' -import { ensureAuthenticated } from '../functions/ensureAuthenticated.js' -import Product from '../models/product.js' -import Delivery from '../models/delivery.js' -import csrf from 'csurf' -import logger from '../functions/logger.js' -import { sendFavoriteProductNotification } from '../functions/sendFavoriteProductNotification.js' -var router = Router() -var csrfProtection = csrf() -router.use(csrfProtection) +import { Router } from "express"; +import { ensureAuthenticated } from "../functions/ensureAuthenticated.js"; +import Product from "../models/product.js"; +import Delivery from "../models/delivery.js"; +import csrf from "csurf"; +import logger from "../functions/logger.js"; +import { sendFavoriteProductNotification } from "../functions/sendFavoriteProductNotification.js"; +var router = Router(); +var csrfProtection = csrf(); +router.use(csrfProtection); /* GET add product page. */ -router.get('/', ensureAuthenticated, function (req, res) { +router.get("/", ensureAuthenticated, function (req, res) { if (!req.user.supplier) { logger.warn( `server.routes.addproducts.get__User tried to access supplier page without permission.`, { metadata: { - result: req.user - } + result: req.user, + }, } - ) - res.redirect('/') - return + ); + res.redirect("/"); + return; } if (req.session.alert) { - var alert = req.session.alert - delete req.session.alert + var alert = req.session.alert; + delete req.session.alert; } Product.find() - .sort([['displayName', 1]]) + .sort([["displayName", 1]]) .then((product) => { logger.debug( `server.routes.addproducts.get__Successfully loaded ${product.length} products.`, { metadata: { - result: product - } + result: product, + }, } - ) + ); - res.render('shop/add_products', { - title: 'Naskladnit | Lednice IT', + res.render("shop/add_products", { + title: "Naskladnit | Lednice IT", products: product, user: req.user, alert: alert, - csrfToken: req.csrfToken() - }) + csrfToken: req.csrfToken(), + }); }) .catch((err) => { logger.error(`server.routes.addproducts.get__Failed to load products.`, { metadata: { - error: err.message - } - }) - res.status(err.status || 500) - res.render('error') - }) -}) + error: err.message, + }, + }); + res.status(err.status || 500); + res.render("error"); + }); +}); /* POST add product form handle. */ -router.post('/', ensureAuthenticated, function (req, res) { +router.post("/", ensureAuthenticated, function (req, res) { if (!req.user.supplier) { logger.warn( `server.routes.addproducts.post__User tried to access supplier page without permission.`, { metadata: { - result: req.user - } + result: req.user, + }, } - ) - res.redirect('/') - return + ); + res.redirect("/"); + return; } Product.findById(req.body.product_id) @@ -79,17 +79,17 @@ router.post('/', ensureAuthenticated, function (req, res) { `server.routes.addproducts.post__Successfully found product ${product.displayName} in the database.`, { metadata: { - result: product - } + result: product, + }, } - ) + ); var newDelivery = new Delivery({ supplierId: req.user.id, productId: product._id, amount_supplied: req.body.product_amount, amount_left: req.body.product_amount, - price: req.body.product_price - }) + price: req.body.product_price, + }); newDelivery .save() @@ -98,17 +98,17 @@ router.post('/', ensureAuthenticated, function (req, res) { `server.routes.addproducts.post__Successfully added product:[${product.displayName}] amount:[${delivery.amount_supplied}] price:${delivery.price}.`, { metadata: { - result: delivery - } + result: delivery, + }, } - ) + ); const alert = { - type: 'success', + type: "success", message: `Produkt ${product.displayName} přidán v počtu ${delivery.amount_supplied} ks za ${delivery.price} Kč.`, - success: 1 - } - req.session.alert = alert - res.redirect('/add_products') + success: 1, + }; + req.session.alert = alert; + res.redirect("/add_products"); sendFavoriteProductNotification( product._id, product.displayName, @@ -116,46 +116,46 @@ router.post('/', ensureAuthenticated, function (req, res) { req.user.displayName, delivery.amount_supplied, delivery.price - ) + ); }) .catch((err) => { logger.error( `server.routes.addproducts.post__Failed to add product:[${product.displayName}] amount:[${req.body.product_amount}] price:${req.body.product_price}.`, { metadata: { - result: err.message - } + result: err.message, + }, } - ) + ); const alert = { - type: 'danger', - component: 'db', + type: "danger", + component: "db", message: err.message, - danger: 1 - } - req.session.alert = alert - res.redirect('/add_products') - }) + danger: 1, + }; + req.session.alert = alert; + res.redirect("/add_products"); + }); }) .catch((err) => { logger.error( `server.routes.addproducts.post__Failed to find product ${req.body.product_id} in the database.`, { metadata: { - error: err.message - } + error: err.message, + }, } - ) + ); const alert = { - type: 'danger', - component: 'db', + type: "danger", + component: "db", message: err.message, - danger: 1 - } - req.session.alert = alert - res.redirect('/add_products') - return - }) -}) + danger: 1, + }; + req.session.alert = alert; + res.redirect("/add_products"); + return; + }); +}); -export default router +export default router; diff --git a/routes/admin/admin_users.js b/routes/admin/admin_users.js new file mode 100644 index 0000000..059d163 --- /dev/null +++ b/routes/admin/admin_users.js @@ -0,0 +1,58 @@ +import { Router } from "express"; +import moment from "moment"; +import User from "../../models/user.js"; +import { ensureAuthenticated } from "../../functions/ensureAuthenticated.js"; +import { checkKiosk } from "../../functions/checkKiosk.js"; +import logger from "../../functions/logger.js"; +var router = Router(); +moment.locale("cs"); + +/* GET users page. */ +router.get("/", ensureAuthenticated, checkKiosk, function (req, res) { + if (!req.user.admin) { + logger.warn( + `server.routes.adminusers.get__User tried to access admin page without permission.`, + { + metadata: { + result: req.user, + }, + } + ); + res.redirect("/"); + return; + } + + if (req.session.alert) { + var alert = req.session.alert; + delete req.session.alert; + } + User.find() + .then((docs) => { + if (docs) { + logger.debug( + `server.routes.adminusers.get__Successfully loaded ${docs.length} users.`, + { + metadata: { + result: docs, + }, + } + ); + } + + res.render("admin/admin_users", { + title: "Uživatelé | Lednice IT", + users: docs, + alert: alert, + user: req.user, + }); + }) + .catch((err) => { + logger.error(`server.routes.adminusers.get__Failed to load users.`, { + metadata: { + error: err.message, + }, + }); + }); +}); + +export default router; diff --git a/routes/orders.js b/routes/orders.js index 894ad93..5f62ac1 100644 --- a/routes/orders.js +++ b/routes/orders.js @@ -33,7 +33,10 @@ router.get("/", ensureAuthenticated, checkKiosk, function (req, res) { // Order.listIndexes().then((indexes) => { // console.log(indexes); // }); - + if (req.session.alert) { + var alert = req.session.alert; + delete req.session.alert; + } Order.aggregate([ { $match: filter, @@ -128,15 +131,6 @@ router.get("/", ensureAuthenticated, checkKiosk, function (req, res) { }, ]) .then((docs) => { - if (req.query.a) { - var alert = { - type: req.query.a, - component: req.query.c, - message: req.query.m, - success: req.query.s, - danger: req.query.d, - }; - } if (docs[0]) { logger.debug( `server.routes.orders.get__Successfully loaded ${docs[0].results.length} orders.`, diff --git a/views/admin/admin_dashboard.hbs b/views/admin/admin_dashboard.hbs index ac631fa..df60e3a 100644 --- a/views/admin/admin_dashboard.hbs +++ b/views/admin/admin_dashboard.hbs @@ -1,97 +1,97 @@ -
-
-
-
+
+
+
+
Administrace
-
-
-
-
+
+
+
+
Všechny objednávky
-
-

Načíst všechny objednávky všech uživatelů. V +

+

Načíst všechny objednávky všech uživatelů. V závislosti na počtu položek může načtení trvat delší dobu.

-
-
-
-
+
+
+
Vše k fakturaci
-
-

Načíst všechny položky k fakturaci všech +

+

Načíst všechny položky k fakturaci všech dodavatelů. V závislosti na počtu položek může načtení trvat delší dobu.

-
-
-
-
+
+
+
Všechny platby
-
-

Načíst všechny platby všech uživatelů v pohledu +

+

Načíst všechny platby všech uživatelů v pohledu plateb. V závislosti na počtu položek může načtení trvat delší dobu.

-
-
-
-
-
+
+
+
+
Správa uživatelů
-
-

Změňte uživatelům oprávnění nebo anonymizujte +

+

Změňte uživatelům oprávnění nebo anonymizujte bývalé uživatele.

-
-
-
-
+
+
+
Nová kategorie
-
-

Vytvořte kategorii, podle které lze filtrovat +

+

Vytvořte kategorii, podle které lze filtrovat produkty.

-
-
-
-
+
+
+
Úprava kategorie
-
-

Upravte nebo zakažte kategorii, podle které lze +

+

Upravte nebo zakažte kategorii, podle které lze filtrovat produkty.

-
diff --git a/views/admin/admin_users.hbs b/views/admin/admin_users.hbs new file mode 100644 index 0000000..096606e --- /dev/null +++ b/views/admin/admin_users.hbs @@ -0,0 +1,94 @@ +
+
+
+ + + + + + + + + + + + + + + + + {{# each users }} + + + + + + + + + + + + + {{/each}} + +
ID v databáziID klávesniceJménoE-mailDodavatelAdminDenní reportID LoginKartaAkce
+ {{ this._id }} + + {{ this.keypadId }} + + {{ this.displayName }} + + {{ this.email }} + + + Ano + {{else}} + > + Ne + {{/if}} + + + Ano + {{else}} + > + Ne + {{/if}} + + {{#if this.sendDailyReport }} + Povolen + {{else}} + Zakázán + {{/if}} + + {{#if this.keypadDisabled }} + Zakázán + {{else}} + Povolen + {{/if}} + + + +
+ + + +
+
+
+
+
+ +{{> datatables }} + + \ No newline at end of file diff --git a/views/partials/header.hbs b/views/partials/header.hbs index dd59842..5def570 100755 --- a/views/partials/header.hbs +++ b/views/partials/header.hbs @@ -51,6 +51,7 @@
  • Všechny objednávky
  • Všechny platby
  • Vše k fakturaci
  • +
  • Uživatelé
  • Nová kategorie
  • Upravit kategorii