From 71bfc5a33a09b4eab7f830d9b2980cd0e7afa718 Mon Sep 17 00:00:00 2001 From: cryptogopher Date: Sun, 24 Jul 2022 16:46:28 +0200 Subject: [PATCH] Last changes on Redmine 4.0 --- app/controllers/concerns/finders.rb | 20 +++++----- app/controllers/measurements_controller.rb | 2 +- app/controllers/readouts_controller.rb | 33 +++++++++++++++- app/helpers/measurements_helper.rb | 10 +---- app/helpers/readouts_helper.rb | 15 ++++++++ .../measurement_routines/_edit_form.html.erb | 9 +++++ app/views/measurement_routines/_form.html.erb | 38 ++++++++++++++----- app/views/measurements/_edit_form.html.erb | 5 ++- app/views/measurements/_form.html.erb | 12 ------ app/views/measurements/_index.html.erb | 7 ++-- app/views/measurements/edit.js.erb | 15 ++++---- app/views/measurements/index.js.erb | 6 +-- app/views/readouts/_edit_form.html.erb | 17 +++++++++ app/views/readouts/edit.js.erb | 9 +++++ app/views/readouts/index.js.erb | 1 + config/locales/en.yml | 11 +++++- config/routes.rb | 2 + init.rb | 2 +- 18 files changed, 154 insertions(+), 60 deletions(-) create mode 100644 app/helpers/readouts_helper.rb create mode 100644 app/views/measurement_routines/_edit_form.html.erb create mode 100644 app/views/readouts/_edit_form.html.erb create mode 100644 app/views/readouts/edit.js.erb create mode 100644 app/views/readouts/index.js.erb diff --git a/app/controllers/concerns/finders.rb b/app/controllers/concerns/finders.rb index 64e1a8e..c2451fd 100644 --- a/app/controllers/concerns/finders.rb +++ b/app/controllers/concerns/finders.rb @@ -40,15 +40,6 @@ module Concerns::Finders render_404 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]) @routine = MeasurementRoutine.find(id) @project = @routine.project @@ -60,6 +51,17 @@ module Concerns::Finders find_measurement_routine(params[:measurement_routine_id]) 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]) @quantity = Quantity.find(id) @project = @quantity.project diff --git a/app/controllers/measurements_controller.rb b/app/controllers/measurements_controller.rb index 4c021e8..d2abacf 100644 --- a/app/controllers/measurements_controller.rb +++ b/app/controllers/measurements_controller.rb @@ -9,7 +9,7 @@ class MeasurementsController < ApplicationController 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_routine_by_measurement_routine_id, - only: [:new, :create, :edit, :update, :retake, :filter] + only: [:new, :create, :filter] before_action :authorize before_action :set_view_params diff --git a/app/controllers/readouts_controller.rb b/app/controllers/readouts_controller.rb index 494ddc2..09ec3c7 100644 --- a/app/controllers/readouts_controller.rb +++ b/app/controllers/readouts_controller.rb @@ -2,12 +2,12 @@ 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_measurement_by_measurement_id, only: [:edit, :update] before_action :find_quantity_by_quantity_id, only: [:toggle_exposure] before_action :authorize @@ -15,6 +15,22 @@ class ReadoutsController < ApplicationController prepare_readouts 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 @routine.readout_exposures.toggle!(@quantity) prepare_readouts @@ -22,6 +38,21 @@ class ReadoutsController < ApplicationController private + def measurement_params + params.require(:measurement).permit( + :notes, + :source_id, + readouts_attributes: + [ + :id, + :quantity_id, + :value, + :unit_id, + :_destroy + ] + ) + end + def prepare_readouts @quantities = @routine.quantities.includes(:formula) diff --git a/app/helpers/measurements_helper.rb b/app/helpers/measurements_helper.rb index 0f5a46c..70e8c9a 100644 --- a/app/helpers/measurements_helper.rb +++ b/app/helpers/measurements_helper.rb @@ -1,14 +1,8 @@ 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) - 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"}) + - 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"}) + delete_link(measurement_path(m), {remote: true, data: {}}) end diff --git a/app/helpers/readouts_helper.rb b/app/helpers/readouts_helper.rb new file mode 100644 index 0000000..88e4605 --- /dev/null +++ b/app/helpers/readouts_helper.rb @@ -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 diff --git a/app/views/measurement_routines/_edit_form.html.erb b/app/views/measurement_routines/_edit_form.html.erb new file mode 100644 index 0000000..dfcd446 --- /dev/null +++ b/app/views/measurement_routines/_edit_form.html.erb @@ -0,0 +1,9 @@ +
+ <% 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 %> +
diff --git a/app/views/measurement_routines/_form.html.erb b/app/views/measurement_routines/_form.html.erb index ce32e44..3c7c173 100644 --- a/app/views/measurement_routines/_form.html.erb +++ b/app/views/measurement_routines/_form.html.erb @@ -1,13 +1,33 @@ -
- <%= fields_for 'measurement[routine_attributes]', routine do |ff| %> - <%= ff.hidden_field :id %> +
+ <%= fields_for :routine do |routine_f| %>

- - <%= ff.text_field :name, required: true, style: "width: 95%;" %> -

-

- - <%= ff.text_area :description, cols: 40, rows: 3, style: "width: 95%;" %> + <%= routine_f.select :id, options_from_collection_for_select( + @project.measurement_routines, :id, :name, @routine.id), + {required: true}, autocomplete: 'off', + onchange: "var mr_id = $('#measurement_routine_attributes_id').val(); + $.ajax({ + 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" %>

+ + <% if @routine.persisted? %> + <% if @routine.description? %> +

<%= @routine.description %>

+ <% end %> + <% else %> +

<%= routine_f.text_field :name, required: true, style: "width: 95%;" %>

+

<%= ff.text_area :description, cols: 40, rows: 3, style: "width: 95%;" %>

+ <% end %> <% end %>
diff --git a/app/views/measurements/_edit_form.html.erb b/app/views/measurements/_edit_form.html.erb index 1b8a092..786a116 100644 --- a/app/views/measurements/_edit_form.html.erb +++ b/app/views/measurements/_edit_form.html.erb @@ -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, html: {id: 'edit-measurement-form', name: 'edit-measurement-form'} do |measurement_f| %>
+ <%= render partial: 'measurement_routines/form', + locals: {measurement_f: measurement_f} %> +
<%= render partial: 'measurements/form', locals: {measurement_f: measurement_f} %>
diff --git a/app/views/measurements/_form.html.erb b/app/views/measurements/_form.html.erb index 3379b10..1726f17 100644 --- a/app/views/measurements/_form.html.erb +++ b/app/views/measurements/_form.html.erb @@ -1,17 +1,5 @@ <%= error_messages_for @measurement %> -
- <% 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 %> -
- -
-

diff --git a/app/views/measurements/_index.html.erb b/app/views/measurements/_index.html.erb index fe8069d..92581fa 100644 --- a/app/views/measurements/_index.html.erb +++ b/app/views/measurements/_index.html.erb @@ -1,10 +1,10 @@ <%= render partial: 'measurements/filters', 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 %> - +
@@ -16,8 +16,7 @@ <% @measurements.each do |m| %> - <% next if m.new_record? %> - + ' +$('tr[id=measurement-<%= @measurement.id %>]').nextUntil('tr.measurement') + .remove().addBack().first().after( + '' + + '' + + '' ); diff --git a/app/views/measurements/index.js.erb b/app/views/measurements/index.js.erb index daa0d83..abe1817 100644 --- a/app/views/measurements/index.js.erb +++ b/app/views/measurements/index.js.erb @@ -1,5 +1 @@ -<% if @view_params[:view] == :index %> - $('#measurements').html('<%= j render partial: 'measurements/index' %>'); -<% else %> - $('#readouts').html('<%= j render partial: 'measurements/readouts' %>'); -<% end %> +$('#measurements').html('<%= j render partial: 'measurements/index' %>'); diff --git a/app/views/readouts/_edit_form.html.erb b/app/views/readouts/_edit_form.html.erb new file mode 100644 index 0000000..22268b9 --- /dev/null +++ b/app/views/readouts/_edit_form.html.erb @@ -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| %> + +
+ <%= render partial: 'measurements/form', locals: {measurement_f: measurement_f} %> +
+ +
+

+ <%= 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;' %> +

+
+<% end %> diff --git a/app/views/readouts/edit.js.erb b/app/views/readouts/edit.js.erb new file mode 100644 index 0000000..4dfd96a --- /dev/null +++ b/app/views/readouts/edit.js.erb @@ -0,0 +1,9 @@ +$('tr[id=measurement-<%= @measurement.id %>]').nextUntil('tr.measurement') + .remove('tr:not(.details)').hide().addBack().first().after( + '' + + '' + + '' +); diff --git a/app/views/readouts/index.js.erb b/app/views/readouts/index.js.erb new file mode 100644 index 0000000..d102337 --- /dev/null +++ b/app/views/readouts/index.js.erb @@ -0,0 +1 @@ +$('#readouts').html('<%= j render partial: 'readouts/index' %>'); diff --git a/config/locales/en.yml b/config/locales/en.yml index 11694a8..f491632 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -124,11 +124,12 @@ en: other: "Created %{count} targets" update: success: + zero: "Targets left unchanged" one: "Successfully updated target" - other: "Successfully updated targets" + other: "Successfully updated %{count} targets" destroy: success: - one: "Deleted 1 target" + one: "Deleted target" other: "Deleted %{count} targets" failure: "Some targets have not been deleted" meals: @@ -158,6 +159,12 @@ en: heading_new_measurement: 'New measurement' index: heading: 'Measurements' + readouts: + update: + success: + zero: "Successfully updated measurement" + one: "Successfully updated readout" + other: "Successfully updated %{count} readouts" foods: contextual: link_import_foods: 'Import' diff --git a/config/routes.rb b/config/routes.rb index 4fe13e7..fc8f764 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -30,7 +30,9 @@ resources :projects, shallow: true do resources :readouts, only: [:index] post 'toggle_exposure', controller: :readouts end + # TODO: nest measurements inside routines? resources :measurements, except: [:show] do + resource :readouts, only: [:edit, :update] member do get 'retake' end diff --git a/init.rb b/init.rb index 025a8c6..3704adb 100644 --- a/init.rb +++ b/init.rb @@ -35,7 +35,7 @@ Redmine::Plugin.register :body_tracking do :toggle_eaten, :toggle_exposure, :adjust], measurement_routines: [:edit], measurements: [:new, :create, :edit, :update, :destroy, :retake], - readouts: [:toggle_exposure], + readouts: [:edit, :update, :toggle_exposure], foods: [:new, :create, :edit, :update, :destroy, :toggle, :toggle_exposure, :import], sources: [:create, :destroy],
<%= l(:field_taken_at_date) %>
<%= format_datetime(m.taken_at) %>
diff --git a/app/views/measurements/edit.js.erb b/app/views/measurements/edit.js.erb index 7a529d0..9577b51 100644 --- a/app/views/measurements/edit.js.erb +++ b/app/views/measurements/edit.js.erb @@ -1,8 +1,9 @@ -$('tr[id=measurement-<%= @measurement.id %>]').nextUntil('tr.primary', ':not(.measurement)') - .remove(); -var columns = $('table > thead > tr > th').length; -$('tr[id=measurement-<%= @measurement.id %>]').nextUntil('tr.primary').addBack().last().after( - '
' + - '<%= j render partial: 'measurements/edit_form' %>' + - '
' + + '<%= j render partial: 'measurements/edit_form' %>' + + '
' + + '<%= j render partial: 'readouts/edit_form' %>' + + '