Extract disableElement/enableElement to shared module

Stimulus controllers were reaching into Turbo.StreamElement.prototype
to call disableElement/enableElement — tight coupling to Turbo internals.

Extract both functions to app/javascript/element_helpers.js and import
from there in application.js (which still assigns them to the Turbo
prototype for server-driven Turbo Stream actions), details_controller,
and readout_unit_controller.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-04-04 14:19:49 +00:00
parent fee3ce8627
commit 67f519052a
5 changed files with 23 additions and 18 deletions

View File

@@ -1,4 +1,5 @@
import { Controller } from "@hotwired/stimulus"
import { disableElement, enableElement } from "element_helpers"
export default class extends Controller {
static targets = ["countLabel", "submitButton", "list"]
@@ -18,10 +19,10 @@ export default class extends Controller {
const count = this.element.querySelectorAll('input:checked:not([disabled])').length
if (count > 0) {
this.countLabelTarget.textContent = count + ' selected'
Turbo.StreamElement.prototype.enableElement(this.submitButtonTarget)
enableElement(this.submitButtonTarget)
} else {
this.countLabelTarget.textContent = this.countLabelTarget.dataset.prompt
Turbo.StreamElement.prototype.disableElement(this.submitButtonTarget)
disableElement(this.submitButtonTarget)
}
}

View File

@@ -1,13 +1,14 @@
import { Controller } from "@hotwired/stimulus"
import { disableElement, enableElement } from "element_helpers"
export default class extends Controller {
static targets = ["select", "button"]
unitChanged() {
if (this.selectTarget.value && this.selectTarget.value !== this.selectTarget.dataset.defaultUnitId) {
Turbo.StreamElement.prototype.enableElement(this.buttonTarget)
enableElement(this.buttonTarget)
} else {
Turbo.StreamElement.prototype.disableElement(this.buttonTarget)
disableElement(this.buttonTarget)
}
}