forked from fixin.me/fixin.me
Readouts gain a taken_at timestamp (distinct from created_at) that records
when the measurement was actually taken. Measurements are now ordered by
taken_at descending.
Quantities gain an optional default_unit association. When set, the unit
is pre-selected in the measurement form. A "Set as default" button on the
unit selector lets users update the default directly from the form.
- Migrations: add taken_at (datetime) to readouts,
add default_unit_id (fk → units) to quantities
- Readout: expose taken_at in ATTRIBUTES permit-list
- Quantity: add default_unit belongs_to, expose in ATTRIBUTES
- QuantitiesController: load @user_units for form actions
- Quantities views: add Default unit column and select to form
- Readouts form: pre-select default unit; add "Set as default" button
(readoutUnitChanged / setDefaultUnit wired up in a later commit)
- Measurements form: default taken_at input to current time
- ApplicationHelper: propagate :form option to html_options in builder
- config/environments/test.rb: allow Capybara's dynamic host
- Tests: system tests for default-unit UI on the Quantities page
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
74 lines
1.8 KiB
Ruby
74 lines
1.8 KiB
Ruby
class QuantitiesController < ApplicationController
|
|
before_action only: :new do
|
|
find_quantity if params[:id].present?
|
|
end
|
|
before_action :find_quantity, only: [:edit, :update, :reparent, :destroy]
|
|
|
|
before_action except: :index do
|
|
raise AccessForbidden unless current_user.at_least(:active)
|
|
end
|
|
|
|
before_action only: [:new, :edit, :create, :update] do
|
|
@user_units = current_user.units.ordered
|
|
end
|
|
|
|
def index
|
|
@quantities = current_user.quantities.ordered.includes(:parent, :subquantities)
|
|
end
|
|
|
|
def new
|
|
@quantity = current_user.quantities.new(parent: @quantity)
|
|
end
|
|
|
|
def create
|
|
@quantity = current_user.quantities.new(quantity_params)
|
|
if @quantity.save
|
|
@before = @quantity.successive
|
|
@ancestors = @quantity.ancestors
|
|
flash.now[:notice] = t('.success', quantity: @quantity)
|
|
else
|
|
render :new
|
|
end
|
|
end
|
|
|
|
def edit
|
|
end
|
|
|
|
def update
|
|
if @quantity.update(quantity_params.except(:parent_id))
|
|
@ancestors = @quantity.ancestors
|
|
flash.now[:notice] = t('.success', quantity: @quantity)
|
|
else
|
|
render :edit
|
|
end
|
|
end
|
|
|
|
def reparent
|
|
permitted = params.require(:quantity).permit(:parent_id)
|
|
@previous_ancestors = @quantity.ancestors
|
|
|
|
# Until UI blocks all disallowed reparents, render error messages if present
|
|
render_no_content(@quantity) unless @quantity.update(permitted)
|
|
|
|
@ancestors = @quantity.ancestors
|
|
@self_and_progenies = @quantity.with_progenies
|
|
@before = @self_and_progenies.last.successive
|
|
end
|
|
|
|
def destroy
|
|
@quantity.destroy!
|
|
@ancestors = @quantity.ancestors
|
|
flash.now[:notice] = t('.success', quantity: @quantity)
|
|
end
|
|
|
|
private
|
|
|
|
def quantity_params
|
|
params.require(:quantity).permit(Quantity::ATTRIBUTES)
|
|
end
|
|
|
|
def find_quantity
|
|
@quantity = current_user.quantities.find_by!(id: params[:id])
|
|
end
|
|
end
|