ingredients.js 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204
  1. window.ingredientsStrandObj = {
  2. isPopulated: false,
  3. addIngredientsDiv: [],
  4. display: function(){
  5. if(!this.isPopulated){
  6. this.populateIngredients();
  7. this.isPopulated = true;
  8. }
  9. },
  10. populateIngredients: function(){
  11. let categories = categorizeIngredients(merchant.inventory);
  12. let ingredientStrand = document.querySelector("#categoryList");
  13. while(ingredientStrand.children.length > 0){
  14. ingredientStrand.removeChild(ingredientStrand.firstChild);
  15. }
  16. for(let category of categories){
  17. let categoryDiv = document.createElement("div");
  18. categoryDiv.classList = "categoryDiv"
  19. ingredientStrand.appendChild(categoryDiv);
  20. let headerDiv = document.createElement("div");
  21. categoryDiv.appendChild(headerDiv);
  22. let headerTitle = document.createElement("p");
  23. headerTitle.innerText = category.name;
  24. headerDiv.appendChild(headerTitle);
  25. let ingredientsDiv = document.createElement("div");
  26. ingredientsDiv.classList = "ingredientsDiv";
  27. ingredientsDiv.style.display = "none";
  28. categoryDiv.appendChild(ingredientsDiv);
  29. let headerButton = document.createElement("button");
  30. headerButton.innerHTML = '<svg width="32" height="32" viewBox="0 0 24 24" fill="none" stroke="black" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><polyline points="6 9 12 15 18 9"></polyline></svg>';
  31. headerButton.onclick = ()=>{this.toggleCategory(ingredientsDiv, headerButton)};
  32. headerDiv.appendChild(headerButton);
  33. for(let ingredient of category.ingredients){
  34. let ingredientDiv = document.createElement("div");
  35. ingredientDiv.classList = "ingredient";
  36. ingredientDiv.onclick = ()=>{this.displayIngredient(ingredient, category)};
  37. ingredientsDiv.appendChild(ingredientDiv);
  38. let ingredientName = document.createElement("p");
  39. ingredientName.innerText = ingredient.name;
  40. ingredientDiv.appendChild(ingredientName);
  41. let spacer = document.createElement("hr");
  42. spacer.classList = "ingredientSpacer";
  43. ingredientDiv.appendChild(spacer);
  44. let ingredientData = document.createElement("p");
  45. ingredientData.innerText = `${ingredient.quantity} ${ingredient.unit}`;
  46. ingredientDiv.appendChild(ingredientData);
  47. }
  48. }
  49. },
  50. //Open or close the list of ingredients for a category
  51. toggleCategory: function(div, button){
  52. if(div.style.display === "none"){
  53. button.innerHTML = '<svg width="32" height="32" viewBox="0 0 24 24" fill="none" stroke="black" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><polyline points="18 15 12 9 6 15"></polyline></svg>';
  54. div.style.display = "flex";
  55. }else if(div.style.display === "flex"){
  56. button.innerHTML = '<svg width="32" height="32" viewBox="0 0 24 24" fill="none" stroke="black" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><polyline points="6 9 12 15 18 9"></polyline></svg>';
  57. div.style.display = "none";
  58. }
  59. },
  60. displayAddIngredients: function(){
  61. let sidebar = document.querySelector("#addIngredients");
  62. let addIngredientsDiv = document.getElementById("addIngredientList");
  63. let categoryTemplate = document.getElementById("addIngredientsCategory");
  64. let ingredientTemplate = document.getElementById("addIngredientsIngredient");
  65. fetch("/ingredients")
  66. .then((response) => response.json())
  67. .then((response)=>{
  68. if(typeof(response) === "string"){
  69. banner.createError(response);
  70. }else{
  71. let categories = categorizeIngredientsFromDB(response);
  72. this.addIngredientsDiv = [];
  73. for(let i = 0; i < categories.length; i++){
  74. let categoryDiv = categoryTemplate.content.children[0].cloneNode(true);
  75. categoryDiv.children[0].children[0].innerText = categories[i].name;
  76. categoryDiv.children[0].children[1].onclick = ()=>{this.toggleAddIngredient(categoryDiv)};
  77. categoryDiv.children[1].style.display = "none";
  78. categoryDiv.children[0].children[1].children[1].style.display = "none";
  79. addIngredientsDiv.appendChild(categoryDiv);
  80. for(let j = 0; j < categories[i].ingredients.length; j++){
  81. let ingredientDiv = ingredientTemplate.content.children[0].cloneNode(true);
  82. ingredientDiv.children[1].innerText = categories[i].ingredients[j].name;
  83. ingredientDiv._id = categories[i].ingredients[j].id;
  84. ingredientDiv._name = categories[i].ingredients[j].name;
  85. ingredientDiv._unit = categories[i].ingredients[j].unit;
  86. ingredientDiv._category = categories[i].name;
  87. categoryDiv.children[1].appendChild(ingredientDiv);
  88. this.addIngredientsDiv.push(ingredientDiv);
  89. }
  90. }
  91. }
  92. })
  93. .catch((err)=>{
  94. banner.createError("Unable to retrieve data");
  95. });
  96. openSidebar(sidebar);
  97. },
  98. toggleAddIngredient: function(categoryElement){
  99. let button = categoryElement.children[0].children[1];
  100. let ingredientDisplay = categoryElement.children[1];
  101. if(ingredientDisplay.style.display === "none"){
  102. ingredientDisplay.style.display = "flex";
  103. button.children[0].style.display = "none";
  104. button.children[1].style.display = "block";
  105. }else{
  106. ingredientDisplay.style.display = "none";
  107. button.children[0].style.display = "block";
  108. button.children[1].style.display = "none";
  109. }
  110. },
  111. displayIngredient: function(ingredient, category){
  112. sidebar = document.querySelector("#ingredientDetails");
  113. openSidebar(sidebar);
  114. document.querySelector("#ingredientDetails p").innerText = category.name;
  115. document.querySelector("#ingredientDetails h1").innerText = ingredient.name;
  116. document.querySelector("#ingredientStock").innerText = `${ingredient.quantity} ${ingredient.unit}`;
  117. let quantities = [];
  118. let now = new Date();
  119. for(let i = 1; i < 31; i++){
  120. let endDay = new Date(now.getFullYear(), now.getMonth(), now.getDate() - i)
  121. let startDay = new Date(now.getFullYear(), now.getMonth(), now.getDate() - i - 1);
  122. quantities.push(ingredientSold(dateIndices(startDay, endDay), ingredient.id));
  123. }
  124. let sum = 0;
  125. for(let quantity of quantities){
  126. sum += quantity;
  127. }
  128. document.querySelector("#dailyUse").innerText = `${(sum/quantities.length).toFixed(2)} ${ingredient.unit}`;
  129. },
  130. submitAddIngredients: function(){
  131. let addIngredients = [];
  132. for(let i = 0; i < this.addIngredientsDiv.length; i++){
  133. let ingredient = this.addIngredientsDiv[i];
  134. if(ingredient.children[0].checked){
  135. if(!validator.ingredient.quantity(ingredient.children[2].value)){
  136. return;
  137. }
  138. addIngredients.push({
  139. ingredient: {
  140. _id: ingredient._id,
  141. name: ingredient._name,
  142. category: ingredient._category,
  143. unit: ingredient._unit
  144. },
  145. quantity: ingredient.children[2].value,
  146. });
  147. }
  148. }
  149. fetch("/merchant/ingredients/add", {
  150. method: "PUT",
  151. headers: {
  152. "Content-Type": "application/json;charset=utf-8"
  153. },
  154. body: JSON.stringify(addIngredients)
  155. })
  156. .then((response)=>{
  157. if(typeof(response.data) === "string"){
  158. banner.createError(response.data);
  159. }else{
  160. banner.createNotification("Ingredients added");
  161. updateInventory(addIngredients);
  162. }
  163. })
  164. .catch((err)=>{
  165. console.log(err);
  166. banner.createError("Unable to update data. Please refresh the page");
  167. });
  168. }
  169. }