orders.js 7.7 KB

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