Last changes on Redmine 4.0
This commit is contained in:
parent
745e1f4264
commit
71bfc5a33a
@ -40,15 +40,6 @@ module Concerns::Finders
|
|||||||
render_404
|
render_404
|
||||||
end
|
end
|
||||||
|
|
||||||
def find_measurement
|
|
||||||
@measurement = Measurement.find(params[:id])
|
|
||||||
# DON'T set @routine here: @routine is a context for :readouts view (set
|
|
||||||
# elsewhere), not a # @measurement.routine
|
|
||||||
@project = @measurement.routine.project
|
|
||||||
rescue ActiveRecord::RecordNotFound
|
|
||||||
render_404
|
|
||||||
end
|
|
||||||
|
|
||||||
def find_measurement_routine(id = params[:id])
|
def find_measurement_routine(id = params[:id])
|
||||||
@routine = MeasurementRoutine.find(id)
|
@routine = MeasurementRoutine.find(id)
|
||||||
@project = @routine.project
|
@project = @routine.project
|
||||||
@ -60,6 +51,17 @@ module Concerns::Finders
|
|||||||
find_measurement_routine(params[:measurement_routine_id])
|
find_measurement_routine(params[:measurement_routine_id])
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def find_measurement(id = params[:id])
|
||||||
|
@measurement = Measurement.find(id)
|
||||||
|
@project = @measurement.routine.project
|
||||||
|
rescue ActiveRecord::RecordNotFound
|
||||||
|
render_404
|
||||||
|
end
|
||||||
|
|
||||||
|
def find_measurement_by_measurement_id
|
||||||
|
find_measurement(params[:measurement_id])
|
||||||
|
end
|
||||||
|
|
||||||
def find_quantity(id = params[:id])
|
def find_quantity(id = params[:id])
|
||||||
@quantity = Quantity.find(id)
|
@quantity = Quantity.find(id)
|
||||||
@project = @quantity.project
|
@project = @quantity.project
|
||||||
|
@ -9,7 +9,7 @@ class MeasurementsController < ApplicationController
|
|||||||
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_measurement, only: [:edit, :update, :destroy, :retake]
|
before_action :find_measurement, only: [:edit, :update, :destroy, :retake]
|
||||||
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, :filter]
|
||||||
before_action :authorize
|
before_action :authorize
|
||||||
before_action :set_view_params
|
before_action :set_view_params
|
||||||
|
|
||||||
|
@ -2,12 +2,12 @@ class ReadoutsController < ApplicationController
|
|||||||
layout 'body_tracking'
|
layout 'body_tracking'
|
||||||
menu_item :body_trackers
|
menu_item :body_trackers
|
||||||
helper :body_trackers
|
helper :body_trackers
|
||||||
helper :measurements
|
|
||||||
|
|
||||||
include Concerns::Finders
|
include Concerns::Finders
|
||||||
|
|
||||||
before_action :find_measurement_routine_by_measurement_routine_id,
|
before_action :find_measurement_routine_by_measurement_routine_id,
|
||||||
only: [:index, :toggle_exposure]
|
only: [:index, :toggle_exposure]
|
||||||
|
before_action :find_measurement_by_measurement_id, only: [:edit, :update]
|
||||||
before_action :find_quantity_by_quantity_id, only: [:toggle_exposure]
|
before_action :find_quantity_by_quantity_id, only: [:toggle_exposure]
|
||||||
before_action :authorize
|
before_action :authorize
|
||||||
|
|
||||||
@ -15,6 +15,22 @@ class ReadoutsController < ApplicationController
|
|||||||
prepare_readouts
|
prepare_readouts
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def edit
|
||||||
|
end
|
||||||
|
|
||||||
|
def update
|
||||||
|
if @measurement.update(measurement_params)
|
||||||
|
count = @measurement.readouts.target.count { |r| r.previous_changes.present? }
|
||||||
|
flash.now[:notice] = t('.success', count: count)
|
||||||
|
|
||||||
|
@routine = @measurement.routine
|
||||||
|
prepare_readouts
|
||||||
|
render :index
|
||||||
|
else
|
||||||
|
render :edit
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
def toggle_exposure
|
def toggle_exposure
|
||||||
@routine.readout_exposures.toggle!(@quantity)
|
@routine.readout_exposures.toggle!(@quantity)
|
||||||
prepare_readouts
|
prepare_readouts
|
||||||
@ -22,6 +38,21 @@ class ReadoutsController < ApplicationController
|
|||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
|
def measurement_params
|
||||||
|
params.require(:measurement).permit(
|
||||||
|
:notes,
|
||||||
|
:source_id,
|
||||||
|
readouts_attributes:
|
||||||
|
[
|
||||||
|
:id,
|
||||||
|
:quantity_id,
|
||||||
|
:value,
|
||||||
|
:unit_id,
|
||||||
|
:_destroy
|
||||||
|
]
|
||||||
|
)
|
||||||
|
end
|
||||||
|
|
||||||
def prepare_readouts
|
def prepare_readouts
|
||||||
@quantities = @routine.quantities.includes(:formula)
|
@quantities = @routine.quantities.includes(:formula)
|
||||||
|
|
||||||
|
@ -1,14 +1,8 @@
|
|||||||
module MeasurementsHelper
|
module MeasurementsHelper
|
||||||
def readout_markup(quantity, readout)
|
|
||||||
content = "#{' '*quantity.depth}#{quantity.name} #{format_amount(readout)}"
|
|
||||||
classes = 'bolded' if @routine.quantities.include?(quantity)
|
|
||||||
content_tag(:span, content, {class: classes}, false)
|
|
||||||
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),
|
||||||
{remote: true, class: "icon icon-reload"}) +
|
{remote: true, class: "icon icon-reload"}) +
|
||||||
link_to(l(:button_edit), edit_measurement_path(m, @view_params),
|
link_to(l(:button_edit), edit_measurement_path(m),
|
||||||
{remote: true, class: "icon icon-edit"}) +
|
{remote: true, class: "icon icon-edit"}) +
|
||||||
delete_link(measurement_path(m), {remote: true, data: {}})
|
delete_link(measurement_path(m), {remote: true, data: {}})
|
||||||
end
|
end
|
||||||
|
15
app/helpers/readouts_helper.rb
Normal file
15
app/helpers/readouts_helper.rb
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
module ReadoutsHelper
|
||||||
|
def readout_markup(quantity, readout)
|
||||||
|
content = "#{' '*quantity.depth}#{quantity.name} #{format_amount(readout)}"
|
||||||
|
classes = 'bolded' if @routine.quantities.include?(quantity)
|
||||||
|
content_tag(:span, content, {class: classes}, false)
|
||||||
|
end
|
||||||
|
|
||||||
|
def action_links(m)
|
||||||
|
link_to(l(:button_retake), retake_measurement_path(m),
|
||||||
|
{remote: true, class: "icon icon-reload"}) +
|
||||||
|
link_to(l(:button_edit), edit_measurement_readouts_path(m),
|
||||||
|
{remote: true, class: "icon icon-edit"}) +
|
||||||
|
delete_link(measurement_path(m), {remote: true, data: {}})
|
||||||
|
end
|
||||||
|
end
|
9
app/views/measurement_routines/_edit_form.html.erb
Normal file
9
app/views/measurement_routines/_edit_form.html.erb
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
<div id='measurement-routine-form'>
|
||||||
|
<% if @measurement.routine.persisted? %>
|
||||||
|
<%= render partial: 'measurement_routines/show_form',
|
||||||
|
locals: {routine: @measurement.routine} %>
|
||||||
|
<% else %>
|
||||||
|
<%= render partial: 'measurement_routines/form',
|
||||||
|
locals: {routine: @measurement.routine} %>
|
||||||
|
<% end %>
|
||||||
|
</div>
|
@ -1,13 +1,33 @@
|
|||||||
<div class="tabular">
|
<div id='measurement-routine-form' class="tabular">
|
||||||
<%= fields_for 'measurement[routine_attributes]', routine do |ff| %>
|
<%= fields_for :routine do |routine_f| %>
|
||||||
<%= ff.hidden_field :id %>
|
|
||||||
<p>
|
<p>
|
||||||
<label><%= l(:field_name) %><span class="required"> *</span></label>
|
<%= routine_f.select :id, options_from_collection_for_select(
|
||||||
<%= ff.text_field :name, required: true, style: "width: 95%;" %>
|
@project.measurement_routines, :id, :name, @routine.id),
|
||||||
</p>
|
{required: true}, autocomplete: 'off',
|
||||||
<p>
|
onchange: "var mr_id = $('#measurement_routine_attributes_id').val();
|
||||||
<label><%= l(:field_description) %></label>
|
$.ajax({
|
||||||
<%= ff.text_area :description, cols: 40, rows: 3, style: "width: 95%;" %>
|
url: '#{measurement_routine_path(id: :mr_id)}'.replace('mr_id', mr_id),
|
||||||
|
dataType: 'script'
|
||||||
|
});
|
||||||
|
return false;" %>
|
||||||
|
<%= link_to_if l(:button_edit), '#',
|
||||||
|
onclick: "var mr_id = $('#measurement_routine_attributes_id').val();
|
||||||
|
$.ajax({
|
||||||
|
url: '#{edit_measurement_routine_path(id: :mr_id)}'.replace('mr_id', mr_id),
|
||||||
|
dataType: 'script'
|
||||||
|
});
|
||||||
|
return false;",
|
||||||
|
class: 'icon icon-edit' %>
|
||||||
|
<%= link_to_if l(:button_cancel), '#', onclick: "cancel edit" %>
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
<% if @routine.persisted? %>
|
||||||
|
<% if @routine.description? %>
|
||||||
|
<p style='white-space: pre-wrap;' ><%= @routine.description %></p>
|
||||||
|
<% end %>
|
||||||
|
<% else %>
|
||||||
|
<p><%= routine_f.text_field :name, required: true, style: "width: 95%;" %></p>
|
||||||
|
<p><%= ff.text_area :description, cols: 40, rows: 3, style: "width: 95%;" %></p>
|
||||||
|
<% end %>
|
||||||
<% end %>
|
<% end %>
|
||||||
</div>
|
</div>
|
||||||
|
@ -1,8 +1,11 @@
|
|||||||
<%= labelled_form_for @measurement, url: measurement_path(@measurement, @view_params),
|
<%= labelled_form_for @measurement, url: measurement_path(@measurement),
|
||||||
method: :patch, remote: true,
|
method: :patch, remote: true,
|
||||||
html: {id: 'edit-measurement-form', name: 'edit-measurement-form'} do |measurement_f| %>
|
html: {id: 'edit-measurement-form', name: 'edit-measurement-form'} do |measurement_f| %>
|
||||||
|
|
||||||
<div class="box tabular">
|
<div class="box tabular">
|
||||||
|
<%= render partial: 'measurement_routines/form',
|
||||||
|
locals: {measurement_f: measurement_f} %>
|
||||||
|
<hr style="width: 95%;">
|
||||||
<%= render partial: 'measurements/form', locals: {measurement_f: measurement_f} %>
|
<%= render partial: 'measurements/form', locals: {measurement_f: measurement_f} %>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
@ -1,17 +1,5 @@
|
|||||||
<%= error_messages_for @measurement %>
|
<%= error_messages_for @measurement %>
|
||||||
|
|
||||||
<div id='measurement-routine-form'>
|
|
||||||
<% if @measurement.routine.persisted? %>
|
|
||||||
<%= render partial: 'measurement_routines/show_form',
|
|
||||||
locals: {routine: @measurement.routine} %>
|
|
||||||
<% else %>
|
|
||||||
<%= render partial: 'measurement_routines/form',
|
|
||||||
locals: {routine: @measurement.routine} %>
|
|
||||||
<% end %>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<hr style="width: 95%;">
|
|
||||||
|
|
||||||
<div class="splitcontent">
|
<div class="splitcontent">
|
||||||
<div class="splitcontentleft">
|
<div class="splitcontentleft">
|
||||||
<p>
|
<p>
|
||||||
|
@ -1,10 +1,10 @@
|
|||||||
<%= render partial: 'measurements/filters',
|
<%= render partial: 'measurements/filters',
|
||||||
locals: {url: filter_project_measurements_path(@project, @view_params)} %>
|
locals: {url: filter_project_measurements_path(@project, @view_params)} %>
|
||||||
|
|
||||||
<% if @measurements.any? { |m| m.persisted? } %>
|
<% if @measurements.any? %>
|
||||||
<%= error_messages_for @filter_q.formula if @filter_q %>
|
<%= error_messages_for @filter_q.formula if @filter_q %>
|
||||||
|
|
||||||
<table class="list">
|
<table id="measurements" class="list">
|
||||||
<thead>
|
<thead>
|
||||||
<tr>
|
<tr>
|
||||||
<th style="width:5%"><%= l(:field_taken_at_date) %></th>
|
<th style="width:5%"><%= l(:field_taken_at_date) %></th>
|
||||||
@ -16,8 +16,7 @@
|
|||||||
</thead>
|
</thead>
|
||||||
<tbody>
|
<tbody>
|
||||||
<% @measurements.each do |m| %>
|
<% @measurements.each do |m| %>
|
||||||
<% next if m.new_record? %>
|
<tr id="measurement-<%= m.id %>" class="measurement">
|
||||||
<tr id="measurement-<%= m.id %>" class="primary measurement">
|
|
||||||
<td class="topleft unwrappable"><%= format_datetime(m.taken_at) %></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;">
|
||||||
|
@ -1,8 +1,9 @@
|
|||||||
$('tr[id=measurement-<%= @measurement.id %>]').nextUntil('tr.primary', ':not(.measurement)')
|
$('tr[id=measurement-<%= @measurement.id %>]').nextUntil('tr.measurement')
|
||||||
.remove();
|
.remove().addBack().first().after(
|
||||||
var columns = $('table > thead > tr > th').length;
|
'<tr>' +
|
||||||
$('tr[id=measurement-<%= @measurement.id %>]').nextUntil('tr.primary').addBack().last().after(
|
'<td class="topleft symmetric"' +
|
||||||
'<tr><td class="form" colspan="'+columns+'"><div id="edit-measurement">' +
|
'colspan="'+$('table#measurements tr:first-child td').length+'">' +
|
||||||
'<%= j render partial: 'measurements/edit_form' %>' +
|
'<%= j render partial: 'measurements/edit_form' %>' +
|
||||||
'</div></td></tr>'
|
'</td>' +
|
||||||
|
'</tr>'
|
||||||
);
|
);
|
||||||
|
@ -1,5 +1 @@
|
|||||||
<% if @view_params[:view] == :index %>
|
$('#measurements').html('<%= j render partial: 'measurements/index' %>');
|
||||||
$('#measurements').html('<%= j render partial: 'measurements/index' %>');
|
|
||||||
<% else %>
|
|
||||||
$('#readouts').html('<%= j render partial: 'measurements/readouts' %>');
|
|
||||||
<% end %>
|
|
||||||
|
17
app/views/readouts/_edit_form.html.erb
Normal file
17
app/views/readouts/_edit_form.html.erb
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
<%= labelled_form_for @measurement, url: measurement_readouts_path(@measurement),
|
||||||
|
method: :patch, remote: true,
|
||||||
|
html: {id: 'edit-measurement-form', name: 'edit-measurement-form'} do |measurement_f| %>
|
||||||
|
|
||||||
|
<div class="box tabular">
|
||||||
|
<%= render partial: 'measurements/form', locals: {measurement_f: measurement_f} %>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="tabular">
|
||||||
|
<p>
|
||||||
|
<%= submit_tag l(:button_save) %>
|
||||||
|
<%= link_to l(:button_cancel), "#",
|
||||||
|
onclick: '$(this).closest("tr").nextUntil("tr.measurement", "tr.details").show()
|
||||||
|
.addBack().first().remove(); return false;' %>
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
<% end %>
|
9
app/views/readouts/edit.js.erb
Normal file
9
app/views/readouts/edit.js.erb
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
$('tr[id=measurement-<%= @measurement.id %>]').nextUntil('tr.measurement')
|
||||||
|
.remove('tr:not(.details)').hide().addBack().first().after(
|
||||||
|
'<tr>' +
|
||||||
|
'<td class="topleft symmetric"' +
|
||||||
|
'colspan="'+$('table#readouts tr:first-child td').length+'">' +
|
||||||
|
'<%= j render partial: 'readouts/edit_form' %>' +
|
||||||
|
'</td>' +
|
||||||
|
'</tr>'
|
||||||
|
);
|
1
app/views/readouts/index.js.erb
Normal file
1
app/views/readouts/index.js.erb
Normal file
@ -0,0 +1 @@
|
|||||||
|
$('#readouts').html('<%= j render partial: 'readouts/index' %>');
|
@ -124,11 +124,12 @@ en:
|
|||||||
other: "Created %{count} targets"
|
other: "Created %{count} targets"
|
||||||
update:
|
update:
|
||||||
success:
|
success:
|
||||||
|
zero: "Targets left unchanged"
|
||||||
one: "Successfully updated target"
|
one: "Successfully updated target"
|
||||||
other: "Successfully updated targets"
|
other: "Successfully updated %{count} targets"
|
||||||
destroy:
|
destroy:
|
||||||
success:
|
success:
|
||||||
one: "Deleted 1 target"
|
one: "Deleted target"
|
||||||
other: "Deleted %{count} targets"
|
other: "Deleted %{count} targets"
|
||||||
failure: "Some targets have not been deleted"
|
failure: "Some targets have not been deleted"
|
||||||
meals:
|
meals:
|
||||||
@ -158,6 +159,12 @@ en:
|
|||||||
heading_new_measurement: 'New measurement'
|
heading_new_measurement: 'New measurement'
|
||||||
index:
|
index:
|
||||||
heading: 'Measurements'
|
heading: 'Measurements'
|
||||||
|
readouts:
|
||||||
|
update:
|
||||||
|
success:
|
||||||
|
zero: "Successfully updated measurement"
|
||||||
|
one: "Successfully updated readout"
|
||||||
|
other: "Successfully updated %{count} readouts"
|
||||||
foods:
|
foods:
|
||||||
contextual:
|
contextual:
|
||||||
link_import_foods: 'Import'
|
link_import_foods: 'Import'
|
||||||
|
@ -30,7 +30,9 @@ resources :projects, shallow: true do
|
|||||||
resources :readouts, only: [:index]
|
resources :readouts, only: [:index]
|
||||||
post 'toggle_exposure', controller: :readouts
|
post 'toggle_exposure', controller: :readouts
|
||||||
end
|
end
|
||||||
|
# TODO: nest measurements inside routines?
|
||||||
resources :measurements, except: [:show] do
|
resources :measurements, except: [:show] do
|
||||||
|
resource :readouts, only: [:edit, :update]
|
||||||
member do
|
member do
|
||||||
get 'retake'
|
get 'retake'
|
||||||
end
|
end
|
||||||
|
2
init.rb
2
init.rb
@ -35,7 +35,7 @@ Redmine::Plugin.register :body_tracking do
|
|||||||
:toggle_eaten, :toggle_exposure, :adjust],
|
:toggle_eaten, :toggle_exposure, :adjust],
|
||||||
measurement_routines: [:edit],
|
measurement_routines: [:edit],
|
||||||
measurements: [:new, :create, :edit, :update, :destroy, :retake],
|
measurements: [:new, :create, :edit, :update, :destroy, :retake],
|
||||||
readouts: [:toggle_exposure],
|
readouts: [:edit, :update, :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],
|
||||||
|
Reference in New Issue
Block a user