editWorkout.js 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. export default {
  2. rendered: false,
  3. workout: null,
  4. render: function(workout){
  5. this.workout = workout;
  6. document.querySelector("#editWorkoutPage h1").textContent = workout.name;
  7. this.displayExercises(workout.exercises);
  8. if(!this.rendered){
  9. this.buttons();
  10. this.rendered = true;
  11. }
  12. },
  13. buttons: function(){
  14. document.getElementById("editWorkoutBack").addEventListener("click", ()=>{changePage("home")});
  15. document.getElementById("editWorkoutAddExercise").addEventListener("click", ()=>{
  16. const container = document.getElementById("newExerciseContainer");
  17. container.style.display = "flex";
  18. container.querySelector("input").focus();
  19. });
  20. document.getElementById("newExerciseSubmit").addEventListener("click", this.addExercise.bind(this));
  21. document.getElementById("editWorkoutSubmit").addEventListener("click", this.submitWorkout.bind(this));
  22. },
  23. displayExercises: function(exercises){
  24. const container = document.getElementById("editWorkoutExercises");
  25. const template = document.getElementById("editWorkoutExercise").content.children[0];
  26. while(container.children.length > 0){
  27. container.removeChild(container.firstChild);
  28. }
  29. for(let i = 0; i < exercises.length; i++){
  30. const exercise = template.cloneNode(true);
  31. exercise.setAttribute("data-id", exercises[i]._id);
  32. exercise.querySelector("p").textContent = exercises[i].name;
  33. exercise.querySelector(".editWorkoutDelete").addEventListener("click", ()=>{
  34. container.removeChild(exercise);
  35. });
  36. exercise.querySelector(".workoutMoveUp").addEventListener("click", (e)=>{
  37. this.moveExercise(e.target.parentElement.parentElement, true);
  38. });
  39. exercise.querySelector(".workoutMoveDown").addEventListener("click", (e)=>{
  40. this.moveExercise(e.target.parentElement.parentElement, false);
  41. });
  42. container.appendChild(exercise);
  43. }
  44. },
  45. moveExercise: function(elem, moveUp){
  46. const otherElem = moveUp ? elem.previousElementSibling : elem.nextElementSibling;
  47. if(moveUp){
  48. elem.parentElement.insertBefore(elem, otherElem);
  49. }else{
  50. elem.parentElement.insertBefore(otherElem, elem);
  51. }
  52. },
  53. addExercise: function(){
  54. const container = document.getElementById("editWorkoutExercises");
  55. const template = document.getElementById("editWorkoutExercise").content.children[0];
  56. const input = document.getElementById("newExerciseInput");
  57. if(input.value === ""){
  58. notify("error", "Exercise must have a name");
  59. return;
  60. }
  61. const exercise = template.cloneNode(true);
  62. exercise.querySelector("p").textContent = input.value;
  63. exercise.querySelector(".editWorkoutDelete").addEventListener("click", ()=>{
  64. container.removeChild(exercise);
  65. });
  66. exercise.querySelector(".workoutMoveUp").addEventListener("click", (e)=>{
  67. this.moveExercise(e.target.parentElement.parentElement, true);
  68. });
  69. exercise.querySelector(".workoutMoveDown").addEventListener("click", (e)=>{
  70. this.moveExercise(e.target.parentElement.parentElement, true);
  71. });
  72. container.appendChild(exercise);
  73. input.value = "";
  74. document.getElementById("newExerciseContainer").style.display = "none";
  75. },
  76. submitWorkout: function(){
  77. const container = document.getElementById("editWorkoutExercises");
  78. const existingExercises = [];
  79. for(let i = 0; i < container.children.length; i++){
  80. const item = container.children[i];
  81. const exerciseId = item.getAttribute("data-id");
  82. if(exerciseId){
  83. existingExercises.push({id: exerciseId});
  84. }else{
  85. existingExercises.push({
  86. new: item.querySelector("p").textContent,
  87. type: "weights"
  88. });
  89. }
  90. }
  91. fetch(`/workout/${this.workout.id}`, {
  92. method: "PUT",
  93. headers: {
  94. "Content-Type": "application/json"
  95. },
  96. body: JSON.stringify({existingExercises: existingExercises})
  97. })
  98. .then(r=>r.json())
  99. .then((response)=>{
  100. if(response.error){
  101. notify("error", response.error.message);
  102. }else{
  103. notify("success", "Workout updated");
  104. changePage("home", {
  105. type: "replace",
  106. workout: response
  107. });
  108. }
  109. })
  110. .catch((err)=>{
  111. notify("error", "ERROR: unable to save workout");
  112. });
  113. }
  114. }