UNPKG

@stimulus-library/controllers

Version:

A library of useful controllers for Stimulus

65 lines (64 loc) 1.99 kB
import { BaseController, isTypeOfButtonableElement } from "@stimulus-library/utilities"; import { useEventListener, useTemporaryContent } from "@stimulus-library/mixins"; export class DisableWithController extends BaseController { get _message() { return this.hasMessageValue ? this.messageValue : "Submitting..."; } get _timeout() { return this.hasTimeoutValue ? this.timeoutValue : 1000; } connect() { requestAnimationFrame(() => { useEventListener(this, this.el, ["click"], this.disable); useEventListener(this, window, ["turbo:load", "turbolinks:load"], this._enable); }); } disable(event) { const element = this.el; if (this._isDisabled(element)) { event === null || event === void 0 ? void 0 : event.preventDefault(); event === null || event === void 0 ? void 0 : event.stopImmediatePropagation(); } else { this._disable(); useTemporaryContent(this, element, this._message, this._timeout, this._enable); } } enable(event) { event === null || event === void 0 ? void 0 : event.preventDefault(); const element = this.el; if (this._isDisabled(element)) { this._enable(); } } _isDisabled(el) { if (isTypeOfButtonableElement(el)) { return el.disabled; } else { return el.dataset.disabled == "true"; } } _disable() { const el = this.el; if (isTypeOfButtonableElement(el)) { el.disabled = true; } else { el.dataset.disabled = "true"; } } _enable() { const el = this.el; if (isTypeOfButtonableElement(el)) { el.disabled = false; } else { el.dataset.disabled = undefined; } } } DisableWithController.values = { message: String, timeout: Number, };