UNPKG

@stimulus-library/controllers

Version:

A library of useful controllers for Stimulus

64 lines (63 loc) 2.46 kB
import { BaseController, EventBus, getAllRadiosInGroup, isHTMLInputElement } from "@stimulus-library/utilities"; import { useEventBus, useEventListeners } from "@stimulus-library/mixins"; import { signalConnectEvent, signalValueEvent } from "./events"; export class SignalInputController extends BaseController { get _debounceTimeout() { return this.hasDebounceIntervalValue ? this.debounceIntervalValue : 1; } get _name() { return this.hasNameValue ? this.nameValue : this.element.name; } connect() { useEventBus(this, signalConnectEvent(this._name), () => this.emitValue()); useEventBus(this, signalValueEvent(this._name), this._onSignal); useEventListeners(this, this.el, ["input", "change"], this.emitValue, { debounce: this._debounceTimeout || undefined }); requestAnimationFrame(() => this.emitValue()); } emitValue() { var _a; let value = this.el.value; if (isHTMLInputElement(this.el) && this.el.type === "checkbox") { value = this.el.checked ? "true" : "false"; } else if (isHTMLInputElement(this.el) && this.el.type === "radio") { const selectedValue = (_a = getAllRadiosInGroup(this.el).find(el => el.checked)) === null || _a === void 0 ? void 0 : _a.value; value = selectedValue ? selectedValue : ""; } this.dispatchEvent(this.el, signalValueEvent(this._name), { detail: { value } }); EventBus.emit(signalValueEvent(this._name), { element: this.el, value }); } _onSignal(payload) { const { element, value } = payload; if (element === this.el) { return; } if (isHTMLInputElement(this.el) && this.el.type === "checkbox") { this.el.checked = value === "true"; } else if (isHTMLInputElement(this.el) && this.el.type === "radio") { this.el.checked = this.el.value === value; } else { this.el.value = value; } if (this.triggerChangeValue) { this.dispatchEvent(this.el, "change"); } if (this.triggerInputValue) { this.dispatchEvent(this.el, "input"); } } } SignalInputController.values = { name: String, debounceInterval: Number, triggerChange: { type: Boolean, default: false, }, triggerInput: { type: Boolean, default: false, }, };