diff --git a/web/src/compose_setup.js b/web/src/compose_setup.js index b5f30e5b9d..7b7c9315e7 100644 --- a/web/src/compose_setup.js +++ b/web/src/compose_setup.js @@ -18,6 +18,7 @@ import * as compose_state from "./compose_state.ts"; import * as compose_ui from "./compose_ui.ts"; import * as compose_validate from "./compose_validate.ts"; import * as dialog_widget from "./dialog_widget.ts"; +import * as drafts from "./drafts.ts"; import * as flatpickr from "./flatpickr.ts"; import {$t_html} from "./i18n.ts"; import * as message_edit from "./message_edit.ts"; @@ -626,6 +627,12 @@ export function initialize() { compose_recipient.set_high_attention_recipient_row(); }); + $(window).on("blur", () => { + // Save drafts when the window loses focus to help + // ensure no work is lost + drafts.update_draft(); + }); + $("body").on("click", ".formatting_button", function (e) { const $compose_click_target = $(this); const $textarea = $compose_click_target.closest("form").find("textarea"); diff --git a/web/tests/compose.test.cjs b/web/tests/compose.test.cjs index ab668ff1b2..9d789a5518 100644 --- a/web/tests/compose.test.cjs +++ b/web/tests/compose.test.cjs @@ -156,6 +156,7 @@ function initialize_handlers({override}) { override(realm, "realm_available_video_chat_providers", {disabled: {id: 0}}); override(realm, "realm_video_chat_provider", 0); override(resize, "watch_manual_resize", noop); + disable_window_triggers(override); compose_setup.initialize(); } @@ -163,6 +164,10 @@ function disable_document_triggers(override) { override(document, "to_$", () => $("document-stub")); } +function disable_window_triggers(override) { + override(window, "to_$", () => $("window-stub")); +} + function on_compose_finished_trigger_do(f) { $(document).on("compose_finished.zulip", f); } @@ -543,6 +548,8 @@ test_ui("finish", ({override, override_rewire}) => { }); test_ui("initialize", ({override}) => { + disable_window_triggers(override); + let compose_actions_expected_opts; let compose_actions_start_checked; diff --git a/web/tests/compose_video.test.cjs b/web/tests/compose_video.test.cjs index 089ea91409..2a15bfcf3c 100644 --- a/web/tests/compose_video.test.cjs +++ b/web/tests/compose_video.test.cjs @@ -78,6 +78,7 @@ function test(label, f) { test("videos", ({override}) => { override(realm, "realm_video_chat_provider", realm_available_video_chat_providers.disabled.id); + override(window, "to_$", () => $("window-stub")); stub_out_video_calls(); @@ -280,6 +281,7 @@ test("videos", ({override}) => { test("test_video_chat_button_toggle disabled", ({override}) => { override(realm, "realm_video_chat_provider", realm_available_video_chat_providers.disabled.id); + override(window, "to_$", () => $("window-stub")); compose_setup.initialize(); assert.equal($(".compose-control-buttons-container .video_link").visible(), false); }); @@ -290,6 +292,7 @@ test("test_video_chat_button_toggle no url", ({override}) => { "realm_video_chat_provider", realm_available_video_chat_providers.jitsi_meet.id, ); + override(window, "to_$", () => $("window-stub")); page_params.jitsi_server_url = null; compose_setup.initialize(); assert.equal($(".compose-control-buttons-container .video_link").visible(), false); @@ -302,6 +305,7 @@ test("test_video_chat_button_toggle enabled", ({override}) => { realm_available_video_chat_providers.jitsi_meet.id, ); override(realm, "realm_jitsi_server_url", "https://meet.jit.si"); + override(window, "to_$", () => $("window-stub")); compose_setup.initialize(); assert.equal($(".compose-control-buttons-container .video_link").visible(), true); });