]> git.evergreen-ils.org Git - Evergreen.git/blob - Open-ILS/xul/staff_client/chrome/content/util/network.js
stop the possibility for a chain of consequtive offline error retry dialogs2
[Evergreen.git] / Open-ILS / xul / staff_client / chrome / content / util / network.js
1 dump('entering util/network.js\n');
2
3 if (typeof util == 'undefined') util = {};
4 util.network = function () {
5
6         JSAN.use('util.error'); this.error = new util.error();
7
8         return this;
9 };
10
11 util.network.prototype = {
12
13         'link_id' : 0,
14
15         'simple_request' : function(id,params,f) {
16                 return this.request(api[id].app,api[id].method,params,f);
17         },
18
19         'request' : function (app,name,params,f,o_params) {
20                 var request =  this._request(app,name,params,f,o_params);
21                 if (request) {
22                         return request.getResultObject();
23                 } else {
24                         return null;
25                 }
26         },
27
28         '_request' : function (app,name,params,f,o_params) {
29                 var obj = this;
30                 try {
31                         var sparams = js2JSON(params);
32                         obj.error.sdump('D_SES','request '+app+' '+name+' '+obj.error.pretty_print(sparams.slice(1,sparams.length-1))+
33                                 '\nResult #' + (++obj.link_id) + ( f ? ' asynced' : ' synced' ) );
34                         var request = new RemoteRequest( app, name );
35                         for(var index in params) {
36                                 request.addParam(params[index]);
37                         }
38         
39                         if (f)  {
40                                 request.setCompleteCallback(
41                                         function(req) {
42                                                 try {
43                                                         obj.error.sdump('D_SES_RESULT','asynced result #' 
44                                                                 + obj.link_id + '\n\n' 
45                                                                 + obj.error.pretty_print(js2JSON(req.getResultObject())));
46                                                         req = obj.rerequest_on_session_timeout(app,name,params,req,o_params);
47                                                         req = obj.rerequest_on_perm_failure(app,name,params,req,o_params);
48                                                         if (o_params) {
49                                                                 req = obj.rerequest_on_override(app,name,params,req,o_params);
50                                                         }
51                                                         req = obj.check_for_offline(app,name,params,req,o_params);
52                                                         f(req);
53                                                 } catch(E) {
54                                                         alert(E);
55                                                 }
56                                         }
57                                 );
58                                 request.send(false);
59                                 return null;
60                         } else {
61                                 request.send(true);
62                                 var result = request.getResultObject();
63                                 this.error.sdump('D_SES_RESULT','synced result #' + obj.link_id + '\n\n' + obj.error.pretty_print(js2JSON(result)));
64                                 request = obj.rerequest_on_session_timeout(app,name,params,request,o_params);
65                                 request = obj.rerequest_on_perm_failure(app,name,params,request,o_params);
66                                 if (o_params) {
67                                         request = obj.rerequest_on_override(app,name,params,request,o_params);
68                                 }
69                                 request = obj.check_for_offline(app,name,params,request,o_params);
70                                 return request;
71                         }
72
73                 } catch(E) {
74                         if (instanceOf(E,perm_ex)) {
75                                 alert('permission exception: ' + js2JSON(E));
76                         }
77                         throw(E);
78                 }
79         },
80
81         'check_for_offline' : function (app,name,params,req,o_params) {
82                 var obj = this;
83                 var result = req.getResultObject();
84                 if (result != null) return req;
85
86                 JSAN.use('OpenILS.data'); var data = new OpenILS.data(); data.init({'via':'stash'});
87                 var proceed = true;
88
89                 while(proceed) {
90
91                         proceed = false;
92
93                         var r;
94
95                         if (data.proceed_offline) {
96
97                                 r = 1;
98
99                         } else {
100                                 r = obj.error.yns_alert('Network failure.  Please check your Internet connection to ' + data.server_unadorned + ' and choose Retry Network.  If you need to enter Offline Mode, choose Proceed Offline in this and subsequent dialogs.  If you believe this error is due to a bug in Evergreen and not network problems, please contact your helpdesk or friendly Evergreen admins, and give them this message "' + name + '".','Network Failure','Retry Network','Proceed Offline',null,'Check here to confirm this message');
101                                 if (r == 1) {
102                                         data.proceed_offline = true; data.stash('proceed_offline');
103                                         dump('Remembering proceed_offline for 200000 ms.\n');
104                                         setTimeout(
105                                                 function() {
106                                                         data.proceed_offline = false; data.stash('proceed_offline');
107                                                         dump('Setting proceed_offline back to false.\n');
108                                                 }, 200000
109                                         );
110                                 }
111                         }
112
113                         dump( r == 0 ? 'Retry Network\n' : 'Proceed Offline\n' );
114
115                         switch(r) {
116                                 case 0: 
117                                         req = obj._request(app,name,params,null,o_params);
118                                         if (req.getResultObject() == null) proceed = true;
119                                         return req;
120                                 break;
121                                 case 1: 
122                                         return { 'getResultObject' : function() { return { 'ilsevent' : -1, 'textcode' : 'Network/Server Problem' }; } };
123                                 break;
124                         }
125                 }
126         },
127
128         'rerequest_on_session_timeout' : function(app,name,params,req,o_params) {
129                 try {
130                         var obj = this;
131                         var robj = req.getResultObject();
132                         if (robj != null && robj.ilsevent && robj.ilsevent == 1001) {
133                                 netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect UniversalBrowserWrite');
134                                 window.open(
135                                         urls.XUL_AUTH_SIMPLE
136                                         + '?login_type=staff'
137                                         + '&desc_brief=' + window.escape('Your session has expired')
138                                         + '&desc_full=' + window.escape('Please re-login.  If after you have re-authenticated, you still see session expired dialogs like this one, please note where they are occuring and inform your friendly Evergreen developers of this debug information: ' + name),
139                                         'simple_auth',
140                                         'chrome,resizable,modal,width=700,height=500'
141                                 );
142                                 JSAN.use('OpenILS.data');
143                                 var data = new OpenILS.data(); data.init({'via':'stash'});
144                                 if (data.temporary_session != '') {
145                                         data.session = data.temporary_session; data.stash('session');
146                                         params[0] = data.session;
147                                         req = obj._request(app,name,params,null,o_params);
148                                 }
149                         }
150                 } catch(E) {
151                         this.error.sdump('D_ERROR',E);
152                 }
153                 return req;
154         },
155         
156         'rerequest_on_perm_failure' : function(app,name,params,req,o_params) {
157                 try {
158                         var obj = this;
159                         var robj = req.getResultObject();
160                         if (robj != null && robj.ilsevent && robj.ilsevent == 5000) {
161                                 netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect UniversalBrowserWrite');
162                                 window.open(
163                                         urls.XUL_AUTH_SIMPLE
164                                         + '?login_type=temp'
165                                         + '&desc_brief=' + window.escape('Permission Denied: ' + robj.ilsperm)
166                                         + '&desc_full=' + window.escape('Another staff member with the above permission may authorize this specific action.  Please notify your library administrator if you need this permission.  If you feel you have received this exception in error, inform your friendly Evergreen developers of the above permission and this debug information: ' + name),
167                                         'simple_auth',
168                                         'chrome,resizable,modal,width=700,height=500'
169                                 );
170                                 JSAN.use('OpenILS.data');
171                                 var data = new OpenILS.data(); data.init({'via':'stash'});
172                                 if (data.temporary_session != '') {
173                                         params[0] = data.temporary_session;
174                                         req = obj._request(app,name,params,null,o_params);
175                                 }
176                         }
177                 } catch(E) {
178                         this.error.sdump('D_ERROR',E);
179                 }
180                 return req;
181         },
182
183         'rerequest_on_override' : function (app,name,params,req,o_params) {
184                 var obj = this;
185                 try {
186                         function override(r) {
187                                 try {
188                                         netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect UniversalBrowserWrite');
189                                         var xml = '<vbox xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"><groupbox><caption label="Exceptions"/><grid><columns><column/><column/><column/></columns><rows>';
190                                         for (var i = 0; i < r.length; i++) {
191                                                 xml += '<row style="color: red"><description>' + r[i].ilsevent + '</description><description>' + r[i].textcode + '</description><description>' +  (obj.error.get_ilsevent(r[i].ilsevent) ? obj.error.get_ilsevent(r[i].ilsevent) : "") + '</description></row>';
192                                         }
193                                         xml += '</rows></grid></groupbox><groupbox><caption label="Override"/><hbox><description>Force this action?</description><button accesskey="C" label="Cancel" name="fancy_cancel"/><button id="override" accesskey="O" label="Override" name="fancy_submit" value="override"/></hbox></groupbox></vbox>';
194                                         window.open(
195                                                 '/xul/server/util/fancy_prompt.xul'
196                                                 + '?xml=' + window.escape(xml)
197                                                 + '&title=' + window.escape(o_params.title),
198                                                 'fancy_prompt', 'chrome,resizable,modal,width=700,height=500'
199                                         );
200                                         JSAN.use('OpenILS.data');
201                                         var data = new OpenILS.data(); data.init({'via':'stash'});
202                                         if (data.fancy_prompt_data != '') {
203                                                 req = obj._request(app,name + '.override',params);
204                                         }
205                                         return req;
206                                 } catch(E) {
207                                         alert(E);
208                                 }
209                         }
210
211                         var result = req.getResultObject();
212                         if (!result) return req;
213
214                         if ( o_params.overridable_events.indexOf(result.ilsevent) != -1 ) {
215                                 req = override([result]);
216                         } else {
217                                 var found_good = false; var found_bad = false;
218                                 for (var i = 0; i < result.length; i++) {
219                                         if (o_params.overridable_events.indexOf(result[i].ilsevent) != -1 ) {
220                                                 found_good = true;
221                                         } else {
222                                                 found_bad = true;
223                                         }
224                                 }
225                                 if (found_good && (!found_bad)) req = override(result);
226                         }
227
228                         return req;
229                 } catch(E) {
230                         throw(E);
231                 }
232         },
233
234
235 }
236
237 /*
238 function sample_callback(request) {
239         var result = request.getResultObject();
240 }
241 */
242
243 dump('exiting util/network.js\n');