orders.js 7.0 KB

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