1
0

Create Readouts controller

Move #readouts + #toggle_exposure from Measurements to Readouts
This commit is contained in:
cryptogopher 2021-05-08 01:02:57 +02:00
parent 40cce31bff
commit 7b2b855d56
13 changed files with 62 additions and 49 deletions

View File

@ -7,13 +7,9 @@ class MeasurementsController < ApplicationController
before_action :init_session_filters before_action :init_session_filters
before_action :find_project_by_project_id, only: [:index, :new, :create, :filter] before_action :find_project_by_project_id, only: [:index, :new, :create, :filter]
before_action :find_quantity_by_quantity_id, only: [:toggle_exposure]
before_action :find_measurement, only: [:edit, :update, :destroy, :retake] before_action :find_measurement, only: [:edit, :update, :destroy, :retake]
# @routine is set for :readouts view ONLY
before_action :find_measurement_routine, only: [:readouts, :toggle_exposure]
before_action :find_measurement_routine_by_measurement_routine_id, before_action :find_measurement_routine_by_measurement_routine_id,
only: [:new, :create, :edit, :update, :retake, :filter], only: [:new, :create, :edit, :update, :retake, :filter]
if: -> { params[:view] == 'readouts' }
before_action :authorize before_action :authorize
before_action :set_view_params before_action :set_view_params
@ -84,15 +80,6 @@ class MeasurementsController < ApplicationController
render :new render :new
end end
def readouts
prepare_readouts
end
def toggle_exposure
@routine.readout_exposures.toggle!(@quantity)
prepare_readouts
end
def filter def filter
session[:m_filters] = params.permit(:name, formula: [:code, :zero_nil]) session[:m_filters] = params.permit(:name, formula: [:code, :zero_nil])
prepare_items prepare_items
@ -141,12 +128,6 @@ class MeasurementsController < ApplicationController
.filter(session[:m_filters]) .filter(session[:m_filters])
end end
def prepare_readouts
@quantities = @routine.quantities.includes(:formula)
@measurements, @filter_q = @routine.measurements.includes(:routine, :source)
.filter(session[:m_filters], @quantities)
end
def set_view_params def set_view_params
@view_params = @view_params =
if @routine if @routine

View File

@ -0,0 +1,31 @@
class ReadoutsController < ApplicationController
layout 'body_tracking'
menu_item :body_trackers
helper :body_trackers
helper :measurements
include Concerns::Finders
before_action :find_measurement_routine_by_measurement_routine_id,
only: [:index, :toggle_exposure]
before_action :find_quantity_by_quantity_id, only: [:toggle_exposure]
before_action :authorize
def index
prepare_readouts
end
def toggle_exposure
@routine.readout_exposures.toggle!(@quantity)
prepare_readouts
end
private
def prepare_readouts
@quantities = @routine.quantities.includes(:formula)
@measurements, @filter_q = @routine.measurements.includes(:routine, :source)
.filter(session[:m_filters], @quantities)
end
end

View File

@ -22,6 +22,10 @@ module BodyTrackersHelper
t&.strftime("%R") t&.strftime("%R")
end end
def format_datetime(dt)
dt.strftime("%F <small>%R&emsp;(~#{time_ago_in_words(dt)} ago)</small>").html_safe
end
def toggle_exposure_options(enabled, domain = :all) def toggle_exposure_options(enabled, domain = :all)
enabled = enabled.map { |q| [q.name, q.id] } enabled = enabled.map { |q| [q.name, q.id] }
enabled_ids = enabled.map(&:last) enabled_ids = enabled.map(&:last)

View File

@ -1,10 +1,4 @@
module MeasurementsHelper module MeasurementsHelper
def format_datetime(m)
m.taken_at
.strftime("%F <small>%R&emsp;(~#{time_ago_in_words(m.taken_at)} ago)</small>")
.html_safe
end
def action_links(m) def action_links(m)
link_to(l(:button_retake), retake_measurement_path(m, @view_params), link_to(l(:button_retake), retake_measurement_path(m, @view_params),
{remote: true, class: "icon icon-reload"}) + {remote: true, class: "icon icon-reload"}) +

View File

@ -18,10 +18,10 @@
<% @measurements.each do |m| %> <% @measurements.each do |m| %>
<% next if m.new_record? %> <% next if m.new_record? %>
<tr id="measurement-<%= m.id %>" class="primary measurement"> <tr id="measurement-<%= m.id %>" class="primary measurement">
<td class="topleft unwrappable"><%= format_datetime(m) %></td> <td class="topleft unwrappable"><%= format_datetime(m.taken_at) %></td>
<td class="topleft"> <td class="topleft">
<div style="float:left;"> <div style="float:left;">
<%= link_to m.routine.name, readouts_measurement_routine_path(m.routine) %> <%= link_to m.routine.name, measurement_routine_readouts_path(m.routine) %>
</div> </div>
<div style="float:right;"> <div style="float:right;">
<small><%= " (#{pluralize(m.readouts.size, 'readout')})" %></small> <small><%= " (#{pluralize(m.readouts.size, 'readout')})" %></small>

View File

@ -1 +0,0 @@
$('#readouts').html('<%= j render partial: 'measurements/readouts' %>');

View File

@ -2,13 +2,13 @@
locals: {url: filter_project_measurements_path(@project, @view_params)} %> locals: {url: filter_project_measurements_path(@project, @view_params)} %>
<% if @measurements.any? %> <% if @measurements.any? %>
<%= render partial: 'measurements/options' %> <%= render partial: 'readouts/options' %>
<% formulas = @quantities.map { |q| q.formula } %> <% formulas = @quantities.collect(&:formula) %>
<% formulas.unshift(@filter_q.formula) if @filter_q %> <% formulas.unshift(@filter_q.formula) if @filter_q %>
<%= error_messages_for *formulas %> <%= error_messages_for *formulas %>
<table class="readouts list odd-even"> <table id="readouts" class="list odd-even">
<thead> <thead>
<tr> <tr>
<% total_width = 3 + @quantities.length %> <% total_width = 3 + @quantities.length %>
@ -17,7 +17,7 @@
<th style="width:<%= 100/total_width %>%" class="closable ellipsible"> <th style="width:<%= 100/total_width %>%" class="closable ellipsible">
<div style="float:right;position:relative;"> <div style="float:right;position:relative;">
<%= link_to '', <%= link_to '',
toggle_exposure_measurement_routine_path(@routine, quantity_id: q.id), measurement_routine_toggle_exposure_path(@routine, quantity_id: q.id),
{class: "icon icon-close", method: :post, remote: true} %> {class: "icon icon-close", method: :post, remote: true} %>
</div> </div>
<%= q.name %> <%= q.name %>
@ -34,7 +34,9 @@
<tr id="measurement-<%= measurement.id %>" class="primary <%= row_class %>"> <tr id="measurement-<%= measurement.id %>" class="primary <%= row_class %>">
<td class="topleft unwrappable" style="cursor: pointer;" <td class="topleft unwrappable" style="cursor: pointer;"
onclick="$(this).closest('tr').toggle(); $(this).closest('tr').nextUntil('tr.primary', '.measurement').toggle(); return false;"> onclick="$(this).closest('tr').toggle(); $(this).closest('tr').nextUntil('tr.primary', '.measurement').toggle(); return false;">
<span class="icon icon-bullet-closed"><%= format_datetime(measurement) %></span> <span class="icon icon-bullet-closed">
<%= format_datetime(measurement.taken_at) %>
</span>
</td> </td>
<% @quantities.each do |q| %> <% @quantities.each do |q| %>
<td class="primary right ellipsible"><%= format_value(readouts[q]) %></td> <td class="primary right ellipsible"><%= format_value(readouts[q]) %></td>
@ -50,7 +52,9 @@
end %> end %>
<td rowspan="<%= rows %>" class="topleft unwrappable" style="cursor: pointer;" <td rowspan="<%= rows %>" class="topleft unwrappable" style="cursor: pointer;"
onclick="$(this).closest('tr').prev('tr.primary').toggle(); $(this).closest('tr').prev('tr.primary').nextUntil('tr.primary', '.measurement').toggle(); return false;"> onclick="$(this).closest('tr').prev('tr.primary').toggle(); $(this).closest('tr').prev('tr.primary').nextUntil('tr.primary', '.measurement').toggle(); return false;">
<span class="icon icon-bullet-open"><%= format_datetime(measurement) %></span> <span class="icon icon-bullet-open">
<%= format_datetime(measurement.taken_at) %>
</span>
</td> </td>
<% @quantities.each do |q| %> <% @quantities.each do |q| %>
<td class="primary topleft ellipsible"> <td class="primary topleft ellipsible">

View File

@ -1,7 +1,7 @@
<fieldset id="options" class="collapsible"> <fieldset id="options" class="collapsible">
<legend onclick="toggleFieldset(this);"><%= l(:label_options) %></legend> <legend onclick="toggleFieldset(this);"><%= l(:label_options) %></legend>
<div> <div>
<%= form_tag toggle_exposure_measurement_routine_path(@routine, @view_params), <%= form_tag measurement_routine_toggle_exposure_path(@routine, @view_params),
id: 'toggle-exposure-form', name: 'toggle-exposure-form', id: 'toggle-exposure-form', name: 'toggle-exposure-form',
method: :post, remote: true do %> method: :post, remote: true do %>

View File

@ -7,6 +7,9 @@
<%= title [t("measurements.index.heading"), project_measurements_path(@project)], <%= title [t("measurements.index.heading"), project_measurements_path(@project)],
@routine.name %> @routine.name %>
<% if @routine.description? %>
<p class="subtitle" style='white-space: pre-wrap;'><%= @routine.description %></p>
<% end %>
<div id='readouts'> <div id='readouts'>
<%= render partial: 'measurements/readouts' %> <%= render partial: 'readouts/index' %>
</div> </div>

View File

@ -0,0 +1 @@
$('#readouts').html('<%= j render partial: 'readouts/index' %>');

View File

@ -1,16 +1,12 @@
<%#= render partial: 'measurements/filters',
locals: {url: filter_project_measurements_path(@project, @view_params)} %>
<% if @targets_by_date.any? %> <% if @targets_by_date.any? %>
<%= render partial: 'targets/options' %> <%= render partial: 'targets/options' %>
<% formulas = @quantities.map { |q| q.formula } %> <% formulas = @quantities.collect(&:formula) %>
<%# formulas.unshift(@filter_q.formula) if @filter_q %>
<%= error_messages_for *formulas %> <%= error_messages_for *formulas %>
<table id="targets" class="list odd-even"> <table id="targets" class="list odd-even">
<thead> <thead>
<% total_width = 3 + @quantities.length %> <% total_width = 2 + @quantities.length %>
<% header = quantities_table_header(@quantities) %> <% header = quantities_table_header(@quantities) %>
<% header.each_with_index do |row, i| %> <% header.each_with_index do |row, i| %>
<tr class="header"> <tr class="header">

View File

@ -27,10 +27,8 @@ resources :projects, shallow: true do
end end
resources :measurement_routines, only: [:show, :edit] do resources :measurement_routines, only: [:show, :edit] do
member do resources :readouts, only: [:index]
get 'readouts', controller: :measurements post 'toggle_exposure', controller: :readouts
post 'toggle_exposure', controller: :measurements
end
end end
resources :measurements, except: [:show] do resources :measurements, except: [:show] do
member do member do

View File

@ -19,7 +19,8 @@ Redmine::Plugin.register :body_tracking do
targets: [:index, :show], targets: [:index, :show],
meals: [:index], meals: [:index],
measurement_routines: [:show], measurement_routines: [:show],
measurements: [:index, :readouts, :filter], measurements: [:index, :filter],
readouts: [:index],
foods: [:index, :nutrients, :filter, :autocomplete], foods: [:index, :nutrients, :filter, :autocomplete],
sources: [:index], sources: [:index],
quantities: [:index, :parents, :filter], quantities: [:index, :parents, :filter],
@ -33,7 +34,8 @@ Redmine::Plugin.register :body_tracking do
meals: [:new, :create, :edit, :update, :destroy, :edit_notes, :update_notes, meals: [:new, :create, :edit, :update, :destroy, :edit_notes, :update_notes,
:toggle_eaten, :toggle_exposure, :adjust], :toggle_eaten, :toggle_exposure, :adjust],
measurement_routines: [:edit], measurement_routines: [:edit],
measurements: [:new, :create, :edit, :update, :destroy, :retake, :toggle_exposure], measurements: [:new, :create, :edit, :update, :destroy, :retake],
readouts: [:toggle_exposure],
foods: [:new, :create, :edit, :update, :destroy, :toggle, :toggle_exposure, foods: [:new, :create, :edit, :update, :destroy, :toggle, :toggle_exposure,
:import], :import],
sources: [:create, :destroy], sources: [:create, :destroy],