forked from fixin.me/fixin.me
Migrate all inline JS to Stimulus controllers
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>
This commit is contained in:
16
CLAUDE.md
16
CLAUDE.md
@@ -79,6 +79,22 @@ root → /units (authenticated), /sign_in (unauthenticated)
|
||||
|
||||
## JavaScript Conventions
|
||||
|
||||
### Use Stimulus for all JS behavior
|
||||
|
||||
This app uses **Hotwire = Turbo + Stimulus**. All JavaScript behavior must be in Stimulus controllers under `app/javascript/controllers/`. Never use:
|
||||
- Inline HTML event handlers: `onclick="..."`, `onkeydown="..."`, `ondragstart="..."` etc.
|
||||
- Global `window.*` function exports
|
||||
- Bare `<script>` blocks in templates
|
||||
- `turbo:load` listeners for behavior that belongs in a controller's `connect()` lifecycle
|
||||
|
||||
**Instead:**
|
||||
- Put behavior in a Stimulus controller method
|
||||
- Wire it with `data-action="event->controller#method"` in the template
|
||||
- Use `data-controller="name"` on the root element, `data-[name]-target="targetName"` for targets, `data-[name]-[valueName]-value="..."` for values
|
||||
- Use `connect()` / `disconnect()` for setup/teardown (MutationObservers, event listeners, etc.)
|
||||
|
||||
Controller filename `foo_bar_controller.js` → identifier `foo-bar` → `data-controller="foo-bar"`.
|
||||
|
||||
### No manual fetch() — use Turbo
|
||||
|
||||
Never make AJAX requests with `fetch()` in JavaScript. Use Turbo's built-in mechanisms instead:
|
||||
|
||||
Reference in New Issue
Block a user