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 %>
-
+
+
+
+ | <%= Quantity.model_name.human %> |
+ <%= Readout.human_attribute_name(:value) %> |
+ <%= Unit.model_name.human %> |
+ <%= Readout.human_attribute_name(:created_at) %> |
+ <% 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.