]> git.evergreen-ils.org Git - Evergreen.git/blob - Open-ILS/xul/staff_client/server/patron/search_result.js
LP#1010027: tweak patron columns in patron search interface
[Evergreen.git] / Open-ILS / xul / staff_client / server / patron / search_result.js
1 dump('entering patron/search_result.js\n');
2
3 function $(id) { return document.getElementById(id); }
4
5 if (typeof patron == 'undefined') patron = {};
6 patron.search_result = function (params) {
7
8     JSAN.use('util.error'); this.error = new util.error();
9     JSAN.use('util.network'); this.network = new util.network();
10     this.w = window;
11 }
12
13 patron.search_result.prototype = {
14
15     'result_cap' : 50,
16
17     'init' : function( params ) {
18
19         var obj = this;
20
21         obj.query = params['query'];
22         obj.search_limit = params['search_limit'];
23         obj.search_sort = params['search_sort'];
24
25         JSAN.use('OpenILS.data'); this.OpenILS = {}; 
26         obj.OpenILS.data = new OpenILS.data(); obj.OpenILS.data.init({'via':'stash'});
27         var obscure_dob = String( obj.OpenILS.data.hash.aous['circ.obscure_dob'] ) == 'true';
28
29         var result_cap_setting = obj.OpenILS.data.hash.aous[
30             'ui.patron_search.result_cap'
31         ];
32         if (typeof result_cap_setting != 'undefined') {
33             obj.result_cap = Math.abs( result_cap_setting );
34         }
35
36         JSAN.use('util.list'); obj.list = new util.list('patron_list');
37
38         JSAN.use('patron.util');
39         var columns = obj.list.fm_columns('au',{
40             '*' : { 'remove_virtual' : true, 'expanded_label' : false, 'hidden' : true, 'sort_headers' : true },
41             'au_barcode' : { 'hidden' : false },
42             'au_barred' : { 'hidden' : false },
43             'au_family_name' : { 'hidden' : false },
44             'au_first_given_name' : { 'hidden' : false },
45             'au_second_given_name' : { 'hidden' : false },
46             'au_dob' : { 'hidden' : false },
47             'au_profile' : { 'fleshed_display_field' : 'name' },
48             'au_ident_type' : { 'fleshed_display_field' : 'name' },
49             'au_ident_type2' : { 'fleshed_display_field' : 'name' },
50             'au_mailing_address' : { 'remove_me' : true },
51             'au_billing_address' : { 'remove_me' : true },
52             'au_net_access_level' : { 'fleshed_display_field' : 'name' }
53         }).concat(
54             obj.list.fm_columns('ac',{
55                 '*' : { 'remove_virtual' : true, 'expanded_label' : true, 'hidden' : true },
56                 'ac_barcode' : { 'hidden' : false }
57             })
58         ).concat(
59             obj.list.fm_columns('aua',{
60                 '*' : {
61                     'dataobj' : 'billing_aua',
62                     'remove_virtual' : true,
63                     'label_prefix' : $('patronStrings').getString('staff.patron.search_result.billing_address_column_label_prefix'),
64                     'hidden' : true
65                 }
66             },'billing_')
67         ).concat(
68             obj.list.fm_columns('aua',{
69                 '*' : {
70                     'dataobj' : 'mailing_aua',
71                     'remove_virtual' : true,
72                     'label_prefix' : $('patronStrings').getString('staff.patron.search_result.mailing_address_column_label_prefix'),
73                     'hidden' : true
74                 }
75             },'mailing_')
76         );
77
78         obj.dblclick_handler = function(ev) {
79             JSAN.use('util.functional');
80             var sel = obj.list.retrieve_selection();
81             var list = util.functional.map_list(
82                 sel,
83                 function(o) { return o.getAttribute('retrieve_id'); }
84             );
85             obj.controller.view.cmd_sel_clip.setAttribute('disabled', list.length < 1 );
86             if (typeof obj.on_dblclick == 'function') {
87                 obj.on_dblclick(list);
88             }
89             if (typeof window.xulG == 'object' && typeof window.xulG.on_dblclick == 'function') {
90                 obj.error.sdump('D_PATRON','patron.search_result: Calling external .on_dblclick()\n');
91                 window.xulG.on_dblclick(list);
92             } else {
93                 obj.error.sdump('D_PATRON','patron.search_result: No external .on_dblclick()\n');
94             }
95         };
96
97         obj.list.init(
98             {
99                 'columns' : columns,
100                 'retrieve_row' : function(params) {
101                     var id = params.retrieve_id;
102                     var au_obj = patron.util.retrieve_fleshed_au_via_id(
103                         ses(),
104                         id,
105                         ["card","billing_address","mailing_address"],
106                         function(req) {
107                             try {
108                                 var row = params.row;
109                                 if (typeof row.my == 'undefined') row.my = {};
110                                 row.my.au = req.getResultObject();
111                                 row.my.ac = row.my.au.card();
112                                 row.my.billing_aua = row.my.au.billing_address();
113                                 row.my.mailing_aua = row.my.au.mailing_address();
114                                 if (typeof params.on_retrieve == 'function') {
115                                     params.on_retrieve(row);
116                                 } else {
117                                     alert($("patronStrings").getFormattedString('staff.patron.search_result.init.typeof_params', [typeof params.on_retrieve]));
118                                 }
119                             } catch(E) {
120                                 alert('error: ' + E);
121                             }
122                         }
123                     );
124                 },
125                 'on_dblclick' : obj.dblclick_handler,
126                 'on_select' : function(ev) {
127                     JSAN.use('util.functional');
128                     var sel = obj.list.retrieve_selection();
129                     var list = util.functional.map_list(
130                         sel,
131                         function(o) { return o.getAttribute('retrieve_id'); }
132                     );
133                     obj.controller.view.cmd_sel_clip.setAttribute('disabled', list.length < 1 );
134                     if (typeof obj.on_select == 'function') {
135                         obj.on_select(list);
136                     }
137                     if (typeof window.xulG == 'object' && typeof window.xulG.on_select == 'function') {
138                         obj.error.sdump('D_PATRON','patron.search_result: Calling external .on_select()\n');
139                         window.xulG.on_select(list);
140                     } else {
141                         obj.error.sdump('D_PATRON','patron.search_result: No external .on_select()\n');
142                     }
143                 }
144             }
145         );
146         JSAN.use('util.controller'); obj.controller = new util.controller();
147         obj.controller.init(
148             {
149                 control_map : {
150                     'cmd_broken' : [
151                         ['command'],
152                         function() { alert($("commonStrings").getString('common.unimplemented')); }
153                     ],
154                     'cmd_search_print' : [
155                         ['command'],
156                         function() {
157                             try {
158                                 obj.list.dump_csv_to_printer();
159                             } catch(E) {
160                                 obj.error.standard_unexpected_error_alert($("patronStrings").getString('staff.patron.search_result.init.search_print'),E);
161                             }
162                         }
163                     ],
164                     'cmd_sel_clip' : [
165                         ['command'],
166                         function() {
167                             try {
168                                 obj.list.clipboard();
169                             } catch(E) {
170                                 obj.error.standard_unexpected_error_alert($("patronStrings").getString('staff.patron.search_result.init.search_clipboard'),E);
171                             }
172                         }
173                     ],
174                     'cmd_save_cols' : [
175                         ['command'],
176                         function() {
177                             try {
178                                 obj.list.save_columns();
179                             } catch(E) {
180                                 obj.error.standard_unexpected_error_alert($("patronStrings").getString('staff.patron.search_result.init.search_saving_columns'),E);
181                             }
182                         }
183                     ],
184                 }
185             }
186         );
187
188         if (obj.query) obj.search(obj.query);
189     },
190
191     'cleanup' : function( params ) {
192         var obj = this;
193         obj.controller.cleanup();
194         obj.list.cleanup();
195         obj.list.clear();
196     },
197
198     'search' : function(query) {
199         var obj = this;
200         var search_hash = {};
201         obj.search_term_count = 0;
202         var inactive = false;
203         var search_depth = 0;
204         for (var i in query) {
205             switch( i ) {
206                 case 'card':
207                     search_hash[ i ] = {};
208                     search_hash[ i ].value = query[i];
209                     search_hash[i].group = 3; 
210                     obj.search_term_count++;
211                 break;
212
213                 case 'phone': case 'ident': 
214                 
215                     search_hash[ i ] = {};
216                     search_hash[ i ].value = query[i];
217                     search_hash[i].group = 2; 
218                     obj.search_term_count++;
219                 break;
220
221                 case 'street1': case 'street2': case 'city': case 'state': case 'post_code': 
222                 
223                     search_hash[ i ] = {};
224                     search_hash[ i ].value = query[i];
225                     search_hash[i].group = 1; 
226                     obj.search_term_count++;
227                 break;
228
229                 case 'family_name': case 'first_given_name': case 'second_given_name': case 'email': case 'alias': case 'usrname': case 'profile':
230
231                     search_hash[ i ] = {};
232                     search_hash[ i ].value = query[i];
233                     search_hash[i].group = 0; 
234                     obj.search_term_count++;
235                 break;
236
237                 case 'inactive':
238                     if (query[i] == 'checked' || query[i] == 'true') inactive = true;
239                 break;
240
241                 case 'search_depth':
242                     search_depth = function(a){return a;}(query[i]);
243                 break;
244             }
245         }
246         try {
247             var results = [];
248
249             var sort_params = obj.search_sort;
250             if (!sort_params) {
251                 sort_params = [ 'family_name ASC', 'first_given_name ASC', 'second_given_name ASC', 'dob DESC' ];
252             }
253             var params = [ 
254                 ses(), 
255                 search_hash, 
256                 typeof obj.search_limit != 'undefined' && typeof obj.search_limit != 'null' ? obj.search_limit : obj.result_cap + 1, 
257                 sort_params
258             ];
259             if (inactive) {
260                 params.push(1);
261                 if (document.getElementById('active')) {
262                     document.getElementById('active').setAttribute('hidden','false');
263                     document.getElementById('active').hidden = false;
264                 }
265             } else {
266                 params.push(0);
267             }
268             params.push(search_depth);
269             if (obj.search_term_count > 0) {
270                 //alert('search params = ' + obj.error.pretty_print( js2JSON( params ) ) );
271                 results = this.network.simple_request( 'FM_AU_IDS_RETRIEVE_VIA_HASH', params );
272                 if ( results == null ) results = [];
273                 if (typeof results.ilsevent != 'undefined') throw(results);
274                 if (results.length == 0) {
275                     alert($("patronStrings").getString('staff.patron.search_result.search.no_patrons_found'));
276                     return;
277                 }
278                 if (results.length == typeof obj.search_limit != 'undefined' && typeof obj.search_limit != 'null' ? obj.search_limit : obj.result_cap+1) {
279                     results.pop();
280                     alert($("patronStrings").getFormattedString('staff.patron.search_result.search.capped_results', [typeof obj.search_limit != 'undefined' && typeof obj.search_limit != 'null' ? obj.search_limit : obj.result_cap]));
281                 }
282             } else {
283                 alert($("patronStrings").getString('staff.patron.search_result.search.enter_search_terms'));
284                 return;
285             }
286
287             obj.list.clear();
288             //this.list.append( { 'retrieve_id' : results[i], 'row' : {} } );
289             var funcs = [];
290
291                 function gen_func(r) {
292                     return function() {
293                         obj.list.append( { 'retrieve_id' : r, 'row' : {}, 'to_bottom' : true, 'no_auto_select' : true } );
294                     }
295                 }
296
297             for (var i = 0; i < results.length; i++) {
298                 funcs.push( gen_func(results[i]) );
299             }
300             JSAN.use('util.exec'); var exec = new util.exec(4);
301             exec.chain( funcs );
302
303         } catch(E) {
304             this.error.standard_unexpected_error_alert('patron.search_result.search',E);
305         }
306     }
307
308 }
309
310 dump('exiting patron/search_result.js\n');