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>
46 lines
1.8 KiB
Plaintext
46 lines
1.8 KiB
Plaintext
<%= tabular_form_with model: Measurement.new, id: :measurement_form,
|
|
class: 'topside-area flex vertical center',
|
|
html: {onkeydown: 'formProcessKey(event)'} do |form| %>
|
|
|
|
<table class="items-table center">
|
|
<tbody id="readouts">
|
|
<%= tabular_fields_for @measurement do |form| %>
|
|
<tr class="italic">
|
|
<td class="hexpand hmin50"><%= t '.taken_at_html' %></td>
|
|
<td colspan="3" class="ralign">
|
|
<%= form.datetime_field :taken_at, required: true, value: Time.current.strftime('%Y-%m-%dT%H:%M') %>
|
|
</td>
|
|
</tr>
|
|
<% end %>
|
|
</tbody>
|
|
</table>
|
|
|
|
<%# TODO: right-click selection; unnecessary with hierarchical tags? %>
|
|
<details id="quantity_select" class="center hexpand" open
|
|
onkeydown="detailsProcessKey(event)">
|
|
<summary autofocus>
|
|
<!-- TODO: Set content with CSS when span empty to avoid duplication -->
|
|
<span data-prompt="<%= t('.select_quantity') %>">
|
|
<%= t('.select_quantity') %>
|
|
</span>
|
|
<%= image_button_tag t(:apply), "update", name: nil, disabled: true,
|
|
formaction: new_readout_path, formmethod: :get, formnovalidate: true,
|
|
data: {turbo_stream: true} %>
|
|
</summary>
|
|
<ul><%= quantities_check_boxes(@quantities) %></ul>
|
|
</details>
|
|
|
|
<div class="flex reverse">
|
|
<%= form.button id: :create_measurement_button, disabled: true -%>
|
|
<%= image_link_to t(:cancel), "close-outline", measurements_path, name: :cancel,
|
|
class: 'dangerous', onclick: render_turbo_stream('form_close') %>
|
|
</div>
|
|
<% end %>
|
|
|
|
<script>
|
|
quantity_select.addEventListener('focusout', detailsClose)
|
|
quantity_select.addEventListener('change', detailsChange)
|
|
detailsObserver.observe(quantity_select.querySelector('ul'),
|
|
{subtree: true, attributeFilter: ['disabled']})
|
|
</script>
|