1
0
This repository has been archived on 2023-12-07. You can view files and clone it, but cannot push or open issues or pull requests.
body_tracking/app/controllers/measurements_controller.rb
cryptogopher e78803e474 Added MealsController#new and form autocomplete for Food
Renamed QuantityColumn -> Exposure
2020-04-15 23:42:58 +02:00

145 lines
3.7 KiB
Ruby

class MeasurementsController < ApplicationController
layout 'body_tracking'
menu_item :body_trackers
helper :body_trackers
include Concerns::Finders
before_action :init_session_filters
before_action :find_project_by_project_id, only: [:index, :new, :create, :filter]
before_action :find_quantity_by_quantity_id, only: [:toggle_column]
before_action :find_measurement, only: [:edit, :update, :destroy, :retake]
before_action :find_measurement_routine, only: [:readouts, :toggle_column]
before_action :authorize
def index
prepare_measurements
end
def new
@measurement = @project.measurements.new
@routine = @measurement.build_routine
@measurement.readouts.new
end
def create
# Nested attributes cannot create outer object (Measurement) and at the same time edit
# existing nested object (MeasurementRoutine) if it's not associated with outer object
# https://stackoverflow.com/questions/6346134/
# That's why routine needs to be found and associated before measurement initialization
@measurement = @project.measurements.new
update_routine_from_params
@measurement.attributes = measurement_params
@measurement.routine.project = @project
@routine = @measurement.routine
if @measurement.save
if @routine.exposures.empty?
@routine.quantities << @measurement.readouts.map(&:quantity).first(6)
end
flash[:notice] = 'Created new measurement'
prepare_items
else
@measurement.readouts.new if @measurement.readouts.empty?
render :new
end
end
def edit
end
def update
update_routine_from_params
if @measurement.update(measurement_params)
flash[:notice] = 'Updated measurement'
if @measurement.routine.previous_changes.has_key?(:name) && params[:view] == 'readouts'
render js: "window.location.pathname='#{readouts_measurement_routine_path(@routine)}'"
else
prepare_items
render :index
end
else
render :edit
end
end
def destroy
if @measurement.destroy
flash[:notice] = 'Deleted measurement'
end
end
def retake
readouts = @measurement.readouts.map(&:dup)
@measurement = @measurement.dup
@measurement.readouts = readouts
@measurement.taken_at = Time.now
@measurement.readouts.each { |r| r.value = nil }
render :new
end
def readouts
prepare_readouts
end
def toggle_column
@routine.exposures.toggle!(@quantity)
prepare_readouts
end
def filter
session[:m_filters] = params.permit(:name, formula: [:code, :zero_nil])
prepare_items
render :index
end
private
def init_session_filters
session[:m_filters] ||= {formula: {}}
end
def measurement_params
params.require(:measurement).permit(
:notes,
:source_id,
routine_attributes:
[
:id,
:name,
:description
],
readouts_attributes:
[
:id,
:quantity_id,
:value,
:unit_id,
:_destroy
]
)
end
def update_routine_from_params
routine_id = params[:measurement][:routine_attributes][:id]
@measurement.routine = @project.measurement_routines.find_by(id: routine_id) if routine_id
end
def prepare_items
params[:view] == 'index' ? prepare_measurements : prepare_readouts
end
def prepare_measurements
@measurements, @formula_q = @project.measurements
.includes(:routine, :source, :readouts)
.filter(session[:m_filters])
end
def prepare_readouts
@quantities = @routine.quantities.includes(:formula)
@measurements, @requested_r, @extra_r, @formula_q = @routine.measurements
.includes(:routine, :source)
.filter(session[:m_filters], @quantities)
end
end