orders.js 8.0 KB

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