forked from fixin.me/fixin.me
Add stimulus-rails gem and wire up 7 controllers: - measurements_view_controller: view toggle (compact/wide) via localStorage - measurements_controller: grouped rows MutationObserver - charts_controller: Plotly chart rendering - form_controller: keyboard shortcuts (Escape/Enter) and submit validation - details_controller: quantity picker state, focusout close, MutationObserver - readout_unit_controller: default unit button enable/disable + PATCH submission - drag_controller: drag-and-drop for quantity reparenting and unit rebasing Remove all inline onclick/onkeydown/ondrag*/onsubmit handlers from templates. Remove all window.* global exports from application.js. Remove bare <script> block from measurements/_form.html.erb. Remove turbo:load listeners for behavior now in controller connect(). application.js now only contains: Turbo Stream custom action definitions and the showPage visibility listener. Document Stimulus conventions in CLAUDE.md. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
40 lines
1.7 KiB
Plaintext
40 lines
1.7 KiB
Plaintext
<%= tabular_form_with model: Measurement.new, id: :measurement_form,
|
|
class: 'topside-area flex vertical center',
|
|
html: {data: {controller: 'form', action: 'keydown->form#processKey'}} 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
|
|
data-controller="details"
|
|
data-action="focusout->details#close change->details#change keydown->details#processKey">
|
|
<summary autofocus>
|
|
<!-- TODO: Set content with CSS when span empty to avoid duplication -->
|
|
<span data-prompt="<%= t('.select_quantity') %>" data-details-target="countLabel">
|
|
<%= 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, details_target: 'submitButton'} %>
|
|
</summary>
|
|
<ul data-details-target="list"><%= 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 %>
|