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:
25
app/javascript/controllers/form_controller.js
Normal file
25
app/javascript/controllers/form_controller.js
Normal file
@@ -0,0 +1,25 @@
|
||||
import { Controller } from "@hotwired/stimulus"
|
||||
|
||||
export default class extends Controller {
|
||||
processKey(event) {
|
||||
switch (event.key) {
|
||||
case "Escape":
|
||||
this.element.querySelector("a[name=cancel]").click()
|
||||
break
|
||||
case "Enter":
|
||||
this.element.querySelector("button[name=button]").click()
|
||||
event.preventDefault()
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
validate(event) {
|
||||
const id = event.submitter?.getAttribute("data-validate")
|
||||
if (!id) return
|
||||
const input = document.getElementById(id)
|
||||
if (!input.checkValidity()) {
|
||||
input.reportValidity()
|
||||
event.preventDefault()
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user