]> git.evergreen-ils.org Git - working/Evergreen.git/blob - Open-ILS/xul/staff_client/server/admin/stat_cat_editor.js
Circ Statistical Archiving
[working/Evergreen.git] / Open-ILS / xul / staff_client / server / admin / stat_cat_editor.js
1 var SC_FETCH_ALL        = 'open-ils.circ:open-ils.circ.stat_cat.TYPE.retrieve.all';
2 var SC_FETCH_SF         = 'open-ils.pcrud:open-ils.pcrud.search.PCRUD.atomic';
3 var SC_CREATE            = 'open-ils.circ:open-ils.circ.stat_cat.TYPE.create';
4 var SC_UPDATE            = 'open-ils.circ:open-ils.circ.stat_cat.TYPE.update';
5 var SC_DELETE            = 'open-ils.circ:open-ils.circ.stat_cat.TYPE.delete';
6 var SC_ENTRY_CREATE    = 'open-ils.circ:open-ils.circ.stat_cat.TYPE.entry.create';
7 var SC_ENTRY_UPDATE    = 'open-ils.circ:open-ils.circ.stat_cat.TYPE.entry.update';
8 var SC_ENTRY_DELETE    = 'open-ils.circ:open-ils.circ.stat_cat.TYPE.entry.delete';
9
10 var ACTOR                = 'actor';
11 var ASSET                = 'asset';
12 var session                = null;
13 var user                    = null;
14
15 var scCache                = {};
16 var PERMS                = {};
17 PERMS[ACTOR]            = {};
18 PERMS[ASSET]            = {};
19
20 var PCRUD_CLASS         = {};
21 PCRUD_CLASS[ACTOR]      = 'actscsf';
22 PCRUD_CLASS[ASSET]      = 'ascsf';
23
24 scSFCache               = {};
25
26 var currentlyVisible;
27 var opacVisible        = false;
28 var cgi;
29 var focusOrg;
30
31 var myPerms = [    
32     'CREATE_PATRON_STAT_CAT',
33     'UPDATE_PATRON_STAT_CAT',
34     'DELETE_PATRON_STAT_CAT',
35     'CREATE_PATRON_STAT_CAT_ENTRY',
36     'UPDATE_PATRON_STAT_CAT_ENTRY',
37     'DELETE_PATRON_STAT_CAT_ENTRY',
38
39     'CREATE_COPY_STAT_CAT',
40     'UPDATE_COPY_STAT_CAT',
41     'DELETE_COPY_STAT_CAT',
42     'CREATE_COPY_STAT_CAT_ENTRY',
43     'UPDATE_COPY_STAT_CAT_ENTRY',
44     'DELETE_COPY_STAT_CAT_ENTRY' 
45 ];
46
47 function scSetPerms() {
48     PERMS[ACTOR].create_stat_cat = OILS_WORK_PERMS.CREATE_PATRON_STAT_CAT;
49     PERMS[ACTOR].update_stat_cat = OILS_WORK_PERMS.UPDATE_PATRON_STAT_CAT;
50     PERMS[ACTOR].delete_stat_cat = OILS_WORK_PERMS.DELETE_PATRON_STAT_CAT;
51     PERMS[ACTOR].create_stat_cat_entry = OILS_WORK_PERMS.CREATE_PATRON_STAT_CAT_ENTRY;
52     PERMS[ACTOR].update_stat_cat_entry = OILS_WORK_PERMS.UPDATE_PATRON_STAT_CAT_ENTRY;
53     PERMS[ACTOR].delete_stat_cat_entry = OILS_WORK_PERMS.DELETE_PATRON_STAT_CAT_ENTRY;
54
55     PERMS[ASSET].create_stat_cat = OILS_WORK_PERMS.CREATE_COPY_STAT_CAT;
56     PERMS[ASSET].update_stat_cat = OILS_WORK_PERMS.UPDATE_COPY_STAT_CAT;
57     PERMS[ASSET].delete_stat_cat = OILS_WORK_PERMS.DELETE_COPY_STAT_CAT;
58     PERMS[ASSET].create_stat_cat_entry =  OILS_WORK_PERMS.CREATE_COPY_STAT_CAT_ENTRY;
59     PERMS[ASSET].update_stat_cat_entry =  OILS_WORK_PERMS.UPDATE_COPY_STAT_CAT_ENTRY;
60     PERMS[ASSET].delete_stat_cat_entry =  OILS_WORK_PERMS.DELETE_COPY_STAT_CAT_ENTRY;
61
62     // set up the filter select
63     var fselector = $('sc_org_filter');
64     var org_list = PERMS[currentlyVisible].update_stat_cat;
65     buildMergedOrgSel(fselector, org_list, 0, 'shortname');
66     var org = findOrgUnit(org_list[0]);
67     if(org_list.length > 1 || (org.children() &&  org.children()[0])) 
68         fselector.disabled = false;
69
70     fselector.onchange = function() {
71         focusOrg = getSelectorVal(fselector);
72         scShow(currentlyVisible);
73     }
74     
75     focusOrg = USER.ws_ou();
76     if(!orgIsMineFromSet(org_list, focusOrg)) 
77         focusOrg = org_list[0];
78     setSelector(fselector, focusOrg);
79 }
80
81 function scEditorInit() {
82     cgi = new CGI();
83     session = cgi.param('ses');
84     if(!session) throw "User session is not defined";
85     user = fetchUser(session);
86     $('sc_type_selector').onchange = scBuildNew;
87     setTimeout( 
88         function() { 
89             fetchHighestWorkPermOrgs(
90                 session, user.id(), myPerms, function(){scGo();});
91         }, 20 );
92 }
93
94 function scPopSipFields( selector, type ) {
95     while(selector.lastChild.value != '') selector.removeChild(selector.lastChild);
96     if(!scSFCache[type]) {
97         var req = new Request( 
98             SC_FETCH_SF.replace(/PCRUD/, PCRUD_CLASS[type]) , session, { 'field' : { '!=' : null } } );
99         req.send(true);
100         scSFCache[type] = req.result();
101     }
102     for(var f in scSFCache[type]) {
103         var option = document.createElement('option');
104         option.value = scSFCache[type][f].field();
105         option.appendChild(text(scSFCache[type][f].name() + ' (' + scSFCache[type][f].field() + ')' + (isTrue(scSFCache[type][f].one_only()) ? '**' : '')));
106         selector.appendChild(option);
107     }
108 }
109
110 function scGo() {
111     var show = cgi.param('show');
112     if(!show) currentlyVisible = ASSET;
113     scSetPerms();
114     scShow(currentlyVisible);
115     scBuildNew();
116     $('sc_user').appendChild(text(user.usrname()));
117 }
118
119 function scFetchAll( session, type, orgid, callback, args ) {
120     var req = new Request( 
121         SC_FETCH_ALL.replace(/TYPE/, type) , session, orgid );
122     req.send(true);
123     return req.result();
124 }
125
126 function scShow(type) { 
127     setTimeout(function(){_scShow(type)}, 500);
128 }
129
130 function _scShow(type) { 
131
132     currentlyVisible = type;
133
134     if( type == ASSET ) {
135         addCSSClass($('sc_show_copy'), 'has_color');
136         removeCSSClass($('sc_show_actor'), 'has_color');
137
138     } else if( type == ACTOR ) {
139         addCSSClass($('sc_show_actor'), 'has_color');
140         removeCSSClass($('sc_show_copy'), 'has_color');
141     }
142
143     scCache[type] = scFetchAll(session, type, focusOrg);   /* XXX */
144     scDraw( type, scCache[type] );
145 }
146
147 var scRow; var scCounter;
148 function scDraw( type, cats ) {
149
150     hideMe($('loading'));
151
152     var tbody = $('sc_tbody');
153     if(!scRow) scRow = tbody.removeChild($('sc_tr'));
154     removeChildren(tbody);
155
156     if(!cats || cats.length == 0) {
157         hideMe($('sc_table'));
158         unHideMe($('sc_none'));
159         return;
160     }
161
162     hideMe($('sc_none'));
163     unHideMe($('sc_table'));
164
165     if(type == ACTOR) {
166         unHideMe($('sc_usr_summary_label'));
167         hideMe($('sc_required_label'));
168     } else {
169         unHideMe($('sc_required_label'));
170         hideMe($('sc_usr_summary_label'));
171     }
172
173     scCounter = 0;
174     for( var c in cats ) scInsertCat( tbody, cats[c], type );
175 }
176
177
178 var scEntryCounter;
179 function scInsertCat( tbody, cat, type ) {
180
181     var row = scRow.cloneNode(true);
182     row.id = 'sc_tr_' + cat.id();
183     var name_td = $n(row, 'sc_name');
184     name_td.appendChild( text(cat.name()) );
185     if(scCounter++ % 2) addCSSClass(row, 'has_color');
186
187     $n(row, 'sc_new_entry').onclick = function() { scNewEntry(type, cat, tbody); }
188     $n(row, 'sc_edit').onclick = function(){ scEdit(tbody, type, cat); };
189     $n(row, 'sc_owning_lib').appendChild( text( findOrgUnit(cat.owner()).name() ));
190
191     if(isTrue(cat.opac_visible()))
192         unHideMe($n(row, 'sc_opac_visible'));
193     else 
194         unHideMe($n(row, 'sc_opac_invisible'));
195
196     if(cat.sip_field().length != 2)
197         unHideMe($n(row, 'sc_sip_field_none'));
198     else {
199         $n(row, 'sc_sip_field_value').appendChild( text( cat.sip_field() ) );
200         unHideMe($n(row, 'sc_sip_field_value'));
201     }
202
203     $n(row, 'sc_sip_format_td').appendChild( text( cat.sip_format() ) );
204
205     if(isTrue(cat.checkout_archive()))
206         unHideMe($n(row, 'sc_checkout_archive_on'));
207     else
208         unHideMe($n(row, 'sc_checkout_archive'));
209
210     if(type == ACTOR) {
211         if(isTrue(cat.usr_summary()))
212             unHideMe($n(row, 'sc_usr_summary_on'));
213         else 
214             unHideMe($n(row, 'sc_usr_summary'));
215
216         hideMe($n(row, 'sc_required_td'));
217     } else {
218         if(isTrue(cat.required()))
219             unHideMe($n(row, 'sc_required_on'));
220         else 
221             unHideMe($n(row, 'sc_required'));
222
223         hideMe($n(row, 'sc_usr_summary_td'));
224     }
225
226     tbody.appendChild(row);
227     scEntryCounter = 0;
228
229     cat.entries().sort(  /* sort the entries by value */
230         function( a, b ) { 
231          a = new String(a.value()).toLowerCase();
232          b = new String(b.value()).toLowerCase();
233             if( a > b ) return 1;
234             if( a < b ) return -1;
235             return 0;
236         }
237     );
238
239     for( var e in cat.entries() ) 
240         scInsertEntry( cat, cat.entries()[e], $n(row, 'sc_entries_selector'), tbody, type );
241 }
242
243
244 function scInsertEntry( cat, entry, selector, tbody, type ) {
245     setSelectorVal( selector, scEntryCounter++, entry.value(), entry.id(), 
246             function(){ scUpdateEntry( cat, entry, tbody, type );} );
247 }
248
249
250
251 function scDelete(type, id) {
252     if(!confirm($('sc_delete_confirm').innerHTML)) return;
253     var req = new Request( SC_DELETE.replace(/TYPE/,type), session, id );
254     req.send(true);
255     var res = req.result();
256     if(checkILSEvent(res)) throw res;
257     alertId('sc_update_success');
258     scShow(type);
259 }
260
261 function scCreateEntry( type, id, row ) {
262     var value = $n(row, 'sc_new_entry_name').value;
263     if(!value) return;
264     var entry;
265     if( type == ACTOR ) entry = new actsce();
266     if( type == ASSET ) entry = new asce();
267
268     entry.isnew(1);
269     entry.stat_cat(id);
270     entry.owner(getSelectorVal($n(row, 'sc_new_entry_lib')));
271     entry.value(value);
272
273     var req = new Request( SC_ENTRY_CREATE.replace(/TYPE/, type), session, entry );
274     req.send(true);
275     var res = req.result();
276     if(checkILSEvent(res)) throw res;
277     alertId('sc_update_success');
278     scShow(type);
279 }
280
281 function scNewEntry( type, cat, tbody ) {
282     cleanTbody(tbody, 'edit');
283     var row = $('sc_new_entry_row').cloneNode(true);
284     row.setAttribute('edit', '1');
285
286     var r = $('sc_tr_' + cat.id());
287     if(r.nextSibling) tbody.insertBefore( row, r.nextSibling );
288     else{ tbody.appendChild(row); }
289
290     $n(row, 'sc_new_entry_create').onclick = 
291         function() {
292             if( scCreateEntry( type, cat.id(), row ) )
293                 tbody.removeChild(row); };
294     $n(row, 'sc_new_entry_cancel').onclick = function(){tbody.removeChild(row);}
295
296     var org_list = PERMS[type].create_stat_cat_entry;
297     if(org_list.length == 0) {
298         $n(row, 'sc_new_entry_create').disabled = true;
299         $n(row, 'sc_new_entry_lib').disabled = true;
300         return;
301     }
302
303     var rootOrg = findReleventRootOrg(org_list, cat.owner());
304     if(!rootOrg) {
305         $n(row, 'sc_new_entry_create').disabled = true;
306         $n(row, 'sc_new_entry_lib').disabled = true;
307         return;
308     }
309     buildOrgSel($n(row, 'sc_new_entry_lib'), rootOrg, 0, 'shortname');
310     $n(row, 'sc_new_entry_name').focus();
311 }
312
313
314 function scBuildNew() {
315     var libSel = $('sc_owning_lib_selector');
316     var typeSel = $('sc_type_selector');
317     var type = getSelectorVal(typeSel);
318     switch(type) {
319         case ACTOR:
320             hideMe($('required_td1'));
321             hideMe($('required_td2'));
322             unHideMe($('usr_summary_td1'));
323             unHideMe($('usr_summary_td2'));
324             unHideMe($('sip_tr'));
325         break;
326         case ASSET:
327             hideMe($('usr_summary_td1'));
328             hideMe($('usr_summary_td2'));
329             hideMe($('sip_tr'));
330             unHideMe($('required_td1'));
331             unHideMe($('required_td2'));
332         break;
333     }
334     var org_list = PERMS[type].create_stat_cat;
335     if(org_list.length == 0) { /* no create perms */
336         $('sc_new').disabled = true;
337         libSel.disabled = true;
338         return;
339     }
340     else {
341         $('sc_new').disabled = false;
342         libSel.disabled = false;
343     }
344     buildMergedOrgSel(libSel, org_list, 0, 'shortname');
345     scPopSipFields($('sc_sip_field'),type);
346 }
347
348
349 function scNew() {
350
351     var name = $('sc_new_name').value;
352     var type = getSelectorVal($('sc_type_selector'));
353
354     var visible = 0;
355     var required = 0;
356     var usr_summary = 0;
357     var checkout_archive = 0;
358     if( $('sc_make_opac_visible').checked) visible = 1;
359     if( $('sc_make_required').checked) required = 1;
360     if( $('sc_make_usr_summary').checked) usr_summary = 1;
361     if( $('sc_make_checkout_archive').checked) checkout_archive = 1;
362
363     var cat;
364     if( type == ACTOR ) {
365         cat = new actsc();
366         cat.usr_summary( usr_summary );
367     }
368     if( type == ASSET ) {
369         cat = new asc();
370         cat.required( required );
371     }
372     var field = getSelectorVal($('sc_sip_field'));
373     if(field.length == 2) cat.sip_field(field);
374     else cat.sip_field(null);
375     cat.sip_format($('sc_sip_format').value);
376
377     cat.opac_visible(visible);
378     cat.name(name);
379     cat.checkout_archive(checkout_archive);
380     cat.owner(getSelectorVal($('sc_owning_lib_selector')));
381     cat.isnew(1);
382
383     var req = new Request( SC_CREATE.replace(/TYPE/, type), session, cat );
384
385     req.send(true);
386     var res = req.result();
387     if(checkILSEvent(res)) throw res;
388     alertId('sc_update_success');
389
390     scShow(type);
391 }
392
393 function scEdit( tbody, type, cat ) {
394
395     cleanTbody(tbody, 'edit');
396     var row = $('sc_edit_row').cloneNode(true);
397     row.setAttribute('edit', '1');
398
399     var r = $('sc_tr_' + cat.id());
400     if(r.nextSibling) { tbody.insertBefore( row, r.nextSibling ); }
401     else{ tbody.appendChild(row); }
402
403     scPopSipFields($n(row, 'sc_edit_sip_field'), type);
404     $n(row, 'sc_edit_name').value = cat.name();
405     setSelector($n(row, 'sc_edit_sip_field'), cat.sip_field());
406     $n(row, 'sc_edit_sip_format').value = cat.sip_format();
407
408     if(type == ACTOR) {
409         var cb = $n(row, 'sc_edit_usr_summary');
410         cb.checked = isTrue(cat.usr_summary()); 
411         hideMe($n(row, 'sc_edit_required_td'));
412         unHideMe($n(row, 'sc_edit_usr_summary_td'));
413     } else {
414         var cb = $n(row, 'sc_edit_required');
415         cb.checked = isTrue(cat.required()); 
416         hideMe($n(row, 'sc_edit_usr_summary_td'));
417         unHideMe($n(row, 'sc_edit_required_td'));
418     }
419
420     var name = $n(row, 'sc_edit_cancel');
421     name.onclick = function() { tbody.removeChild(row); };
422
423     var show = $n(row, 'sc_edit_show_owning_lib');
424     
425     var myorg = findOrgUnit(user.home_ou());
426     var ownerorg = findOrgUnit(cat.owner());
427     show.appendChild(text(ownerorg.name()));
428
429     var selector = null;
430     if( myorg.children() && myorg.children().length > 0 ) {
431         selector = $n(row, 'sc_edit_owning_lib');
432         buildOrgSel( selector, myorg, findOrgDepth(myorg), 'shortname');
433         setSelector( selector, cat.owner() );
434         unHideMe(selector);
435
436     } else { unHideMe(show); }
437
438     name.focus();
439     name.select();
440
441     if( cat.opac_visible() != 0 && cat.opac_visible() != '0' ) {
442         $n( $n(row, 'sc_edit_opac_vis'), 
443             'sc_edit_opac_visibility').checked = true;
444     } else {
445         $n( $n(row, 'sc_edit_opac_invis'), 
446             'sc_edit_opac_visibility').checked = true;
447     }
448
449     $n( row, 'sc_edit_checkout_archive' ).checked = isTrue(cat.checkout_archive());
450
451     $n(row, 'sc_edit_submit').onclick = 
452         function() { scEditGo( type, cat, row, selector ); };
453
454     $n(row, 'sc_edit_delete').onclick = 
455         function(){ scDelete(type, cat.id()); };
456
457     var rootEditOrg = findReleventRootOrg(PERMS[type].update_stat_cat, cat.owner());
458     var rootDelOrg = findReleventRootOrg(PERMS[type].delete_stat_cat, cat.owner());
459
460     if(!rootEditOrg || rootEditOrg.id() != cat.owner())
461         $n(row,'sc_edit_submit').disabled = true;
462
463     if(!rootDelOrg || rootDelOrg.id() != cat.owner())
464         $n(row,'sc_edit_delete').disabled = true;
465 }
466
467 function scEditGo( type, cat, row, selector ) {
468     var name = $n(row, 'sc_edit_name').value;
469     var visible = 
470         $n( $n(row, 'sc_edit_opac_vis'), 'sc_edit_opac_visibility').checked;
471
472     var newlib = cat.owner();
473     if(selector) newlib = getSelectorVal( selector );
474
475     if(!name) return false;
476
477     var usr_summary = $n(row, 'sc_edit_usr_summary').checked;
478     var required = $n(row, 'sc_edit_required').checked;
479     var sip_field = getSelectorVal( $n(row, 'sc_edit_sip_field') );
480
481     cat.name( name );
482     cat.owner( newlib );
483     cat.entries(null);
484     cat.opac_visible(0);
485     cat.checkout_archive($n(row, 'sc_edit_checkout_archive').checked ? 1 : 0);
486     if(sip_field.length == 2) cat.sip_field( sip_field );
487     else cat.sip_field(null);
488     cat.sip_format($n(row, 'sc_edit_sip_format').value);
489     if( visible ) cat.opac_visible(1);
490     switch(type) {
491         case ACTOR:
492             cat.usr_summary( (usr_summary) ? 1 : 0 );
493         break;
494         case ASSET:
495             cat.required( (required) ? 1 : 0 );
496         break;
497     }
498
499     var req = new Request( SC_UPDATE.replace(/TYPE/,type), session, cat );
500     req.send(true);
501     var res = req.result();
502     if(checkILSEvent(res)) throw res;
503     alertId('sc_update_success');
504     scShow(type);
505
506     return true;
507 }
508
509 function scUpdateEntry( cat, entry, tbody, type ) {
510     cleanTbody(tbody, 'edit');
511     var row = $('sc_edit_entry_row').cloneNode(true);
512     row.setAttribute('edit', '1');
513
514     var r = $('sc_tr_' + cat.id());
515     if(r.nextSibling) tbody.insertBefore( row, r.nextSibling );
516     else{ tbody.appendChild(row); }
517
518     $n(row, 'sc_edit_entry_owner').appendChild(text(findOrgUnit(entry.owner()).name()));
519
520     var name = $n(row, 'sc_edit_entry_name');
521     name.value = entry.value();
522     name.focus();
523     name.select();
524
525     $n(row,'sc_edit_entry_name_submit').onclick = 
526         function(){
527             if( scEditEntry(cat, entry, name.value, type ) )
528                 tbody.removeChild(row);
529             };
530
531     $n(row,'sc_edit_entry_cancel').onclick = function(){tbody.removeChild(row);};
532     $n(row,'sc_edit_entry_delete').onclick = 
533         function(){ scEntryDelete( cat, entry, type ); }
534
535     var rootEditOrg = findReleventRootOrg(PERMS[type].update_stat_cat_entry, entry.owner());
536     var rootDelOrg = findReleventRootOrg(PERMS[type].delete_stat_cat_entry, entry.owner());
537
538     if(!rootEditOrg || rootEditOrg.id() != entry.owner())
539         $n(row,'sc_edit_submit').disabled = true;
540
541     if(!rootDelOrg || rootDelOrg.id() != entry.owner())
542         $n(row,'sc_edit_delete').disabled = true;
543 }
544
545 function scEntryDelete( cat, entry, type ) {
546     if(!confirm($('sc_entry_delete_confirm').innerHTML)) return;
547     var req = new Request( SC_ENTRY_DELETE.replace(/TYPE/,type), session, entry.id() );
548     req.send(true);
549     var res = req.result();
550     if(checkILSEvent(res)) throw res;
551     alertId('sc_update_success');
552     scShow(type);
553 }
554
555 function scEditEntry( cat, entry, newvalue, type ) {
556     if(entry.value() == newvalue) return;
557     entry.value( newvalue );
558     var req = new Request( 
559         SC_ENTRY_UPDATE.replace(/TYPE/, type), session, entry );
560     req.send(true);
561     var res = req.result();
562     if(checkILSEvent(res)) throw res;
563     scShow(type);
564 }
565