Commit 2fae577
Changed files (6)
app
assets
javascripts
controllers
models
views
layouts
workouts
spec
models
app/assets/javascripts/application.js
@@ -18,6 +18,8 @@
//= require ractive
//= require backbone
//= require ractive-backbone
+//= require Chart.bundle
+//= require chartkick
//= require_self
//= require_tree .
//= require turbolinks
app/controllers/charts_controller.rb
@@ -3,14 +3,28 @@ class ChartsController < ApplicationController
exercise = Exercise.find_by(id: params[:exercise])
respond_to do |format|
format.js { @training_history = current_user.history_for(exercise) }
- format.json { render json: recent_workouts(exercise).to_line_chart }
+ #format.json { render json: recent_workouts(exercise).to_line_chart }
+ format.json { render json: rolled_up_sets(exercise || Exercise.primary).chart_json }
end
+
end
private
- def recent_workouts(exercise, since = (params[:since] || 7.days).to_i.seconds.ago)
- workouts = current_user.workouts.since(since.beginning_of_day).recent
- exercise ? workouts.with_exercise(exercise) : workouts
+ #def recent_workouts(exercise, since = (params[:since] || 7.days).to_i.seconds.ago)
+ #workouts = current_user.workouts.since(since.beginning_of_day).recent
+ #exercise ? workouts.with_exercise(exercise) : workouts
+ #end
+
+ def rolled_up_sets(exercise, since = (params[:since] || 7.days).to_i.seconds.ago)
+ ExerciseSet
+ .joins(:exercise)
+ .where(exercise: exercise)
+ .where('workouts.occurred_at > ?', since.beginning_of_day)
+ .where.not(target_weight: nil)
+ .group('exercises.name')
+ .joins(:workout)
+ .group('workouts.occurred_at')
+ .maximum(:target_weight)
end
end
app/models/workout.rb
@@ -15,7 +15,7 @@ class Workout < ApplicationRecord
joins(:exercises).where(exercises: { id: exercise.id }).distinct
end
scope :to_line_chart, -> do
- joins(:exercise_sets).group(:occurred_at).recent.maximum(:target_weight)
+ joins(:exercise_sets).group(:occurred_at).recent.maximum('exercise_sets.target_weight')
end
def train(exercise, target_weight, repetitions:, set: nil)
app/views/layouts/application.html.erb
@@ -8,7 +8,6 @@
<title><%= t('.title') %> <%= content_for?(:title) ? "| #{yield(:title)}" : "" %></title>
<%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track': 'reload' %>
<%= javascript_include_tag 'application', 'data-turbolinks-track': 'reload' %>
- <%= javascript_include_tag "https://www.google.com/jsapi", "chartkick" %>
<%= javascript_include_tag "https://maps.googleapis.com/maps/api/js?key=#{ENV['GOOGLE_MAPS_API_KEY']}" %>
<%= yield(:head) %>
</head>
app/views/workouts/index.html.erb
@@ -30,9 +30,9 @@
<div class="level-right">
<p class="level-item">
<% if @exercise.nil? %>
- <strong> <%= link_to 'All', workouts_path(filter_params_hash) %> </strong>
+ <strong> <%= link_to 'All', workouts_path(filter_params_hash(exercise: nil)) %> </strong>
<% else %>
- <%= link_to 'All', workouts_path(filter_params_hash) %>
+ <%= link_to 'All', workouts_path(filter_params_hash(exercise: nil)) %>
<% end %>
</p>
<% @primary_exercises.each do |exercise| %>
@@ -49,13 +49,11 @@
</nav>
</div>
</div>
- <% if @exercise %>
- <div class="columns">
- <div class="column is-12">
- <%= line_chart charts_path(filter_params_hash) %>
- </div>
+ <div class="columns">
+ <div class="column is-12">
+ <%= line_chart charts_path(filter_params_hash), download: true %>
</div>
- <% end %>
+ </div>
<div class="columns">
<div class="column is-12">
spec/models/workout_spec.rb
@@ -114,9 +114,14 @@ describe Workout, type: :model do
describe ".to_line_chart" do
let(:routine) { subject.routine }
let(:squat) { create(:exercise) }
+ let(:bench_press) { create(:exercise) }
- it 'returns a single series' do
+ before :each do
routine.add_exercise(squat)
+ routine.add_exercise(bench_press)
+ end
+
+ it 'returns a single series' do
subject.train(squat, 315, repetitions: 5)
subject.reload
@@ -124,5 +129,16 @@ describe Workout, type: :model do
subject.occurred_at => 315.0
})
end
+
+ it 'returns multiple series' do
+ subject.train(squat, 315, repetitions: 5)
+ subject.train(bench_press, 210, repetitions: 5)
+ subject.reload
+
+ expect(described_class.to_line_chart).to match_array([
+ { name: squat.name, data: { subject.occurred_at => 315.0 } },
+ { name: bench_press.name, data: { subject.occurred_at => 210.0 } },
+ ])
+ end
end
end