Measurement improvements
Added 'new' action. Separated js views for new/create/edit. Displaying taken_at in local time. Fixed readout destruction on edit.
This commit is contained in:
parent
65d811d9fb
commit
681c0279fb
@ -1,33 +1,31 @@
|
|||||||
class MeasurementsController < ApplicationController
|
class MeasurementsController < ApplicationController
|
||||||
menu_item :body_trackers
|
menu_item :body_trackers
|
||||||
|
|
||||||
before_action :find_project_by_project_id, only: [:index, :create]
|
before_action :find_project_by_project_id, only: [:index, :new, :create]
|
||||||
before_action :find_measurement, only: [:edit, :update, :destroy, :retake]
|
before_action :find_measurement, only: [:edit, :update, :destroy, :retake]
|
||||||
before_action :authorize
|
before_action :authorize
|
||||||
|
|
||||||
def index
|
def index
|
||||||
|
prepare_measurements
|
||||||
|
end
|
||||||
|
|
||||||
|
def new
|
||||||
@measurement = @project.measurements.new
|
@measurement = @project.measurements.new
|
||||||
@measurement.readouts.new
|
@measurement.readouts.new
|
||||||
|
|
||||||
prepare_measurements
|
|
||||||
@measurements << @measurement
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def create
|
def create
|
||||||
@measurement = @project.measurements.new(measurement_params)
|
@measurement = @project.measurements.new(measurement_params)
|
||||||
if @measurement.save
|
if @measurement.save
|
||||||
flash[:notice] = 'Created new measurement'
|
flash[:notice] = 'Created new measurement'
|
||||||
redirect_to :back
|
|
||||||
else
|
|
||||||
prepare_measurements
|
prepare_measurements
|
||||||
|
else
|
||||||
@measurement.readouts.new if @measurement.readouts.empty?
|
@measurement.readouts.new if @measurement.readouts.empty?
|
||||||
render :index
|
render :new
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def edit
|
def edit
|
||||||
prepare_measurements
|
|
||||||
render :index
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def update
|
def update
|
||||||
|
@ -10,7 +10,9 @@ class Measurement < ActiveRecord::Base
|
|||||||
# Readout quantity_id + unit_id uniqueness validation. Cannot be effectively
|
# Readout quantity_id + unit_id uniqueness validation. Cannot be effectively
|
||||||
# checked on Readout model level.
|
# checked on Readout model level.
|
||||||
validate do
|
validate do
|
||||||
quantities = self.readouts.map { |r| [r.quantity_id, r.unit_id] }
|
quantities = self.readouts.map do |r|
|
||||||
|
[r.quantity_id, r.unit_id] unless r.marked_for_destruction?
|
||||||
|
end
|
||||||
if quantities.length != quantities.uniq.length
|
if quantities.length != quantities.uniq.length
|
||||||
errors.add(:readouts, :duplicated_quantity_unit_pair)
|
errors.add(:readouts, :duplicated_quantity_unit_pair)
|
||||||
end
|
end
|
||||||
@ -31,14 +33,14 @@ class Measurement < ActiveRecord::Base
|
|||||||
end
|
end
|
||||||
|
|
||||||
def taken_at_date
|
def taken_at_date
|
||||||
self.taken_at
|
self.taken_at.getlocal
|
||||||
end
|
end
|
||||||
def taken_at_date=(value)
|
def taken_at_date=(value)
|
||||||
self.taken_at = Time.parse(value, self.taken_at)
|
self.taken_at = Time.parse(value, self.taken_at)
|
||||||
end
|
end
|
||||||
|
|
||||||
def taken_at_time
|
def taken_at_time
|
||||||
self.taken_at
|
self.taken_at.getlocal
|
||||||
end
|
end
|
||||||
def taken_at_time=(value)
|
def taken_at_time=(value)
|
||||||
self.taken_at = Time.parse(value, self.taken_at)
|
self.taken_at = Time.parse(value, self.taken_at)
|
||||||
|
15
app/views/measurements/_edit_form.html.erb
Normal file
15
app/views/measurements/_edit_form.html.erb
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
<%= labelled_form_for @measurement,
|
||||||
|
url: measurement_path(@measurement),
|
||||||
|
method: :patch, remote: true,
|
||||||
|
html: {id: 'measurement-edit-form', name: 'measurement-edit-form'} do |f| %>
|
||||||
|
|
||||||
|
<%= render partial: 'measurements/form', locals: {f: f} %>
|
||||||
|
|
||||||
|
<div class="tabular">
|
||||||
|
<p>
|
||||||
|
<%= submit_tag l(:button_save) %>
|
||||||
|
<%= link_to l(:button_cancel), "#",
|
||||||
|
onclick: '$(this).closest("tr").remove(); return false;' %>
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
<% end %>
|
@ -6,7 +6,7 @@
|
|||||||
<p><%= f.text_field :name, size: 40, required: true %></p>
|
<p><%= f.text_field :name, size: 40, required: true %></p>
|
||||||
<p>
|
<p>
|
||||||
<%= f.date_field :taken_at_date, required: true %>
|
<%= f.date_field :taken_at_date, required: true %>
|
||||||
<%= f.time_field :taken_at_time, value: @measurement.taken_at.strftime("%H:%M"),
|
<%= f.time_field :taken_at_time, value: @measurement.taken_at.getlocal.strftime("%R"),
|
||||||
required: true, label: '' %>
|
required: true, label: '' %>
|
||||||
</p>
|
</p>
|
||||||
<% @measurement.readouts.each_with_index do |r, index| %>
|
<% @measurement.readouts.each_with_index do |r, index| %>
|
||||||
@ -26,35 +26,35 @@
|
|||||||
<% end %>
|
<% end %>
|
||||||
<% end %>
|
<% end %>
|
||||||
<p>
|
<p>
|
||||||
<%= link_to t(".button_add_readout"), '#', class: 'icon icon-add',
|
<%= link_to t(".button_new_readout"), '#', class: 'icon icon-add',
|
||||||
onclick: 'addReadout(); return false;' %>
|
onclick: 'newReadout(); return false;' %>
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<%= javascript_tag do %>
|
<%= javascript_tag do %>
|
||||||
function addReadout() {
|
function newReadout() {
|
||||||
var row = $('p.readout:visible:last');
|
var form = $(event.target).closest('form');
|
||||||
|
var row = form.find('p.readout:visible:last');
|
||||||
var new_row = row.clone().insertAfter(row);
|
var new_row = row.clone().insertAfter(row);
|
||||||
new_row.find('input[id$=__id], input[id$=__value], select[id$=_quantity__id]').val('');
|
new_row.find('input[id$=__id], input[id$=__value], select[id$=_quantity__id]').val('');
|
||||||
new_row.find('select[id$=__unit_id]').val(row.find('select[id$=__unit_id]').val());
|
new_row.find('select[id$=__unit_id]').val(row.find('select[id$=__unit_id]').val());
|
||||||
new_row.find('input[id$=__destroy]').val('false');
|
new_row.find('input[id$=__destroy]').val('');
|
||||||
new_row.find('label:first').text('');
|
new_row.find('label:first').hide();
|
||||||
if ($('p.readout:visible').length > 1) {
|
form.find('p.readout:visible a.icon-del').show();
|
||||||
$('p.readout a.icon-del').show();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function deleteReadout() {
|
function deleteReadout() {
|
||||||
|
var form = $(event.target).closest('form');
|
||||||
var row = $(event.target).closest('p.readout');
|
var row = $(event.target).closest('p.readout');
|
||||||
if (row.find('input[id$=__id]').val()) {
|
if (row.find('input[id$=__id]').val()) {
|
||||||
row.hide();
|
row.hide();
|
||||||
row.find('input[id$=__destroy]').val('true');
|
row.find('input[id$=__destroy]').val('1');
|
||||||
} else {
|
} else {
|
||||||
row.remove();
|
row.remove();
|
||||||
}
|
}
|
||||||
$('p.readout:visible:first label:first').text('<%= t "field_readouts" %>');
|
form.find('p.readout:visible:first label:first').show();
|
||||||
if ($('p.readout:visible').length <= 1) {
|
if (form.find('p.readout:visible').length <= 1) {
|
||||||
$('p.readout a.icon-del').hide();
|
form.find('p.readout:visible a.icon-del').hide();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
<% end %>
|
<% end %>
|
||||||
|
@ -12,7 +12,7 @@
|
|||||||
<% @measurements.each do |m| %>
|
<% @measurements.each do |m| %>
|
||||||
<% next if m.new_record? %>
|
<% next if m.new_record? %>
|
||||||
<tr id="measurement-<%= m.id %>" class="measurement <%= 'hidden' if m.hidden %>">
|
<tr id="measurement-<%= m.id %>" class="measurement <%= 'hidden' if m.hidden %>">
|
||||||
<td class="date"><%= m.taken_at.strftime("%F %R") %></td>
|
<td class="date"><%= m.taken_at.getlocal.strftime("%F %R") %></td>
|
||||||
<td class="name">
|
<td class="name">
|
||||||
<div style="float:left;"><%= m.name %></div>
|
<div style="float:left;"><%= m.name %></div>
|
||||||
<div style="float:right;">
|
<div style="float:right;">
|
||||||
@ -32,30 +32,15 @@
|
|||||||
<%= delete_link measurement_path(m), {remote: true, data: {}} %>
|
<%= delete_link measurement_path(m), {remote: true, data: {}} %>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
<% next unless (m == @measurement) &&
|
<% if (m == @measurement) && @measurement.errors.present? %>
|
||||||
((action_name == "edit") ||
|
<tr>
|
||||||
(action_name == "update" && @measurement.errors.present?)) %>
|
<td class="form" colspan="5">
|
||||||
<tr>
|
<div id="edit-measurement">
|
||||||
<td class="form" colspan="5">
|
<%= render partial: 'measurements/edit_form' %>
|
||||||
<div id="edit-measurement">
|
</div>
|
||||||
<%= labelled_form_for @measurement,
|
</td>
|
||||||
url: measurement_path(@measurement),
|
</tr>
|
||||||
method: :patch, remote: true,
|
<% end %>
|
||||||
html: {id: 'measurement-edit-form', name: 'measurement-edit-form'} do |f| %>
|
|
||||||
|
|
||||||
<%= render partial: 'measurements/form', locals: {f: f} %>
|
|
||||||
|
|
||||||
<div class="tabular">
|
|
||||||
<p>
|
|
||||||
<%= submit_tag l(:button_save) %>
|
|
||||||
<%= link_to l(:button_cancel), "#",
|
|
||||||
onclick: '$(this).closest("tr").remove(); return false;' %>
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
<% end %>
|
|
||||||
</div>
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
<% end %>
|
<% end %>
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
|
18
app/views/measurements/_new_form.html.erb
Normal file
18
app/views/measurements/_new_form.html.erb
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
<h2><%= t ".heading_new_measurement" %></h2>
|
||||||
|
|
||||||
|
<%= labelled_form_for @measurement,
|
||||||
|
url: project_measurements_path(@project),
|
||||||
|
remote: true,
|
||||||
|
html: {id: 'new-measurement-form', name: 'new-measurement-form'} do |f| %>
|
||||||
|
|
||||||
|
<%= render partial: 'measurements/form', locals: {f: f} %>
|
||||||
|
|
||||||
|
<div class="tabular">
|
||||||
|
<p>
|
||||||
|
<%= submit_tag l(:button_create) %>
|
||||||
|
<%= link_to l(:button_cancel), "#",
|
||||||
|
onclick: '$("#new-measurement").empty(); return false;' %>
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
<% end %>
|
||||||
|
<hr>
|
4
app/views/measurements/create.js.erb
Normal file
4
app/views/measurements/create.js.erb
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
$('div[id^=flash_]').remove();
|
||||||
|
$('#content').prepend('<%= j render_flash_messages %>');
|
||||||
|
$('#new-measurement').empty();
|
||||||
|
$('#measurements').html('<%= j render partial: 'measurements/index' %>');
|
3
app/views/measurements/edit.js.erb
Normal file
3
app/views/measurements/edit.js.erb
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
$('div[id^=flash_]').remove();
|
||||||
|
$('#content').prepend('<%= j render_flash_messages %>');
|
||||||
|
$('tr[id=measurement-<%= @measurement.id %>]').after('<tr><td class="form" colspan="5"><div id="edit-measurement"><%= j render partial: "measurements/edit_form" %></div></td></tr>');
|
@ -4,31 +4,14 @@
|
|||||||
|
|
||||||
<div class="contextual">
|
<div class="contextual">
|
||||||
<% if User.current.allowed_to?(:manage_common, @project) %>
|
<% if User.current.allowed_to?(:manage_common, @project) %>
|
||||||
<%= link_to t(".link_new_measurement"), '#', class: 'icon icon-add',
|
<%= link_to t(".link_new_measurement"), new_project_measurement_path(@project), {
|
||||||
onclick: '$("#add-measurement").toggle(); $("#measurement_name").focus(); return false;'
|
remote: true,
|
||||||
%>
|
class: 'icon icon-add'
|
||||||
|
} %>
|
||||||
<% end %>
|
<% end %>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<% hide_add_form = @measurement.errors.empty? && (action_name != "retake") %>
|
<div id="new-measurement">
|
||||||
<div id="add-measurement" <%= 'style=display:none;' if hide_add_form %>>
|
|
||||||
<h2><%= t ".heading_new_measurement" %></h2>
|
|
||||||
|
|
||||||
<%= labelled_form_for @measurement,
|
|
||||||
url: project_measurements_path(@project),
|
|
||||||
html: {id: 'measurement-add-form', name: 'measurement-add-form'} do |f| %>
|
|
||||||
|
|
||||||
<%= render partial: 'measurements/form', locals: {f: f} %>
|
|
||||||
|
|
||||||
<div class="tabular">
|
|
||||||
<p>
|
|
||||||
<%= submit_tag l(:button_create) %>
|
|
||||||
<%= link_to l(:button_cancel), "#",
|
|
||||||
onclick: '$("#add-measurement").hide(); return false;' %>
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
<% end %>
|
|
||||||
<hr>
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<h2><%= t ".heading" %></h2>
|
<h2><%= t ".heading" %></h2>
|
||||||
|
@ -1,3 +1,3 @@
|
|||||||
$('div[id^=flash_]').remove();
|
$('div[id^=flash_]').remove();
|
||||||
$('#content').prepend('<%= escape_javascript(render_flash_messages) %>');
|
$('#content').prepend('<%= j render_flash_messages %>');
|
||||||
$('#measurements').html('<%= escape_javascript(render partial: 'measurements/index') %>');
|
$('#measurements').html('<%= j render partial: 'measurements/index' %>');
|
||||||
|
3
app/views/measurements/new.js.erb
Normal file
3
app/views/measurements/new.js.erb
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
$('div[id^=flash_]').remove();
|
||||||
|
$('#content').prepend('<%= j render_flash_messages %>');
|
||||||
|
$('#new-measurement').html('<%= j render partial: 'measurements/new_form' %>');
|
@ -59,12 +59,13 @@ en:
|
|||||||
confirm_defaults: 'This will load default quantities and units. Continue?'
|
confirm_defaults: 'This will load default quantities and units. Continue?'
|
||||||
measurements:
|
measurements:
|
||||||
form:
|
form:
|
||||||
button_add_readout: 'Add readout'
|
button_new_readout: 'Add readout'
|
||||||
button_delete_readout: 'Delete'
|
button_delete_readout: 'Delete'
|
||||||
null_source: '- unspecified -'
|
null_source: '- unspecified -'
|
||||||
|
new_form:
|
||||||
|
heading_new_measurement: 'New measurement'
|
||||||
index:
|
index:
|
||||||
heading: 'Measurements'
|
heading: 'Measurements'
|
||||||
heading_new_measurement: 'New measurement'
|
|
||||||
link_new_measurement: 'New measurement'
|
link_new_measurement: 'New measurement'
|
||||||
ingredients:
|
ingredients:
|
||||||
contextual:
|
contextual:
|
||||||
|
@ -5,7 +5,7 @@ resources :projects, shallow: true do
|
|||||||
resources :body_trackers, only: [:index] do
|
resources :body_trackers, only: [:index] do
|
||||||
collection do
|
collection do
|
||||||
post 'defaults'
|
post 'defaults'
|
||||||
resources :measurements, only: [:index, :create, :edit, :update, :destroy] do
|
resources :measurements, only: [:index, :new, :create, :edit, :update, :destroy] do
|
||||||
get 'retake', on: :member
|
get 'retake', on: :member
|
||||||
end
|
end
|
||||||
resources :ingredients, only: [:index, :create, :destroy] do
|
resources :ingredients, only: [:index, :create, :destroy] do
|
||||||
|
2
init.rb
2
init.rb
@ -24,7 +24,7 @@ Redmine::Plugin.register :body_tracking do
|
|||||||
}, read: true
|
}, read: true
|
||||||
permission :manage_common, {
|
permission :manage_common, {
|
||||||
body_trackers: [:defaults],
|
body_trackers: [:defaults],
|
||||||
measurements: [:create, :edit, :update, :destroy, :retake],
|
measurements: [:new, :create, :edit, :update, :destroy, :retake],
|
||||||
ingredients: [:create, :destroy, :toggle, :import, :toggle_nutrient_column],
|
ingredients: [:create, :destroy, :toggle, :import, :toggle_nutrient_column],
|
||||||
sources: [:create, :destroy],
|
sources: [:create, :destroy],
|
||||||
quantities: [:create, :edit, :update, :destroy, :toggle, :move],
|
quantities: [:create, :edit, :update, :destroy, :toggle, :move],
|
||||||
|
Reference in New Issue
Block a user