342 lines
13 KiB
JavaScript
342 lines
13 KiB
JavaScript
/*
|
|
* Copyright (C) 2011 - present Instructure, Inc.
|
|
*
|
|
* This file is part of Canvas.
|
|
*
|
|
* Canvas is free software: you can redistribute it and/or modify it under
|
|
* the terms of the GNU Affero General Public License as published by the Free
|
|
* Software Foundation, version 3 of the License.
|
|
*
|
|
* Canvas is distributed in the hope that it will be useful, but WITHOUT ANY
|
|
* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
|
|
* A PARTICULAR PURPOSE. See the GNU Affero General Public License for more
|
|
* details.
|
|
*
|
|
* You should have received a copy of the GNU Affero General Public License along
|
|
* with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
import INST from './INST'
|
|
import I18n from 'i18n!profile'
|
|
import $ from 'jquery'
|
|
import Pseudonym from 'compiled/models/Pseudonym'
|
|
import AvatarWidget from 'compiled/util/AvatarWidget'
|
|
import './jquery.ajaxJSON'
|
|
import './jquery.instructure_date_and_time' /* datetimeString, time_field, datetime_field */
|
|
import './jquery.instructure_forms' /* formSubmit, formErrors, errorBox */
|
|
import 'jqueryui/dialog'
|
|
import 'compiled/jquery/fixDialogButtons'
|
|
import './jquery.instructure_misc_plugins' /* confirmDelete, fragmentChange, showIf */
|
|
import './jquery.loadingImg'
|
|
import './jquery.templateData'
|
|
import 'jqueryui/sortable'
|
|
import 'compiled/jquery.rails_flash_notifications'
|
|
|
|
var $edit_settings_link = $(".edit_settings_link");
|
|
|
|
var $profile_table = $(".profile_table"),
|
|
$update_profile_form = $("#update_profile_form"),
|
|
$default_email_id = $("#default_email_id"),
|
|
profile_pics_url = '/api/v1/users/self/avatars';
|
|
|
|
$edit_settings_link.click(function(event) {
|
|
$(this).hide();
|
|
$profile_table.addClass('editing')
|
|
.find(".edit_data_row").show().end()
|
|
.find(":focusable:first").focus().select();
|
|
return false;
|
|
});
|
|
|
|
$profile_table.find(".cancel_button").click(function(event) {
|
|
$edit_settings_link.show();
|
|
$profile_table
|
|
.removeClass('editing')
|
|
.find(".change_password_row,.edit_data_row,.more_options_row").hide().end()
|
|
.find("#change_password_checkbox").attr('checked', false);
|
|
return false;
|
|
});
|
|
|
|
$profile_table.find("#change_password_checkbox")
|
|
.change(function(event) {
|
|
if(!$(this).attr('checked')) {
|
|
$profile_table.find(".change_password_row").hide().find(":password").val("");
|
|
} else {
|
|
$(this).addClass('showing');
|
|
$profile_table.find(".change_password_row").show().find("#old_password").focus().select();
|
|
}
|
|
})
|
|
.attr('checked', false)
|
|
.change();
|
|
|
|
$update_profile_form
|
|
.attr('method', 'PUT')
|
|
.formSubmit({
|
|
formErrors: false,
|
|
required: ($update_profile_form.find('#user_name').length ? ['name'] : []),
|
|
object_name: 'user',
|
|
property_validations: {
|
|
'=default_email_id': function(val, data) {
|
|
if($("#default_email_id").length && (!val || val == "new")) {
|
|
return I18n.t('please_select_an_option', "Please select an option");
|
|
}
|
|
}
|
|
},
|
|
beforeSubmit: function(data) {
|
|
},
|
|
success: function(data) {
|
|
var user = data.user;
|
|
var templateData = {
|
|
short_name: user.short_name,
|
|
full_name: user.name,
|
|
sortable_name: user.sortable_name,
|
|
time_zone: user.time_zone,
|
|
locale: $("#user_locale option[value='" + user.locale + "']").text()
|
|
};
|
|
if (templateData.locale != $update_profile_form.find('.locale').text()) {
|
|
location.reload();
|
|
return;
|
|
}
|
|
if ($default_email_id.length > 0) {
|
|
var default_email = $default_email_id.find('option:selected').text();
|
|
$('.default_email.display_data').text(default_email);
|
|
}
|
|
$('.channel').removeClass('default');
|
|
$("#channel_" + user.communication_channel.id).addClass('default');
|
|
$update_profile_form.fillTemplateData({
|
|
data: templateData
|
|
}).find(".cancel_button").click();
|
|
},
|
|
error: function(errors) {
|
|
if (errors.password) {
|
|
var pseudonymId = $(this).find("#profile_pseudonym_id").val();
|
|
errors = Pseudonym.prototype.normalizeErrors(errors, ENV.PASSWORD_POLICIES[pseudonymId] || ENV.PASSWORD_POLICY);
|
|
}
|
|
$update_profile_form.loadingImage('remove').formErrors(errors);
|
|
$edit_settings_link.click();
|
|
}
|
|
})
|
|
.find(".more_options_link").click(function() {
|
|
$update_profile_form.find(".more_options_link_row").hide();
|
|
$update_profile_form.find(".more_options_row").show();
|
|
return false;
|
|
});
|
|
|
|
$("#default_email_id").change(function() {
|
|
if($(this).val() == "new") {
|
|
$(".add_email_link:first").click();
|
|
}
|
|
});
|
|
|
|
$("#unregistered_services li.service").click(function(event) {
|
|
event.preventDefault();
|
|
$("#" + $(this).attr('id') + "_dialog").dialog({
|
|
width: 350,
|
|
open: function(){
|
|
$(this).dialog("widget").find('a').focus()
|
|
}
|
|
});
|
|
});
|
|
$(".create_user_service_form").formSubmit({
|
|
object_name: 'user_service',
|
|
beforeSubmit: function(data) {
|
|
$(this).loadingImage();
|
|
},
|
|
success: function(data) {
|
|
$(this).loadingImage('remove').parents(".content").dialog('close');
|
|
document.location.reload();
|
|
},
|
|
error: function(data) {
|
|
$(this).loadingImage('remove').errorBox(I18n.t('errors.registration_failed', 'Registration failed. Check the user name and password, and try again.'));
|
|
}
|
|
});
|
|
$("#unregistered_services li.service .content form .cancel_button").click(function(event) {
|
|
$(this).parents(".content").dialog('close');
|
|
});
|
|
$("#registered_services li.service .delete_service_link").click(function(event) {
|
|
event.preventDefault();
|
|
$(this).parents("li.service").confirmDelete({
|
|
message: I18n.t('confirms.unregister_service', "Are you sure you want to unregister this service?"),
|
|
url: $(this).attr('href'),
|
|
success: function(data) {
|
|
$(this).slideUp(function() {
|
|
$("#unregistered_services").find("#unregistered_" + $(this).attr('id')).slideDown();
|
|
});
|
|
}
|
|
});
|
|
});
|
|
$(".service").hover(function() {
|
|
$(this).addClass('service-hover');
|
|
}, function() {
|
|
$(this).removeClass('service-hover');
|
|
});
|
|
$("#show_user_services").change(function() {
|
|
$.ajaxJSON($("#update_profile_form").attr('action'), 'PUT', {'user[show_user_services]': $(this).prop('checked')}, function(data) {
|
|
}, function(data) {
|
|
});
|
|
});
|
|
$("#disable_inbox").change(function() {
|
|
$.ajaxJSON("/profile/toggle_disable_inbox", 'POST', {'user[disable_inbox]': $(this).prop('checked')}, function(data) {
|
|
}, function(data) {
|
|
});
|
|
});
|
|
$(".delete_pseudonym_link").click(function(event) {
|
|
event.preventDefault();
|
|
$(this).parents(".pseudonym").confirmDelete({
|
|
url: $(this).attr('href'),
|
|
message: I18n.t('confirms.delete_login', "Are you sure you want to delete this login?")
|
|
});
|
|
});
|
|
$(".datetime_field").datetime_field();
|
|
$(".expires_field").bind('change keyup', function() {
|
|
$(this).closest("td").find(".hint").showIf(!$(this).val());
|
|
});
|
|
$(".delete_key_link").click(function(event) {
|
|
event.preventDefault();
|
|
var $key_row = $(this).closest(".access_token");
|
|
var $focus_row = $key_row.prevAll(":not(.blank)").first();
|
|
if ($focus_row.length == 0) {
|
|
$focus_row = $key_row.nextAll(":not(.blank)").first();
|
|
}
|
|
var $to_focus = $focus_row.length > 0 ? $(".delete_key_link", $focus_row) : $(".add_access_token_link");
|
|
$key_row.confirmDelete({
|
|
url: $(this).attr('rel'),
|
|
message: I18n.t('confirms.delete_access_key', "Are you sure you want to delete this access key?"),
|
|
success: function() {
|
|
$(this).remove();
|
|
if(!$(".access_token:visible").length) {
|
|
$("#no_approved_integrations,#access_tokens_holder").toggle();
|
|
}
|
|
$to_focus.focus();
|
|
}
|
|
});
|
|
});
|
|
$("#add_access_token_dialog .cancel_button").click(function() {
|
|
$("#add_access_token_dialog").dialog('close');
|
|
});
|
|
$("#access_token_form").formSubmit({
|
|
object_name: 'access_token',
|
|
property_validations: {
|
|
'purpose': function(value){
|
|
if (!value || value == ''){
|
|
return I18n.t('purpose_required', "Purpose is required");
|
|
}
|
|
}
|
|
},
|
|
beforeSubmit: function() {
|
|
$(this).find("button").attr('disabled', true).filter(".submit_button").text(I18n.t('buttons.generating_token', "Generating Token..."));
|
|
},
|
|
success: function(data) {
|
|
$(this).find("button").attr('disabled', false).filter(".submit_button").text(I18n.t('buttons.generate_token', "Generate Token"));
|
|
$("#add_access_token_dialog").dialog('close');
|
|
$("#no_approved_integrations").hide()
|
|
$("#access_tokens_holder").show();
|
|
var $token = $(".access_token.blank:first").clone(true).removeClass('blank');
|
|
data.created = $.datetimeString(data.created_at) || "--";
|
|
data.expires = $.datetimeString(data.expires_at) || I18n.t('token_never_expires', "never");
|
|
data.used = "--";
|
|
$token.fillTemplateData({
|
|
data: data,
|
|
hrefValues: ['id']
|
|
});
|
|
$token.data('token', data);
|
|
$("#access_tokens > tbody").append($token.show());
|
|
$token.find(".show_token_link").click();
|
|
},
|
|
error: function() {
|
|
$(this).find("button").attr('disabled', false).filter(".submit_button").text(I18n.t('errors.generating_token_failed', "Generating Token Failed"));
|
|
}
|
|
});
|
|
$("#token_details_dialog .regenerate_token").click(function() {
|
|
var result = confirm(I18n.t('confirms.regenerate_token', "Are you sure you want to regenerate this token? Anything using this token will have to be updated."));
|
|
if(!result) { return; }
|
|
|
|
var $dialog = $("#token_details_dialog");
|
|
var $token = $dialog.data('token');
|
|
var url = $dialog.data('token_url');
|
|
var $button = $(this);
|
|
$button.text(I18n.t('buttons.regenerating_token', "Regenerating token...")).attr('disabled', true);
|
|
$.ajaxJSON(url, 'PUT', {'access_token[regenerate]': '1'}, function(data) {
|
|
data.created = $.datetimeString(data.created_at) || "--";
|
|
data.expires = $.datetimeString(data.expires_at) || I18n.t('token_never_expires', "never");
|
|
data.used = $.datetimeString(data.last_used_at) || "--";
|
|
data.visible_token = data.visible_token || "protected";
|
|
$dialog.fillTemplateData({data: data})
|
|
.find(".full_token_warning").showIf(data.visible_token.length > 10);
|
|
$token.data('token', data);
|
|
$button.text(I18n.t('buttons.regenerate_token', "Regenerate Token")).attr('disabled', false);
|
|
}, function() {
|
|
$button.text(I18n.t('errors.regenerating_token_failed', "Regenerating Token Failed")).attr('disabled', false);
|
|
});
|
|
});
|
|
$(".show_token_link").click(function(event) {
|
|
event.preventDefault();
|
|
var $dialog = $("#token_details_dialog");
|
|
var url = $(this).attr('rel');
|
|
$dialog.dialog({
|
|
width: 700
|
|
});
|
|
var $token = $(this).parents(".access_token");
|
|
$dialog.data('token', $token);
|
|
$dialog.find(".loading_message").show().end()
|
|
.find(".results,.error_loading_message").hide();
|
|
function tokenLoaded(token) {
|
|
$dialog.fillTemplateData({data: token});
|
|
$dialog.data('token_url', url);
|
|
$dialog.find(".refresh_token").showIf(token.visible_token && token.visible_token !== "protected")
|
|
.find(".regenerate_token").text(I18n.t('buttons.regenerate_token', "Regenerate Token")).attr('disabled', false);
|
|
$dialog.find(".loading_message,.error_loading_message").hide().end()
|
|
.find(".results").show().end()
|
|
.find(".full_token_warning").showIf(token.visible_token.length > 10);
|
|
$dialog.find(".regenerate_token").focus();
|
|
}
|
|
var token = $token.data('token');
|
|
if(token) {
|
|
tokenLoaded(token);
|
|
} else {
|
|
$.ajaxJSON(url, 'GET', {}, function(data) {
|
|
data.created = $.datetimeString(data.created_at) || "--";
|
|
data.expires = $.datetimeString(data.expires_at) || I18n.t('token_never_expires', "never");
|
|
data.used = $.datetimeString(data.last_used_at) || "--";
|
|
data.visible_token = data.visible_token || "protected";
|
|
$token.data('token', data);
|
|
tokenLoaded(data);
|
|
}, function() {
|
|
$dialog.find(".error_loading_message").show().end()
|
|
.find(".results,.loading_message").hide();
|
|
});
|
|
}
|
|
|
|
});
|
|
$(".add_access_token_link").click(function(event) {
|
|
event.preventDefault();
|
|
$("#access_token_form").find("button").attr('disabled', false).filter(".submit_button").text(I18n.t('buttons.generate_token', "Generate Token"));
|
|
$("#add_access_token_dialog").find(":input").val("").end()
|
|
.dialog({
|
|
width: 500,
|
|
open: function() {
|
|
$(this).closest('.ui-dialog').focus()
|
|
}
|
|
}).fixDialogButtons();
|
|
});
|
|
$(document).fragmentChange(function(event, hash) {
|
|
var type = hash.substring(1);
|
|
if(type.match(/^register/)) {
|
|
type = type.substring(9);
|
|
}
|
|
if($("#unregistered_service_" + type + ":visible").length > 0) {
|
|
$("#unregistered_service_" + type + ":visible").click();
|
|
}
|
|
}).fragmentChange();
|
|
|
|
new AvatarWidget('.profile_pic_link');
|
|
|
|
$("#disable_mfa_link").click(function(event) {
|
|
var $disable_mfa_link = $(this);
|
|
$.ajaxJSON($disable_mfa_link.attr('href'), 'DELETE', {}, function() {
|
|
$.flashMessage(I18n.t('notices.mfa_disabled', "Multi-factor authentication disabled"));
|
|
$disable_mfa_link.remove();
|
|
$('#otp_backup_codes_link').remove();
|
|
});
|
|
event.preventDefault();
|
|
});
|