mirror of
				https://github.com/zulip/zulip.git
				synced 2025-10-31 03:53:50 +00:00 
			
		
		
		
	Extract settings_account.js.
This code handles the settings pane for "Your account," which has email/name/password/avatar/etc.
This commit is contained in:
		| @@ -32,6 +32,7 @@ | |||||||
|         "stream_color": false, |         "stream_color": false, | ||||||
|         "people": false, |         "people": false, | ||||||
|         "navigate": false, |         "navigate": false, | ||||||
|  |         "settings_account": false, | ||||||
|         "settings": false, |         "settings": false, | ||||||
|         "resize": false, |         "resize": false, | ||||||
|         "loading": false, |         "loading": false, | ||||||
|   | |||||||
| @@ -139,14 +139,6 @@ function render_bots() { | |||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
| exports.update_email = function (new_email) { |  | ||||||
|     var email_input = $('#email_value'); |  | ||||||
|  |  | ||||||
|     if (email_input) { |  | ||||||
|         email_input.text(new_email); |  | ||||||
|     } |  | ||||||
| }; |  | ||||||
|  |  | ||||||
| exports.generate_zuliprc_uri = function (email, api_key) { | exports.generate_zuliprc_uri = function (email, api_key) { | ||||||
|     var data = settings.generate_zuliprc_content(email, api_key); |     var data = settings.generate_zuliprc_content(email, api_key); | ||||||
|  |  | ||||||
| @@ -246,13 +238,13 @@ function _setup_page() { | |||||||
|     }); |     }); | ||||||
|  |  | ||||||
|     $(".settings-box").html(settings_tab); |     $(".settings-box").html(settings_tab); | ||||||
|     $("#account-settings-status").hide(); |  | ||||||
|     $("#notify-settings-status").hide(); |     $("#notify-settings-status").hide(); | ||||||
|     $("#display-settings-status").hide(); |     $("#display-settings-status").hide(); | ||||||
|     $("#ui-settings-status").hide(); |     $("#ui-settings-status").hide(); | ||||||
|  |  | ||||||
|     alert_words_ui.set_up_alert_words(); |     alert_words_ui.set_up_alert_words(); | ||||||
|     attachments_ui.set_up_attachments(); |     attachments_ui.set_up_attachments(); | ||||||
|  |     settings_account.set_up(); | ||||||
|  |  | ||||||
|     $("#api_key_value").text(""); |     $("#api_key_value").text(""); | ||||||
|     $("#get_api_key_box").hide(); |     $("#get_api_key_box").hide(); | ||||||
| @@ -263,13 +255,6 @@ function _setup_page() { | |||||||
|         exports.launch_page(tab); |         exports.launch_page(tab); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     function clear_password_change() { |  | ||||||
|         // Clear the password boxes so that passwords don't linger in the DOM |  | ||||||
|         // for an XSS attacker to find. |  | ||||||
|         $('#old_password, #new_password, #confirm_password').val(''); |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     clear_password_change(); |  | ||||||
|  |  | ||||||
|     $('#api_key_button').click(function () { |     $('#api_key_button').click(function () { | ||||||
|         if (page_params.password_auth_enabled !== false) { |         if (page_params.password_auth_enabled !== false) { | ||||||
| @@ -281,30 +266,6 @@ function _setup_page() { | |||||||
|         $("#api_key_button_box").hide(); |         $("#api_key_button_box").hide(); | ||||||
|     }); |     }); | ||||||
|  |  | ||||||
|     $('#pw_change_link').on('click', function (e) { |  | ||||||
|         e.preventDefault(); |  | ||||||
|         $('#pw_change_link').hide(); |  | ||||||
|         $('#pw_change_controls').show(); |  | ||||||
|         if (page_params.password_auth_enabled !== false) { |  | ||||||
|             // zxcvbn.js is pretty big, and is only needed on password |  | ||||||
|             // change, so load it asynchronously. |  | ||||||
|             var zxcvbn_path = '/static/min/zxcvbn.js'; |  | ||||||
|             if (page_params.development_environment) { |  | ||||||
|                 // Usually the Django templates handle this path stuff |  | ||||||
|                 // for us, but in this case we need to hardcode it. |  | ||||||
|                 zxcvbn_path = '/static/node_modules/zxcvbn/dist/zxcvbn.js'; |  | ||||||
|             } |  | ||||||
|             $.getScript(zxcvbn_path, function () { |  | ||||||
|                 $('#pw_strength .bar').removeClass("fade"); |  | ||||||
|             }); |  | ||||||
|         } |  | ||||||
|     }); |  | ||||||
|  |  | ||||||
|     $('#new_password').on('change keyup', function () { |  | ||||||
|         var field = $('#new_password'); |  | ||||||
|         password_quality(field.val(), $('#pw_strength .bar'), field); |  | ||||||
|     }); |  | ||||||
|  |  | ||||||
|     if (!page_params.show_digest_email) { |     if (!page_params.show_digest_email) { | ||||||
|         $("#other_notifications").hide(); |         $("#other_notifications").hide(); | ||||||
|     } |     } | ||||||
| @@ -312,57 +273,6 @@ function _setup_page() { | |||||||
|         $('.new-bot-ui').hide(); |         $('.new-bot-ui').hide(); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     function settings_change_error(message, xhr) { |  | ||||||
|         // Scroll to the top so the error message is visible. |  | ||||||
|         // We would scroll anyway if we end up submitting the form. |  | ||||||
|         message_viewport.scrollTop(0); |  | ||||||
|         ui_report.error(message, xhr, $('#account-settings-status').expectOne()); |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     function settings_change_success(message) { |  | ||||||
|         // Scroll to the top so the error message is visible. |  | ||||||
|         // We would scroll anyway if we end up submitting the form. |  | ||||||
|         message_viewport.scrollTop(0); |  | ||||||
|         ui_report.success(message, $('#account-settings-status').expectOne()); |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     $("form.your-account-settings").ajaxForm({ |  | ||||||
|         dataType: 'json', // This seems to be ignored. We still get back an xhr. |  | ||||||
|         beforeSubmit: function () { |  | ||||||
|             if (page_params.password_auth_enabled !== false) { |  | ||||||
|                 // FIXME: Check that the two password fields match |  | ||||||
|                 // FIXME: Use the same jQuery validation plugin as the signup form? |  | ||||||
|                 var field = $('#new_password'); |  | ||||||
|                 var new_pw = $('#new_password').val(); |  | ||||||
|                 if (new_pw !== '') { |  | ||||||
|                     var password_ok = password_quality(new_pw, undefined, field); |  | ||||||
|                     if (password_ok === undefined) { |  | ||||||
|                         // zxcvbn.js didn't load, for whatever reason. |  | ||||||
|                         settings_change_error( |  | ||||||
|                             'An internal error occurred; try reloading the page. ' + |  | ||||||
|                             'Sorry for the trouble!'); |  | ||||||
|                         return false; |  | ||||||
|                     } else if (!password_ok) { |  | ||||||
|                         settings_change_error('New password is too weak'); |  | ||||||
|                         return false; |  | ||||||
|                     } |  | ||||||
|                 } |  | ||||||
|             } |  | ||||||
|             return true; |  | ||||||
|         }, |  | ||||||
|         success: function () { |  | ||||||
|             settings_change_success("Updated settings!"); |  | ||||||
|         }, |  | ||||||
|         error: function (xhr) { |  | ||||||
|             settings_change_error("Error changing settings", xhr); |  | ||||||
|         }, |  | ||||||
|         complete: function () { |  | ||||||
|             // Whether successful or not, clear the password boxes. |  | ||||||
|             // TODO: Clear these earlier, while the request is still pending. |  | ||||||
|             clear_password_change(); |  | ||||||
|         }, |  | ||||||
|     }); |  | ||||||
|  |  | ||||||
|     function update_notification_settings_success(resp, statusText, xhr) { |     function update_notification_settings_success(resp, statusText, xhr) { | ||||||
|         var result = JSON.parse(xhr.responseText); |         var result = JSON.parse(xhr.responseText); | ||||||
|         var notify_settings_status = $('#notify-settings-status').expectOne(); |         var notify_settings_status = $('#notify-settings-status').expectOne(); | ||||||
| @@ -597,63 +507,12 @@ function _setup_page() { | |||||||
|         }); |         }); | ||||||
|     }); |     }); | ||||||
|  |  | ||||||
|     $('#change_email_button').on('click', function (e) { |  | ||||||
|         e.preventDefault(); |  | ||||||
|         e.stopPropagation(); |  | ||||||
|         $('#change_email_modal').modal('hide'); |  | ||||||
|  |  | ||||||
|         var data = {}; |  | ||||||
|         data.email = $('.email_change_container').find("input[name='email']").val(); |  | ||||||
|  |  | ||||||
|         channel.patch({ |  | ||||||
|             url: '/json/settings/change', |  | ||||||
|             data: data, |  | ||||||
|             success: function (data) { |  | ||||||
|                 if ('account_email' in data) { |  | ||||||
|                     settings_change_success(data.account_email); |  | ||||||
|                 } else { |  | ||||||
|                     settings_change_error(i18n.t("Error changing settings: No new data supplied.")); |  | ||||||
|                 } |  | ||||||
|             }, |  | ||||||
|             error: function (xhr) { |  | ||||||
|                 settings_change_error("Error changing settings", xhr); |  | ||||||
|             }, |  | ||||||
|         }); |  | ||||||
|     }); |  | ||||||
|  |  | ||||||
|     $('#default_language').on('click', function (e) { |     $('#default_language').on('click', function (e) { | ||||||
|         e.preventDefault(); |         e.preventDefault(); | ||||||
|         e.stopPropagation(); |         e.stopPropagation(); | ||||||
|         $('#default_language_modal').show().attr('aria-hidden', false); |         $('#default_language_modal').show().attr('aria-hidden', false); | ||||||
|     }); |     }); | ||||||
|  |  | ||||||
|     $('#change_email').on('click', function (e) { |  | ||||||
|         e.preventDefault(); |  | ||||||
|         e.stopPropagation(); |  | ||||||
|         $('#change_email_modal').modal('show'); |  | ||||||
|         var email = $('#email_value').text(); |  | ||||||
|         $('.email_change_container').find("input[name='email']").val(email); |  | ||||||
|     }); |  | ||||||
|  |  | ||||||
|     $("#user_deactivate_account_button").on('click', function (e) { |  | ||||||
|         e.preventDefault(); |  | ||||||
|         e.stopPropagation(); |  | ||||||
|         $("#deactivate_self_modal").modal("show"); |  | ||||||
|     }); |  | ||||||
|  |  | ||||||
|     $("#do_deactivate_self_button").on('click',function () { |  | ||||||
|         $("#deactivate_self_modal").modal("hide"); |  | ||||||
|         channel.del({ |  | ||||||
|             url: '/json/users/me', |  | ||||||
|             success: function () { |  | ||||||
|                 window.location.href = "/login"; |  | ||||||
|             }, |  | ||||||
|             error: function (xhr) { |  | ||||||
|                 ui_report.error(i18n.t("Error deactivating account"), xhr, $('#account-settings-status').expectOne()); |  | ||||||
|             }, |  | ||||||
|         }); |  | ||||||
|     }); |  | ||||||
|  |  | ||||||
|     $("#get_api_key_box").hide(); |     $("#get_api_key_box").hide(); | ||||||
|     $("#show_api_key_box").hide(); |     $("#show_api_key_box").hide(); | ||||||
|     $("#get_api_key_box form").ajaxForm({ |     $("#get_api_key_box form").ajaxForm({ | ||||||
| @@ -675,39 +534,6 @@ function _setup_page() { | |||||||
|         }, |         }, | ||||||
|     }); |     }); | ||||||
|  |  | ||||||
|     function upload_avatar(file_input) { |  | ||||||
|         var form_data = new FormData(); |  | ||||||
|  |  | ||||||
|         form_data.append('csrfmiddlewaretoken', csrf_token); |  | ||||||
|         jQuery.each(file_input[0].files, function (i, file) { |  | ||||||
|             form_data.append('file-'+i, file); |  | ||||||
|         }); |  | ||||||
|  |  | ||||||
|         var spinner = $("#upload_avatar_spinner").expectOne(); |  | ||||||
|         loading.make_indicator(spinner, {text: 'Uploading avatar.'}); |  | ||||||
|  |  | ||||||
|         channel.put({ |  | ||||||
|             url: '/json/users/me/avatar', |  | ||||||
|             data: form_data, |  | ||||||
|             cache: false, |  | ||||||
|             processData: false, |  | ||||||
|             contentType: false, |  | ||||||
|             success: function (data) { |  | ||||||
|                 loading.destroy_indicator($("#upload_avatar_spinner")); |  | ||||||
|                 $("#user-settings-avatar").expectOne().attr("src", data.avatar_url); |  | ||||||
|                 $("#user_avatar_delete_button").show(); |  | ||||||
|             }, |  | ||||||
|         }); |  | ||||||
|  |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     avatar.build_user_avatar_widget(upload_avatar); |  | ||||||
|  |  | ||||||
|     if (page_params.name_changes_disabled) { |  | ||||||
|         $(".name_change_container").hide(); |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|  |  | ||||||
|     // TODO: render bots xxxx |     // TODO: render bots xxxx | ||||||
|     render_bots(); |     render_bots(); | ||||||
|     $(document).on('zulip.bot_data_changed', render_bots); |     $(document).on('zulip.bot_data_changed', render_bots); | ||||||
|   | |||||||
							
								
								
									
										192
									
								
								static/js/settings_account.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										192
									
								
								static/js/settings_account.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,192 @@ | |||||||
|  | var settings_account = (function () { | ||||||
|  |  | ||||||
|  | var exports = {}; | ||||||
|  |  | ||||||
|  | exports.update_email = function (new_email) { | ||||||
|  |     var email_input = $('#email_value'); | ||||||
|  |  | ||||||
|  |     if (email_input) { | ||||||
|  |         email_input.text(new_email); | ||||||
|  |     } | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | function settings_change_error(message, xhr) { | ||||||
|  |     // Scroll to the top so the error message is visible. | ||||||
|  |     // We would scroll anyway if we end up submitting the form. | ||||||
|  |     message_viewport.scrollTop(0); | ||||||
|  |     ui_report.error(message, xhr, $('#account-settings-status').expectOne()); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | function settings_change_success(message) { | ||||||
|  |     // Scroll to the top so the error message is visible. | ||||||
|  |     // We would scroll anyway if we end up submitting the form. | ||||||
|  |     message_viewport.scrollTop(0); | ||||||
|  |     ui_report.success(message, $('#account-settings-status').expectOne()); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | exports.set_up = function () { | ||||||
|  |     $("#account-settings-status").hide(); | ||||||
|  |  | ||||||
|  |     function clear_password_change() { | ||||||
|  |         // Clear the password boxes so that passwords don't linger in the DOM | ||||||
|  |         // for an XSS attacker to find. | ||||||
|  |         $('#old_password, #new_password, #confirm_password').val(''); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     clear_password_change(); | ||||||
|  |  | ||||||
|  |     $('#pw_change_link').on('click', function (e) { | ||||||
|  |         e.preventDefault(); | ||||||
|  |         $('#pw_change_link').hide(); | ||||||
|  |         $('#pw_change_controls').show(); | ||||||
|  |         if (page_params.password_auth_enabled !== false) { | ||||||
|  |             // zxcvbn.js is pretty big, and is only needed on password | ||||||
|  |             // change, so load it asynchronously. | ||||||
|  |             var zxcvbn_path = '/static/min/zxcvbn.js'; | ||||||
|  |             if (page_params.development_environment) { | ||||||
|  |                 // Usually the Django templates handle this path stuff | ||||||
|  |                 // for us, but in this case we need to hardcode it. | ||||||
|  |                 zxcvbn_path = '/static/node_modules/zxcvbn/dist/zxcvbn.js'; | ||||||
|  |             } | ||||||
|  |             $.getScript(zxcvbn_path, function () { | ||||||
|  |                 $('#pw_strength .bar').removeClass("fade"); | ||||||
|  |             }); | ||||||
|  |         } | ||||||
|  |     }); | ||||||
|  |  | ||||||
|  |     $('#new_password').on('change keyup', function () { | ||||||
|  |         var field = $('#new_password'); | ||||||
|  |         password_quality(field.val(), $('#pw_strength .bar'), field); | ||||||
|  |     }); | ||||||
|  |  | ||||||
|  |     $("form.your-account-settings").ajaxForm({ | ||||||
|  |         dataType: 'json', // This seems to be ignored. We still get back an xhr. | ||||||
|  |         beforeSubmit: function () { | ||||||
|  |             if (page_params.password_auth_enabled !== false) { | ||||||
|  |                 // FIXME: Check that the two password fields match | ||||||
|  |                 // FIXME: Use the same jQuery validation plugin as the signup form? | ||||||
|  |                 var field = $('#new_password'); | ||||||
|  |                 var new_pw = $('#new_password').val(); | ||||||
|  |                 if (new_pw !== '') { | ||||||
|  |                     var password_ok = password_quality(new_pw, undefined, field); | ||||||
|  |                     if (password_ok === undefined) { | ||||||
|  |                         // zxcvbn.js didn't load, for whatever reason. | ||||||
|  |                         settings_change_error( | ||||||
|  |                             'An internal error occurred; try reloading the page. ' + | ||||||
|  |                             'Sorry for the trouble!'); | ||||||
|  |                         return false; | ||||||
|  |                     } else if (!password_ok) { | ||||||
|  |                         settings_change_error('New password is too weak'); | ||||||
|  |                         return false; | ||||||
|  |                     } | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |             return true; | ||||||
|  |         }, | ||||||
|  |         success: function () { | ||||||
|  |             settings_change_success("Updated settings!"); | ||||||
|  |         }, | ||||||
|  |         error: function (xhr) { | ||||||
|  |             settings_change_error("Error changing settings", xhr); | ||||||
|  |         }, | ||||||
|  |         complete: function () { | ||||||
|  |             // Whether successful or not, clear the password boxes. | ||||||
|  |             // TODO: Clear these earlier, while the request is still pending. | ||||||
|  |             clear_password_change(); | ||||||
|  |         }, | ||||||
|  |     }); | ||||||
|  |  | ||||||
|  |     $('#change_email_button').on('click', function (e) { | ||||||
|  |         e.preventDefault(); | ||||||
|  |         e.stopPropagation(); | ||||||
|  |         $('#change_email_modal').modal('hide'); | ||||||
|  |  | ||||||
|  |         var data = {}; | ||||||
|  |         data.email = $('.email_change_container').find("input[name='email']").val(); | ||||||
|  |  | ||||||
|  |         channel.patch({ | ||||||
|  |             url: '/json/settings/change', | ||||||
|  |             data: data, | ||||||
|  |             success: function (data) { | ||||||
|  |                 if ('account_email' in data) { | ||||||
|  |                     settings_change_success(data.account_email); | ||||||
|  |                 } else { | ||||||
|  |                     settings_change_error(i18n.t("Error changing settings: No new data supplied.")); | ||||||
|  |                 } | ||||||
|  |             }, | ||||||
|  |             error: function (xhr) { | ||||||
|  |                 settings_change_error("Error changing settings", xhr); | ||||||
|  |             }, | ||||||
|  |         }); | ||||||
|  |     }); | ||||||
|  |  | ||||||
|  |     $('#change_email').on('click', function (e) { | ||||||
|  |         e.preventDefault(); | ||||||
|  |         e.stopPropagation(); | ||||||
|  |         $('#change_email_modal').modal('show'); | ||||||
|  |         var email = $('#email_value').text(); | ||||||
|  |         $('.email_change_container').find("input[name='email']").val(email); | ||||||
|  |     }); | ||||||
|  |  | ||||||
|  |     $("#user_deactivate_account_button").on('click', function (e) { | ||||||
|  |         e.preventDefault(); | ||||||
|  |         e.stopPropagation(); | ||||||
|  |         $("#deactivate_self_modal").modal("show"); | ||||||
|  |     }); | ||||||
|  |  | ||||||
|  |     $("#do_deactivate_self_button").on('click',function () { | ||||||
|  |         $("#deactivate_self_modal").modal("hide"); | ||||||
|  |         channel.del({ | ||||||
|  |             url: '/json/users/me', | ||||||
|  |             success: function () { | ||||||
|  |                 window.location.href = "/login"; | ||||||
|  |             }, | ||||||
|  |             error: function (xhr) { | ||||||
|  |                 ui_report.error(i18n.t("Error deactivating account"), xhr, $('#account-settings-status').expectOne()); | ||||||
|  |             }, | ||||||
|  |         }); | ||||||
|  |     }); | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     function upload_avatar(file_input) { | ||||||
|  |         var form_data = new FormData(); | ||||||
|  |  | ||||||
|  |         form_data.append('csrfmiddlewaretoken', csrf_token); | ||||||
|  |         jQuery.each(file_input[0].files, function (i, file) { | ||||||
|  |             form_data.append('file-'+i, file); | ||||||
|  |         }); | ||||||
|  |  | ||||||
|  |         var spinner = $("#upload_avatar_spinner").expectOne(); | ||||||
|  |         loading.make_indicator(spinner, {text: 'Uploading avatar.'}); | ||||||
|  |  | ||||||
|  |         channel.put({ | ||||||
|  |             url: '/json/users/me/avatar', | ||||||
|  |             data: form_data, | ||||||
|  |             cache: false, | ||||||
|  |             processData: false, | ||||||
|  |             contentType: false, | ||||||
|  |             success: function (data) { | ||||||
|  |                 loading.destroy_indicator($("#upload_avatar_spinner")); | ||||||
|  |                 $("#user-settings-avatar").expectOne().attr("src", data.avatar_url); | ||||||
|  |                 $("#user_avatar_delete_button").show(); | ||||||
|  |             }, | ||||||
|  |         }); | ||||||
|  |  | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     avatar.build_user_avatar_widget(upload_avatar); | ||||||
|  |  | ||||||
|  |     if (page_params.name_changes_disabled) { | ||||||
|  |         $(".name_change_container").hide(); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  | }; | ||||||
|  |  | ||||||
|  |  | ||||||
|  | return exports; | ||||||
|  | }()); | ||||||
|  |  | ||||||
|  | if (typeof module !== 'undefined') { | ||||||
|  |     module.exports = settings_account; | ||||||
|  | } | ||||||
| @@ -24,7 +24,7 @@ exports.update_person = function update(person) { | |||||||
|         compose.update_email(user_id, new_email); |         compose.update_email(user_id, new_email); | ||||||
|  |  | ||||||
|         if (people.is_my_user_id(person.user_id)) { |         if (people.is_my_user_id(person.user_id)) { | ||||||
|             settings.update_email(new_email); |             settings_account.update_email(new_email); | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         people.update_email(user_id, new_email); |         people.update_email(user_id, new_email); | ||||||
|   | |||||||
| @@ -905,6 +905,7 @@ JS_SPECS = { | |||||||
|             'js/upload_widget.js', |             'js/upload_widget.js', | ||||||
|             'js/avatar.js', |             'js/avatar.js', | ||||||
|             'js/realm_icon.js', |             'js/realm_icon.js', | ||||||
|  |             'js/settings_account.js', | ||||||
|             'js/settings.js', |             'js/settings.js', | ||||||
|             'js/admin.js', |             'js/admin.js', | ||||||
|             'js/tab_bar.js', |             'js/tab_bar.js', | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user