workoutMenu.js 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  1. export default {
  2. render: function(workout){
  3. document.getElementById("workoutMenuTitle").textContent = workout.name;
  4. this.buttons(workout);
  5. },
  6. buttons: function(workout){
  7. const container = document.getElementById("workoutMenuButtons");
  8. while(container.children.length > 0){
  9. container.removeChild(container.firstChild);
  10. }
  11. const start = document.createElement("button");
  12. start.classList.add("button");
  13. start.textContent = "Start Workout";
  14. start.addEventListener("click", ()=>{
  15. const existingWorkout = localStorage.getItem(workout.id);
  16. if(existingWorkout === null){
  17. changePage("session", workout);
  18. }else{
  19. const container = document.getElementById("resumeWorkoutContainer");
  20. container.style.display = "flex";
  21. this.addResumeButtons(container, workout);
  22. }
  23. });
  24. container.appendChild(start);
  25. const history = document.createElement("button");
  26. history.classList.add("button");
  27. history.textContent = "Workout History";
  28. history.addEventListener("click", ()=>{changePage("sessionHistory", workout)});
  29. container.appendChild(history);
  30. const edit = document.createElement("button");
  31. edit.classList.add("button");
  32. edit.textContent = "Edit Workout";
  33. edit.addEventListener("click", ()=>{changePage("editWorkout", workout)});
  34. container.appendChild(edit);
  35. const remove = document.createElement("button");
  36. remove.classList.add("button");
  37. remove.textContent = "Delete Workout";
  38. remove.addEventListener("click", ()=>{this.showDeleteModal(workout)});
  39. container.appendChild(remove);
  40. const back = document.createElement("button");
  41. back.classList.add("button");
  42. back.textContent = "Back";
  43. back.addEventListener("click", ()=>{changePage("home")});
  44. container.appendChild(back);
  45. },
  46. addResumeButtons: function(container, workout){
  47. const buttons = container.querySelectorAll("button");
  48. for(let i = 0; i < buttons.length; i++){
  49. buttons[i].parentElement.removeChild(buttons[i]);
  50. }
  51. const finish = document.createElement("button");
  52. finish.classList.add("button");
  53. finish.textContent = "Save Previous and Start New";
  54. finish.addEventListener("click", ()=>{this.finish(workout)});
  55. container.appendChild(finish);
  56. const discard = document.createElement("button");
  57. discard.classList.add("button");
  58. discard.textContent = "Discard Previous and Start New";
  59. discard.addEventListener("click", ()=>{this.discard(workout)});
  60. container.appendChild(discard);
  61. const resume = document.createElement("button");
  62. resume.classList.add("button");
  63. resume.textContent = "Resume Previous Workout";
  64. resume.addEventListener("click", ()=>{this.resume(workout)});
  65. container.appendChild(resume);
  66. const cancel = document.createElement("button");
  67. cancel.classList.add("button");
  68. cancel.textContent = "Cancel";
  69. cancel.addEventListener("click", this.cancel);
  70. container.appendChild(cancel);
  71. },
  72. finish: function(workout){
  73. const session = JSON.parse(localStorage.getItem(workout.id));
  74. session.end = new Date();
  75. fetch("/session", {
  76. method: "POST",
  77. headers: {
  78. "Content-Type": "application/json"
  79. },
  80. body: JSON.stringify(session)
  81. })
  82. .then(r=>r.json())
  83. .then((response)=>{
  84. if(response.error){
  85. notify("error", response.error.message);
  86. }else{
  87. notify("success", "Workout saved");
  88. }
  89. localStorage.removeItem(workout.id);
  90. document.getElementById("resumeWorkoutContainer").style.display = "none";
  91. changePage("session", workout);
  92. })
  93. .catch((err)=>{
  94. notify("error", "ERROR: unable to start workout");
  95. });
  96. },
  97. discard: function(workout){
  98. localStorage.removeItem(workout.id);
  99. document.getElementById("resumeWorkoutContainer").style.display = "none";
  100. changePage("session", workout);
  101. },
  102. resume: function(workout){
  103. document.getElementById("resumeWorkoutContainer").style.display = "none";
  104. changePage("session", workout);
  105. },
  106. cancel: function(){
  107. document.getElementById("resumeWorkoutContainer").style.display = "none";
  108. },
  109. showDeleteModal: function(workout){
  110. const modal = document.getElementById("deleteWorkoutModal");
  111. const buttons = modal.querySelectorAll("button");
  112. for(let i = 0; i < buttons.length; i++){
  113. buttons[i].parentElement.removeChild(buttons[i]);
  114. }
  115. const cancel = document.createElement("button");
  116. cancel.classList.add("button");
  117. cancel.textContent = "Cancel";
  118. cancel.addEventListener("click", ()=>{modal.style.display = "none"});
  119. modal.appendChild(cancel);
  120. const confirm = document.createElement("button");
  121. confirm.classList.add("dangerButton");
  122. confirm.textContent = "Delete Workout";
  123. confirm.addEventListener("click", ()=>{this.delete(workout)});
  124. modal.appendChild(confirm);
  125. modal.style.display = "flex";
  126. },
  127. delete: function(workout){
  128. fetch(`/workout/${workout.id}`, {
  129. method: "DELETE",
  130. headers: {
  131. "Content-Type": "application/json"
  132. }
  133. })
  134. .then(r=>r.json())
  135. .then((response)=>{
  136. if(response.error){
  137. notify("error", response.error.message);
  138. }else{
  139. changePage("home", {
  140. type: "remove",
  141. workout: workout.id
  142. });
  143. }
  144. })
  145. .catch((err)=>{
  146. notify("error", "ERROR: unable to delete the workout");
  147. });
  148. document.getElementById("resumeWorkoutContainer").style.display = "none";
  149. }
  150. }