From 6ad8e276de088bde4eca1bd9c817ee31dc2c421f Mon Sep 17 00:00:00 2001 From: Sahil Batra Date: Fri, 4 Nov 2022 15:41:33 +0530 Subject: [PATCH] settings: Refactor code for realm message retention setting. This commit refactors the code for realm message retention setting to make it more similar to code for other time-limit realm settings. There are still separate functions for the message retention setting but they are similar to that of other time-limit settings and can probably help us to deduplicate the code in future. This refactor also helps us in reusing some code for stream message retention setting for changes in #23013. This commit also fixes a bug where save-discard widget not being hidden when resetting the setting to original value. This can only be reproduced when the original setting value is "retain_forever". Following changes have been done in this commit - - Added data-setting-widget-type attribute which is set to "message-retention-setting" similar to "time-limit" value for message edit and delete limit settings. - Added get_message_retention_setting_value function similar to get_time_limit_setting_value function which is used by get_input_element_value. - Removed "message-retention" block from get_complete_data_for_subsection and the message retention setting is now added to request data in populate_data_for_request itself using data-setting-widget-type attribute. - Updated id and class of elements to support the above changes. --- frontend_tests/node_tests/settings_org.js | 4 +- static/js/settings_org.js | 85 +++++++++++-------- .../settings/organization_settings_admin.hbs | 16 ++-- 3 files changed, 59 insertions(+), 46 deletions(-) diff --git a/frontend_tests/node_tests/settings_org.js b/frontend_tests/node_tests/settings_org.js index c040f7f93a..e7194dd114 100644 --- a/frontend_tests/node_tests/settings_org.js +++ b/frontend_tests/node_tests/settings_org.js @@ -557,7 +557,9 @@ test("set_up", ({override, override_rewire}) => { ); $custom_delete_limit_input.attr("id", "id_realm_message_content_delete_limit_minutes"); - $("#id_realm_message_retention_days").set_parent($.create("")); + $("#id_realm_message_retention_custom_input").set_parent( + $.create(""), + ); $("#message_content_in_email_notifications_label").set_parent( $.create(""), ); diff --git a/static/js/settings_org.js b/static/js/settings_org.js index 1d8dd51c59..51ebfdadb0 100644 --- a/static/js/settings_org.js +++ b/static/js/settings_org.js @@ -162,13 +162,6 @@ function get_property_value(property_name, for_realm_default_settings) { return "custom_days"; } - if (property_name === "realm_message_retention_setting") { - if (page_params.realm_message_retention_days === settings_config.retain_message_forever) { - return "retain_forever"; - } - return "retain_for_period"; - } - if (property_name === "realm_org_join_restrictions") { if (page_params.realm_emails_restricted_to_domains) { return "only_selected_domain"; @@ -371,19 +364,45 @@ function set_msg_delete_limit_dropdown() { set_time_limit_setting("realm_message_content_delete_limit_seconds"); } -function set_message_retention_setting_dropdown() { - const value = get_property_value("realm_message_retention_setting"); - $("#id_realm_message_retention_setting").val(value); - change_element_block_display_property( - "id_realm_message_retention_days", - value === "retain_for_period", - ); - if ( - get_property_value("realm_message_retention_days") === - settings_config.retain_message_forever - ) { - $("#id_realm_message_retention_days").val(""); +function get_message_retention_setting_value($input_elem, for_api_data = true) { + const select_elem_val = $input_elem.val(); + if (select_elem_val === "retain_forever") { + if (!for_api_data) { + return settings_config.retain_message_forever; + } + return JSON.stringify("unlimited"); } + + const $custom_input = $input_elem.parent().find(".message-retention-setting-custom-input"); + if ($custom_input.val().length === 0) { + return settings_config.retain_message_forever; + } + return Number.parseInt($custom_input.val(), 10); +} + +function get_dropdown_value_for_message_retention_setting(setting_value) { + if (setting_value === settings_config.retain_message_forever) { + return "retain_forever"; + } + + return "retain_for_period"; +} + +function set_message_retention_setting_dropdown() { + const value = get_property_value("realm_message_retention_days"); + const dropdown_val = get_dropdown_value_for_message_retention_setting(value); + $("#id_realm_message_retention_days").val(dropdown_val); + + change_element_block_display_property( + "id_realm_message_retention_custom_input", + dropdown_val === "retain_for_period", + ); + + let custom_input_val = ""; + if (dropdown_val === "retain_for_period") { + custom_input_val = value; + } + $("#id_realm_message_retention_custom_input").val(custom_input_val); } function set_org_join_restrictions_dropdown() { @@ -484,9 +503,6 @@ function update_dependent_subsettings(property_name) { case "realm_allow_message_editing": update_message_edit_sub_settings(page_params.realm_allow_message_editing); break; - case "realm_message_retention_days": - set_message_retention_setting_dropdown(); - break; case "realm_delete_own_message_policy": set_delete_own_message_policy_dropdown(page_params.realm_delete_own_message_policy); break; @@ -578,6 +594,9 @@ function discard_property_element_changes(elem, for_realm_default_settings) { case "realm_message_content_delete_limit_seconds": set_time_limit_setting(property_name); break; + case "realm_message_retention_days": + set_message_retention_setting_dropdown(); + break; default: if (property_value !== undefined) { set_input_element_value($elem, property_value); @@ -732,6 +751,8 @@ export function get_input_element_value(input_elem, input_type) { return undefined; case "time-limit": return get_time_limit_setting_value($input_elem); + case "message-retention-setting": + return get_message_retention_setting_value($input_elem); default: return undefined; } @@ -828,6 +849,9 @@ function check_property_changed(elem, for_realm_default_settings) { case "realm_message_content_delete_limit_seconds": proposed_val = get_time_limit_setting_value($elem, false); break; + case "realm_message_retention_days": + proposed_val = get_message_retention_setting_value($elem, false); + break; case "realm_default_language": proposed_val = $( "#org-notifications .language_selection_widget .language_selection_button span", @@ -984,19 +1008,6 @@ export function register_save_discard_widget_handlers( "#org-notifications .language_selection_widget .language_selection_button span", ).attr("data-language-code"); break; - case "message_retention": { - const message_retention_setting_value = $( - "#id_realm_message_retention_setting", - ).val(); - if (message_retention_setting_value === "retain_forever") { - data.message_retention_days = JSON.stringify("unlimited"); - } else { - data.message_retention_days = JSON.stringify( - get_input_element_value($("#id_realm_message_retention_days")), - ); - } - break; - } case "other_settings": { const code_block_language_value = default_code_language_widget.value(); // No need to JSON-encode, since this value is already a string. @@ -1156,10 +1167,10 @@ export function build_page() { update_custom_value_input("realm_message_content_delete_limit_seconds"); }); - $("#id_realm_message_retention_setting").on("change", (e) => { + $("#id_realm_message_retention_days").on("change", (e) => { const message_retention_setting_dropdown_value = e.target.value; change_element_block_display_property( - "id_realm_message_retention_days", + "id_realm_message_retention_custom_input", message_retention_setting_dropdown_value === "retain_for_period", ); }); diff --git a/static/templates/settings/organization_settings_admin.hbs b/static/templates/settings/organization_settings_admin.hbs index 55c7b186cb..514ef1c3b6 100644 --- a/static/templates/settings/organization_settings_admin.hbs +++ b/static/templates/settings/organization_settings_admin.hbs @@ -69,23 +69,23 @@
-