diff --git a/app/javascript/controllers/auto_save_controller.js b/app/javascript/controllers/auto_save_controller.js index 0323ab9adc..589ff5c84a 100644 --- a/app/javascript/controllers/auto_save_controller.js +++ b/app/javascript/controllers/auto_save_controller.js @@ -5,6 +5,7 @@ const AUTOSAVE_INTERVAL = 3000 export default class extends Controller { #timer + #savePromise // Lifecycle @@ -17,6 +18,8 @@ export default class extends Controller { async submit() { if (this.#dirty) { await this.#save() + } else if (this.#savePromise) { + await this.#savePromise } } @@ -34,7 +37,12 @@ export default class extends Controller { async #save() { this.#resetTimer() - await submitForm(this.element) + this.#savePromise = submitForm(this.element) + try { + await this.#savePromise + } finally { + this.#savePromise = null + } } #resetTimer() { diff --git a/app/javascript/controllers/clicker_controller.js b/app/javascript/controllers/clicker_controller.js index 6d35719425..91d1223870 100644 --- a/app/javascript/controllers/clicker_controller.js +++ b/app/javascript/controllers/clicker_controller.js @@ -3,8 +3,13 @@ import { nextFrame } from "helpers/timing_helpers"; export default class extends Controller { static targets = [ "clickable" ] + static outlets = [ "auto-save" ] async click() { + if (this.hasAutoSaveOutlet) { + await this.autoSaveOutlet.submit() + } + await nextFrame() this.#clickable.click() } diff --git a/app/views/cards/container/footer/_create.html.erb b/app/views/cards/container/footer/_create.html.erb index 4e5a83e205..9df6a7ff11 100644 --- a/app/views/cards/container/footer/_create.html.erb +++ b/app/views/cards/container/footer/_create.html.erb @@ -3,13 +3,15 @@ <%= button_to card_publish_path(card), name: "creation_type", value: "add", class: "btn", title: "Create card (#{ hotkey_label(["ctrl", "enter"]) })", form: { data: { controller: "form bridge--form" } }, - data: { form_target: "submit", bridge__form_target: "submit", controller: "clicker", action: "keydown.ctrl+enter@document->clicker#click keydown.meta+enter@document->clicker#click" } do %> + data: { form_target: "submit", bridge__form_target: "submit", controller: "clicker", clicker_auto_save_outlet: "#card_form", + action: "keydown.ctrl+enter@document->clicker#click keydown.meta+enter@document->clicker#click" } do %> Create card <% end %> <%= button_to card_publish_path(card), method: :post, class: "btn btn--reversed", name: "creation_type", value: "add_another", title: "Create and add another (#{ hotkey_label(["ctrl", "shift", "enter"]) })", form: { data: { controller: "form" } }, - data: { form_target: "submit", controller: "clicker", action: "keydown.ctrl+shift+enter@document->clicker#click keydown.meta+shift+enter@document->clicker#click" } do %> + data: { form_target: "submit", controller: "clicker", clicker_auto_save_outlet: "#card_form", + action: "keydown.ctrl+shift+enter@document->clicker#click keydown.meta+shift+enter@document->clicker#click" } do %> Create and add another <% end %>