Commit 25a2811
Changed files (12)
app
assets
javascripts
controllers
views
profiles
training_sessions
spec
controllers
javascripts
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')