]> git.evergreen-ils.org Git - working/Evergreen.git/blob - Open-ILS/xul/staff_client/server/admin/stat_cat_editor.js
Fix bug and typo in stat cat editor
[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 filter 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         libSel.disabled = true;
300         return;
301     }
302     else {
303         $('sc_new').disabled = false;
304         libSel.disabled = false;
305     }
306     buildMergedOrgSel(libSel, org_list, 0, 'shortname');
307 }
308
309
310 function scNew() {
311
312     var name = $('sc_new_name').value;
313     var type = getSelectorVal($('sc_type_selector'));
314
315     var visible = 0;
316     var required = 0;
317     var usr_summary = 0;
318     if( $('sc_make_opac_visible').checked) visible = 1;
319     if( $('sc_make_required').checked) required = 1;
320     if( $('sc_make_usr_summary').checked) usr_summary = 1;
321
322     var cat;
323     if( type == ACTOR ) {
324         cat = new actsc();
325         cat.usr_summary( usr_summary );
326     }
327     if( type == ASSET ) {
328         cat = new asc();
329         cat.required( required );
330     }
331
332     cat.opac_visible(visible);
333     cat.name(name);
334     cat.owner(getSelectorVal($('sc_owning_lib_selector')));
335     cat.isnew(1);
336
337     var req = new Request( SC_CREATE.replace(/TYPE/, type), session, cat );
338
339     req.send(true);
340     var res = req.result();
341     if(checkILSEvent(res)) throw res;
342     alertId('sc_update_success');
343
344     scShow(type);
345 }
346
347 function scEdit( tbody, type, cat ) {
348
349     cleanTbody(tbody, 'edit');
350     var row = $('sc_edit_row').cloneNode(true);
351     row.setAttribute('edit', '1');
352
353     var r = $('sc_tr_' + cat.id());
354     if(r.nextSibling) { tbody.insertBefore( row, r.nextSibling ); }
355     else{ tbody.appendChild(row); }
356
357     $n(row, 'sc_edit_name').value = cat.name();
358
359     if(type == ACTOR) {
360         var cb = $n(row, 'sc_edit_usr_summary');
361         cb.checked = isTrue(cat.usr_summary()); 
362         hideMe($n(row, 'sc_edit_required_td'));
363         unHideMe($n(row, 'sc_edit_usr_summary_td'));
364     } else {
365         var cb = $n(row, 'sc_edit_required');
366         cb.checked = isTrue(cat.required()); 
367         hideMe($n(row, 'sc_edit_usr_summary_td'));
368         unHideMe($n(row, 'sc_edit_required_td'));
369     }
370
371     var name = $n(row, 'sc_edit_cancel');
372     name.onclick = function() { tbody.removeChild(row); };
373
374     var show = $n(row, 'sc_edit_show_owning_lib');
375     
376     var myorg = findOrgUnit(user.home_ou());
377     var ownerorg = findOrgUnit(cat.owner());
378     show.appendChild(text(ownerorg.name()));
379
380     var selector = null;
381     if( myorg.children() && myorg.children().length > 0 ) {
382         selector = $n(row, 'sc_edit_owning_lib');
383         buildOrgSel( selector, myorg, findOrgDepth(myorg), 'shortname');
384         setSelector( selector, cat.owner() );
385         unHideMe(selector);
386
387     } else { unHideMe(show); }
388
389     name.focus();
390     name.select();
391
392     if( cat.opac_visible() != 0 && cat.opac_visible() != '0' ) {
393         $n( $n(row, 'sc_edit_opac_vis'), 
394             'sc_edit_opac_visibility').checked = true;
395     } else {
396         $n( $n(row, 'sc_edit_opac_invis'), 
397             'sc_edit_opac_visibility').checked = true;
398     }
399
400     $n(row, 'sc_edit_submit').onclick = 
401         function() { scEditGo( type, cat, row, selector ); };
402
403     $n(row, 'sc_edit_delete').onclick = 
404         function(){ scDelete(type, cat.id()); };
405
406     var rootEditOrg = findReleventRootOrg(PERMS[type].update_stat_cat, cat.owner());
407     var rootDelOrg = findReleventRootOrg(PERMS[type].delete_stat_cat, cat.owner());
408
409     if(!rootEditOrg || rootEditOrg.id() != cat.owner())
410         $n(row,'sc_edit_submit').disabled = true;
411
412     if(!rootDelOrg || rootDelOrg.id() != cat.owner())
413         $n(row,'sc_edit_delete').disabled = true;
414 }
415
416 function scEditGo( type, cat, row, selector ) {
417     var name = $n(row, 'sc_edit_name').value;
418     var visible = 
419         $n( $n(row, 'sc_edit_opac_vis'), 'sc_edit_opac_visibility').checked;
420
421     var newlib = cat.owner();
422     if(selector) newlib = getSelectorVal( selector );
423
424     if(!name) return false;
425
426     var usr_summary = $n(row, 'sc_edit_usr_summary').checked;
427     var required = $n(row, 'sc_edit_required').checked;
428
429     cat.name( name );
430     cat.owner( newlib );
431     cat.entries(null);
432     cat.opac_visible(0);
433     if( visible ) cat.opac_visible(1);
434     switch(type) {
435         case ACTOR:
436             cat.usr_summary( (usr_summary) ? 1 : 0 );
437         break;
438         case ASSET:
439             cat.required( (required) ? 1 : 0 );
440         break;
441     }
442
443     var req = new Request( SC_UPDATE.replace(/TYPE/,type), session, cat );
444     req.send(true);
445     var res = req.result();
446     if(checkILSEvent(res)) throw res;
447     alertId('sc_update_success');
448     scShow(type);
449
450     return true;
451 }
452
453 function scUpdateEntry( cat, entry, tbody, type ) {
454     cleanTbody(tbody, 'edit');
455     var row = $('sc_edit_entry_row').cloneNode(true);
456     row.setAttribute('edit', '1');
457
458     var r = $('sc_tr_' + cat.id());
459     if(r.nextSibling) tbody.insertBefore( row, r.nextSibling );
460     else{ tbody.appendChild(row); }
461
462     $n(row, 'sc_edit_entry_owner').appendChild(text(findOrgUnit(entry.owner()).name()));
463
464     var name = $n(row, 'sc_edit_entry_name');
465     name.value = entry.value();
466     name.focus();
467     name.select();
468
469     $n(row,'sc_edit_entry_name_submit').onclick = 
470         function(){
471             if( scEditEntry(cat, entry, name.value, type ) )
472                 tbody.removeChild(row);
473             };
474
475     $n(row,'sc_edit_entry_cancel').onclick = function(){tbody.removeChild(row);};
476     $n(row,'sc_edit_entry_delete').onclick = 
477         function(){ scEntryDelete( cat, entry, type ); }
478
479     var rootEditOrg = findReleventRootOrg(PERMS[type].update_stat_cat_entry, entry.owner());
480     var rootDelOrg = findReleventRootOrg(PERMS[type].delete_stat_cat_entry, entry.owner());
481
482     if(!rootEditOrg || rootEditOrg.id() != entry.owner())
483         $n(row,'sc_edit_submit').disabled = true;
484
485     if(!rootDelOrg || rootDelOrg.id() != entry.owner())
486         $n(row,'sc_edit_delete').disabled = true;
487 }
488
489 function scEntryDelete( cat, entry, type ) {
490     if(!confirm($('sc_entry_delete_confirm').innerHTML)) return;
491     var req = new Request( SC_ENTRY_DELETE.replace(/TYPE/,type), session, entry.id() );
492     req.send(true);
493     var res = req.result();
494     if(checkILSEvent(res)) throw res;
495     alertId('sc_update_success');
496     scShow(type);
497 }
498
499 function scEditEntry( cat, entry, newvalue, type ) {
500     if(entry.value() == newvalue) return;
501     entry.value( newvalue );
502     var req = new Request( 
503         SC_ENTRY_UPDATE.replace(/TYPE/, type), session, entry );
504     req.send(true);
505     var res = req.result();
506     if(checkILSEvent(res)) throw res;
507     scShow(type);
508 }
509