Roo/Login.js
[roojs1] / Roo / Login.js
1 //<script type="text/javascript">
2
3
4 /**
5 * A generic Login Dialog..... - only one needed in theory!?!?
6 *
7 * Fires XComponent builder on success...
8
9 * Sends 
10 *    username,password, lang = for login actions.
11 *    check = 1 for periodic checking that sesion is valid.
12 *    passwordRequest = email request password
13 *    logout = 1 = to logout
14
15 * Affects: (this id="????" elements)
16 *   loading  (removed) (used to indicate application is loading)
17 *   loading-mask (hides) (used to hide application when it's building loading)
18 *   
19
20 * Usage: 
21 *    
22
23 * Myapp.login = Roo.Login({
24     url: xxxx,
25   
26     realm : 'Myapp', 
27     
28     
29     method : 'POST',
30     
31     
32     * 
33 })
34
35
36
37 * Ext.apply(_T, _T[lang]);
38
39 **/
40  
41 Roo.Login = function(cfg)
42 {
43     this.addEvents({
44         'refreshed' : true,
45     });
46     
47     Roo.apply(this,cfg);
48     
49     Roo.onReady(function() {
50         this.onLoad();
51     }, this);
52     // call parent..
53     
54    
55     Roo.Login.superclass.constructor.call(this, this);
56     //this.addxtype(this.items[0]);
57     
58     
59 }
60
61
62 Roo.extend(Roo.Login, Roo.LayoutDialog, {
63     
64     /**
65      * @cfg {String} method
66      * Method used to query for login details.
67      */
68     
69     method : 'POST',
70     /**
71      * @cfg {String} url
72      * URL to query login data. - eg. baseURL + '/Login.php'
73      */
74     url : '',
75     
76     /**
77      * @property user
78      * The user data - if user.id < 0 then login will be bypassed. (used for inital setup situation.
79      * @type {Object} 
80      */
81     user : false,
82     /**
83      * @property checkFails
84      * Number of times we have attempted to get authentication check, and failed.
85      * @type {Number} 
86      */
87     checkFails : 0,
88       /**
89      * @property intervalID
90      * The window interval that does the constant login checking.
91      * @type {Number} 
92      */
93     intervalID : 0,
94     
95     
96     onLoad : function() // called on page load...
97     {
98         // load 
99          
100         if (Roo.get('loading')) { // clear any loading indicator..
101             Roo.get('loading').remove();
102         }
103         
104         //this.switchLang('en'); // set the language to english..
105        
106         this.check({
107             success:  function(response, opts)  {  // check successfull...
108             
109                 var res = this.processResponse(response);
110                 this.checkFails =0;
111                 if (!res.success) { // error!
112                     this.checkFails = 5;
113                     //console.log('call failure');
114                     return this.failure(response,opts);
115                 }
116                 
117                 if (!res.data.id) { // id=0 == login failure.
118                     return this.show();
119                 }
120                 
121                               
122                         //console.log(success);
123                 this.fillAuth(res.data);   
124                 this.checkFails =0;
125                 Roo.XComponent.build();
126             },
127             failure : this.show
128         });
129         
130     }, 
131     
132     
133     check: function(cfg) // called every so often to refresh cookie etc..
134     {
135         if (cfg.again) { // could be undefined..
136             this.checkFails++;
137         } else {
138             this.checkFails = 0;
139         }
140         var _this = this;
141         if (this.sending) {
142             if ( this.checkFails > 4) {
143                 Roo.MessageBox.alert("Error",  
144                     "Error getting authentication status. - try reloading, or wait a while", function() {
145                         _this.sending = false;
146                     }); 
147                 return;
148             }
149             cfg.again = true;
150             _this.check.defer(10000, _this, [ cfg ]); // check in 10 secs.
151             return;
152         }
153         this.sending = true;
154         
155         Roo.Ajax.request({  
156             url: this.url,
157             params: {
158                 getAuthUser: true
159             },  
160             method: this.method,
161             success:  cfg.success || this.success,
162             failure : cfg.failure || this.failure,
163             scope : this,
164             callCfg : cfg
165               
166         });  
167     }, 
168     
169     
170     logout: function()
171     {
172         window.onbeforeunload = function() { }; // false does not work for IE..
173         this.user = false;
174         var _this = this;
175         
176         Roo.Ajax.request({  
177             url: this.url,
178             params: {
179                 logout: 1
180             },  
181             method: 'GET',
182             failure : function() {
183                 Roo.MessageBox.alert("Error", "Error logging out. - continuing anyway.", function() {
184                     document.location = document.location.toString() + '?ts=' + Math.random();
185                 });
186                 
187             },
188             success : function() {
189                 _this.user = false;
190                 this.checkFails =0;
191                 // fixme..
192                 document.location = document.location.toString() + '?ts=' + Math.random();
193             }
194               
195               
196         }); 
197     },
198     
199     processResponse : function (response)
200     {
201         var res = '';
202         try {
203             res = Roo.decode(response.responseText);
204             // oops...
205             if (typeof(res) != 'object') {
206                 res = { success : false, errorMsg : res, errors : true };
207             }
208             if (typeof(res.success) == 'undefined') {
209                 res.success = false;
210             }
211             
212         } catch(e) {
213             res = { success : false,  errorMsg : response.responseText, errors : true };
214         }
215         return res;
216     },
217     
218     success : function(response, opts)  // check successfull...
219     {  
220         this.sending = false;
221         var res = this.processResponse(response);
222         if (!res.success) {
223             return this.failure(response, opts);
224         }
225         if (!res.data || !res.data.id) {
226             return this.failure(response,opts);
227         }
228         //console.log(res);
229         this.fillAuth(res.data);
230         
231         this.checkFails =0;
232         
233     },
234     
235     
236     failure : function (response, opts) // called if login 'check' fails.. (causes re-check)
237     {
238         this.authUser = -1;
239         this.sending = false;
240         var res = this.processResponse(response);
241         //console.log(res);
242         if ( this.checkFails > 2) {
243         
244             Roo.MessageBox.alert("Error", res.errorMsg ? res.errorMsg : 
245                 "Error getting authentication status. - try reloading"); 
246             return;
247         }
248         opts.callCfg.again = true;
249         this.check.defer(1000, this, [ opts.callCfg ]);
250         return;  
251     },
252     
253     
254     
255     fillAuth: function(au) {
256         this.startAuthCheck();
257         this.authUserId = au.id;
258         this.authUser = au;
259         this.lastChecked = new Date();
260         this.fireEvent('refreshed', au);
261         //Pman.Tab.FaxQueue.newMaxId(au.faxMax);
262         //Pman.Tab.FaxTab.setTitle(au.faxNumPending);
263         
264         //this.switchLang(Roo.state.Manager.get('Pman.Login.lang', 'en'));
265         Roo.state.Manager.set( this.realm + 'lang' , au.lang);
266         this.switchLang(au.lang);
267         
268      
269         // open system... - -on setyp..
270         if (this.authUserId  < 0) {
271             Roo.MessageBox.alert("Warning", 
272                 "This is an open system - please set up a admin user with a password.");  
273         }
274          
275         //Pman.onload(); // which should do nothing if it's a re-auth result...
276         
277              
278     },
279     
280     startAuthCheck : function() // starter for timeout checking..
281     {
282         if (this.intervalID) { // timer already in place...
283             return false;
284         }
285         var _this = this;
286         this.intervalID =  window.setInterval(function() {
287               _this.check(false);
288             }, 120000); // every 120 secs = 2mins..
289         
290         
291     },
292          
293     
294     switchLang : function (lang) 
295     {
296         if (!_T && lang != 'en') {
297             Roo.MessageBox.alert("Sorry", "Language not available yet (" + lang +')');
298             return;
299         }
300         if (!_T || !lang.length) {
301             return;
302         }
303         
304         if (typeof(_T.en) == 'undefined') {
305             _T.en = {};
306             Roo.apply(_T.en, _T);
307         }
308         
309         if (typeof(_T[lang]) == 'undefined') {
310             Roo.MessageBox.alert("Sorry", "Language not available yet (" + lang +')');
311             return;
312         }
313         
314         
315         Roo.apply(_T, _T[lang]);
316         // just need to set the text values for everything...
317         var _this = this;
318         /* this will not work ...
319         if (this.form) { 
320             
321                
322             function formLabel(name, val) {
323                 _this.form.findField(name).fieldEl.child('label').dom.innerHTML  = val;
324             }
325             
326             formLabel('password', "Password"+':');
327             formLabel('username', "Email Address"+':');
328             formLabel('lang', "Language"+':');
329             this.dialog.setTitle("Login");
330             this.dialog.buttons[0].setText("Forgot Password");
331             this.dialog.buttons[1].setText("Login");
332         }
333         */
334         
335         
336     },
337     
338     
339     title: "Login",
340     modal: true,
341     width:  350,
342     height: 230,
343     shadow: true,
344     minWidth:200,
345     minHeight:180,
346     //proxyDrag: true,
347     closable: false,
348     draggable: false,
349     collapsible: false,
350     resizable: false,
351     center: {  // needed??
352         autoScroll:false,
353         titlebar: false,
354        // tabPosition: 'top',
355         hideTabs: true,
356         closeOnTab: true,
357         alwaysShowTabs: false
358     } ,
359     listeners : {
360         
361         rendered : function(dlg) {
362             this.form = this.items[0];
363             this.form.dialog = dlg;
364             this.buttons[0].form = this.form;
365             this.buttons[0].dialog = dlg
366             this.buttons[1].form = this.form;
367             this.buttons[1].dialog = dlg;
368             
369              // logoprefix comes from base config.
370             //Pman.Login.form.el.createChild({
371             //    tag: 'img', 
372             //    src: rootURL + '/Pman/'+appNameShort + '/templates/images/logo.gif',
373             //    style: 'margin-bottom: 10px;'
374             //},
375             
376     
377         
378             
379         },
380         show  : function()
381         {
382             //this.resizeToLogo.defer(1000,this);
383             // this is all related to resizing for logos..
384             //var sz = Roo.get(Pman.Login.form.el.query('img')[0]).getSize();
385            //// if (!sz) {
386              //   this.resizeToLogo.defer(1000,this);
387              //   return;
388            // }
389             //var w = Ext.lib.Dom.getViewWidth() - 100;
390             //var h = Ext.lib.Dom.getViewHeight() - 100;
391             //this.resizeTo(Math.max(350, Math.min(sz.width + 30, w)),Math.min(sz.height+200, h));
392             //this.center();
393             if (this.disabled) {
394                 this.hide();
395                 return;
396             }
397             
398             if (this.user.id < 0) { // used for inital setup situations.
399                 return;
400             }
401             
402             if (this.intervalID) {
403                 // remove the timer
404                 window.clearInterval(this.intervalID);
405                 this.intervalID = false;
406             }
407             
408             
409             if (Roo.get('loading')) {
410                 Roo.get('loading').remove();
411             }
412             if (Roo.get('loading-mask')) {
413                 Roo.get('loading-mask').hide();
414             }
415             
416             //incomming._node = tnode;
417             this.dialog.form.reset();
418             //this.dialog.modal = !modal;
419             //this.dialog.show();
420             this.dialog.el.unmask(); 
421             
422             
423             this.form.setValues({
424                 'username' : Roo.state.Manager.get(this.realm + '.username', ''),
425                 'lang' : Roo.state.Manager.get(this.realm + '.lang', 'en')
426             });
427             
428             this.switchLang(Roo.state.Manager.get(this.realm + '.lang', ''));
429             if (this.form.findField('username').getValue().length > 0 ){
430                 this.form.findField('password').focus();
431             } else {
432                this.form.findField('username').focus();
433             }
434     
435         }
436     },
437     items : [
438          {
439        
440             xtype : 'ContentPanel',
441             xns : Roo,
442             region: 'center',
443             fitToFrame : true,
444             items : [
445     
446                 {
447                
448                     xtype : 'Form',
449                     xns : Roo.form,
450                     labelWidth: 100,
451                     style : 'margin : 10px;',
452                     listeners : {
453                         actionfailed : function(f, act) {
454                             // form can return { errors: .... }
455                                 
456                             //act.result.errors // invalid form element list...
457                             //act.result.errorMsg// invalid form element list...
458                             
459                             this.dialog.el.unmask();
460                             Roo.MessageBox.alert("Error", act.result.errorMsg ? act.result.errorMsg : 
461                                         "Login failed - communication error - try again.");
462                                       
463                         },
464                         actioncomplete: function(re, act) {
465                              
466                             Roo.state.Manager.set(
467                                 this.dialog.realm + '.username',  
468                                     this.findField('username').getValue()
469                             );
470                             Roo.state.Manager.set(
471                                 this.dialog.realm + '.lang',  
472                                 this.findField('lang').getValue() 
473                             );
474                             
475                             this.dialog.fillAuth(act.result.data);
476                               
477                             this.dialog.hide();
478                             
479                             if (Roo.get('loading-mask')) {
480                                 Roo.get('loading-mask').show();
481                             }
482                             Roo.XComponent.build();
483                             
484                              
485                             
486                         }
487                     },
488                     items : [
489                         {
490                             xtype : 'TextField',
491                             xns : Roo.form,
492                             fieldLabel: "Email Address",
493                             name: 'username',
494                             width:200,
495                             autoCreate : {tag: "input", type: "text", size: "20"}
496                         },
497                         {
498                             xtype : 'TextField',
499                             xns : Roo.form,
500                             fieldLabel: "Password",
501                             inputType: 'password',
502                             name: 'password',
503                             width:200,
504                             autoCreate : {tag: "input", type: "text", size: "20"},
505                             listeners : {
506                                 specialkey : function(e,ev) {
507                                     if (ev.keyCode == 13) {
508                                         this.form.dialog.el.mask("Logging in");
509                                         this.form.doAction('submit', {
510                                             url: this.form.dialog.url,
511                                             method: this.form.dialog.method,
512                                         });
513                                     }
514                                 }
515                             }  
516                         },
517                         {
518                             xtype : 'ComboBox',
519                             xns : Roo.form,
520                             fieldLabel: "Language",
521                             name : 'langdisp',
522                             store: {
523                                 xtype : 'SimpleStore',
524                                 fields: ['lang', 'ldisp'],
525                                 data : [
526                                     [ 'en', 'English' ],
527                                     [ 'zh_HK' , '\u7E41\u4E2D' ],
528                                     [ 'zh_CN', '\u7C21\u4E2D' ]
529                                 ]
530                             },
531                             
532                             valueField : 'lang',
533                             hiddenName:  'lang',
534                             width: 200,
535                             displayField:'ldisp',
536                             typeAhead: false,
537                             editable: false,
538                             mode: 'local',
539                             triggerAction: 'all',
540                             emptyText:'Select a Language...',
541                             selectOnFocus:true,
542                             listeners : {
543                                 select :  function(cb, rec, ix) {
544                                     this.form.switchLang(rec.data.lang);
545                                 }
546                             }
547                         
548                         }
549                     ]
550                 },
551                   
552                 
553             ],
554             buttons : [
555                 {
556                     xtype : 'Button',
557                     xns : 'Roo',
558                     text : "Forgot Password",
559                     listeners : {
560                         click : function() {
561                     
562                             var n = this.form.findField('username').getValue();
563                             if (!n.length) {
564                                 Roo.MessageBox.alert("Error", "Fill in your email address");
565                                 return;
566                             }
567                             Roo.Ajax.request({
568                                 url: this.dialog.url,
569                                 params: {
570                                     passwordRequest: n
571                                 },
572                                 method: this.dialog.method,
573                                 success:  function(response, opts)  {  // check successfull...
574                                 
575                                     var res = this.dialog.processResponse(response);
576                                     if (!res.success) { // error!
577                                        Roo.MessageBox.alert("Error" ,
578                                             res.errorMsg ? res.errorMsg  : "Problem Requesting Password Reset");
579                                        return;
580                                     }
581                                     Roo.MessageBox.alert("Notice" ,
582                                         "Please check you email for the Password Reset message");
583                                 },
584                                 failure : function() {
585                                     Roo.MessageBox.alert("Error" , "Problem Requesting Password Reset");
586                                 }
587                                 
588                             });
589                         }
590                     }
591                 },
592                 {
593                     xtype : 'Button',
594                     xns : 'Roo',
595                     text : "Login",
596                     listeners : {
597                         
598                         click : function () {
599                                 
600                             this.dialog.el.mask("Logging in");
601                             this.form.doAction('submit', {
602                                     url: this.dialog.url,
603                                     method: this.dialog.method
604                             });
605                         }
606                     }
607                 }
608             ]
609         }
610     ]
611 })
612  
613
614
615