orders.js 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190
  1. const Order = require("./Order");
  2. module.exports = {
  3. isFetched: false,
  4. display: async function(Order){
  5. if(!this.isFetched){
  6. let loader = document.getElementById("loaderContainer");
  7. loader.style.display = "flex";
  8. fetch("/order", {
  9. method: "GET",
  10. headers: {
  11. "Content-Type": "application/json;charset=utf-8"
  12. },
  13. })
  14. .then((response) => response.json())
  15. .then((response)=>{
  16. if(typeof(response) === "string"){
  17. banner.createError(response);
  18. }else{
  19. let newOrders = [];
  20. for(let i = 0; i < response.length; i++){
  21. newOrders.push(new Order(
  22. response[i]._id,
  23. response[i].name,
  24. response[i].date,
  25. response[i].ingredients,
  26. merchant
  27. ));
  28. }
  29. merchant.editOrders(newOrders);
  30. document.getElementById("orderSubmitForm").onsubmit = ()=>{this.submitFilter(Order)};
  31. this.isFetched = true;
  32. }
  33. })
  34. .catch((err)=>{
  35. banner.createError("SOMETHING WENT WRONG. TRY REFRESHING THE PAGE");
  36. })
  37. .finally(()=>{
  38. loader.style.display = "none";
  39. });
  40. }
  41. },
  42. populate: function(){
  43. let listDiv = document.getElementById("orderList");
  44. let template = document.getElementById("order").content.children[0];
  45. let dateDropdown = document.getElementById("dateDropdownOrder");
  46. let ingredientDropdown = document.getElementById("ingredientDropdown");
  47. dateDropdown.style.display = "none";
  48. ingredientDropdown.style.display = "none";
  49. document.getElementById("dateFilterBtnOrder").onclick = ()=>{this.toggleDropdown(dateDropdown)};
  50. document.getElementById("ingredientFilterBtn").onclick = ()=>{this.toggleDropdown(ingredientDropdown)};
  51. for(let i = 0; i < merchant.ingredients.length; i++){
  52. let checkbox = document.createElement("input");
  53. checkbox.type = "checkbox";
  54. checkbox.ingredient = merchant.ingredients[i].ingredient;
  55. ingredientDropdown.appendChild(checkbox);
  56. let label = document.createElement("label");
  57. label.innerText = merchant.ingredients[i].ingredient.name;
  58. label.for = checkbox;
  59. ingredientDropdown.appendChild(label);
  60. let brk = document.createElement("br");
  61. ingredientDropdown.appendChild(brk);
  62. }
  63. while(listDiv.children.length > 0){
  64. listDiv.removeChild(listDiv.firstChild);
  65. }
  66. for(let i = 0; i < merchant.orders.length; i++){
  67. let row = template.cloneNode(true);
  68. let totalCost = 0;
  69. for(let j = 0; j < merchant.orders[i].ingredients.length; j++){
  70. totalCost += merchant.orders[i].ingredients[j].quantity * merchant.orders[i].ingredients[j].price;
  71. }
  72. row.children[0].innerText = merchant.orders[i].name;
  73. row.children[1].innerText = `${merchant.orders[i].ingredients.length} items`;
  74. row.children[2].innerText = new Date(merchant.orders[i].date).toLocaleDateString("en-US");
  75. row.children[3].innerText = `$${(totalCost / 100).toFixed(2)}`;
  76. row.order = merchant.orders[i];
  77. row.onclick = ()=>{controller.openSidebar("orderDetails", merchant.orders[i])};
  78. listDiv.appendChild(row);
  79. }
  80. },
  81. submitFilter: function(){
  82. event.preventDefault();
  83. let data = {
  84. startDate: document.getElementById("orderFilDate1").valueAsDate,
  85. endDate: document.getElementById("orderFilDate2").valueAsDate,
  86. ingredients: []
  87. }
  88. if(data.startDate >= data.endDate){
  89. banner.createError("START DATE CANNOT BE AFTER END DATE");
  90. return;
  91. }
  92. let ingredientChoices = document.getElementById("ingredientDropdown");
  93. for(let i = 0; i < ingredientChoices.children.length; i += 3){
  94. if(ingredientChoices.children[i].checked){
  95. data.ingredients.push(ingredientChoices.children[i].ingredient.id);
  96. }
  97. }
  98. if(data.ingredients.length === 0){
  99. for(let i = 0; i < merchant.ingredients.length; i++){
  100. data.ingredients.push(merchant.ingredients[i].ingredient.id);
  101. }
  102. }
  103. let loader = document.getElementById("loaderContainer");
  104. loader.style.display = "flex";
  105. fetch("/order", {
  106. method: "POST",
  107. headers: {
  108. "Content-Type": "application/json;charset=utf-8"
  109. },
  110. body: JSON.stringify(data)
  111. })
  112. .then((response) => response.json())
  113. .then((response)=>{
  114. if(typeof(response) === "string"){
  115. banner.createError(response);
  116. }else{
  117. let orderList = document.getElementById("orderList");
  118. let template = document.getElementById("order").content.children[0];
  119. while(orderList.children.length > 0){
  120. orderList.removeChild(orderList.firstChild);
  121. }
  122. for(let i = 0; i < response.length; i++){
  123. let orderDiv = template.cloneNode(true);
  124. let order = new Order(
  125. response[i]._id,
  126. response[i].name,
  127. response[i].date,
  128. response[i].ingredients,
  129. merchant
  130. );
  131. let cost = 0;
  132. for(let j = 0; j < order.ingredients.length; j++){
  133. cost += (order.ingredients[j].price / 100) * order.ingredients[j].quantity;
  134. }
  135. orderDiv.children[0].innerText = order.name;
  136. orderDiv.children[1].innerText = `${order.ingredients.length} items`;
  137. orderDiv.children[2].innerText = order.date.toLocaleDateString();
  138. orderDiv.children[3].innerText = `$${cost.toFixed(2)}`;
  139. orderDiv.onclick = ()=>{controller.openSidebar("orderDetails", order)};
  140. orderList.appendChild(orderDiv);
  141. }
  142. }
  143. })
  144. .catch((err)=>{
  145. banner.createError("UNABLE TO DISPLAY THE ORDERS");
  146. })
  147. .finally(()=>{
  148. loader.style.display = "none";
  149. });
  150. },
  151. toggleDropdown: function(dropdown){
  152. event.preventDefault();
  153. let polyline = dropdown.parentElement.children[0].children[1].children[0].children[0];
  154. if(dropdown.style.display === "none"){
  155. dropdown.style.display = "block";
  156. polyline.setAttribute("points", "18 15 12 9 6 15");
  157. }else{
  158. dropdown.style.display = "none";
  159. polyline.setAttribute("points", "6 9 12 15 18 9");
  160. }
  161. }
  162. }