odoo/addons/auth_signup/static/src/js/auth_signup.js

187 lines
7.7 KiB
JavaScript

openerp.auth_signup = function(instance) {
instance.auth_signup = instance.auth_signup || {};
var _t = instance.web._t;
instance.web.Login.include({
start: function() {
var self = this;
this.signup_enabled = false;
this.reset_password_enabled = false;
return this._super().always(function() {
// Switches the login box to the select mode whith mode == [default|signup|reset]
self.on('change:login_mode', self, function() {
var mode = self.get('login_mode') || 'default';
self.$('*[data-modes]').each(function() {
var modes = $(this).data('modes').split(/\s+/);
$(this).toggle(modes.indexOf(mode) > -1);
});
self.$('a.oe_signup_signup:visible').toggle(self.signup_enabled);
self.$('a.oe_signup_reset_password:visible').toggle(self.reset_password_enabled);
});
// to switch between the signup and regular login form
self.$('a.oe_signup_signup').click(function(ev) {
self.set('login_mode', 'signup');
return false;
});
self.$('a.oe_signup_back').click(function(ev) {
self.set('login_mode', 'default');
delete self.params.token;
return false;
});
var dbname = self.selected_db;
// if there is an error message in params, show it then forget it
if (self.params.error_message) {
self.show_error(self.params.error_message);
delete self.params.error_message;
}
if (dbname && self.params.login) {
self.$("form input[name=login]").val(self.params.login);
}
// bind reset password link
self.$('a.oe_signup_reset_password').click(self.do_reset_password);
if (dbname) {
self.rpc("/auth_signup/get_config", {dbname: dbname}).then(function(result) {
self.signup_enabled = result.signup;
self.reset_password_enabled = result.reset_password;
if (!self.signup_enabled || self.$("form input[name=login]").val()){
self.set('login_mode', self.params.type || 'default');
} else {
self.set('login_mode', 'signup');
}
// in case of a signup, retrieve the user information from the token
if (self.params.token) {
self.rpc("/auth_signup/retrieve", {dbname: dbname, token: self.params.token})
.then(self.on_token_loaded, self.on_token_failed);
}
});
} else {
// TODO: support multiple database mode
self.set('login_mode', self.params.type || 'default');
}
});
},
on_token_loaded: function(result) {
// select the right the database
this.selected_db = result.db;
this.on_db_loaded([result.db]);
if (result.token) {
// switch to signup mode, set user name and login
this.set('login_mode', (this.params.type === 'reset' ? 'reset' : 'signup'));
this.$("form input[name=name]").val(result.name).attr("readonly", "readonly");
if (result.login) {
this.$("form input[name=login]").val(result.login).attr("readonly", "readonly");
} else {
this.$("form input[name=login]").val(result.email);
}
} else {
// remain in login mode, set login if present
delete this.params.token;
this.set('login_mode', 'default');
this.$("form input[name=login]").val(result.login || "");
}
},
on_token_failed: function(result, ev) {
if (ev) {
ev.preventDefault();
}
this.show_error(_t("Invalid signup token"));
delete this.params.db;
delete this.params.token;
this.set('login_mode', 'default');
},
get_params: function(){
// signup user (or reset password)
var db = this.$("form [name=db]").val();
var name = this.$("form input[name=name]").val();
var login = this.$("form input[name=login]").val();
var password = this.$("form input[name=password]").val();
var confirm_password = this.$("form input[name=confirm_password]").val();
if (!db) {
this.do_warn(_t("Login"), _t("No database selected !"));
return false;
} else if (!name) {
this.do_warn(_t("Login"), _t("Please enter a name."));
return false;
} else if (!login) {
this.do_warn(_t("Login"), _t("Please enter a username."));
return false;
} else if (!password || !confirm_password) {
this.do_warn(_t("Login"), _t("Please enter a password and confirm it."));
return false;
} else if (password !== confirm_password) {
this.do_warn(_t("Login"), _t("Passwords do not match; please retype them."));
return false;
}
var params = {
dbname : db,
token: this.params.token || "",
name: name,
login: login,
password: password,
};
return params;
},
on_submit: function(ev) {
if (ev) {
ev.preventDefault();
}
var login_mode = this.get('login_mode');
if (login_mode === 'signup' || login_mode === 'reset') {
var params = this.get_params();
if (_.isEmpty(params)){
return false;
}
var self = this,
super_ = this._super;
this.rpc('/auth_signup/signup', params)
.done(function(result) {
if (result.error) {
self.show_error(result.error);
} else {
super_.apply(self, [ev]);
}
});
} else {
// regular login
this._super(ev);
}
},
do_reset_password: function(ev) {
if (ev) {
ev.preventDefault();
}
var self = this;
var db = this.$("form [name=db]").val();
var login = this.$("form input[name=login]").val();
if (!db) {
this.do_warn(_t("Login"), _t("No database selected !"));
return $.Deferred().reject();
} else if (!login) {
this.do_warn(_t("Login"), _t("Please enter a username or email address."));
return $.Deferred().reject();
}
return self.rpc("/auth_signup/reset_password", { dbname: db, login: login }).done(function(result) {
self.show_error(_t("An email has been sent with credentials to reset your password"));
self.set('login_mode', 'default');
}).fail(function(result, ev) {
ev.preventDefault();
self.show_error(result.message);
});
},
});
};