diff --git a/bin/www b/bin/www index 0f172b9..7415a6c 100755 --- a/bin/www +++ b/bin/www @@ -27,7 +27,7 @@ let server = http.createServer(app); */ const io = require("socket.io")(server); -io.on("connection", require("../socket")); +io.on("connection", require("../sockets")); /** * Listen on provided port, on all network interfaces. diff --git a/models/command.js b/models/command.js index ea25b53..a1c2467 100644 --- a/models/command.js +++ b/models/command.js @@ -3,7 +3,8 @@ module.exports = (sequelize, DataTypes) => { const Command = sequelize.define('Command', { number: { type: DataTypes.INTEGER, - allowNull: false + allowNull: false, + unique: "uniqueNumberPerDay" }, price: { type: DataTypes.FLOAT, @@ -12,7 +13,8 @@ module.exports = (sequelize, DataTypes) => { date: { type: DataTypes.DATEONLY, defaultValue: DataTypes.NOW, - allowNull: false + allowNull: false, + unique: "uniqueNumberPerDay" }, take: { type: DataTypes.DATE, @@ -41,13 +43,13 @@ module.exports = (sequelize, DataTypes) => { Command.associate = function(models) { // associations can be defined here Command.belongsTo(models.User, { - as: "command" + as: "client" }); Command.belongsTo(models.User, { - as: "pcCommand" + as: "pc" }); Command.belongsTo(models.User, { - as: "sandwichCommand" + as: "sandwich" }); Command.belongsTo(models.Dish); Command.belongsToMany(models.Ingredient, { diff --git a/models/dish.js b/models/dish.js index 2e5ecb3..0270fbf 100644 --- a/models/dish.js +++ b/models/dish.js @@ -22,7 +22,7 @@ module.exports = (sequelize, DataTypes) => { allowNull: false } }, { - tableName: "dishes" + tableName: "Dishes" }); Dish.associate = function(models) { Dish.hasMany(models.Command); diff --git a/models/user.js b/models/user.js index 4e39b0d..de2f0ca 100644 --- a/models/user.js +++ b/models/user.js @@ -3,33 +3,27 @@ module.exports = (sequelize, DataTypes) => { const User = sequelize.define('User', { username: { type: DataTypes.STRING, - allowNull: false + allowNull: false, + unique: true }, passwordHash: { type: DataTypes.STRING }, firstName: { type: DataTypes.STRING, - allowNull: false + allowNull: false, + unique: "userFullName" }, lastName: { type: DataTypes.STRING, - allowNull: false + allowNull: false, + unique: "userFullName" } }, { tableName: "Users" }); User.associate = function(models) { // associations can be defined here - User.hasMany(models.Command, { - as: "client" - }); - User.hasMany(models.Command, { - as: "pc" - }); - User.hasMany(models.Command, { - as: "sandwich" - }) }; return User; }; diff --git a/public/javascripts/commands.js b/public/javascripts/commands.js index 56bbffd..3cd66d2 100644 --- a/public/javascripts/commands.js +++ b/public/javascripts/commands.js @@ -1,145 +1,153 @@ -let socket = io(); -let plate = document.querySelector("#plat ul"); -let ingredient = document.querySelector("#ingredient ul"); -let sauce = document.querySelector("#sauce ul"); -let drink = document.querySelector("#boisson ul"); -let dessert = document.querySelector("#dessert ul"); -let list = document.querySelector(".liste"); -let current = {"plate": null, "ingredient": [], "sauce": [], "drink": null, "dessert": null, "price": {}}; -let radios = {"plate": null, "drink": null, "dessert": null}; -let db = {"plate": {}, "ingredient": {}, "sauce": {}, "drink": {}, "dessert": {}}; +const socket = io(); +const dish = document.querySelector("#dish ul"); +const ingredient = document.querySelector("#ingredient ul"); +const sauce = document.querySelector("#sauce ul"); +const drink = document.querySelector("#drink ul"); +const dessert = document.querySelector("#dessert ul"); +const list = document.querySelector(".list"); + +let current = {dish: null, ingredient: [], sauce: [], drink: null, dessert: null, price: {}}; +let radios = {dish: null, drink: null, dessert: null}; +let db = {dish: {}, ingredient: {}, sauce: {}, drink: {}, dessert: {}}; -function addcmd(id, plate, ingredient, sauce, drink, dessert, state, client, sandwich) { - for (let i of ["plate", "ingredient", "sauce", "drink", "dessert", "state", "sandwich"]) - if (!eval(i)) - eval(`${i} = ""`); - list.insertAdjacentHTML("beforeend", `

${id}

${sandwich}

${client}

${plate}

${ingredient}

${sauce}

${drink}

${dessert}

`); - let e = document.querySelector(`.liste #cmd${id}`); +function addCmd(command) { + list.insertAdjacentHTML("beforeend", `
+ +

${command.number}

+
+

${command.sandwich}

+

${command.client}

+

${command.dish}

+

${command.ingredients}

+

${command.sauces}

+

${command.drink}

+

${command.dessert}

+ + +
+
`); + let e = document.querySelector(`.list #cmd${command.number}`); e.addEventListener( "click" ,ev => { ev.stopPropagation(); e.classList.toggle("show-spec"); }); - e.querySelector(".donner").addEventListener("click", ev => { + e.querySelector(".give").addEventListener("click", ev => { ev.stopPropagation(); - socket.emit("give command", {"id": id}); + socket.emit("give command", {"id": command.number}); }); - e.querySelector(".annuler").addEventListener("click", ev => { + e.querySelector(".cancel").addEventListener("click", ev => { ev.stopPropagation(); - socket.emit("clear command", {"id": id}); + socket.emit("clear command", {"id": command.number}); }); - e.querySelector(".erreur").addEventListener("click", ev => { + e.querySelector(".error").addEventListener("click", ev => { ev.stopPropagation(); - socket.emit("error command", {"id": id}); + socket.emit("error command", {"id": command.number}); }); - switch (state) { - case "WIP": - WIP(e, sandwich); - break; - case "done": - done(e); - break; - case "gave": - give(e); - break; - case "error": - error(e); - break; - } - document.querySelector("#resume>h1").innerHTML = `Commande ${id+1}`; + if (command.error) + error(e) + else if (command.give) + give(e) + else if (command.done) + done(e) + else if (command.WIP) + WIP(e, command.sandwich) + document.querySelector("#resume>h1").innerHTML = `Command ${command.number+1}`; } -function addplate(id, name) { - plate.insertAdjacentHTML("beforeend", `
  • `); - let e = document.querySelector(`input[id=${id} ]`); +function addDish(d) { + dish.insertAdjacentHTML("beforeend", `
  • `); + let e = document.querySelector(`input[id=dish${d.id}]`); e.addEventListener("click", () => { - radiocheck(e, "plate",0); + radioCheck(e); document.querySelectorAll("input[name=ingredient],input[name=sauce]").forEach( el => { if (el.checked) el.click(); }); document.querySelectorAll("input[name=ingredient],input[name=sauce]").forEach( el => { - el.disabled = !(e.checked && !db["plate"][e.id]["avoid " + el.name]); + el.disabled = !(e.checked && !db.dish[e.id.replace(e.name, "")]["avoid" + el.name.charAt(0).toUpperCase() + el.name.slice(1)]); }); }) } -function addingredient(id, name) { - ingredient.insertAdjacentHTML("beforeend", `
  • `); - let e = document.querySelector(`input[id=${id} ]`); +function addIngredient(i) { + ingredient.insertAdjacentHTML("beforeend", `
  • `); + let e = document.querySelector(`input[id=ingredient${i.id}]`); e.addEventListener("click", () => { - checkcheck(e, "ingredient", 1, 3) + checkCheck(e, 3) }) } -function addsauce(id, name) { - sauce.insertAdjacentHTML("beforeend", `
  • `); - let e = document.querySelector(`input[id=${id} ]`); +function addSauce(s) { + sauce.insertAdjacentHTML("beforeend", `
  • `); + let e = document.querySelector(`input[id=sauce${s.id}]`); e.addEventListener("click", () => { - checkcheck(e, "sauce", 2, 2) + checkCheck(e,2) }) } -function adddrink(id, name) { - drink.insertAdjacentHTML("beforeend", `
  • `); - let e = document.querySelector(`input[id=${id} ]`); +function addDrink(d) { + drink.insertAdjacentHTML("beforeend", `
  • `); + let e = document.querySelector(`input[id=drink${d.id}]`); e.addEventListener("click", () => { - radiocheck(e, "drink", 3) + radioCheck(e) }) } -function adddessert(id, name) { - dessert.insertAdjacentHTML("beforeend", `
  • `); - let e = document.querySelector(`input[id=${id} ]`); +function addDessert(d) { + dessert.insertAdjacentHTML("beforeend", `
  • `); + let e = document.querySelector(`input[id=dessert${d.id}]`); e.addEventListener("click", () => { - radiocheck(e, "dessert", 4) + radioCheck(e) }) } -function radiocheck (e, n, p) { +function radioCheck (e) { if (e.checked) { let curr, name; - if (e.id === radios[n]) { + if (e.id.replace(e.name, "") === radios[e.name]) { e.checked = false; - radios[n] = null; + radios[e.name] = null; curr = null; name = null; } else { - radios[n] = e.id; - curr = e.id; + radios[e.name] = e.id.replace(e.name, ""); + curr = e.id.replace(e.name, ""); name = document.querySelector(`label[for=${e.id}]`).innerHTML; } - current[n] = curr; + current[e.name] = curr; if (curr) - current["price"][n] = db[n][curr]["price"]; + current.price[e.name] = db[e.name][curr.replace(e.name, "")].price; else - current["price"][n] = 0; + current.price[e.name] = 0; price(); - document.querySelectorAll("#resume p")[p].innerHTML = name; + document.getElementById("p-"+e.name).innerHTML = name; } } -function checkcheck(e, n, p, l) { +function checkCheck(e, l) { if (e.checked) - current[n].push(e.id); + current[e.name].push(e.id.replace(e.name, "")); else - current[n].splice(current[n].indexOf(e.id), 1); - document.querySelectorAll(`input[name=${n}]`).forEach( e => { + current[e.name].splice(current[e.name].indexOf(e.id.replace(e.name, "")), 1); + document.querySelectorAll(`input[name=${e.name}]`).forEach( e => { if (!e.checked) - e.disabled = current[n].length === l + e.disabled = current[e.name].length === l }); - current["price"][n] = 0; - for (let i of current[n]) { - current["price"][n] += db[n][i]["price"] + current.price[e.name] = 0; + for (let i of current[e.name]) { + current.price[e.name] += db[e.name][i].price } price(); - document.querySelectorAll("#resume p")[p].innerHTML = current[n].join(" - "); + let names = []; + current[e.name].forEach(el=>names.push(document.querySelector(`label[for=${e.name}${el}]`).innerHTML)); + document.getElementById("p-"+e.name).innerHTML = names.join(" - "); } function clear(e) { - e.classList.remove("finis"); - e.classList.remove("donnee"); - e.classList.remove("probleme"); + e.classList.remove("done"); + e.classList.remove("give"); + e.classList.remove("warning"); e.classList.remove("WIP"); e.classList.remove("show-spec"); list.prepend(e); @@ -164,29 +172,27 @@ function give(e) { function error(e) { e.classList.remove("show-spec"); - e.classList.add("probleme"); + e.classList.add("warning"); list.appendChild(e); } function price() { let p = 0; - for (let i in current["price"]) { - p += current["price"][i] + for (let i in current.price) { + p += current.price[i] } p = p.toFixed(2); document.querySelector("#resume h2").innerHTML = p+"€"; return p; } -socket.on("connect", data => { - if (data === "ok") { - socket.emit("list plate"); - socket.emit("list ingredient"); - socket.emit("list sauce"); - socket.emit("list drink"); - socket.emit("list dessert"); - socket.emit("list command"); - } +socket.on("connected", () => { + socket.emit("list dish"); + socket.emit("list ingredient"); + socket.emit("list sauce"); + socket.emit("list drink"); + socket.emit("list dessert"); + socket.emit("list command"); }); socket.on("list command", data => { @@ -195,20 +201,20 @@ socket.on("list command", data => { list.removeChild(child); child = list.lastElementChild; } - for (let c of data.list) { - addcmd(c.id, c.plate, c.ingredient, c.sauce, c.drink, c.dessert, c.state, c.client, c.sandwich); + for (let c of data) { + addCmd(c); } }); -socket.on("list plate", data => { - let child = plate.lastElementChild; +socket.on("list dish", data => { + let child = dish.lastElementChild; while (child) { - plate.removeChild(child); - child = plate.lastElementChild; + dish.removeChild(child); + child = dish.lastElementChild; } - for (let p of data.list) { - addplate(p.id, p.name); - db["plate"][p.id] = {"name": p.name, "price": p.price, "avoid ingredient": p.avoid_ingredient, "avoid sauce": p.avoid_sauce} + for (let d of data) { + addDish(d); + db.dish[d.id] = d; } }); @@ -218,9 +224,9 @@ socket.on("list ingredient", data => { ingredient.removeChild(child); child = ingredient.lastElementChild; } - for (let i of data.list) { - addingredient(i.id, i.name); - db["ingredient"][i.id] = {"name": i.name, "price": i.price} + for (let i of data) { + addIngredient(i); + db.ingredient[i.id] = i; } }); @@ -230,9 +236,9 @@ socket.on("list sauce", data => { sauce.removeChild(child); child = sauce.lastElementChild; } - for (let s of data.list) { - addsauce(s.id, s.name); - db["sauce"][s.id] = {"name": s.name, "price": s.price} + for (let s of data) { + addSauce(s); + db.sauce[s.id] = s; } }); @@ -242,9 +248,9 @@ socket.on("list drink", data => { drink.removeChild(child); child = drink.lastElementChild; } - for (let d of data.list) { - adddrink(d.id, d.name); - db["drink"][d.id] = {"name": d.name, "price": d.price} + for (let d of data) { + addDrink(d); + db.drink[d.id] = d; } }); @@ -254,53 +260,57 @@ socket.on("list dessert", data => { dessert.removeChild(child); child = dessert.lastElementChild; } - for (let d of data.list) { - adddessert(d.id, d.name); - db["dessert"][d.id] = {"name": d.name, "price": d.price} + for (let d of data) { + addDessert(d); + db.dessert[d.id] = d; } }); socket.on("new command", data => { - addcmd(data.id, data.plate, data.ingredient, data.sauce, data.drink, data.dessert, data.state, data.client, data.sandwich); + addCmd(data); }); socket.on("cleared command", data => { - clear(document.querySelector(`.liste #cmd${data.id}`)) + clear(document.querySelector(`.list #cmd${data}`)) }); socket.on("WIPed command", data => { - WIP(document.querySelector(`.liste #cmd${data.id}`), data.sandwich) + WIP(document.querySelector(`.list #cmd${data.id}`), data.sandwich) }); socket.on("finish command", data => { - done(document.querySelector(`.liste #cmd${data.id}`)) + done(document.querySelector(`.list #cmd${data}`)) }); socket.on("gave command", data => { - give(document.querySelector(`.liste #cmd${data.id}`)) + give(document.querySelector(`.list #cmd${data}`)) }); socket.on("glitched command", data => { - error(document.querySelector(`.liste #cmd${data.id}`)) + error(document.querySelector(`.list #cmd${data}`)) }); +socket.on("error", () => { + alert("An error occurred :") +}) + document.querySelector(".validation").addEventListener("click", ev => { ev.stopPropagation(); let user = document.getElementById("user"); - if (!current.plate && !current.ingredient.length && !current.sauce.length && !current.drink && !current.dessert) { + if (!current.dish && !current.ingredient.length && !current.sauce.length && !current.drink && !current.dessert) { alert("Empty command !"); return; } else if (user.style.color === "red") { - current["firstname"] = prompt("Prénom"); - current["lastname"] = prompt("Nom"); + current.firstname = prompt("Prénom"); + current.lastname = prompt("Nom"); } - current["client"] = user.value; - current["pc"] = pc_id; - current["price"] = price(); + current.client = user.value; + current.pc = 0; + current.price = price(); socket.emit("add command", current); - current = {"plate": null, "ingredient": [], "sauce": [], "drink": null, "dessert": null, "price": {}}; - document.querySelectorAll("input[name=plate],input[name=drink],input[name=dessert]").forEach( e => { + current = {dish: null, ingredient: [], sauce: [], drink: null, dessert: null, price: {}}; + document.querySelectorAll("input[name=dish],input[name=drink],input[name=dessert]").forEach( e => { e.checked = false; }); document.querySelectorAll("input[name=ingredient],input[name=sauce]").forEach( e => { @@ -329,12 +339,12 @@ function hinter(ev) { socket.on("list users", data => { let user_list = document.getElementById("user_list"); user_list.innerHTML = ""; - for (let u of data["list"]) { + for (let u of data) { user_list.insertAdjacentHTML("beforeend", `