diff --git a/app/controllers/measurements_controller.rb b/app/controllers/measurements_controller.rb index ebe6622..89e2cb4 100644 --- a/app/controllers/measurements_controller.rb +++ b/app/controllers/measurements_controller.rb @@ -1,7 +1,12 @@ class MeasurementsController < ApplicationController + before_action :find_readout, only: :destroy + + before_action except: :index do + raise AccessForbidden unless current_user.at_least(:active) + end + def index - @measurements = [] - #@measurements = current_user.units.ordered.includes(:base, :subunits) + @measurements = current_user.readouts.includes(:quantity, :unit).order(created_at: :desc) end def new @@ -9,8 +14,26 @@ class MeasurementsController < ApplicationController end def create + readout_params = params.permit(readouts: Readout::ATTRIBUTES).fetch(:readouts, []) + @readouts = readout_params.map { |rp| current_user.readouts.build(rp) } + + if @readouts.present? && @readouts.all?(&:valid?) + ActiveRecord::Base.transaction { @readouts.each(&:save!) } + flash.now[:notice] = t('.success', count: @readouts.size) + else + errors = @readouts.flat_map { |r| r.errors.full_messages } + flash.now[:alert] = errors.present? ? errors.first : t('.no_readouts') + end end def destroy + @readout.destroy! + flash.now[:notice] = t('.success') + end + + private + + def find_readout + @readout = current_user.readouts.find(params[:id]) end end diff --git a/app/views/measurements/_readout.html.erb b/app/views/measurements/_readout.html.erb new file mode 100644 index 0000000..21ca605 --- /dev/null +++ b/app/views/measurements/_readout.html.erb @@ -0,0 +1,12 @@ +<%= tag.tr id: dom_id(readout) do %> + <%= readout.quantity %> + <%= readout.value %> + <%= readout.unit %> + <%= l(readout.created_at) %> + <% if current_user.at_least(:active) %> + + <%= image_button_to t('.destroy'), 'delete-outline', measurement_path(readout), + method: :delete, data: {turbo_stream: true} %> + + <% end %> +<% end %> diff --git a/app/views/measurements/create.turbo_stream.erb b/app/views/measurements/create.turbo_stream.erb new file mode 100644 index 0000000..78fb571 --- /dev/null +++ b/app/views/measurements/create.turbo_stream.erb @@ -0,0 +1,11 @@ +<% if @readouts.all?(&:persisted?) %> + <%= turbo_stream.update :flashes %> + <%= turbo_stream.remove :measurement_form %> + <%= turbo_stream.enable :new_measurement_link %> + <%= turbo_stream.remove :no_items %> + <% @readouts.each do |readout| %> + <%= turbo_stream.prepend :measurements, readout %> + <% end %> +<% else %> + <%= turbo_stream.update :flashes %> +<% end %> diff --git a/app/views/measurements/destroy.turbo_stream.erb b/app/views/measurements/destroy.turbo_stream.erb new file mode 100644 index 0000000..ac0c032 --- /dev/null +++ b/app/views/measurements/destroy.turbo_stream.erb @@ -0,0 +1,3 @@ +<%= turbo_stream.update :flashes %> +<%= turbo_stream.remove @readout %> +<%= turbo_stream.append(:measurements, render_no_items) if current_user.readouts.empty? %> diff --git a/app/views/measurements/index.html.erb b/app/views/measurements/index.html.erb index bac10e1..deb1604 100644 --- a/app/views/measurements/index.html.erb +++ b/app/views/measurements/index.html.erb @@ -7,7 +7,18 @@ <% end %> - +
+ + + + + + + <% if current_user.at_least(:active) %> + + <% end %> + + <%= render(@measurements) || render_no_items %> diff --git a/config/locales/en.yml b/config/locales/en.yml index 3382167..411a2a1 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -13,6 +13,9 @@ en: quantity: description: Description name: Name + readout: + created_at: Recorded at + value: Value unit: base: Base unit description: Description @@ -89,6 +92,15 @@ en: taken_at_html: Measurement taken at  index: new_measurement: Add measurement + readout: + destroy: Delete + create: + success: + one: Recorded 1 measurement. + other: Recorded %{count} measurements. + no_readouts: No readouts selected. + destroy: + success: Measurement deleted. quantities: navigation: Quantities no_items: There are no configured quantities. You can Add some or Import from defaults.
<%= Quantity.model_name.human %><%= Readout.human_attribute_name(:value) %><%= Unit.model_name.human %><%= Readout.human_attribute_name(:created_at) %>