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';
21 PCRUD_CLASS[ACTOR] = 'actscsf';
22 PCRUD_CLASS[ASSET] = 'ascsf';
27 var opacVisible = false;
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',
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'
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;
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;
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;
70 fselector.onchange = function() {
71 focusOrg = getSelectorVal(fselector);
72 scShow(currentlyVisible);
75 focusOrg = USER.ws_ou();
76 if(!orgIsMineFromSet(org_list, focusOrg))
77 focusOrg = org_list[0];
78 setSelector(fselector, focusOrg);
81 function scEditorInit() {
83 session = cgi.param('ses');
84 if(!session) throw "User session is not defined";
85 user = fetchUser(session);
86 $('sc_type_selector').onchange = scBuildNew;
89 fetchHighestWorkPermOrgs(
90 session, user.id(), myPerms, function(){scGo();});
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 } } );
100 scSFCache[type] = req.result();
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);
111 var show = cgi.param('show');
112 if(!show) currentlyVisible = ASSET;
114 scShow(currentlyVisible);
116 $('sc_user').appendChild(text(user.usrname()));
119 function scFetchAll( session, type, orgid, callback, args ) {
120 var req = new Request(
121 SC_FETCH_ALL.replace(/TYPE/, type) , session, orgid );
126 function scShow(type) {
127 setTimeout(function(){_scShow(type)}, 500);
130 function _scShow(type) {
132 currentlyVisible = type;
134 if( type == ASSET ) {
135 addCSSClass($('sc_show_copy'), 'has_color');
136 removeCSSClass($('sc_show_actor'), 'has_color');
138 } else if( type == ACTOR ) {
139 addCSSClass($('sc_show_actor'), 'has_color');
140 removeCSSClass($('sc_show_copy'), 'has_color');
143 scCache[type] = scFetchAll(session, type, focusOrg); /* XXX */
144 scDraw( type, scCache[type] );
147 var scRow; var scCounter;
148 function scDraw( type, cats ) {
150 hideMe($('loading'));
152 var tbody = $('sc_tbody');
153 if(!scRow) scRow = tbody.removeChild($('sc_tr'));
154 removeChildren(tbody);
156 if(!cats || cats.length == 0) {
157 hideMe($('sc_table'));
158 unHideMe($('sc_none'));
162 hideMe($('sc_none'));
163 unHideMe($('sc_table'));
166 unHideMe($('sc_usr_summary_label'));
167 hideMe($('sc_required_label'));
169 unHideMe($('sc_required_label'));
170 hideMe($('sc_usr_summary_label'));
174 for( var c in cats ) scInsertCat( tbody, cats[c], type );
179 function scInsertCat( tbody, cat, type ) {
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');
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() ));
191 if(isTrue(cat.opac_visible()))
192 unHideMe($n(row, 'sc_opac_visible'));
194 unHideMe($n(row, 'sc_opac_invisible'));
196 if(cat.sip_field().length != 2)
197 unHideMe($n(row, 'sc_sip_field_none'));
199 $n(row, 'sc_sip_field_value').appendChild( text( cat.sip_field() ) );
200 unHideMe($n(row, 'sc_sip_field_value'));
203 $n(row, 'sc_sip_format_td').appendChild( text( cat.sip_format() ) );
205 if(isTrue(cat.checkout_archive()))
206 unHideMe($n(row, 'sc_checkout_archive_on'));
208 unHideMe($n(row, 'sc_checkout_archive'));
211 if(isTrue(cat.usr_summary()))
212 unHideMe($n(row, 'sc_usr_summary_on'));
214 unHideMe($n(row, 'sc_usr_summary'));
216 hideMe($n(row, 'sc_required_td'));
218 if(isTrue(cat.required()))
219 unHideMe($n(row, 'sc_required_on'));
221 unHideMe($n(row, 'sc_required'));
223 hideMe($n(row, 'sc_usr_summary_td'));
226 tbody.appendChild(row);
229 cat.entries().sort( /* sort the entries by value */
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;
239 for( var e in cat.entries() )
240 scInsertEntry( cat, cat.entries()[e], $n(row, 'sc_entries_selector'), tbody, type );
244 function scInsertEntry( cat, entry, selector, tbody, type ) {
245 setSelectorVal( selector, scEntryCounter++, entry.value(), entry.id(),
246 function(){ scUpdateEntry( cat, entry, tbody, type );} );
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 );
255 var res = req.result();
256 if(checkILSEvent(res)) throw res;
257 alertId('sc_update_success');
261 function scCreateEntry( type, id, row ) {
262 var value = $n(row, 'sc_new_entry_name').value;
265 if( type == ACTOR ) entry = new actsce();
266 if( type == ASSET ) entry = new asce();
270 entry.owner(getSelectorVal($n(row, 'sc_new_entry_lib')));
273 var req = new Request( SC_ENTRY_CREATE.replace(/TYPE/, type), session, entry );
275 var res = req.result();
276 if(checkILSEvent(res)) throw res;
277 alertId('sc_update_success');
281 function scNewEntry( type, cat, tbody ) {
282 cleanTbody(tbody, 'edit');
283 var row = $('sc_new_entry_row').cloneNode(true);
284 row.setAttribute('edit', '1');
286 var r = $('sc_tr_' + cat.id());
287 if(r.nextSibling) tbody.insertBefore( row, r.nextSibling );
288 else{ tbody.appendChild(row); }
290 $n(row, 'sc_new_entry_create').onclick =
292 if( scCreateEntry( type, cat.id(), row ) )
293 tbody.removeChild(row); };
294 $n(row, 'sc_new_entry_cancel').onclick = function(){tbody.removeChild(row);}
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;
303 var rootOrg = findReleventRootOrg(org_list, cat.owner());
305 $n(row, 'sc_new_entry_create').disabled = true;
306 $n(row, 'sc_new_entry_lib').disabled = true;
309 buildOrgSel($n(row, 'sc_new_entry_lib'), rootOrg, 0, 'shortname');
310 $n(row, 'sc_new_entry_name').focus();
314 function scBuildNew() {
315 var libSel = $('sc_owning_lib_selector');
316 var typeSel = $('sc_type_selector');
317 var type = getSelectorVal(typeSel);
320 hideMe($('required_td1'));
321 hideMe($('required_td2'));
322 unHideMe($('usr_summary_td1'));
323 unHideMe($('usr_summary_td2'));
324 unHideMe($('sip_tr'));
327 hideMe($('usr_summary_td1'));
328 hideMe($('usr_summary_td2'));
330 unHideMe($('required_td1'));
331 unHideMe($('required_td2'));
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;
341 $('sc_new').disabled = false;
342 libSel.disabled = false;
344 buildMergedOrgSel(libSel, org_list, 0, 'shortname');
345 scPopSipFields($('sc_sip_field'),type);
351 var name = $('sc_new_name').value;
352 var type = getSelectorVal($('sc_type_selector'));
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;
364 if( type == ACTOR ) {
366 cat.usr_summary( usr_summary );
368 if( type == ASSET ) {
370 cat.required( required );
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);
377 cat.opac_visible(visible);
379 cat.checkout_archive(checkout_archive);
380 cat.owner(getSelectorVal($('sc_owning_lib_selector')));
383 var req = new Request( SC_CREATE.replace(/TYPE/, type), session, cat );
386 var res = req.result();
387 if(checkILSEvent(res)) throw res;
388 alertId('sc_update_success');
393 function scEdit( tbody, type, cat ) {
395 cleanTbody(tbody, 'edit');
396 var row = $('sc_edit_row').cloneNode(true);
397 row.setAttribute('edit', '1');
399 var r = $('sc_tr_' + cat.id());
400 if(r.nextSibling) { tbody.insertBefore( row, r.nextSibling ); }
401 else{ tbody.appendChild(row); }
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();
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'));
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'));
420 var name = $n(row, 'sc_edit_cancel');
421 name.onclick = function() { tbody.removeChild(row); };
423 var show = $n(row, 'sc_edit_show_owning_lib');
425 var myorg = findOrgUnit(user.home_ou());
426 var ownerorg = findOrgUnit(cat.owner());
427 show.appendChild(text(ownerorg.name()));
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() );
436 } else { unHideMe(show); }
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;
445 $n( $n(row, 'sc_edit_opac_invis'),
446 'sc_edit_opac_visibility').checked = true;
449 $n( row, 'sc_edit_checkout_archive' ).checked = isTrue(cat.checkout_archive());
451 $n(row, 'sc_edit_submit').onclick =
452 function() { scEditGo( type, cat, row, selector ); };
454 $n(row, 'sc_edit_delete').onclick =
455 function(){ scDelete(type, cat.id()); };
457 var rootEditOrg = findReleventRootOrg(PERMS[type].update_stat_cat, cat.owner());
458 var rootDelOrg = findReleventRootOrg(PERMS[type].delete_stat_cat, cat.owner());
460 if(!rootEditOrg || rootEditOrg.id() != cat.owner())
461 $n(row,'sc_edit_submit').disabled = true;
463 if(!rootDelOrg || rootDelOrg.id() != cat.owner())
464 $n(row,'sc_edit_delete').disabled = true;
467 function scEditGo( type, cat, row, selector ) {
468 var name = $n(row, 'sc_edit_name').value;
470 $n( $n(row, 'sc_edit_opac_vis'), 'sc_edit_opac_visibility').checked;
472 var newlib = cat.owner();
473 if(selector) newlib = getSelectorVal( selector );
475 if(!name) return false;
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') );
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);
492 cat.usr_summary( (usr_summary) ? 1 : 0 );
495 cat.required( (required) ? 1 : 0 );
499 var req = new Request( SC_UPDATE.replace(/TYPE/,type), session, cat );
501 var res = req.result();
502 if(checkILSEvent(res)) throw res;
503 alertId('sc_update_success');
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');
514 var r = $('sc_tr_' + cat.id());
515 if(r.nextSibling) tbody.insertBefore( row, r.nextSibling );
516 else{ tbody.appendChild(row); }
518 $n(row, 'sc_edit_entry_owner').appendChild(text(findOrgUnit(entry.owner()).name()));
520 var name = $n(row, 'sc_edit_entry_name');
521 name.value = entry.value();
525 $n(row,'sc_edit_entry_name_submit').onclick =
527 if( scEditEntry(cat, entry, name.value, type ) )
528 tbody.removeChild(row);
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 ); }
535 var rootEditOrg = findReleventRootOrg(PERMS[type].update_stat_cat_entry, entry.owner());
536 var rootDelOrg = findReleventRootOrg(PERMS[type].delete_stat_cat_entry, entry.owner());
538 if(!rootEditOrg || rootEditOrg.id() != entry.owner())
539 $n(row,'sc_edit_submit').disabled = true;
541 if(!rootDelOrg || rootDelOrg.id() != entry.owner())
542 $n(row,'sc_edit_delete').disabled = true;
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() );
549 var res = req.result();
550 if(checkILSEvent(res)) throw res;
551 alertId('sc_update_success');
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 );
561 var res = req.result();
562 if(checkILSEvent(res)) throw res;