[IMP] use new api for events
[odoo/odoo.git] / addons / auth_signup / static / src / js / auth_signup.js
1 openerp.auth_signup = function(instance) {
2     instance.auth_signup = instance.auth_signup || {};
3     var _t = instance.web._t;
4
5     instance.web.Login.include({
6         init: function() {
7             this._super.apply(this, arguments);
8             this.signup_enabled = false;
9             this.reset_password_enabled = false;
10             this.on('change:login-mode', this, function() {
11                 /*
12                  * Switches the login box to the select mode
13                  * whith mode == [default|signup|reset]
14                  */
15                 var self = this;
16                 var mode = this.get('login-mode') || 'default';
17                 self.$('*[data-modes]').each(function() {
18                     var modes = $(this).data('modes').split(/\s+/);
19                     $(this).toggle(modes.indexOf(mode) > -1);
20                 });
21                 self.$('a.oe_signup_signup:visible').toggle(this.signup_enabled);
22                 self.$('a.oe_signup_reset_password:visible').toggle(this.reset_password_enabled);
23             });
24         },
25         start: function() {
26             var self = this;
27             return this._super().then(function() {
28                 // to switch between the signup and regular login form
29                 self.$('a.oe_signup_signup').click(function(ev) {
30                     self.set('login-mode', 'signup');
31                     return false;
32                 });
33                 self.$('a.oe_signup_back').click(function(ev) {
34                     self.set('login-mode', 'default');
35                     delete self.params.token;
36                     return false;
37                 });
38
39                 var dblist = self.db_list || [];
40                 var dbname = self.params.db || (dblist.length === 1 ? dblist[0] : null);
41
42                 // if there is an error message in params, show it then forget it
43                 if (self.params.error_message) {
44                     self.show_error(self.params.error_message);
45                     delete self.params.error_message;
46                 }
47
48                 // in case of a signup, retrieve the user information from the token
49                 if (dbname && self.params.token) {
50                     self.rpc("/auth_signup/retrieve", {dbname: dbname, token: self.params.token})
51                         .done(self.on_token_loaded)
52                         .fail(self.on_token_failed);
53                 }
54                 if (dbname && self.params.login) {
55                     self.$("form input[name=login]").val(self.params.login);
56                 }
57
58                 // bind reset password link
59                 self.$('a.oe_signup_reset_password').click(self.do_reset_password);
60
61                 if (dbname) {
62                     self.rpc("/auth_signup/get_config", {dbname: dbname}).done(function(result) {
63                         self.signup_enabled = result.signup;
64                         self.reset_password_enabled = result.reset_password;
65                         self.set('login-mode', 'default');
66                     });
67                 } else {
68                     // TODO: support multiple database mode
69                     this.set('login-mode', 'default');
70                 }
71             });
72         },
73
74         on_token_loaded: function(result) {
75             // select the right the database
76             this.selected_db = result.db;
77             this.on_db_loaded([result.db]);
78             if (result.token) {
79                 // switch to signup mode, set user name and login
80                 this.set('login-mode', (this.params.type === 'reset' ? 'reset' : 'signup'));
81                 this.$("form input[name=name]").val(result.name).attr("readonly", "readonly");
82                 if (result.login) {
83                     this.$("form input[name=login]").val(result.login).attr("readonly", "readonly");
84                 } else {
85                     this.$("form input[name=login]").val(result.email);
86                 }
87             } else {
88                 // remain in login mode, set login if present
89                 delete this.params.token;
90                 this.set('login-mode', 'default');
91                 this.$("form input[name=login]").val(result.login || "");
92             }
93         },
94
95         on_token_failed: function(result, ev) {
96             if (ev) {
97                 ev.preventDefault();
98             }
99             this.show_error(_t("Invalid signup token"));
100             delete this.params.db;
101             delete this.params.token;
102             this.set('login-mode', 'default');
103         },
104
105         on_submit: function(ev) {
106             if (ev) {
107                 ev.preventDefault();
108             }
109             var login_mode = this.get('login-mode');
110             if (login_mode === 'signup' || login_mode === 'reset') {
111                 // signup user (or reset password)
112                 var db = this.$("form [name=db]").val();
113                 var name = this.$("form input[name=name]").val();
114                 var login = this.$("form input[name=login]").val();
115                 var password = this.$("form input[name=password]").val();
116                 var confirm_password = this.$("form input[name=confirm_password]").val();
117                 if (!db) {
118                     this.do_warn(_t("Login"), _t("No database selected !"));
119                     return false;
120                 } else if (!name) {
121                     this.do_warn(_t("Login"), _t("Please enter a name."));
122                     return false;
123                 } else if (!login) {
124                     this.do_warn(_t("Login"), _t("Please enter a username."));
125                     return false;
126                 } else if (!password || !confirm_password) {
127                     this.do_warn(_t("Login"), _t("Please enter a password and confirm it."));
128                     return false;
129                 } else if (password !== confirm_password) {
130                     this.do_warn(_t("Login"), _t("Passwords do not match; please retype them."));
131                     return false;
132                 }
133                 var params = {
134                     dbname : db,
135                     token: this.params.token || "",
136                     name: name,
137                     login: login,
138                     password: password,
139                 };
140
141                 var self = this,
142                     super_ = this._super;
143                 this.rpc('/auth_signup/signup', params)
144                     .done(function(result) {
145                         if (result.error) {
146                             self.show_error(result.error);
147                         } else {
148                             super_.apply(self, [ev]);
149                         }
150                     });
151             } else {
152                 // regular login
153                 this._super(ev);
154             }
155         },
156
157         do_reset_password: function(ev) {
158             if (ev) {
159                 ev.preventDefault();
160             }
161             var self = this;
162             var db = this.$("form [name=db]").val();
163             var login = this.$("form input[name=login]").val();
164             if (!db) {
165                 this.do_warn(_t("Login"), _t("No database selected !"));
166                 return $.Deferred().reject();
167             } else if (!login) {
168                 this.do_warn(_t("Login"), _t("Please enter a username or email address."));
169                 return $.Deferred().reject();
170             }
171             return self.rpc("/auth_signup/reset_password", { dbname: db, login: login }).done(function(result) {
172                 self.show_error(_t("An email has been sent with credentials to reset your password"));
173                 self.set('login-mode', 'default');
174             }).fail(function(result, ev) {
175                 ev.preventDefault();
176                 self.show_error(result.message);
177             });
178         },
179     });
180 };