- Add _wide_table.html.erb partial (server-rendered pivot table)
- Add load_measurements helper in controller to prepare @wide_groups and
@wide_quantities for all mutating actions
- Update index view to render the wide_table partial in #measurements-wide
- Add/update create, destroy, update turbo_stream views to refresh the
wide table atomically after each mutation
- Remove buildWideTable() and editMeasurementWide() from application.js
- Fix create.turbo_stream.erb condition (empty readouts are vacuously all persisted)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Replace the toggle-view approach and hidden DOM data carrier with a
proper dedicated Charts page:
- Move Charts out of Measurements view toggles into its own nav tab
and route (GET /charts)
- ChartsController serializes readout data as JSON (ordered by
taken_at); the view embeds it in a <script type="application/json">
element instead of rendering a hidden copy of the measurements
partial just to ferry data attributes to JS
- buildCharts() reads from the JSON element directly — no DOM parsing,
no sorting in JS (server already orders the data)
- Turbo load handler detects the charts page via #charts-data presence
- Add controller tests (authentication, data shape, ordering,
data isolation between users) and system tests
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Users can now switch to a Charts view that renders a separate
time-series line chart for each tracked quantity, using Plotly.js
loaded via CDN. Charts are sorted chronologically and styled to
match the app palette. A dedicated toggle button and matching
CSS visibility rules mirror the existing Compact/Wide view pattern.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* adding streams in client breaks things (e.g. autofocus)
* some tasks need to be performed in one stream action to avoid
flickering (e.g. table row substitution)