import { Controller } from "@hotwired/stimulus" import { debounce, nextFrame } from "helpers/timing_helpers"; export default class extends Controller { static targets = [ "cancel", "submit", "input" ] static values = { debounceTimeout: { type: Number, default: 300 } } initialize() { this.debouncedSubmit = debounce(this.debouncedSubmit.bind(this), this.debounceTimeoutValue) } submit() { this.element.requestSubmit() } preventEmptySubmit(event) { const input = this.hasInputTarget ? this.inputTarget : null if (input) { const value = (input.value || "").trim() if (value.length === 0) { event.preventDefault() } } } debouncedSubmit(event) { this.submit(event) } submitToTopTarget(event) { this.element.setAttribute("data-turbo-frame", "_top") this.submit() } reset() { this.element.reset() } cancel() { this.cancelTarget?.click() } preventAttachment(event) { event.preventDefault() } async disableSubmitWhenInvalid(event) { await nextFrame() if (this.element.checkValidity()) { this.submitTarget.removeAttribute("disabled") } else { this.submitTarget.toggleAttribute("disabled", true) } } select(event) { event.target.select() } blurActiveInput() { document.activeElement?.blur() } }