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