Commit 25a2811

mo khan <mo@mokhan.ca>
2016-06-07 03:00:31
record completion of each exercise.
1 parent 5443ec8
app/assets/javascripts/templates/exercise_view.ractive
@@ -0,0 +1,20 @@
+<div class="panel small-12 columns">
+  <div class="row">
+    <div class="small-6 columns">
+      {{name}}
+    </div>
+    <div class="small-6 columns">
+      <p class="text-right">
+      {{sets}}x{{repetitions}} {{target_weight}}lb
+      </p>
+    </div>
+  </div>
+
+  <div class="row">
+    <div class="small-12 columns">
+    {{#each reps}}
+      <button on-click="updateProgress" class="button small round {{status}}">{{completed}}</button>
+    {{/each}}
+    </div>
+  </div>
+</div>
app/assets/javascripts/templates/training_session_view.ractive
@@ -1,5 +1,5 @@
 <div class="row">
-  {{#each exercises}}
+  {{#each training_session.exercises}}
   <div class="panel small-12 columns">
     <div class="row">
       <div class="small-6 columns">
@@ -12,13 +12,27 @@
       </div>
     </div>
 
-    <div class="row">
-      <div class="small-12 columns">
-      {{#each reps}}
-        <button on-click="updateProgress" class="button small round {{status}}">{{completed}}</button>
-      {{/each}}
+    {{#if completed}}
+      <div class="row">
+        <div class="small-12 columns">
+          Good Work!
+        </div>
       </div>
-    </div>
+    {{else}}
+      <div class="row">
+        <div class="small-12 columns">
+        {{#each reps}}
+          <button on-click="updateProgress" class="button small round {{status}}">{{completed}}</button>
+        {{/each}}
+        </div>
+      </div>
+      <div class="row">
+        <div class="small-12 columns">
+          <button on-click="completeExercise">Done</button>
+        </div>
+      </div>
+    {{/if}}
+
   </div>
   {{/each}}
 </div>
app/assets/javascripts/views/exercise_view.js.coffee
@@ -0,0 +1,10 @@
+#= require templates/exercise_view
+class Stronglifters.ExerciseView extends Ractive
+  template: RactiveTemplates["templates/exercise_view"]
+  data:
+    name: ''
+    sets: 5
+    repeitions: 5
+    target_weight: 100
+    reps: [ ]
+
app/assets/javascripts/views/training_session_view.js.coffee
@@ -3,7 +3,8 @@ class Stronglifters.TrainingSessionView extends Ractive
 
   oninit: ->
     @on 'updateProgress', (event) -> @updateProgress(event)
-    @observe 'exercises.*.reps.*', (newValue, oldValue, keypath) ->
+    @on 'completeExercise', (event) -> @completeExercise(event.context)
+    @observe 'training_session.exercises.*.reps.*', (newValue, oldValue, keypath) ->
       @refreshStatus(newValue, oldValue, keypath)
 
   updateProgress: (event) ->
@@ -21,3 +22,23 @@ class Stronglifters.TrainingSessionView extends Ractive
       @set("#{keyPath}.status", "success")
     else
       @set("#{keyPath}.status", "alert")
+
+  completeExercise: (exercise) ->
+    payload =
+      training_session:
+        exercise_id: exercise.id
+        weight: exercise.target_weight
+        sets: _.map exercise.reps, (rep) ->
+          rep.completed
+
+    $.ajax
+      url: "/training_sessions/#{@get('training_session.id')}",
+      dataType: 'json',
+      type: 'patch',
+      contentType: 'application/json',
+      data: JSON.stringify(payload),
+      success: (gym, statux, xhr) =>
+        exercise.completed = true
+        @updateModel()
+      error: (xhr, status, error) ->
+        console.log(error)
app/controllers/training_sessions_controller.rb
@@ -34,13 +34,12 @@ class TrainingSessionsController < ApplicationController
     secure_params = params.
       require(:training_session).
       permit(:exercise_id, :weight, sets: [])
-    training_session = current_user.training_sessions.find(params[:id])
-    training_session.train(
+    @training_session = current_user.training_sessions.find(params[:id])
+    @training_session.train(
       Exercise.find(secure_params[:exercise_id]),
       secure_params[:weight],
       secure_params[:sets]
     )
-    render nothing: true
   end
 
   def upload
app/views/profiles/edit.html.erb
@@ -35,5 +35,10 @@
 <%= render partial: "home_gym_modal", locals: { id: 'homeGymModal' } %>
 
 <script type="text/javascript" charset="utf-8">
-new Stronglifters.HomeGym({ el: 'gym-search', data: { city: '<%= current_session.location.try(:city) %>'} })
+window.currentView = new Stronglifters.HomeGym({
+  el: 'gym-search',
+  data: function() {
+    return { city: '<%= current_session.location.try(:city) %>' };
+  }
+})
 </script>
app/views/training_sessions/_edit.json.jbuilder
@@ -1,13 +1,3 @@
-json.id training_session.id
-json.body_weight training_session.body_weight
-json.workout_name training_session.workout.name
-json.exercises training_session.workout.exercise_workouts do |exercise|
-  json.name exercise.name
-  json.sets exercise.sets
-  json.repetitions exercise.repetitions
-  json.reps training_session.progress_for(exercise).try(:sets) || exercise.sets.times.map { |x| 0 } do |completed_reps|
-    json.target exercise.repetitions
-    json.completed completed_reps
-  end
-  json.target_weight current_user.next_weight_for(exercise.exercise)
+json.training_session do
+  json.partial! 'training_session', training_session: training_session
 end
app/views/training_sessions/_training_session.jbuilder
@@ -0,0 +1,14 @@
+json.id training_session.id
+json.body_weight training_session.body_weight
+json.workout_name training_session.workout.name
+json.exercises training_session.workout.exercise_workouts do |exercise|
+  json.id exercise.exercise.id
+  json.name exercise.name
+  json.sets exercise.sets
+  json.repetitions exercise.repetitions
+  json.reps training_session.progress_for(exercise.exercise).sets do |completed_reps|
+    json.target exercise.repetitions
+    json.completed completed_reps.to_i
+  end
+  json.target_weight current_user.next_weight_for(exercise.exercise)
+end
app/views/training_sessions/edit.html.erb
@@ -10,6 +10,8 @@
 var json = <%= raw render partial: 'edit.json.jbuilder', locals: { training_session: @training_session } %>;
 window.currentView = new Stronglifters.TrainingSessionView({
   el: 'training-session-view',
-  data: json
+  data: function() {
+    return json;
+  }
 })
 </script>
app/views/training_sessions/update.json.jbuilder
@@ -0,0 +1,3 @@
+json.training_session do
+  json.partial! 'training_session', training_session: @training_session
+end
spec/controllers/training_sessions_controller_spec.rb
@@ -113,10 +113,10 @@ describe TrainingSessionsController do
         workout_id: workout_b.id,
         body_weight: body_weight
       }
-      expect(response.status).to eql(200)
       expect(user.reload.training_sessions.count).to eql(1)
       expect(user.last_workout).to eql(workout_b)
       expect(user.training_sessions.last.body_weight).to eql(body_weight.to_f)
+      expect(response).to redirect_to(edit_training_session_path(user.training_sessions.last))
     end
   end
 
@@ -134,7 +134,7 @@ describe TrainingSessionsController do
     let(:training_session) { create(:training_session, user: user, workout: workout_a) }
 
     it "records the exercise" do
-      patch :update, id: training_session.id, training_session: {
+      xhr :patch, :update, id: training_session.id, training_session: {
         exercise_id: squat.id,
         weight: 315,
         sets: [5, 5, 5],
spec/javascripts/views/training_session_view_spec.js.coffee
@@ -6,49 +6,50 @@ describe "TrainingSessionView", ->
       el: @el,
       data: ->
         {
-          id: "1",
-          body_weight: 225,
-          workout_name: "A",
-          exercises: [{
+          training_session:
+            id: "1",
+            body_weight: 225,
+            workout_name: "A",
+            exercises: [{
               name: 'Squat',
               sets: 3,
               repetitions: 5,
               reps: [{target: 5, completed: 0}, {target: 5, completed: 1},{target: 5, completed: 2}]
               target_weight: 315,
-          }]
+            }]
         }
     )
 
   it "has one exercise", ->
-    @subject.get('exercises')
-    expect(@subject.get('exercises').length).toEqual(1)
+    @subject.get('training_session.exercises')
+    expect(@subject.get('training_session.exercises').length).toEqual(1)
 
   it "indicates no progress recorded", ->
-    result = @subject.get('exercises.0.reps.0.status')
+    result = @subject.get('training_session.exercises.0.reps.0.status')
     expect(result).toEqual('secondary')
 
   describe "updating progress", ->
     describe "when no reps are completed", ->
       it "sets the reps to the target", ->
         @el.find('button').first().trigger('click')
-        result = @subject.get('exercises.0.reps.0.completed')
+        result = @subject.get('training_session.exercises.0.reps.0.completed')
         expect(result).toEqual(5)
 
       it "indicates a successful set", ->
         @el.find('button').first().trigger('click')
-        result = @subject.get('exercises.0.reps.0.status')
+        result = @subject.get('training_session.exercises.0.reps.0.status')
         expect(result).toEqual('success')
 
     describe "when at least one rep is completed", ->
       beforeEach ->
-        @subject.set('exercises.0.reps.0.completed', 5)
+        @subject.set('training_session.exercises.0.reps.0.completed', 5)
 
       it 'decrements the count', ->
         @el.find('button').first().trigger('click')
-        result = @subject.get('exercises.0.reps.0.completed')
+        result = @subject.get('training_session.exercises.0.reps.0.completed')
         expect(result).toEqual(4)
 
       it "indicates a failed set", ->
         @el.find('button').first().trigger('click')
-        result = @subject.get('exercises.0.reps.0.status')
+        result = @subject.get('training_session.exercises.0.reps.0.status')
         expect(result).toEqual('alert')