import { isButtonElement } from '@utils'; import { ApplicationController } from './application_controller'; export class AutosaveSubmitController extends ApplicationController { #isSaving = false; #shouldSubmit = true; #buttonText?: string; connect(): void { this.onGlobal('autosave:enqueue', () => this.didEnqueue()); this.onGlobal('autosave:end', () => this.didSucceed()); this.onGlobal('autosave:error', () => this.didFail()); this.on('click', (event) => this.onClick(event)); } // Intercept form submit if autosave is still in progress private onClick(event: Event) { if (this.#isSaving) { this.#shouldSubmit = true; this.disableButton(); event.preventDefault(); } } private didEnqueue() { this.#isSaving = true; this.#shouldSubmit = false; } // If submit was previously requested, send it, now that autosave have finished private didSucceed() { if (this.#shouldSubmit && isButtonElement(this.element)) { this.element.form?.requestSubmit(this.element); } this.#isSaving = false; this.#shouldSubmit = false; this.enableButton(); } private didFail() { this.#isSaving = false; this.#shouldSubmit = false; this.enableButton(); } private disableButton() { if (isButtonElement(this.element)) { this.#buttonText = this.element.value; this.element.value = this.element.dataset.disableWith ?? ''; this.element.disabled = true; } } private enableButton() { if (isButtonElement(this.element) && this.#buttonText) { this.element.value = this.#buttonText; this.element.disabled = false; } } }