Просмотр исходного кода

Create ability to add ingredients

Lee Morgan 6 лет назад
Родитель
Сommit
becf25fd8e

+ 4 - 6
controllers/merchantData.js

@@ -230,9 +230,7 @@ module.exports = {
 
     //POST - Adds an ingredient to merchant's inventory
     //Inputs:
-    //  req.body: array of objects containing ingredient id and quantity
-    //Returns:
-    //  entire inventory of merchant
+    //  req.body: array of objects (each object is a full ingredient)
     addMerchantIngredient: function(req, res){
         if(!req.session.user){
             req.session.error = "Must be logged in to do that";
@@ -243,13 +241,13 @@ module.exports = {
             .then((merchant)=>{
                 for(let ingredient of req.body){
                     for(let item of merchant.inventory){
-                        if(item.ingredient.toString() === ingredient.id){
+                        if(item.ingredient.toString() === ingredient.ingredient._id){
                             return res.json("Error: Duplicate ingredient detected");
                         }
                     }
                     
                     merchant.inventory.push({
-                        ingredient: ingredient.id,
+                        ingredient: ingredient.ingredient._id,
                         quantity: ingredient.quantity
                     });
                 }
@@ -260,7 +258,7 @@ module.exports = {
                             if(err){
                                 return res.json("Warning: refresh page to view updates");
                             }else{
-                                return res.json(newMerchant.inventory);
+                                return res.json({});
                             }
                         });
                     })

+ 2 - 2
routes.js

@@ -17,7 +17,7 @@ module.exports = function(app){
     app.post("/merchant/create/clover", merchantData.createMerchantClover);
     // app.get("/merchant/recipes/update", merchantData.updateRecipes);
     // app.post("/merchant/recipes/remove", merchantData.removeRecipe);
-    // app.post("/merchant/ingredients/add/:id", merchantData.addMerchantIngredient);
+    app.put("/merchant/ingredients/add", merchantData.addMerchantIngredient);
     // app.post("/merchant/ingredients/remove", merchantData.removeMerchantIngredient);
     app.put("/merchant/ingredients/update", merchantData.updateMerchantIngredient);
     // app.post("/merchant/recipes/ingredients/create", merchantData.addRecipeIngredient);
@@ -27,7 +27,7 @@ module.exports = function(app){
     // app.post("/merchant/password", merchantData.updatePassword);
 
     //Ingredients
-    // app.get("/ingredients", ingredientData.getIngredients);
+    app.get("/ingredients", ingredientData.getIngredients);
     // app.post("/ingredients/create", ingredientData.createIngredient);  //also adds to merchant
 
     //Recipes

+ 2 - 0
views/dashboardPage/components/addIngredients.ejs

@@ -10,6 +10,8 @@
 
     <div id="addIngredientList"></div>
 
+    <button class="button" onclick="ingredientsStrandObj.submitAddIngredients()">Add</button>
+
     <template id="addIngredientsCategory">
         <div class="addIngredientsCategory">
             <div class="categoryHeader">

+ 45 - 12
views/dashboardPage/controller.js

@@ -241,18 +241,52 @@ Return:
             unit: Measurement unit
         name: Category name
 */
-let categorizeIngredients = ()=>{
+let categorizeIngredients = (ingredients)=>{
     let ingredientsByCategory = [];
 
-    for(let i = 0; i < merchant.inventory.length; i++){
+    for(let i = 0; i < ingredients.length; i++){
+        let categoryExists = false;
+        for(let j = 0; j < ingredientsByCategory.length; j++){
+            if(ingredients[i].ingredient.category === ingredientsByCategory[j].name){
+                ingredientsByCategory[j].ingredients.push({
+                    id: ingredients[i].ingredient._id,
+                    name: ingredients[i].ingredient.name,
+                    quantity: ingredients[i].quantity,
+                    unit: ingredients[i].ingredient.unit
+                });
+
+                categoryExists = true;
+                break;
+            }
+        }
+
+        if(!categoryExists){
+            ingredientsByCategory.push({
+                name: ingredients[i].ingredient.category,
+                ingredients: [{
+                    id: ingredients[i].ingredient._id,
+                    name: ingredients[i].ingredient.name,
+                    quantity: ingredients[i].quantity,
+                    unit: ingredients[i].ingredient.unit
+                }]
+            });
+        }
+    }
+
+    return ingredientsByCategory;
+}
+
+let categorizeIngredientsFromDB = (ingredients)=>{
+    let ingredientsByCategory = [];
+
+    for(let i = 0; i < ingredients.length; i++){
         let categoryExists = false;
         for(let j = 0; j < ingredientsByCategory.length; j++){
-            if(merchant.inventory[i].ingredient.category === ingredientsByCategory[j].name){
+            if(ingredients[i].category === ingredientsByCategory[j].name){
                 ingredientsByCategory[j].ingredients.push({
-                    id: merchant.inventory[i].ingredient._id,
-                    name: merchant.inventory[i].ingredient.name,
-                    quantity: merchant.inventory[i].quantity,
-                    unit: merchant.inventory[i].ingredient.unit
+                    id: ingredients[i]._id,
+                    name: ingredients[i].name,
+                    unit: ingredients[i].unit
                 });
 
                 categoryExists = true;
@@ -262,12 +296,11 @@ let categorizeIngredients = ()=>{
 
         if(!categoryExists){
             ingredientsByCategory.push({
-                name: merchant.inventory[i].ingredient.category,
+                name: ingredients[i].category,
                 ingredients: [{
-                    id: merchant.inventory[i].ingredient._id,
-                    name: merchant.inventory[i].ingredient.name,
-                    quantity: merchant.inventory[i].quantity,
-                    unit: merchant.inventory[i].ingredient.unit
+                    id: ingredients[i]._id,
+                    name: ingredients[i].name,
+                    unit: ingredients[i].unit
                 }]
             });
         }

+ 2 - 2
views/dashboardPage/home.js

@@ -230,10 +230,10 @@ window.homeStrandObj = {
                 body: JSON.stringify(changes)
             })
                 .then((response)=>{
-                    banner.createError("Ingredients updated");
                     if(typeof(response.data) === "string"){
-                        console.log(err);
+                        banner.createError(response.data);
                     }else{
+                        banner.createNotification("Ingredients updated");
                         updateInventory(changes);
                     }
                 })

+ 81 - 21
views/dashboardPage/ingredients.js

@@ -1,5 +1,6 @@
 window.ingredientsStrandObj = {
     isPopulated: false,
+    addIngredientsDiv: [],
 
     display: function(){
         if(!this.isPopulated){
@@ -10,7 +11,7 @@ window.ingredientsStrandObj = {
     },
 
     populateIngredients: function(){
-        let categories = categorizeIngredients();
+        let categories = categorizeIngredients(merchant.inventory);
 
         let ingredientStrand = document.querySelector("#categoryList");
         while(ingredientStrand.children.length > 0){
@@ -76,25 +77,42 @@ window.ingredientsStrandObj = {
         let categoryTemplate = document.getElementById("addIngredientsCategory");
         let ingredientTemplate = document.getElementById("addIngredientsIngredient");
 
-        let categories = categorizeIngredients();
-        console.log(categories);
-
-        for(let i = 0; i < categories.length; i++){
-            let categoryDiv = categoryTemplate.content.children[0].cloneNode(true);
-            categoryDiv.children[0].children[0].innerText = categories[i].name;
-            categoryDiv.children[0].children[1].onclick = ()=>{this.toggleAddIngredient(categoryDiv)};
-            categoryDiv.children[1].style.display = "none";
-            categoryDiv.children[0].children[1].children[1].style.display = "none";
-
-            addIngredientsDiv.appendChild(categoryDiv);
-            
-            for(let j = 0; j < categories[i].ingredients.length; j++){
-                let ingredientDiv = ingredientTemplate.content.children[0].cloneNode(true);
-                ingredientDiv.children[1].innerText = categories[i].ingredients[j].name;
-
-                categoryDiv.children[1].appendChild(ingredientDiv);
-            }
-        }
+        fetch("/ingredients")
+            .then((response) => response.json())
+            .then((response)=>{
+                if(typeof(response) === "string"){
+                    banner.createError(response);
+                }else{
+                    let categories = categorizeIngredientsFromDB(response);
+
+                    this.addIngredientsDiv = [];
+                    for(let i = 0; i < categories.length; i++){
+                        let categoryDiv = categoryTemplate.content.children[0].cloneNode(true);
+                        categoryDiv.children[0].children[0].innerText = categories[i].name;
+                        categoryDiv.children[0].children[1].onclick = ()=>{this.toggleAddIngredient(categoryDiv)};
+                        categoryDiv.children[1].style.display = "none";
+                        categoryDiv.children[0].children[1].children[1].style.display = "none";
+
+                        addIngredientsDiv.appendChild(categoryDiv);
+                        
+                        for(let j = 0; j < categories[i].ingredients.length; j++){
+                            let ingredientDiv = ingredientTemplate.content.children[0].cloneNode(true);
+                            ingredientDiv.children[1].innerText = categories[i].ingredients[j].name;
+                            ingredientDiv._id = categories[i].ingredients[j].id;
+                            ingredientDiv._name = categories[i].ingredients[j].name;
+                            ingredientDiv._unit = categories[i].ingredients[j].unit;
+                            ingredientDiv._category = categories[i].name;
+
+                            categoryDiv.children[1].appendChild(ingredientDiv);
+
+                            this.addIngredientsDiv.push(ingredientDiv);
+                        }
+                    }
+                }
+            })
+            .catch((err)=>{
+                banner.createError("Unable to retrieve data");
+            });
 
         openSidebar(sidebar);
     },
@@ -140,5 +158,47 @@ window.ingredientsStrandObj = {
         document.querySelector("#dailyUse").innerText = `${(sum/quantities.length).toFixed(2)} ${ingredient.unit}`;
     },
 
-    
+    submitAddIngredients: function(){
+        let addIngredients = [];
+
+        for(let i = 0; i < this.addIngredientsDiv.length; i++){
+            let ingredient = this.addIngredientsDiv[i];
+
+            if(ingredient.children[0].checked){
+                if(!validator.ingredient.quantity(ingredient.children[2].value)){
+                    return;
+                }
+
+                addIngredients.push({
+                    ingredient: {
+                        _id: ingredient._id,
+                        name: ingredient._name,
+                        category: ingredient._category,
+                        unit: ingredient._unit
+                    },
+                    quantity: ingredient.children[2].value,
+                });
+            }
+        }
+
+        fetch("/merchant/ingredients/add", {
+            method: "PUT",
+            headers: {
+                "Content-Type": "application/json;charset=utf-8"
+            },
+            body: JSON.stringify(addIngredients)
+        })
+            .then((response)=>{
+                if(typeof(response.data) === "string"){
+                    banner.createError(response.data);
+                }else{
+                    banner.createNotification("Ingredients added");
+                    updateInventory(addIngredients);
+                }
+            })
+            .catch((err)=>{
+                console.log(err);
+                banner.createError("Unable to update data.  Please refresh the page");
+            });
+    }
 }

+ 1 - 1
views/dashboardPage/recipeBook.js

@@ -59,7 +59,7 @@ window.recipeBookStrandObj = {
         openSidebar(document.querySelector("#addRecipe"));
 
         let ingredientsSelect = document.querySelector("#recipeInputIngredients select");
-        let categories = categorizeIngredients();
+        let categories = categorizeIngredients(merchant.inventory);
         for(let category of categories){
             let optgroup = document.createElement("optgroup");
             optgroup.label = category.name;