Files
fixin.me/app/javascript/controllers/form_controller.js
barbie-bot 169e84fe8a Replace render_turbo_stream cancel handlers with form#cancel Stimulus action
Add cancel() method to form_controller that handles all close cases:
- tabular forms (<tr>): removes inner form, re-enables link, shows hidden row
- measurements create form: removes self, enables trigger link, shows no-items

Data attributes already present on controller elements (data-form, data-link,
data-hidden-row) drive the behaviour. Two extra attributes on the create form
(data-cancel-enable, data-cancel-show) cover the non-tabular case.

Delete now-unused _form_close and _edit_form_close partial templates.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-04 14:14:44 +00:00

52 lines
1.6 KiB
JavaScript

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()
}
}
cancel(event) {
event.preventDefault()
const el = this.element
// Move focus to next open form if this one had focus
const focused = document.activeElement
if (!focused || focused === document.body || el.contains(focused)) {
const next = el.parentElement?.querySelector(`#${el.id} ~ tr:has([autofocus])`)
?? el.parentElement?.querySelector("tr:has([autofocus])")
next?.querySelector("[autofocus]")?.focus()
}
// Remove associated inner form element (tabular: <tr> wraps a separate <form>)
document.getElementById(el.dataset.form)?.remove()
// Re-enable trigger link
const enableId = el.dataset.link ?? el.dataset.cancelEnable
if (enableId) Turbo.StreamElement.prototype.enableElement(document.getElementById(enableId))
// Show hidden row (tabular forms) or no-items placeholder (create form)
document.getElementById(el.dataset.hiddenRow)?.removeAttribute("style")
document.getElementById(el.dataset.cancelShow)?.style.removeProperty("display")
el.remove()
}
}