editIngredient.js 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222
  1. let editIngredient = {
  2. display: function(ingredient){
  3. let buttonList = document.getElementById("unitButtons");
  4. let quantLabel = document.getElementById("editIngQuantityLabel");
  5. let name = document.getElementById("editIngName");
  6. let unit = ingredient.ingredient.unit;
  7. name.focus();
  8. document.getElementById("editSubIngredients").onclick = ()=>{controller.openModal("editSubIngredients", ingredient.ingredient)};
  9. //Clear any existing data
  10. while(buttonList.children.length > 0){
  11. buttonList.removeChild(buttonList.firstChild);
  12. }
  13. //Populate basic fields
  14. name.innerText = ingredient.ingredient.name;
  15. document.getElementById("editIngName").value = ingredient.ingredient.name;
  16. document.getElementById("editIngCategory").value = ingredient.ingredient.category;
  17. quantLabel.innerText = `CURRENT STOCK (${unit.toUpperCase()})`;
  18. document.getElementById("editIngSubmit").onclick = ()=>{this.submit(ingredient)};
  19. //Populate the unit buttons
  20. let units = ingredient.ingredient.getPotentialUnits();
  21. let ingredientUnit = (unit === "bottle") ? ingredient.ingredient.altUnit : unit;
  22. for(let i = 0; i < units.length; i++){
  23. let button = document.createElement("button");
  24. button.classList.add("unitButton");
  25. button.innerText = units[i].toUpperCase();
  26. button.onclick = ()=>{this.changeUnit(button, ingredient)};
  27. buttonList.appendChild(button);
  28. if(units[i] === ingredientUnit) button.classList.add("unitActive");
  29. }
  30. //Offer conversions
  31. let massDiv = document.getElementById("editIngMass");
  32. let volumeDiv = document.getElementById("editIngVolume");
  33. let lengthDiv = document.getElementById("editIngLength");
  34. let multiplier = controller.unitMultiplier(controller.getBaseUnit(unit), unit);
  35. if(unit === "bottle") multiplier = controller.unitMultiplier(controller.getBaseUnit(ingredient.ingredient.altUnit), ingredient.ingredient.altUnit);
  36. massDiv.children[0].value = 1;
  37. massDiv.children[1].innerText = (unit === "bottle") ? ingredient.ingredient.altUnit.toUpperCase() : unit.toUpperCase();
  38. massDiv.children[3].value = parseFloat((ingredient.ingredient.convert.toMass / multiplier).toFixed(3));
  39. massDiv.children[4].value = "g";
  40. massDiv.children[4].previousValue = "g";
  41. massDiv.children[4].onchange = ()=>{this.changeConversionSelect(massDiv)};
  42. volumeDiv.children[0].value = 1;
  43. volumeDiv.children[1].innerText = (unit === "bottle") ? ingredient.ingredient.altUnit.toUpperCase() : unit.toUpperCase();
  44. volumeDiv.children[3].value = parseFloat((ingredient.ingredient.convert.toVolume / multiplier).toFixed(3));
  45. volumeDiv.children[4].value = "l";
  46. volumeDiv.children[4].previousValue = "l";
  47. volumeDiv.children[4].onchange = ()=>{this.changeConversionSelect(volumeDiv)};
  48. lengthDiv.children[0].value = 1;
  49. lengthDiv.children[1].innerText = (unit === "bottle") ? ingredient.ingredient.altUnit.toUpperCase() : unit.toUpperCase();
  50. lengthDiv.children[3].value = parseFloat((ingredient.ingredient.convert.toLength / multiplier).toFixed(3));
  51. lengthDiv.children[4].value = "m";
  52. lengthDiv.children[4].previousValue = "m";
  53. lengthDiv.children[4].onchange = ()=>{this.changeConversionSelect(lengthDiv)};
  54. switch(controller.getBaseUnit(unit)){
  55. case "g":
  56. massDiv.style.display = "none";
  57. volumeDiv.style.display = "flex";
  58. lengthDiv.style.display = "flex";
  59. break;
  60. case "l":
  61. massDiv.style.display = "flex";
  62. volumeDiv.style.display = "none";
  63. lengthDiv.style.display = "flex";
  64. break;
  65. case "m":
  66. massDiv.style.display = "flex";
  67. volumeDiv.style.display = "flex";
  68. lengthDiv.style.display = "none";
  69. }
  70. let quantInput = document.createElement("input");
  71. quantInput.id = "editIngQuantity";
  72. quantInput.type = "number";
  73. quantInput.min = "0";
  74. quantInput.step = "0.01";
  75. quantInput.value = ingredient.quantity.toFixed(2);
  76. quantLabel.appendChild(quantInput);
  77. },
  78. changeUnit: function(button, ingredient){
  79. //update current stock quantity
  80. let label = document.getElementById("editIngQuantityLabel");
  81. if(ingredient.ingredient.unit !== "bottle") label.innerText = `CURRENT STOCK (${button.innerText})`;
  82. if(ingredient.ingredient.unit === "bottle") label.innerText = "CURRENT STOCK (bottle)";
  83. let input = document.createElement("input");
  84. input.id = "editIngQuantity";
  85. input.type = "number";
  86. input.min = "0";
  87. input.step = "0.01";
  88. input.value = (ingredient.quantity * controller.unitMultiplier(ingredient.ingredient.unit, button.innerText.toLowerCase())).toFixed(2);
  89. label.appendChild(input);
  90. //update conversions
  91. let massDiv = document.getElementById("editIngMass");
  92. let volumeDiv = document.getElementById("editIngVolume");
  93. let lengthDiv = document.getElementById("editIngLength");
  94. massDiv.children[1].innerText = button.innerText;
  95. volumeDiv.children[1].innerText = button.innerText;
  96. lengthDiv.children[1].innerText = button.innerText;
  97. let multiplier = controller.unitMultiplier(document.querySelector(".unitActive").innerText.toLowerCase(), button.innerText.toLowerCase());
  98. massDiv.children[0].value = parseFloat((massDiv.children[0].value * multiplier).toFixed(3));
  99. massDiv.children[3].value = parseFloat((massDiv.children[3].value * multiplier).toFixed(3));
  100. volumeDiv.children[0].value = parseFloat((volumeDiv.children[0].value * multiplier).toFixed(3));
  101. volumeDiv.children[3].value = parseFloat((volumeDiv.children[3].value * multiplier).toFixed(3));
  102. lengthDiv.children[0].value = parseFloat((lengthDiv.children[0].value * multiplier).toFixed(3));
  103. lengthDiv.children[3].value = parseFloat((lengthDiv.children[3].value *= multiplier).toFixed(3));
  104. //Update the buttons
  105. let buttons = document.getElementById("unitButtons");
  106. for(let i = 0; i < buttons.children.length; i++){
  107. buttons.children[i].classList.remove("unitActive");
  108. }
  109. button.classList.add("unitActive");
  110. },
  111. changeConversionSelect: function(div){
  112. let multiplier = controller.unitMultiplier(div.children[4].previousUnit, div.children[4].value);
  113. div.children[3].value = parseFloat((div.children[3].value * multiplier).toFixed(3));
  114. div.children[4].previousUnit = div.children[4].value;
  115. },
  116. submit: function(ingredient){
  117. let quantity = parseFloat(document.getElementById("editIngQuantityLabel").children[0].value);
  118. let selectedUnit = document.getElementById("unitButtons").querySelector(".unitActive").innerText.toLowerCase();
  119. let unit = (ingredient.ingredient.unit === "bottle") ? "bottle" : selectedUnit;
  120. let massDiv = document.getElementById("editIngMass");
  121. let volumeDiv = document.getElementById("editIngVolume");
  122. let lengthDiv = document.getElementById("editIngLength");
  123. let leftMass = massDiv.children[0].value;
  124. let rightMass = massDiv.children[3].value;
  125. let leftVolume = volumeDiv.children[0].value;
  126. let rightVolume = volumeDiv.children[3].value;
  127. let leftLength = lengthDiv.children[0].value;
  128. let rightLength = lengthDiv.children[3].value;
  129. let leftUnit = massDiv.children[1].innerText.toLowerCase();
  130. let rightUnitMass = massDiv.children[4].value;
  131. let rightUnitVolume = volumeDiv.children[4].value;
  132. let rightUnitLength = lengthDiv.children[4].value;
  133. let leftMultiplier = controller.unitMultiplier(leftUnit, controller.getBaseUnit(leftUnit));
  134. leftMass *= leftMultiplier;
  135. leftVolume *= leftMultiplier;
  136. leftLength *= leftMultiplier;
  137. rightMass *= controller.unitMultiplier(rightUnitMass, controller.getBaseUnit(rightUnitMass));
  138. rightVolume *= controller.unitMultiplier(rightUnitVolume, controller.getBaseUnit(rightUnitVolume));
  139. rightLength *= controller.unitMultiplier(rightUnitLength, controller.getBaseUnit(rightUnitLength));
  140. let data = {
  141. ingredient: {
  142. id: ingredient.ingredient.id,
  143. name: document.getElementById("editIngName").value,
  144. category: document.getElementById("editIngCategory").value,
  145. unit: unit,
  146. convert: {
  147. toMass: rightMass / leftMass,
  148. toVolume: rightVolume / leftVolume,
  149. toLength: rightLength / leftLength
  150. }
  151. },
  152. quantity: quantity * controller.unitMultiplier(unit, controller.getBaseUnit(unit))
  153. };
  154. switch(controller.getUnitType(unit)){
  155. case "mass": data.ingredient.convert.toMass = 1; break;
  156. case "volume": data.ingredient.convert.toVolume = 1; break;
  157. case "length": data.ingredient.convert.toLength = 1; break;
  158. case "bottle":
  159. data.ingredient.convert.toMass = controller.toBase(rightMass / leftMass, rightUnitMass);
  160. data.ingredient.convert.toVolume = ingredient.ingredient.convert.toVolume;
  161. data.ingredient.convert.toLength = controller.toBase(rightLength / leftLength, rightUnitLength);
  162. data.quantity = quantity / data.ingredient.convert.toVolume;
  163. data.ingredient.altUnit = selectedUnit;
  164. break;
  165. }
  166. let loader = document.getElementById("loaderContainer");
  167. loader.style.display = "flex";
  168. fetch("/ingredients/update", {
  169. method: "put",
  170. headers: {
  171. "Content-Type": "application/json;charset=utf-8"
  172. },
  173. body: JSON.stringify(data)
  174. })
  175. .then(response => response.json())
  176. .then((response)=>{
  177. if(typeof(response) === "string"){
  178. controller.createBanner(response, "error");
  179. }else{
  180. merchant.updateIngredients([response]);
  181. state.updateIngredients();
  182. controller.openStrand("ingredients");
  183. controller.createBanner("INGREDIENT UPDATED", "success");
  184. }
  185. })
  186. .catch((err)=>{
  187. controller.createBanner("SOMETHING WENT WRONG. PLEASE REFRESH THE PAGE", "error");
  188. })
  189. .finally(()=>{
  190. loader.style.display = "none";
  191. });
  192. }
  193. }
  194. module.exports = editIngredient;