Commit 2fae577

mo khan <mo@mokhan.ca>
2017-02-18 18:49:10
use chart.js instead of google charts.
1 parent 3ea15ef
Changed files (6)
app
spec
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