]> git.evergreen-ils.org Git - working/Evergreen.git/blob - Open-ILS/xul/staff_client/server/patron/ue_ui.js
Merge branch 'master' of git.evergreen-ils.org:Evergreen
[working/Evergreen.git] / Open-ILS / xul / staff_client / server / patron / ue_ui.js
1 /* -----------------------------------------------------------------------
2     UI code for the user editor.  Handles breaking up the components
3     into a wizard-like interface.
4     ----------------------------------------------------------------------- */
5
6
7 var pages = [ 
8     'uedit_userid', 
9     'uedit_contact_info', 
10     'uedit_addresses', 
11     'uedit_groups', 
12     'uedit_stat_cats', 
13     'uedit_surveys',
14     'uedit_finalize',
15     ];
16
17 /* ID's of objects that should be focused when their page is made visible */
18 var pageFocus = [
19     'ue_barcode',
20     'ue_email',
21     'ue_addr_label_1',
22     'ue_profile',
23     'ue_stat_cat_selector_1',
24     'ue_survey_selector_1',
25     'ue_view_summary'
26 ];
27
28
29 function uEditNext() {
30     var i = _findActive();
31     if( i < (pages.length - 1)) uEditShowPage(pages[i+1]);
32 }
33
34
35 function uEditPrev() {
36     var i = _findActive();
37     if( i > 0 ) uEditShowPage(pages[i-1]);
38 }
39
40 function uEditCheckErrors() {
41     var errors = uEditGetErrorStrings();
42     if(errors) unHideMe($('ue_errors'));
43     else hideMe($('ue_errors'));
44 }
45
46 /*
47 function uEditFetchError(id) { if($(id)) return $(id).innerHTML + "\n"; return "";}
48 */
49
50 function uEditShowPage(id) {
51     if( id == null ) return;
52
53     for( var p in pages ) {
54         var page = pages[p];
55         hideMe($(page));
56         removeCSSClass($(page+'_label'), 'label_active');
57     }
58
59     var idx = _findPageIdx(id);
60
61     unHideMe($(id));
62     addCSSClass($(id+'_label'), 'label_active');
63     var fpage = pageFocus[idx];
64
65     var pnode = $(fpage);
66     if( id == 'uedit_addresses' ) 
67         pnode = $n( $('ue_address_tbody').
68             getElementsByTagName('tr')[0], 'ue_addr_label');
69
70     if(pnode) { 
71         pnode.focus(); 
72         try{pnode.select()}catch(e){} 
73     }
74
75     unHideMe($('ue_back'));
76     unHideMe($('ue_fwd'));
77
78     if(idx == 0) hideMe($('ue_back'));
79     if(idx == (pages.length-1)) hideMe($('ue_fwd'));
80 }
81
82 function _findActive() {
83     for( var p in pages ) {
84         if(! $(pages[p]).className.match(/hide_me/) )
85             return parseInt(p);
86     }
87     return null;
88 }
89
90 function _findPageIdx(name) {
91     for( var i in pages ) {
92         var page = pages[i];
93         if( page == name ) return i;
94     }
95     return -1;
96 }
97
98 /* ------------------------------------------------------------------------------ */
99 /* Below are the various UI components built from retrieved data */
100 /* ------------------------------------------------------------------------------ */
101
102
103 /* org selector */
104 function uEditBuildLibSelector( node, depth, selector ) {
105     if(!selector) selector = $('ue_org_selector');
106     if(!node) { depth = 0; node = globalOrgTree; }
107     var opt = insertSelectorVal( 
108         selector, -1, node.name(), node.id(), null, depth++ );
109     if(!findOrgType(node.ou_type()).can_have_users()) opt.disabled = true; 
110     if( node.id() == USER.ws_ou() ) 
111         setSelector(selector, node.id());
112
113     for( var c in node.children() ) 
114         uEditBuildLibSelector(node.children()[c], depth, selector);
115 }
116
117
118 /* group tree selector */
119 function uEditDrawGroups(tree, depth, selector, drawme) {
120     if(!selector) {
121         selector = $('ue_profile');
122         depth = 0;
123     }
124     groupsCache[tree.id()] = tree;
125
126     /* if the staff does not have perms to access this group, 
127         remove it from the tree and don't add it's children */
128     var perm = uEditFindGroupPerm(tree);
129     var org = PERMS[perm];
130     if( org == -1 ) drawme = false;
131
132     if( drawme ) {
133         var opt = insertSelectorVal( selector, -1, tree.name(), tree.id(), null, depth++ );    
134         if(!isTrue(tree.usergroup())) opt.disabled = true;
135     }
136
137     for( var c in tree.children() ) 
138         uEditDrawGroups( tree.children()[c], depth, selector, drawme );
139 }
140
141
142 function uEditFindGroupPerm(group) {
143     if(!group) return null;
144     if( group.application_perm() ) 
145         return group.application_perm();
146     return uEditFindGroupPerm(groupsCache[group.parent()]);
147 }
148
149
150 /* user identification types */
151 function uEditDrawIDTypes(types) {
152     var pri_sel = $('ue_primary_ident_type');
153     //var sec_sel = $('ue_secondary_ident_type');
154     var idx = 1;
155     for( var t in types ) {
156         var type = types[t];
157         if(!type.name()) continue;
158         identTypesCache[type.id()] = type;
159         setSelectorVal( pri_sel, idx, type.name(), type.id() );
160         //setSelectorVal( sec_sel, idx++, type.name(), type.id() );
161         idx++;
162     }
163 }
164
165 /* user statistical catagories */
166 function uEditDrawStatCats(cats) {
167     var tbody = $('ue_stat_cat_tbody');
168     var templ = tbody.removeChild($('ue_stat_cat_row'));
169
170     for( var c in cats ) {
171         var row = templ.cloneNode(true);
172         uEditInsertCat( row, cats[c], c );
173         tbody.appendChild(row);
174     }
175 }
176
177
178 function uEditInsertCat( row, cat, idx ) {
179
180     cat.entries().sort(  /* sort the entries by value */
181         function( a, b ) { 
182             if( !a.value() ) return -1;
183             if( !b.value() ) return 1;
184             if( (a.value()+'').toLowerCase() > (b.value()+'').toLowerCase()) return 1;
185             if( (a.value()+'').toLowerCase() < (b.value()+'').toLowerCase()) return -1;
186             return 0;
187         }
188     );
189
190     statCatsCache[cat.id()] = cat;
191
192     /* register the new map object */
193     uEditBuildSCMField(cat, row);
194
195     var newval = $n(row, 'ue_stat_cat_newval');
196     var selector = $n(row, 'ue_stat_cat_selector');
197
198     selector.onchange = function() { 
199         newval.value = getSelectorVal(selector);
200         if(newval.onchange) newval.onchange();
201     }
202
203     if( idx == 0 ) selector.id = 'ue_stat_cat_selector_1'; 
204
205     $n(row, 'ue_stat_cat_name').appendChild(text(cat.name()));
206     $n(row, 'ue_stat_cat_owner').appendChild(
207         text(fetchOrgUnit(cat.owner()).shortname()));
208
209     for( var e in cat.entries() ) {
210         var entry = cat.entries()[e];
211         setSelectorVal( selector, 
212             (parseInt(e)+1), entry.value(), entry.value() );
213     }
214 }
215
216 /* draw the surveys */
217 function uEditDrawSurveys(surveys) {
218
219         patron.survey_responses([]); /* clear out all surveys up front */
220
221         var div = $('uedit_surveys');
222         var table = div.removeChild($('ue_survey_table'));
223         if( surveys.length == 0 ) unHideMe($('uedit_no_surveys'));
224
225     for( var s in surveys ) {
226         var survey = surveys[s];
227         surveysCache[survey.id()] = survey;
228         var clone = table.cloneNode(true);
229         uEditInsertSurvey( div, clone, survey, s );
230         div.appendChild(clone);
231     }
232 }
233
234 /* insert the servey then insert each of that surveys questions */
235 function uEditInsertSurvey( div, table, survey, sidx ) {
236
237     $n(table, 'ue_survey_name').appendChild(text(survey.name()));
238     $n(table, 'ue_survey_desc').appendChild(text(survey.description()));
239
240     var tbody = $n(table, 'ue_survey_tbody');
241     var templ = tbody.removeChild($n(table, 'ue_survey_row'));
242
243     for( var q in survey.questions() ) {
244         var row = templ.cloneNode(true);
245         var quest = survey.questions()[q];
246         uEditInsertSurveyQuestion( row, survey, quest );
247         tbody.appendChild(row);
248     }
249 }
250
251 function uEditInsertSurveyQuestion( row, survey, question ) {
252
253     var selector = $n(row, 'ue_survey_answer');
254     row.setAttribute('question', question.id());
255     $n(row, 'ue_survey_question').appendChild(text(question.question()));
256
257     for( var a in question.answers() ) {
258         var answer = question.answers()[a];
259         surveyAnswersCache[answer.id()] = answer;
260         insertSelectorVal(selector, -1, answer.answer(), answer.id() );
261     }
262
263     surveyQuestionsCache[question.id()] = question;
264
265     if( patron.isnew() && isTrue(survey.required()) ) 
266         addCSSClass(selector, 'invalid_value');
267
268     selector.onchange = function() {
269
270                 /* remove any existing responses for this question */
271                 patron.survey_responses(
272                         grep( patron.survey_responses(),
273                                 function(item) {
274                                         return (item.question() != row.getAttribute('question'));
275                                 }
276                         )
277                 );
278
279
280         if(!patron.survey_responses())
281             patron.survey_responses([]);
282
283         var val = getSelectorVal(selector);
284
285         if( patron.isnew() && isTrue(survey.required()) ) {
286             if(val)
287                 removeCSSClass(selector, 'invalid_value');
288             else 
289                 addCSSClass(selector, 'invalid_value');
290             uEditCheckErrors();
291         }
292
293         if(!val) return;
294
295         var resp    = new asvr();
296         resp.isnew(1);
297         resp.survey(survey.id());
298         resp.usr(patron.id());
299         resp.question(row.getAttribute('question'));
300         resp.answer(val);
301         patron.survey_responses().push( resp );
302     }
303 }
304
305
306
307
308
309 /* -----------------------------------------------------------------------
310     Spit out the patron info to the summary display tables...
311     ----------------------------------------------------------------------- */
312
313 function uEditShowSummary() {
314     hideMe($('main_div_container'));
315     unHideMe($('summary_div_container'));
316
317     for( var f in dataFields ) {
318
319         var field = dataFields[f];
320         if( field.object == patron ) {
321
322             var val = uEditNodeVal(field);
323
324             if(    field.key == 'profile'        ||
325                     field.key == 'home_ou'        ||
326                     field.key == 'ident_type'    ||
327                     field.key == 'ident_type2') {
328
329                 val = getSelectorName($(field.widget.id));
330             }
331
332             var node = $('ue_summary_'+field.key);
333             if(node) appendClear(node, text(val));
334         }
335
336         if( field.object == patron.card() )
337             appendClear($('ue_summary_barcode'), text(uEditNodeVal(field)));
338
339     }
340
341     var table = $('ue_summary_table');
342     uEditFleshSummaryAddresses( table, patron );
343     uEditFleshSummaryStatCats( table, patron );
344     uEditFleshSummarySurveys( table, patron );
345 }
346
347
348
349 var uEditSummaryAddrRow;
350 function uEditFleshSummaryAddresses( table, patron ) {
351
352     var addrtbody = $n(table, 'ue_summary_addr_tbody');
353     if(!uEditSummaryAddrRow)
354         uEditSummaryAddrRow = 
355             addrtbody.removeChild($n(addrtbody, 'ue_summary_addr_row'));
356     var rowtmpl = uEditSummaryAddrRow;
357     removeChildren(addrtbody);
358
359     for( var a in patron.addresses() ) {
360         var address = patron.addresses()[a];
361         var row = rowtmpl.cloneNode(true);
362         uEditFleshSummaryAddr( address, patron, row );
363         addrtbody.appendChild(row);
364         if(address.isdeleted()) addCSSClass(row, 'deleted');
365     }
366 }
367
368
369 function uEditFleshSummaryAddr( address, patron, row ) {
370     var yes = $('yes').innerHTML;
371     var no = $('no').innerHTML;
372
373     $n(row, 'label').appendChild(text(address.address_type()));
374     $n(row, 'street1').appendChild(text(address.street1()));
375     $n(row, 'street2').appendChild(text(address.street2()));
376     $n(row, 'city').appendChild(text(address.city()));
377     $n(row, 'county').appendChild(text(address.county()));
378     $n(row, 'state').appendChild(text(address.state()));
379     $n(row, 'country').appendChild(text(address.country()));
380     $n(row, 'zip').appendChild(text(address.post_code()));
381     $n(row, 'valid').appendChild(text( (isTrue(address.valid())) ? yes : no ));
382     $n(row, 'incorporated').appendChild(text( (isTrue(address.within_city_limits())) ? yes : no ));
383
384     var mid = patron.mailing_address();
385     if( typeof patron.mailing_address() == 'object' ) 
386         mid = patron.mailing_address().id();
387     $n(row, 'mailing').appendChild(text((mid == address.id()) ? yes : no ));
388
389     var bid = patron.billing_address();
390     if( typeof patron.billing_address() == 'object' ) 
391         bid = patron.billing_address().id();
392     $n(row, 'billing').appendChild(text((bid == address.id()) ? yes : no ));
393 }
394
395
396
397 var uEditSummaryStatCatRow;
398 function uEditFleshSummaryStatCats( table, patron ) {
399     var tbody = $n(table, 'ue_summary_stats_tbody');
400
401     if(!uEditSummaryStatCatRow)
402         uEditSummaryStatCatRow = 
403             tbody.removeChild($n(tbody, 'ue_summary_stats_row'));
404     var rowtmpl = uEditSummaryStatCatRow;
405     removeChildren(tbody);
406
407     for( var s in patron.stat_cat_entries() ) {
408         row = rowtmpl.cloneNode(true);
409         var entry = patron.stat_cat_entries()[s];
410         var cat = statCatsCache[entry.stat_cat()];
411         $n(row, 'ue_summary_stat_name').appendChild(text(cat.name()));
412         $n(row, 'ue_summary_stat_value').appendChild(text(entry.stat_cat_entry()));
413         row.setAttribute('statcat', entry.stat_cat());
414         if( entry.isdeleted() ) addCSSClass(row, 'deleted'); 
415         tbody.appendChild(row);
416     }
417
418     if( ! getElementsByTagNameFlat( tbody, 'tr' )[0] )
419         hideMe(tbody.parentNode);
420     else
421         unHideMe(tbody.parentNode);
422 }
423
424
425
426 var uEditSummarySurveyRow;
427 function uEditFleshSummarySurveys( table, patron ) {
428
429     var tbody    = $n(table, 'ue_summary_survey_tbody');
430     if(!uEditSummarySurveyRow)
431         uEditSummarySurveyRow = 
432             tbody.removeChild($n(tbody, 'ue_summary_survey_row'));
433     var rowtmpl = uEditSummarySurveyRow;
434
435     removeChildren(tbody);
436
437     for( var r in patron.survey_responses() ) {
438         var row        = rowtmpl.cloneNode(true);
439         var resp        = patron.survey_responses()[r];
440         var survey    = surveysCache[resp.survey()];
441         var quest    = surveyQuestionsCache[resp.question()];
442         var answer    = surveyAnswersCache[resp.answer()];
443         $n(row, 'ue_summary_survey_name').appendChild(text(survey.name()));
444         $n(row, 'ue_summary_survey_question').appendChild(text(quest.question()));
445         $n(row, 'ue_summary_survey_answer').appendChild(text(answer.answer()));
446         tbody.appendChild(row);
447     }
448
449     if( ! getElementsByTagNameFlat(tbody, 'tr')[0])
450         hideMe(tbody.parentNode);
451     else
452         unHideMe(tbody.parentNode);
453 }
454
455
456 function uEditDrawNetLevels(netLevels) {
457     var sel = $('ue_net_level');
458     iterate( netLevels, 
459         function(i) {
460             insertSelectorVal( sel, -1, i.name(), i.id() );
461         }
462     );
463     setSelector(sel, defaultNetLevel);
464 }
465
466
467
468