From 5da1e57fc286c66bff4df5273e8119cc6e10801a Mon Sep 17 00:00:00 2001 From: Sahil Batra Date: Tue, 18 Jun 2024 15:20:51 +0530 Subject: [PATCH] settings: Update save discard buttons when live-updating. This commit adds code to hide save discard buttons and discard the changes if another user changed a setting in the same subsection. --- web/src/settings_org.js | 9 ++++-- .../settings_realm_user_settings_defaults.js | 7 ++++- web/tests/settings_org.test.js | 31 +++++++++++++++++++ 3 files changed, 44 insertions(+), 3 deletions(-) diff --git a/web/src/settings_org.js b/web/src/settings_org.js index 608eaf3ff0..5333b47185 100644 --- a/web/src/settings_org.js +++ b/web/src/settings_org.js @@ -663,7 +663,7 @@ export function discard_group_settings_subsection_changes($subsection, group) { settings_components.change_save_button_state($save_btn_controls, "discarded"); } -function discard_realm_default_settings_subsection_changes($subsection) { +export function discard_realm_default_settings_subsection_changes($subsection) { for (const elem of settings_components.get_subsection_property_elements($subsection)) { discard_realm_default_property_element_changes(elem); } @@ -710,7 +710,12 @@ export function sync_realm_settings(property) { } const $element = $(`#id_realm_${CSS.escape(property)}`); if ($element.length) { - discard_realm_property_element_changes($element); + const $subsection = $element.closest(".settings-subsection-parent"); + if ($subsection.find(".save-button-controls").hasClass("hide")) { + discard_realm_property_element_changes($element); + } else { + discard_realm_settings_subsection_changes($subsection); + } } } diff --git a/web/src/settings_realm_user_settings_defaults.js b/web/src/settings_realm_user_settings_defaults.js index b6df9f271e..0a96ee3903 100644 --- a/web/src/settings_realm_user_settings_defaults.js +++ b/web/src/settings_realm_user_settings_defaults.js @@ -34,7 +34,12 @@ export function update_page(property) { const $element = $(`#realm_${CSS.escape(property)}`); if ($element.length) { - settings_org.discard_realm_default_property_element_changes($element[0]); + const $subsection = $element.closest(".settings-subsection-parent"); + if ($subsection.find(".save-button-controls").hasClass("hide")) { + settings_org.discard_realm_default_property_element_changes($element[0]); + } else { + settings_org.discard_realm_default_settings_subsection_changes($subsection); + } } } diff --git a/web/tests/settings_org.test.js b/web/tests/settings_org.test.js index 56cd99b3c8..d52f3d3ad3 100644 --- a/web/tests/settings_org.test.js +++ b/web/tests/settings_org.test.js @@ -288,10 +288,17 @@ function test_extract_property_name() { } function test_sync_realm_settings() { + const $subsection_stub = $.create("org-subsection-stub"); + $subsection_stub.set_find_results( + ".save-button-controls", + $.create("save-button-controls-stub").addClass("hide"), + ); + { /* Test invalid settings property sync */ const $property_elem = $("#id_realm_invalid_settings_property"); $property_elem.attr("id", "id_realm_invalid_settings_property"); + $property_elem.closest = () => $subsection_stub; $property_elem.length = 1; blueslip.expect("error", "Element refers to unknown property"); @@ -302,6 +309,7 @@ function test_sync_realm_settings() { const $property_elem = $(`#id_realm_${CSS.escape(property_name)}`); $property_elem.length = 1; $property_elem.attr("id", `id_realm_${CSS.escape(property_name)}`); + $property_elem.closest = () => $subsection_stub; /* Each policy is initialized to 'by_members' and then all the values are tested in the following order - by_admins_only, by_moderators_only, by_full_members, @@ -328,6 +336,7 @@ function test_sync_realm_settings() { $property_dropdown_elem.length = 1; $property_elem.attr("id", "id_realm_message_content_edit_limit_minutes"); $property_dropdown_elem.attr("id", "id_realm_message_content_edit_limit_seconds"); + $property_dropdown_elem.closest = () => $subsection_stub; realm.realm_message_content_edit_limit_seconds = 120; @@ -351,6 +360,7 @@ function test_sync_realm_settings() { const $property_elem = $("#id_realm_org_join_restrictions"); $property_elem.length = 1; $property_elem.attr("id", "id_realm_org_join_restrictions"); + $property_elem.closest = () => $subsection_stub; realm.realm_emails_restricted_to_domains = true; realm.realm_disallow_disposable_email_addresses = false; @@ -367,6 +377,27 @@ function test_sync_realm_settings() { settings_org.sync_realm_settings("emails_restricted_to_domains"); assert.equal($("#id_realm_org_join_restrictions").val(), "no_restriction"); } + + { + // Test hiding save-discard buttons on live-updating. + const $property_elem = $("#id_realm_invite_to_realm_policy"); + $property_elem.length = 1; + $property_elem.attr("id", "id_realm_invite_to_realm_policy"); + $property_elem.closest = () => $subsection_stub; + + const save_button_stubs = createSaveButtons("subsection-stub"); + $subsection_stub.set_find_results( + ".save-button-controls", + save_button_stubs.$save_button_controls, + ); + $property_elem.val(settings_config.common_policy_values.by_admins_only.code); + realm.realm_invite_to_realm_policy = settings_config.common_policy_values.by_members.code; + save_button_stubs.$save_button_controls.removeClass("hide"); + $subsection_stub.set_find_results(".prop-element", [$property_elem]); + + settings_org.sync_realm_settings("invite_to_realm_policy"); + assert.equal(save_button_stubs.props.hidden, true); + } } function test_parse_time_limit() {