jam-cloud/web/app/assets/javascripts/accounts_identity.js

246 lines
10 KiB
JavaScript

(function(context,$) {
"use strict";
context.JK = context.JK || {};
context.JK.AccountIdentityScreen = function(app) {
var logger = context.JK.logger;
var rest = context.JK.Rest();
var userId;
var user = {};
function beforeShow(data) {
userId = data.id;
}
function afterShow(data) {
resetForm();
renderAccountIdentity();
}
function resetForm() {
// remove all display errors
$('#account-identity-content-scroller form .error-text').remove()
$('#account-identity-content-scroller form .error').removeClass("error")
}
function populateAccountIdentity(userDetail) {
var template = context.JK.fillTemplate($('#template-account-identity').html(), {
email: userDetail.email
});
appendPasswordPrompt(template);
}
function appendPasswordPrompt(template) {
$('#account-identity-content-scroller').html(template);
// append overlay-small
var overlay = context.JK.fillTemplate($('#template-overlay-small').html(), {
id: 'email-update-password-dialog',
title : 'your password is required'
});
overlay = $(overlay);
var passwordForm = context.JK.fillTemplate($('#template-account-update-email-password-prompt-dialog').html(), {
});
$('.overlay-inner', overlay).append(passwordForm);
$('#account-identity-content-scroller').append(overlay);
}
/****************** MAIN PORTION OF SCREEN *****************/
// events for main screen
function events() {
$('#account-identity-content-scroller').on('click', '#account-edit-email-cancel', function(evt) { evt.stopPropagation(); navToAccount(); return false; } );
$('#account-identity-content-scroller').on('click', '#account-edit-email-submit', function(evt) { evt.stopPropagation(); handleUpdateEmail(); return false; } );
$('#account-identity-content-scroller').on('submit', '#account-edit-email-form', function(evt) { evt.stopPropagation(); handleUpdateEmail(); return false; } );
$('#account-identity-content-scroller').on('click', '#account-edit-password-cancel', function(evt) { evt.stopPropagation(); navToAccount(); return false; } );
$('#account-identity-content-scroller').on('click', '#account-edit-password-submit', function(evt) { evt.stopPropagation(); handleUpdatePassword(); return false; } );
$('#account-identity-content-scroller').on('submit', '#account-edit-password-form', function(evt) { evt.stopPropagation(); handleUpdatePassword(); return false; } );
$('#account-identity-content-scroller').on('click', '#email-update-password-dialog a[data-purpose=cancel]', function(evt) { evt.stopPropagation(); handleUpdateEmailPasswordPromptCancel(); return false; } );
$('#account-identity-content-scroller').on('click', '#email-update-password-dialog a[data-purpose=submit]', function(evt) { evt.stopPropagation(); handleUpdateEmailPasswordPromptSubmit(); return false; } );
$('#account-identity-content-scroller').on('submit', '#email-update-password-dialog form', function(evt) { evt.stopPropagation(); handleUpdateEmailPasswordPromptSubmit(); return false; } );
}
function renderAccountIdentity() {
rest.getUserDetail()
.done(populateAccountIdentity)
.error(app.ajaxError);
}
function navToAccount() {
resetForm();
window.location = '/client#/account';
}
function handleUpdateEmail() {
resetForm();
$('#account-edit-email-submit').addClass('button-disabled');
$('#account-edit-email-submit').bind('click', false);
$('#email-update-password-dialog *').show();
$('#email-update-password-dialog input[name=password]').focus();
}
function handleUpdateEmailPasswordPromptCancel() {
$('#account-edit-email-submit').removeClass('button-disabled');
$('#account-edit-email-submit').unbind('click', false);
$('#email-update-password-dialog *').hide();
$('#email-update-password-dialog input[name=password]').val('');
}
function handleUpdateEmailPasswordPromptSubmit() {
$('#email-update-password-dialog *').hide();
var email = $('#account_update_email').val();
var password = $('#email-update-password-dialog input[name=password]').val();
$('#email-update-password-dialog input[name=password]').val('');
postUpdateEmail(email, password)
.done(function(response) { postUpdateEmailSuccess(response, email) })
.fail(postUpdateEmailFailure)
}
function handleUpdatePassword() {
resetForm();
$('#account-edit-password-submit').addClass('button-disabled');
$('#account-edit-password-submit').bind('click', false);
var currentPassword = $('#account-edit-password-form input[name=current_password]').val()
var password = $('#account-edit-password-form input[name=password]').val()
var passwordConfirmation = $('#account-edit-password-form input[name=password_confirmation]').val()
postUpdatePassword(currentPassword, password, passwordConfirmation)
.done(postUpdatePasswordSuccess)
.fail(postUpdatePasswordFailure)
}
function postUpdateEmail(email, current_password) {
var url = "/api/users/" + context.JK.currentUserId + "/update_email";
return $.ajax({
type: "POST",
dataType: "json",
contentType: 'application/json',
url: url,
data: JSON.stringify({ update_email: email, current_password : current_password}),
processData: false
});
}
function postUpdateEmailSuccess(response, email) {
$('#account-edit-email-submit').removeClass('button-disabled');
$('#account-edit-email-submit').unbind('click', false);
app.notify(
{ title: "Confirmation Email Sent",
text: "A confirmation email should arrive shortly at " + email + ". Please click the confirmation link in it to confirm your email change."
},
null, // notify method will add buttons
true);
}
function postUpdateEmailFailure(xhr, textStatus, errorMessage) {
$('#account-edit-email-submit').removeClass('button-disabled');
$('#account-edit-email-submit').unbind('click', false);
var errors = JSON.parse(xhr.responseText)
if(xhr.status == 422) {
$('#account_update_email').closest("div.field").addClass("error")
var emailError = context.JK.get_first_error("update_email", errors);
var passwordError = context.JK.get_first_error("current_password", errors);
var combinedErrorMsg = ""
if(emailError != null) {
combinedErrorMsg += "<li>email " + emailError + "</li>"
}
if(passwordError != null) {
combinedErrorMsg += "<li>password " + passwordError + "</li>"
}
if(combinedErrorMsg.length == 0) {
combinedErrorMsg = "unknown error"
}
$('#account_update_email').after("<ul class='error-text'>" + combinedErrorMsg + "</ul>")
}
else {
app.ajaxError(xhr, textStatus, errorMessage)
}
}
function postUpdatePassword(currentPassword, newPassword, newPasswordConfirm) {
var url = "/api/users/" + context.JK.currentUserId + "/set_password";
return $.ajax({
type: "POST",
dataType: "json",
contentType: 'application/json',
url: url,
data: JSON.stringify({ old_password: currentPassword, new_password: newPassword, new_password_confirm: newPasswordConfirm }),
processData: false
});
}
function postUpdatePasswordSuccess(response) {
$('#account-edit-password-submit').removeClass('button-disabled');
$('#account-edit-password-submit').unbind('click', false);
app.notify(
{ title: "Password Changed",
text: "You have changed your password successfully."
},
null,
true);
}
function postUpdatePasswordFailure(xhr, textStatus, errorMessage) {
$('#account-edit-password-submit').removeClass('button-disabled');
$('#account-edit-password-submit').unbind('click', false);
var errors = JSON.parse(xhr.responseText)
if(xhr.status == 422) {
var current_password_errors = context.JK.format_errors("current_password", errors)
var password_errors = context.JK.format_errors("password", errors)
var password_confirmation_errors = context.JK.format_errors("password_confirmation", errors)
if(current_password_errors != null) {
$('#account-edit-password-form input[name=current_password]').closest('div.field').addClass('error').end().after(current_password_errors);
}
if(password_errors != null) {
$('#account-edit-password-form input[name=password]').closest('div.field').addClass('error').end().after(password_errors);
}
if(password_confirmation_errors != null) {
$('#account-edit-password-form input[name=password_confirmation]').closest('div.field').addClass('error').end().after(password_confirmation_errors);
}
}
else {
app.ajaxError(xhr, textStatus, errorMessage)
}
}
function initialize() {
var screenBindings = {
'beforeShow': beforeShow,
'afterShow': afterShow
};
app.bindScreen('account/identity', screenBindings);
events();
}
this.initialize = initialize;
this.beforeShow = beforeShow;
this.afterShow = afterShow;
return this;
};
})(window,jQuery);