Add sandwiches management to routes
This commit is contained in:
parent
152ac5cc15
commit
0b20b10f5f
13 changed files with 184 additions and 68 deletions
2
app.js
2
app.js
|
@ -14,7 +14,6 @@ let ordersRouter = require("./routes/orders");
|
||||||
let sandwichesRouter = require("./routes/sandwiches");
|
let sandwichesRouter = require("./routes/sandwiches");
|
||||||
let profileRouter = require("./routes/profile");
|
let profileRouter = require("./routes/profile");
|
||||||
let adminRouter = require("./routes/admin");
|
let adminRouter = require("./routes/admin");
|
||||||
let adminOrdersRouter = require("./routes/admin/orders");
|
|
||||||
|
|
||||||
let app = express();
|
let app = express();
|
||||||
let sess = {
|
let sess = {
|
||||||
|
@ -55,7 +54,6 @@ app.use("/orders", ordersRouter);
|
||||||
app.use("/sandwiches", sandwichesRouter);
|
app.use("/sandwiches", sandwichesRouter);
|
||||||
app.use("/profile", profileRouter);
|
app.use("/profile", profileRouter);
|
||||||
app.use("/admin", adminRouter);
|
app.use("/admin", adminRouter);
|
||||||
app.use("/admin/orders", adminOrdersRouter);
|
|
||||||
|
|
||||||
// catch 404 and forward to error handler
|
// catch 404 and forward to error handler
|
||||||
app.use((req, res) => {
|
app.use((req, res) => {
|
||||||
|
|
|
@ -32,8 +32,7 @@
|
||||||
},
|
},
|
||||||
"profile": {
|
"profile": {
|
||||||
"title": "Profile",
|
"title": "Profile",
|
||||||
"infos": "Infos",
|
"infos": "Infos"
|
||||||
"save": "Save"
|
|
||||||
},
|
},
|
||||||
"admin": {
|
"admin": {
|
||||||
"title": "Administration",
|
"title": "Administration",
|
||||||
|
@ -43,7 +42,12 @@
|
||||||
"sandwichManagement": "Sandwich management",
|
"sandwichManagement": "Sandwich management",
|
||||||
"manageSandwiches": "Manage sandwiches",
|
"manageSandwiches": "Manage sandwiches",
|
||||||
"userManagement": "User management",
|
"userManagement": "User management",
|
||||||
"manageUsers": "Manage users"
|
"manageUsers": "Manage users",
|
||||||
|
"add": "Add",
|
||||||
|
"edit": "Edit",
|
||||||
|
"remove": "Remove",
|
||||||
|
"name": "Name,",
|
||||||
|
"price": "Price"
|
||||||
},
|
},
|
||||||
"firstName": "First name",
|
"firstName": "First name",
|
||||||
"lastName": "Last name",
|
"lastName": "Last name",
|
||||||
|
@ -54,5 +58,6 @@
|
||||||
"orders": "Orders",
|
"orders": "Orders",
|
||||||
"sandwiches": "Sandwiches",
|
"sandwiches": "Sandwiches",
|
||||||
"date": "Date",
|
"date": "Date",
|
||||||
"order": "Order"
|
"order": "Order",
|
||||||
|
"save": "Save"
|
||||||
}
|
}
|
||||||
|
|
117
locales/fr.json
117
locales/fr.json
|
@ -1,58 +1,63 @@
|
||||||
{
|
{
|
||||||
"layout": {
|
"layout": {
|
||||||
"home": "Accueil",
|
"home": "Accueil",
|
||||||
"logout": "Se déconnecter",
|
"logout": "Se déconnecter",
|
||||||
"login": "S'identifier",
|
"login": "S'identifier",
|
||||||
"register": "S'inscrire",
|
"register": "S'inscrire",
|
||||||
"about": "À propos",
|
"about": "À propos",
|
||||||
"aboutDescription": "Ce logiciel répond à la crise sanitaire du COVID-19 pour l'approvisionnement alimentaire des bureaux d'étudiants suivants",
|
"aboutDescription": "Ce logiciel répond à la crise sanitaire du COVID-19 pour l'approvisionnement alimentaire des bureaux d'étudiants suivants",
|
||||||
"bio": "BDE Bio",
|
"bio": "BDE Bio",
|
||||||
"chemistry": "BDE Chimie",
|
"chemistry": "BDE Chimie",
|
||||||
"GC": "BDE GC",
|
"GC": "BDE GC",
|
||||||
"GCPD": "BDE GCPD",
|
"GCPD": "BDE GCPD",
|
||||||
"GEA": "BDE GEA",
|
"GEA": "BDE GEA",
|
||||||
"IT": "BDE Info",
|
"IT": "BDE Info",
|
||||||
"made": "Fait avec ❤️ par",
|
"made": "Fait avec ❤️ par",
|
||||||
"contact": "Contact",
|
"contact": "Contact",
|
||||||
"orderIssue": "Problème de commande"
|
"orderIssue": "Problème de commande"
|
||||||
},
|
},
|
||||||
"index": {
|
"index": {
|
||||||
"welcome": "Bienvenue sur Sandwiches Order Doua",
|
"welcome": "Bienvenue sur Sandwiches Order Doua",
|
||||||
"sandwich": "Sandwich",
|
"sandwich": "Sandwich",
|
||||||
"day": "Jour",
|
"day": "Jour",
|
||||||
"pay": "Payer"
|
"pay": "Payer"
|
||||||
},
|
},
|
||||||
"login": {
|
"login": {
|
||||||
"title": "Se connecter",
|
"title": "Se connecter",
|
||||||
"submit": "Connexion"
|
"submit": "Connexion"
|
||||||
},
|
},
|
||||||
"register": {
|
"register": {
|
||||||
"title": "S'inscrire",
|
"title": "S'inscrire",
|
||||||
"submit": "Envoyer"
|
"submit": "Envoyer"
|
||||||
},
|
},
|
||||||
"profile": {
|
"profile": {
|
||||||
"title": "Profil",
|
"title": "Profil",
|
||||||
"infos": "Infos",
|
"infos": "Infos"
|
||||||
"save": "Enregistrer"
|
},
|
||||||
},
|
"admin": {
|
||||||
"admin": {
|
"title": "Administration",
|
||||||
"title": "Administration",
|
"ordersManagement": "Gestion des commandes",
|
||||||
"ordersManagement": "Gestion des commandes",
|
"ordersDate": "Date des commandes",
|
||||||
"ordersDate": "Date des commandes",
|
"manageOrders": "Gérer les commandes",
|
||||||
"manageOrders": "Gérer les commandes",
|
"sandwichManagement": "Gestion des sandwichs",
|
||||||
"sandwichManagement": "Gestion des sandwichs",
|
"manageSandwiches": "Gérer les sandwichs",
|
||||||
"manageSandwiches": "Gérer les sandwichs",
|
"userManagement": "Gestion des utilisateurs",
|
||||||
"userManagement": "Gestion des utilisateurs",
|
"manageUsers": "Gérer les utilisateurs",
|
||||||
"manageUsers": "Gérer les utilisateurs"
|
"add": "Ajouter",
|
||||||
},
|
"edit": "Éditer",
|
||||||
"firstName": "Prénom",
|
"remove": "Supprimer",
|
||||||
"lastName": "Nom de famille",
|
"name": "Nom",
|
||||||
"username": "Nom d'utilisateur",
|
"price": "Prix"
|
||||||
"password": "Mot de passe",
|
},
|
||||||
"email": "Email",
|
"firstName": "Prénom",
|
||||||
"department": "Département",
|
"lastName": "Nom de famille",
|
||||||
"orders": "Commandes",
|
"username": "Nom d'utilisateur",
|
||||||
"sandwiches": "Sandwichs",
|
"password": "Mot de passe",
|
||||||
"date": "Date",
|
"email": "Email",
|
||||||
"order": "Commande"
|
"department": "Département",
|
||||||
|
"orders": "Commandes",
|
||||||
|
"sandwiches": "Sandwichs",
|
||||||
|
"date": "Date",
|
||||||
|
"order": "Commande",
|
||||||
|
"save": "Enregistrer"
|
||||||
}
|
}
|
5
public/javascripts/admin/sandwiches.js
Normal file
5
public/javascripts/admin/sandwiches.js
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
document.querySelectorAll("a.remove")
|
||||||
|
.forEach(e => e.addEventListener("click", ev => {
|
||||||
|
if (!confirm("Do you really want to remove this sandwich ?"))
|
||||||
|
ev.preventDefault();
|
||||||
|
}));
|
|
@ -190,7 +190,7 @@ p.before-link a::before {
|
||||||
overflow-y: auto;
|
overflow-y: auto;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ordersManagement {
|
#ordersManagement, #sandwichesManagement {
|
||||||
max-height: 90%;
|
max-height: 90%;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -198,7 +198,7 @@ p.before-link a::before {
|
||||||
margin: 0.2em 0 0 0;
|
margin: 0.2em 0 0 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ordersManagement>div {
|
#ordersManagement>div, #sandwichesManagement>div {
|
||||||
overflow-y: auto;
|
overflow-y: auto;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -11,6 +11,8 @@ router.get("/", sessionCheck(3), async (req, res) => {
|
||||||
sandwiches: await models.Sandwich.findAll(),
|
sandwiches: await models.Sandwich.findAll(),
|
||||||
users: await models.User.findAll()
|
users: await models.User.findAll()
|
||||||
});
|
});
|
||||||
});
|
})
|
||||||
|
.use("/orders", require("./orders"))
|
||||||
|
.use("/sandwiches", require("./sandwiches"));
|
||||||
|
|
||||||
module.exports = router;
|
module.exports = router;
|
||||||
|
|
40
routes/admin/sandwiches/edit.js
Normal file
40
routes/admin/sandwiches/edit.js
Normal file
|
@ -0,0 +1,40 @@
|
||||||
|
let express = require("express");
|
||||||
|
let router = express.Router();
|
||||||
|
let sessionCheck = require("../../../middlewares/sessionCheck");
|
||||||
|
let models = require("../../../models");
|
||||||
|
|
||||||
|
router.get("/", sessionCheck(3), async (req, res) => {
|
||||||
|
if (!req.query.name)
|
||||||
|
res.render("error", {message: "Can't edit sandwich !", error: {status: "Missing arg"}});
|
||||||
|
else {
|
||||||
|
let sandwich = await models.Sandwich.findByPk(req.query.name);
|
||||||
|
if (!sandwich)
|
||||||
|
res.render("error",
|
||||||
|
{message: "Can't edit sandwich !", error: {status: "Sandwich not found"}});
|
||||||
|
else
|
||||||
|
res.render("admin/sandwiches/edit", {
|
||||||
|
title: "SOD - Sandwiches administration",
|
||||||
|
user: req.session.user,
|
||||||
|
sandwich: sandwich
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}).post("/", sessionCheck(3), async (req, res) => {
|
||||||
|
if (!req.body.name)
|
||||||
|
res.render("error", {message: "Fail to edit sandwich !", error: {status: "Missing arg"}});
|
||||||
|
else {
|
||||||
|
let sandwich = await models.Sandwich.findByPk(req.body.name);
|
||||||
|
if (!sandwich)
|
||||||
|
res.render("error",
|
||||||
|
{message: "Fail to edit sandwich !", error: {status: "Invalid sandwich name"}});
|
||||||
|
else {
|
||||||
|
if (req.body.price && req.body.price !== sandwich.price)
|
||||||
|
sandwich.price = req.body.price;
|
||||||
|
await sandwich.save();
|
||||||
|
if (req.body.newName && req.body.newName !== sandwich.name)
|
||||||
|
await models.Sandwich.update({name: req.body.newName}, {where: {name: req.body.name}});
|
||||||
|
res.redirect("/admin/sandwiches");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
module.exports = router;
|
29
routes/admin/sandwiches/index.js
Normal file
29
routes/admin/sandwiches/index.js
Normal file
|
@ -0,0 +1,29 @@
|
||||||
|
let express = require("express");
|
||||||
|
let router = express.Router();
|
||||||
|
let sessionCheck = require("../../../middlewares/sessionCheck");
|
||||||
|
let models = require("../../../models");
|
||||||
|
|
||||||
|
|
||||||
|
router.get("/", sessionCheck(3), async (req, res) => {
|
||||||
|
res.render("admin/sandwiches/index", {
|
||||||
|
title: "SOD - Sandwiches administration",
|
||||||
|
user: req.session.user,
|
||||||
|
sandwiches: await models.Sandwich.findAll()
|
||||||
|
});
|
||||||
|
})
|
||||||
|
.use("/edit", require("./edit"))
|
||||||
|
.get("/delete", sessionCheck(3), async (req, res) => {
|
||||||
|
if (!req.query.name)
|
||||||
|
res.render("error", {message: "Can't remove sandwich !", error: {status: "Missing arg"}});
|
||||||
|
else {
|
||||||
|
let sandwich = await models.Sandwich.findByPk(req.query.name);
|
||||||
|
if (!sandwich)
|
||||||
|
res.render("error", {message: "Can't remove sandwich !", error: {status: "Invalid sandwich"}});
|
||||||
|
else {
|
||||||
|
await sandwich.destroy();
|
||||||
|
res.redirect("/admin/sandwiches");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
module.exports = router;
|
15
views/admin/sandwiches/edit.pug
Normal file
15
views/admin/sandwiches/edit.pug
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
extends ../../layout
|
||||||
|
|
||||||
|
block content
|
||||||
|
div.card#sandwichesManagement
|
||||||
|
h1=__("admin.edit")+" "+sandwich.name
|
||||||
|
form(action="/admin/sandwiches/edit" method="POST")
|
||||||
|
input.hide(type="text" name="name" value=sandwich.name required)
|
||||||
|
div.field
|
||||||
|
label(for="name")=__("admin.name")+":"
|
||||||
|
input#name(type="text" name="newName" value=sandwich.name required)
|
||||||
|
div.field
|
||||||
|
label(for="price")=__("admin.price") + ":"
|
||||||
|
input#price(type="number" min="0" step="any" name="price" value=sandwich.price required)
|
||||||
|
div.field
|
||||||
|
input(type="submit" value=__("save"))
|
17
views/admin/sandwiches/index.pug
Normal file
17
views/admin/sandwiches/index.pug
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
extends ../../layout
|
||||||
|
|
||||||
|
block content
|
||||||
|
div.card#sandwichesManagement
|
||||||
|
h1=__("admin.sandwichManagement")
|
||||||
|
input.add(type="button" value=__("admin.add"))
|
||||||
|
div
|
||||||
|
each sandwich in sandwiches
|
||||||
|
div.sandwich
|
||||||
|
h2=sandwich.name
|
||||||
|
div.buttons
|
||||||
|
a.edit(href="/admin/sandwiches/edit?name="+sandwich.name)
|
||||||
|
button=__("admin.edit")
|
||||||
|
a.remove(href="/admin/sandwiches/delete?name="+sandwich.name)
|
||||||
|
button=__("admin.remove")
|
||||||
|
|
||||||
|
script(src="/javascripts/admin/sandwiches.js")
|
|
@ -24,7 +24,7 @@ block content
|
||||||
label(for="password")=__("password")+":"
|
label(for="password")=__("password")+":"
|
||||||
input#password(type="password" name="password")
|
input#password(type="password" name="password")
|
||||||
div.field
|
div.field
|
||||||
input(type="submit" value=__("profile.save"))
|
input(type="submit" value=__("save"))
|
||||||
|
|
||||||
datalist#department-list
|
datalist#department-list
|
||||||
each department in departments
|
each department in departments
|
||||||
|
|
|
@ -10,4 +10,4 @@ block content
|
||||||
div.sandwich
|
div.sandwich
|
||||||
h2 #{sandwich.SandwichName}: #{sandwich.dataValues.number}
|
h2 #{sandwich.SandwichName}: #{sandwich.dataValues.number}
|
||||||
|
|
||||||
script(src="/javascripts/sandwiches.js")
|
script(src="/javascripts/index.js")
|
||||||
|
|
Reference in a new issue