modal.js 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329
  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 addIngredient = (button, ingredient)=>{
  150. button.parentElement.removeChild(button);
  151. let div = template.cloneNode(true);
  152. div.children[0].innerText = ingredient.name;
  153. div.children[1].children[0].value = 0;
  154. div.children[1].children[1].onclick = ()=>{removeIngredient(div, ingredient)};
  155. div.ingredient = ingredient;
  156. right.appendChild(div);
  157. }
  158. let removeIngredient = (div, ingredient)=>{
  159. div.parentElement.removeChild(div);
  160. let button = document.createElement("button");
  161. button.innerText = ingredient.name;
  162. button.classList.add("choosable");
  163. button.onclick = ()=>{addIngredient(button, ingredient)};
  164. left.appendChild(button);
  165. }
  166. for(let i = 0; i < merchant.inventory.length; i++){
  167. if(ingredient.id === merchant.inventory[i].ingredient.id) continue;
  168. let skip = false;
  169. for(let j = 0; j < ingredient.subIngredients.length; j++){
  170. if(merchant.inventory[i].ingredient === ingredient.subIngredients[j].ingredient){
  171. let div = template.cloneNode(true);
  172. div.children[0].innerText = merchant.inventory[i].ingredient.name;
  173. div.children[1].children[0].value = ingredient.subIngredients[j].quantity;
  174. div.children[1].children[1].onclick = ()=>{removeIngredient(div, ingredient.subIngredients[j].ingredient)};
  175. div.ingredient = merchant.inventory[i].ingredient;
  176. right.appendChild(div);
  177. skip = true;
  178. break;
  179. }
  180. }
  181. if(skip === true) continue;
  182. let button = document.createElement("button");
  183. button.innerText = merchant.inventory[i].ingredient.name;
  184. button.classList.add("choosable");
  185. button.onclick = ()=>{addIngredient(button, merchant.inventory[i].ingredient)};
  186. left.appendChild(button);
  187. }
  188. //SUBMIT SUB INGREDIENTS
  189. document.getElementById("submitEditSubIngredients").onclick = ()=>{
  190. let data = {
  191. id: ingredient.id,
  192. ingredients: []
  193. };
  194. for(let i = 0; i < right.children.length; i++){
  195. data.ingredients.push({
  196. ingredient: right.children[i].ingredient.id,
  197. quantity: parseFloat(right.children[i].children[1].children[0].value)
  198. });
  199. }
  200. let loader = document.getElementById("loaderContainer");
  201. loader.style.display = "flex";
  202. fetch("/ingredients/subingredients", {
  203. method: "put",
  204. headers: {
  205. "Content-Type": "application/json"
  206. },
  207. body: JSON.stringify(data)
  208. })
  209. .then(response => response.json())
  210. .then((response)=>{
  211. if(typeof(response) === "string"){
  212. if(response.includes("$") === true) {
  213. controller.createBanner(response.split("$")[0], "error");
  214. controller.closeModal();
  215. controller.openModal("circularReference", response);
  216. }else{
  217. controller.createBanner(response, "error");
  218. }
  219. }else{
  220. ingredient.replaceIngredients(response.ingredients);
  221. state.updateIngredients();
  222. controller.createBanner(`SUB-INGREDIENTS UPDATED FOR ${ingredient.name}`, "success");
  223. controller.closeModal();
  224. }
  225. })
  226. .catch((err)=>{
  227. controller.createBanner("SOMETHING WENT WRONG. PLEASE REFRESH THE PAGE", "error");
  228. })
  229. .finally(()=>{
  230. loader.style.display = "none";
  231. });
  232. }
  233. },
  234. circularReference: function(response){
  235. let array = response.split("$");
  236. let modal = document.getElementById("modalCircularReference");
  237. modal.style.display = "flex";
  238. modal.children[0].innerText = array[0];
  239. while(modal.children[1].children.length > 0){
  240. modal.children[1].removeChild(modal.children[1].firstChild);
  241. }
  242. for(let i = 1; i < array.length; i++){
  243. let text = document.createElement("p");
  244. text.innerText = array[i];
  245. modal.children[1].appendChild(text);
  246. }
  247. document.getElementById("circularReferenceButton").onclick = ()=>{controller.closeModal()};
  248. },
  249. alternateUnit: function(data){
  250. document.getElementById("modalUnitConversion").style.display = "flex";
  251. let container = document.getElementById("unitConversions");
  252. let template = document.getElementById("convertUnitOption").content.children[0];
  253. while(container.children.length > 0){
  254. container.removeChild(container.firstChild);
  255. }
  256. for(let i = 0; i < data.mismatchUnits.length; i++){
  257. let conversion = template.cloneNode(true);
  258. conversion.children[0].innerText = data.mismatchUnits[i].ingredient.name;
  259. conversion.children[1].children[0].children[0].value = data.mismatchUnits[i].newIngredient.quantity;
  260. conversion.children[1].children[0].children[1].innerText = data.mismatchUnits[i].newIngredient.unit.toUpperCase();
  261. conversion.children[1].children[2].children[1].innerText = data.mismatchUnits[i].ingredient.unit.toUpperCase();
  262. container.appendChild(conversion);
  263. }
  264. //Submit conversions
  265. document.getElementById("submitAlternateUnits").onclick = ()=>{
  266. for(let i = 0; i < container.children.length; i++){
  267. let inputLeft = container.children[i].children[1].children[0].children[0].value;
  268. let inputRight = container.children[i].children[1].children[2].children[0].value;
  269. if(inputLeft === "" || inputRight === "" || inputLeft === 0 || inputRight === 0){
  270. controller.createBanner("ALL FIELDS ARE REQUIRED", "error");
  271. return;
  272. }
  273. data.mismatchUnits[i].newIngredient.baseUnitMultiplier = data.mismatchUnits[i].ingredient.calculateRecipeMultiplier(inputLeft, inputRight);
  274. }
  275. controller.closeModal();
  276. newRecipe.submit(data.recipe);
  277. }
  278. }
  279. };
  280. module.exports = modal;