forked from fixin.me/fixin.me
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:
@@ -2,6 +2,7 @@
|
||||
// https://github.com/rails/importmap-rails
|
||||
import "@hotwired/turbo-rails"
|
||||
import "controllers"
|
||||
import { disableElement, enableElement } from "element_helpers"
|
||||
|
||||
|
||||
/* Hide page before loaded for testing purposes */
|
||||
@@ -12,23 +13,13 @@ document.addEventListener('turbo:load', showPage)
|
||||
|
||||
|
||||
/* Turbo stream actions */
|
||||
Turbo.StreamElement.prototype.disableElement = function(element) {
|
||||
element.setAttribute("disabled", "disabled")
|
||||
element.setAttribute("aria-disabled", "true")
|
||||
element.setAttribute("tabindex", "-1")
|
||||
}
|
||||
Turbo.StreamElement.prototype.disableElement = disableElement
|
||||
Turbo.StreamElement.prototype.enableElement = enableElement
|
||||
Turbo.StreamActions.disable = function() {
|
||||
this.targetElements.forEach((e) => { this.disableElement(e) })
|
||||
}
|
||||
|
||||
Turbo.StreamElement.prototype.enableElement = function(element) {
|
||||
element.removeAttribute("disabled")
|
||||
element.removeAttribute("aria-disabled")
|
||||
// Assume 'tabindex' is not used explicitly, so removing it is safe
|
||||
element.removeAttribute("tabindex")
|
||||
this.targetElements.forEach(disableElement)
|
||||
}
|
||||
Turbo.StreamActions.enable = function() {
|
||||
this.targetElements.forEach((e) => { this.enableElement(e) })
|
||||
this.targetElements.forEach(enableElement)
|
||||
}
|
||||
|
||||
/* TODO: change to visibility = collapse to avoid width change? */
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
11
app/javascript/element_helpers.js
Normal file
11
app/javascript/element_helpers.js
Normal file
@@ -0,0 +1,11 @@
|
||||
export function disableElement(element) {
|
||||
element.setAttribute("disabled", "disabled")
|
||||
element.setAttribute("aria-disabled", "true")
|
||||
element.setAttribute("tabindex", "-1")
|
||||
}
|
||||
|
||||
export function enableElement(element) {
|
||||
element.removeAttribute("disabled")
|
||||
element.removeAttribute("aria-disabled")
|
||||
element.removeAttribute("tabindex")
|
||||
}
|
||||
Reference in New Issue
Block a user