orders.js 8.5 KB

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