editIngredient.js 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245
  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. let bottleLabel = document.getElementById("editSpecialLabel");
  78. if(ingredient.ingredient.unit === "bottle"){
  79. bottleLabel.innerText = `BOTTLE SIZE (${ingredient.ingredient.altUnit.toUpperCase()})`;
  80. let bottleInput = document.createElement("input");
  81. bottleInput.id = "editSpecialInput";
  82. bottleInput.type = "number";
  83. bottleInput.min = "0";
  84. bottleInput.value = 1 / ingredient.ingredient.convert.toBottle * controller.unitMultiplier(controller.getBaseUnit(ingredient.ingredient.altUnit), ingredient.ingredient.altUnit);
  85. bottleLabel.appendChild(bottleInput);
  86. bottleLabel.style.display = "flex";
  87. }else{
  88. bottleLabel.style.display = "none";
  89. }
  90. },
  91. changeUnit: function(button, ingredient){
  92. //update current stock quantity
  93. let label = {};
  94. let newValue = 0;
  95. if(ingredient.ingredient.unit === "bottle"){
  96. label = document.getElementById("editSpecialLabel");
  97. label.innerText = `BOTTLE SIZE (${button.innerText})`;
  98. newValue = controller.unitMultiplier(controller.getBaseUnit(ingredient.ingredient.altUnit), button.innerText.toLowerCase()) / ingredient.ingredient.convert.toBottle;
  99. }else{
  100. label = document.getElementById("editIngQuantityLabel");
  101. label.innerText = `CURRENT STOCK (${button.innerText})`;
  102. newValue = ingredient.quantity * controller.unitMultiplier(ingredient.ingredient.unit, button.innerText.toLowerCase());
  103. }
  104. let input = document.createElement("input");
  105. input.type = "number";
  106. input.min = "0";
  107. input.step = "0.01";
  108. input.value = newValue.toFixed(2);
  109. label.appendChild(input);
  110. //update conversions
  111. let massDiv = document.getElementById("editIngMass");
  112. let volumeDiv = document.getElementById("editIngVolume");
  113. let lengthDiv = document.getElementById("editIngLength");
  114. massDiv.children[1].innerText = button.innerText;
  115. volumeDiv.children[1].innerText = button.innerText;
  116. lengthDiv.children[1].innerText = button.innerText;
  117. let multiplier = controller.unitMultiplier(document.querySelector(".unitActive").innerText.toLowerCase(), button.innerText.toLowerCase());
  118. massDiv.children[0].value = parseFloat((massDiv.children[0].value * multiplier).toFixed(3));
  119. massDiv.children[3].value = parseFloat((massDiv.children[3].value * multiplier).toFixed(3));
  120. volumeDiv.children[0].value = parseFloat((volumeDiv.children[0].value * multiplier).toFixed(3));
  121. volumeDiv.children[3].value = parseFloat((volumeDiv.children[3].value * multiplier).toFixed(3));
  122. lengthDiv.children[0].value = parseFloat((lengthDiv.children[0].value * multiplier).toFixed(3));
  123. lengthDiv.children[3].value = parseFloat((lengthDiv.children[3].value *= multiplier).toFixed(3));
  124. //Update the buttons
  125. let buttons = document.getElementById("unitButtons");
  126. for(let i = 0; i < buttons.children.length; i++){
  127. buttons.children[i].classList.remove("unitActive");
  128. }
  129. button.classList.add("unitActive");
  130. },
  131. changeConversionSelect: function(div){
  132. let multiplier = controller.unitMultiplier(div.children[4].previousUnit, div.children[4].value);
  133. div.children[3].value = parseFloat((div.children[3].value * multiplier).toFixed(3));
  134. div.children[4].previousUnit = div.children[4].value;
  135. },
  136. submit: function(ingredient){
  137. let quantity = parseFloat(document.getElementById("editIngQuantityLabel").children[0].value);
  138. let selectedUnit = document.getElementById("unitButtons").querySelector(".unitActive").innerText.toLowerCase();
  139. let unit = (ingredient.ingredient.unit === "bottle") ? "bottle" : selectedUnit;
  140. let massDiv = document.getElementById("editIngMass");
  141. let volumeDiv = document.getElementById("editIngVolume");
  142. let lengthDiv = document.getElementById("editIngLength");
  143. let leftMass = massDiv.children[0].value;
  144. let rightMass = massDiv.children[3].value;
  145. let leftVolume = volumeDiv.children[0].value;
  146. let rightVolume = volumeDiv.children[3].value;
  147. let leftLength = lengthDiv.children[0].value;
  148. let rightLength = lengthDiv.children[3].value;
  149. let leftUnit = massDiv.children[1].innerText.toLowerCase();
  150. let rightUnitMass = massDiv.children[4].value;
  151. let rightUnitVolume = volumeDiv.children[4].value;
  152. let rightUnitLength = lengthDiv.children[4].value;
  153. let leftMultiplier = controller.unitMultiplier(leftUnit, controller.getBaseUnit(leftUnit));
  154. leftMass *= leftMultiplier;
  155. leftVolume *= leftMultiplier;
  156. leftLength *= leftMultiplier;
  157. rightMass *= controller.unitMultiplier(rightUnitMass, controller.getBaseUnit(rightUnitMass));
  158. rightVolume *= controller.unitMultiplier(rightUnitVolume, controller.getBaseUnit(rightUnitVolume));
  159. rightLength *= controller.unitMultiplier(rightUnitLength, controller.getBaseUnit(rightUnitLength));
  160. let data = {
  161. ingredient: {
  162. id: ingredient.ingredient.id,
  163. name: document.getElementById("editIngName").value,
  164. category: document.getElementById("editIngCategory").value,
  165. unit: unit,
  166. convert: {
  167. toMass: rightMass / leftMass,
  168. toVolume: rightVolume / leftVolume,
  169. toLength: rightLength / leftLength,
  170. toBottle: 0
  171. }
  172. },
  173. quantity: quantity * controller.unitMultiplier(unit, controller.getBaseUnit(unit))
  174. };
  175. switch(controller.getUnitType(unit)){
  176. case "mass": data.ingredient.convert.toMass = 1; break;
  177. case "volume": data.ingredient.convert.toVolume = 1; break;
  178. case "length": data.ingredient.convert.toLength = 1; break;
  179. case "bottle":
  180. let bottleQuant = document.getElementById("editSpecialInput").value;
  181. data.ingredient.altUnit = selectedUnit;
  182. data.ingredient.convert.toVolume = 1;
  183. data.ingredient.convert.toBottle = 1 / controller.toBase(bottleQuant, selectedUnit);
  184. data.quantity = quantity * controller.toBase(bottleQuant, selectedUnit);
  185. break;
  186. }
  187. let loader = document.getElementById("loaderContainer");
  188. loader.style.display = "flex";
  189. fetch("/ingredients/update", {
  190. method: "put",
  191. headers: {
  192. "Content-Type": "application/json;charset=utf-8"
  193. },
  194. body: JSON.stringify(data)
  195. })
  196. .then(response => response.json())
  197. .then((response)=>{
  198. if(typeof(response) === "string"){
  199. controller.createBanner(response, "error");
  200. }else{
  201. merchant.updateIngredients([response]);
  202. state.updateIngredients();
  203. controller.openStrand("ingredients");
  204. controller.createBanner("INGREDIENT UPDATED", "success");
  205. }
  206. })
  207. .catch((err)=>{
  208. controller.createBanner("SOMETHING WENT WRONG. PLEASE REFRESH THE PAGE", "error");
  209. })
  210. .finally(()=>{
  211. loader.style.display = "none";
  212. });
  213. }
  214. }
  215. module.exports = editIngredient;