modal.js 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367
  1. const Merchant = require("./classes/Merchant.js");
  2. const newRecipe = require("./sidebars/newRecipe.js");
  3. let modal = {
  4. feedback: function(){
  5. let form = document.getElementById("modalFeedback");
  6. form.style.display = "flex";
  7. form.onsubmit = ()=>{this.submitFeedback()};
  8. },
  9. submitFeedback: function(){
  10. event.preventDefault();
  11. let data = {
  12. title: document.getElementById("feedbackTitle").value,
  13. content: document.getElementById("feedbackContent").value,
  14. date: new Date()
  15. };
  16. let loader = document.getElementById("loaderContainer");
  17. loader.style.display = "flex";
  18. fetch("/feedback", {
  19. method: "post",
  20. headers: {
  21. "Content-Type": "application/json;charset=utf-8"
  22. },
  23. body: JSON.stringify(data)
  24. })
  25. .then(response => response.json())
  26. .then((response)=>{
  27. if(typeof(response) === "string"){
  28. controller.createBanner(response, "error");
  29. }else{
  30. controller.createBanner("THANK YOU FOR YOUR INPUT", "success");
  31. controller.closeModal();
  32. }
  33. })
  34. .catch((err)=>{
  35. controller.createBanner("SOMETHING WENT WRONG. PLEASE REFRESH THE PAGE", "error");
  36. })
  37. .finally(()=>{
  38. loader.style.display = "none";
  39. });
  40. },
  41. newMerchant: function(){
  42. let form = document.getElementById("modalNewMerchant");
  43. form.style.display = "flex";
  44. form.onsubmit = ()=>{this.submitNewMerchantNone()};
  45. },
  46. submitNewMerchantNone(){
  47. event.preventDefault();
  48. let data = {
  49. name: document.getElementById("addMerchantName").value,
  50. };
  51. let loader = document.getElementById("loaderContainer");
  52. loader.style.display = "flex";
  53. fetch("/merchant/add/none", {
  54. method: "post",
  55. headers: {
  56. "Content-Type": "application/json;charset=utf-8"
  57. },
  58. body: JSON.stringify(data)
  59. })
  60. .then(response => response.json())
  61. .then((response)=>{
  62. if(typeof(response) === "string"){
  63. controller.createBanner(response, "error");
  64. }else{
  65. let newMerchant = new Merchant(
  66. response[1].name,
  67. response[1].pos,
  68. response[1].inventory,
  69. response[1].recipes,
  70. [],
  71. (response[1].address === undefined) ? "" : response[1].address.full,
  72. response[0]
  73. );
  74. window.merchant = newMerchant;
  75. state.updateMerchant();
  76. controller.openStrand("home");
  77. controller.closeModal();
  78. }
  79. })
  80. .catch((err)=>{
  81. controller.createBanner("SOMETHING WENT WRONG. PLEASE REFRESH THE PAGE", "error");
  82. })
  83. .finally(()=>{
  84. loader.style.display = "none";
  85. });
  86. },
  87. squareLocations: function(locations){
  88. document.getElementById("modalSquareLocations").style.display = "flex";
  89. document.getElementById("squareLocationsCancel").onclick = ()=>{controller.closeModal()};
  90. if(locations.length === 0){
  91. document.getElementById("squareLocationsTitle").innerText = "ALL OF YOUR LOCATIONS HAVE ALREADY BEEN ADDED TO THE SUBLINE";
  92. return;
  93. }
  94. let container = document.getElementById("squareLocationsButtons");
  95. while(container.children.length > 0){
  96. container.removeChild(container.firstChild);
  97. }
  98. for(let i = 0; i < locations.length; i++){
  99. let button = document.createElement("button");
  100. button.innerText = locations[i].name;
  101. button.classList.add("button");
  102. button.onclick = ()=>{this.addSquareMerchant(locations[i].id)};
  103. container.appendChild(button);
  104. }
  105. },
  106. addSquareMerchant: function(id){
  107. let loader = document.getElementById("loaderContainer");
  108. loader.style.display = "flex";
  109. fetch(`/square/add/${id}`)
  110. .then(response => response.json())
  111. .then((response)=>{
  112. if(typeof(response) === "string"){
  113. controller.createBanner(response, "error");
  114. }else{
  115. window.merchant = new Merchant(
  116. response[1].name,
  117. response[1].pos,
  118. response[1].inventory,
  119. response[1].recipes,
  120. [],
  121. (response[1].address === undefined) ? "" : response[1].address.full,
  122. response[0]
  123. );
  124. state.updateMerchant();
  125. controller.closeModal();
  126. controller.openStrand("home");
  127. controller.createBanner(`NEW MERCHANT, "${response[1].name}", CREATED`, "success");
  128. }
  129. })
  130. .catch((err)=>{
  131. controller.createBanner("SOMETHING WENT WRONG. PLEASE REFRESH THE PAGE", "error");
  132. })
  133. .finally(()=>{
  134. loader.style.display = "none";
  135. });
  136. },
  137. editSubIngredients: function(ingredient){
  138. document.getElementById("modalEditSubIngredients").style.display = "flex";
  139. document.getElementById("cancelEditSubIngredients").onclick = ()=>{controller.closeModal()};
  140. let left = document.getElementById("editSubAllIng");
  141. let right = document.getElementById("editSubCurrentIng");
  142. let template = document.getElementById("selectedSubIngredient").content.children[0];
  143. while(left.children.length > 0){
  144. left.removeChild(left.firstChild);
  145. }
  146. while(right.children.length > 0){
  147. right.removeChild(right.firstChild);
  148. }
  149. let createOptGroup = (container, group, options)=>{
  150. let optGroup = document.createElement("optgroup")
  151. optGroup.label = group;
  152. container.appendChild(optGroup);
  153. for(let i = 0; i < options.length; i++){
  154. let option = document.createElement("option");
  155. option.innerText = options[i].toUpperCase();
  156. option.value = options[i];
  157. optGroup.appendChild(option);
  158. }
  159. }
  160. let addIngredient = (button, ingredient)=>{
  161. button.parentElement.removeChild(button);
  162. let div = template.cloneNode(true);
  163. div.children[0].children[0].innerText = ingredient.name;
  164. div.children[0].children[1].onclick = ()=>{removeIngredient(div, ingredient)};
  165. div.children[1].children[0].value = 0;
  166. div.ingredient = ingredient;
  167. right.appendChild(div);
  168. if(ingredient.convert.toMass !== undefined){
  169. createOptGroup(div.children[1].children[1], "Mass", ["g", "kg", "oz", "lb"])
  170. }
  171. if(ingredient.convert.toVolume !== undefined){
  172. createOptGroup(div.children[1].children[1], "Volume", ["ml", "l", "tsp", "tbsp", "ozfl", "cup", "pt", "qt", "gal"]);
  173. }
  174. if(ingredient.convert.toLength !== undefined){
  175. createOptGroup(div.children[1].children[1], "Length", ["mm", "cm", "m", "in", "ft"]);
  176. }
  177. div.children[1].children[1].value = ingredient.unit;
  178. }
  179. let removeIngredient = (div, ingredient)=>{
  180. div.parentElement.removeChild(div);
  181. let button = document.createElement("button");
  182. button.innerText = ingredient.name;
  183. button.classList.add("choosable");
  184. button.onclick = ()=>{addIngredient(button, ingredient)};
  185. left.appendChild(button);
  186. }
  187. for(let i = 0; i < merchant.inventory.length; i++){
  188. if(ingredient.id === merchant.inventory[i].ingredient.id) continue;
  189. let skip = false;
  190. for(let j = 0; j < ingredient.subIngredients.length; j++){
  191. if(merchant.inventory[i].ingredient === ingredient.subIngredients[j].ingredient){
  192. let div = template.cloneNode(true);
  193. div.children[0].children[0].innerText = merchant.inventory[i].ingredient.name;
  194. div.children[0].children[1].onclick = ()=>{removeIngredient(div, ingredient.subIngredients[j].ingredient)};
  195. div.children[1].children[0].value = ingredient.subIngredients[j].quantity;
  196. div.ingredient = merchant.inventory[i].ingredient;
  197. right.appendChild(div);
  198. let conversions = merchant.inventory[i].ingredient.convert;
  199. if(conversions.toMass !== undefined){
  200. createOptGroup(div.children[1].children[1], "Mass", ["g", "kg", "oz", "lb"]);
  201. }
  202. if(conversions.toVolume !== undefined){
  203. createOptGroup(div.children[1].children[1], "Volume", ["ml", "l", "tsp", "tbsp", "ozfl", "cup", "pt", "qt", "gal"]);
  204. }
  205. if(conversions.toLength !== undefined){
  206. createOptGroup(div.children[1].children[1], "Length", ["mm", "cm", "m", "in", "ft"]);
  207. }
  208. div.children[1].children[1].value = merchant.inventory[i].ingredient.unit;
  209. skip = true;
  210. break;
  211. }
  212. }
  213. if(skip === true) continue;
  214. let button = document.createElement("button");
  215. button.innerText = merchant.inventory[i].ingredient.name;
  216. button.classList.add("choosable");
  217. button.onclick = ()=>{addIngredient(button, merchant.inventory[i].ingredient)};
  218. left.appendChild(button);
  219. }
  220. //SUBMIT SUB INGREDIENTS
  221. document.getElementById("submitEditSubIngredients").onclick = ()=>{
  222. let data = {
  223. id: ingredient.id,
  224. ingredients: []
  225. };
  226. for(let i = 0; i < right.children.length; i++){
  227. data.ingredients.push({
  228. ingredient: right.children[i].ingredient.id,
  229. quantity: parseFloat(right.children[i].children[1].children[0].value),
  230. unit: right.children[i].children[1].children[1].value
  231. });
  232. }
  233. let loader = document.getElementById("loaderContainer");
  234. loader.style.display = "flex";
  235. fetch("/ingredients/subingredients", {
  236. method: "put",
  237. headers: {
  238. "Content-Type": "application/json"
  239. },
  240. body: JSON.stringify(data)
  241. })
  242. .then(response => response.json())
  243. .then((response)=>{
  244. if(typeof(response) === "string"){
  245. if(response.includes("$") === true) {
  246. controller.createBanner(response.split("$")[0], "error");
  247. controller.closeModal();
  248. controller.openModal("circularReference", response);
  249. }else{
  250. controller.createBanner(response, "error");
  251. }
  252. }else{
  253. ingredient.replaceIngredients(response.ingredients);
  254. state.updateIngredients();
  255. controller.createBanner(`SUB-INGREDIENTS UPDATED FOR ${ingredient.name}`, "success");
  256. controller.closeModal();
  257. }
  258. })
  259. .catch((err)=>{
  260. controller.createBanner("SOMETHING WENT WRONG. PLEASE REFRESH THE PAGE", "error");
  261. })
  262. .finally(()=>{
  263. loader.style.display = "none";
  264. });
  265. }
  266. },
  267. circularReference: function(response){
  268. let array = response.split("$");
  269. let modal = document.getElementById("modalCircularReference");
  270. modal.style.display = "flex";
  271. modal.children[0].innerText = array[0];
  272. while(modal.children[1].children.length > 0){
  273. modal.children[1].removeChild(modal.children[1].firstChild);
  274. }
  275. for(let i = 1; i < array.length; i++){
  276. let text = document.createElement("p");
  277. text.innerText = array[i];
  278. modal.children[1].appendChild(text);
  279. }
  280. document.getElementById("circularReferenceButton").onclick = ()=>{controller.closeModal()};
  281. },
  282. alternateUnit: function(data){
  283. document.getElementById("modalUnitConversion").style.display = "flex";
  284. let container = document.getElementById("unitConversions");
  285. let template = document.getElementById("convertUnitOption").content.children[0];
  286. while(container.children.length > 0){
  287. container.removeChild(container.firstChild);
  288. }
  289. for(let i = 0; i < data.mismatchUnits.length; i++){
  290. let conversion = template.cloneNode(true);
  291. conversion.children[0].innerText = data.mismatchUnits[i].ingredient.name;
  292. conversion.children[1].children[0].children[0].value = data.mismatchUnits[i].newIngredient.quantity;
  293. conversion.children[1].children[0].children[1].innerText = data.mismatchUnits[i].newIngredient.unit.toUpperCase();
  294. conversion.children[1].children[2].children[1].innerText = data.mismatchUnits[i].ingredient.unit.toUpperCase();
  295. container.appendChild(conversion);
  296. }
  297. //Submit conversions
  298. document.getElementById("submitAlternateUnits").onclick = ()=>{
  299. for(let i = 0; i < container.children.length; i++){
  300. let inputLeft = container.children[i].children[1].children[0].children[0].value;
  301. let inputRight = container.children[i].children[1].children[2].children[0].value;
  302. if(inputLeft === "" || inputRight === "" || inputLeft === 0 || inputRight === 0){
  303. controller.createBanner("ALL FIELDS ARE REQUIRED", "error");
  304. return;
  305. }
  306. data.mismatchUnits[i].newIngredient.baseUnitMultiplier = data.mismatchUnits[i].ingredient.calculateRecipeMultiplier(inputLeft, inputRight);
  307. }
  308. controller.closeModal();
  309. data.submit(data.recipe);
  310. }
  311. }
  312. };
  313. module.exports = modal;