]> git.evergreen-ils.org Git - Evergreen.git/blob - Open-ILS/xul/staff_client/server/admin/stat_cat_editor.js
stat cat editor is now work-ou aware. default focus org is workstation. staff is...
[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         scCounter = 0;
144         for( var c in cats ) scInsertCat( tbody, cats[c], type );
145 }
146
147
148 var scEntryCounter;
149 function scInsertCat( tbody, cat, type ) {
150
151         var row = scRow.cloneNode(true);
152         row.id = 'sc_tr_' + cat.id();
153         var name_td = $n(row, 'sc_name');
154         name_td.appendChild( text(cat.name()) );
155         if(scCounter++ % 2) addCSSClass(row, 'has_color');
156
157         $n(row, 'sc_new_entry').onclick = function() { scNewEntry(type, cat, tbody); }
158         $n(row, 'sc_edit').onclick = function(){ scEdit(tbody, type, cat); };
159         $n(row, 'sc_owning_lib').appendChild( text( findOrgUnit(cat.owner()).name() ));
160
161         if( cat.opac_visible() ) unHideMe($n(row, 'sc_opac_visible'));
162         else unHideMe($n(row, 'sc_opac_invisible'));
163
164         tbody.appendChild(row);
165         scEntryCounter = 0;
166
167         cat.entries().sort(  /* sort the entries by value */
168                 function( a, b ) { 
169          a = new String(a.value()).toLowerCase();
170          b = new String(b.value()).toLowerCase();
171                         if( a > b ) return 1;
172                         if( a < b ) return -1;
173                         return 0;
174                 }
175         );
176
177         for( var e in cat.entries() ) 
178                 scInsertEntry( cat, cat.entries()[e], $n(row, 'sc_entries_selector'), tbody, type );
179 }
180
181
182 function scInsertEntry( cat, entry, selector, tbody, type ) {
183         setSelectorVal( selector, scEntryCounter++, entry.value(), entry.id(), 
184                         function(){ scUpdateEntry( cat, entry, tbody, type );} );
185 }
186
187
188
189 function scDelete(type, id) {
190         if(!confirm($('sc_delete_confirm').innerHTML)) return;
191         var req = new Request( SC_DELETE.replace(/TYPE/,type), session, id );
192         req.send(true);
193         var res = req.result();
194         if(checkILSEvent(res)) throw res;
195         alertId('sc_update_success');
196         scShow(type);
197 }
198
199 function scCreateEntry( type, id, row ) {
200         var value = $n(row, 'sc_new_entry_name').value;
201         if(!value) return;
202         var entry;
203         if( type == ACTOR ) entry = new actsce();
204         if( type == ASSET ) entry = new asce();
205
206         entry.isnew(1);
207         entry.stat_cat(id);
208         entry.owner(getSelectorVal($n(row, 'sc_new_entry_lib')));
209         entry.value(value);
210
211         var req = new Request( SC_ENTRY_CREATE.replace(/TYPE/, type), session, entry );
212         req.send(true);
213         var res = req.result();
214         if(checkILSEvent(res)) throw res;
215         alertId('sc_update_success');
216         scShow(type);
217 }
218
219 function scNewEntry( type, cat, tbody ) {
220         cleanTbody(tbody, 'edit');
221         var row = $('sc_new_entry_row').cloneNode(true);
222         row.setAttribute('edit', '1');
223
224         var r = $('sc_tr_' + cat.id());
225         if(r.nextSibling) tbody.insertBefore( row, r.nextSibling );
226         else{ tbody.appendChild(row); }
227
228         $n(row, 'sc_new_entry_create').onclick = 
229                 function() {
230                         if( scCreateEntry( type, cat.id(), row ) )
231                                 tbody.removeChild(row); };
232         $n(row, 'sc_new_entry_cancel').onclick = function(){tbody.removeChild(row);}
233
234     var org_list = PERMS[type].create_stat_cat_entry;
235     if(org_list.length == 0) {
236                 $n(row, 'sc_new_entry_create').disabled = true;
237                 $n(row, 'sc_new_entry_lib').disabled = true;
238                 return;
239     }
240
241     var rootOrg = findReleventRootOrg(org_list, cat.owner());
242     if(!rootOrg) {
243                 $n(row, 'sc_new_entry_create').disabled = true;
244                 $n(row, 'sc_new_entry_lib').disabled = true;
245                 return;
246     }
247     buildOrgSel($n(row, 'sc_new_entry_lib'), rootOrg, 0, 'shortname');
248         $n(row, 'sc_new_entry_name').focus();
249 }
250
251
252 function scBuildNew() {
253     var libSel = $('sc_owning_lib_selector');
254     var typeSel = $('sc_type_selector');
255         var type = getSelectorVal(typeSel);
256     var org_list = PERMS[type].create_stat_cat;
257     if(org_list.length == 0) { /* no create perms */
258         $('sc_new').disabled = true;
259         typeSel.disabled = true;
260         libSel.disabled = true;
261         return;
262     }
263         buildMergedOrgSel(libSel, org_list, 0, 'shortname');
264 }
265
266
267 function scNew() {
268
269         var name = $('sc_new_name').value;
270         var type = getSelectorVal($('sc_type_selector'));
271
272         var visible = 0;
273         if( $('sc_make_opac_visible').checked) visible = 1;
274
275         var cat;
276         if( type == ACTOR ) cat = new actsc();
277         if( type == ASSET ) cat = new asc();
278
279         cat.opac_visible(visible);
280         cat.name(name);
281         cat.owner(getSelectorVal($('sc_owning_lib_selector')));
282         cat.isnew(1);
283
284         var req = new Request( SC_CREATE.replace(/TYPE/, type), session, cat );
285
286         req.send(true);
287         var res = req.result();
288         if(checkILSEvent(res)) throw res;
289         alertId('sc_update_success');
290
291         scShow(type);
292 }
293
294 function scEdit( tbody, type, cat ) {
295
296         cleanTbody(tbody, 'edit');
297         var row = $('sc_edit_row').cloneNode(true);
298         row.setAttribute('edit', '1');
299
300         var r = $('sc_tr_' + cat.id());
301         if(r.nextSibling) { tbody.insertBefore( row, r.nextSibling ); }
302         else{ tbody.appendChild(row); }
303
304         $n(row, 'sc_edit_name').value = cat.name();
305
306         var name = $n(row, 'sc_edit_cancel');
307         name.onclick = function() { tbody.removeChild(row); };
308
309         var show = $n(row, 'sc_edit_show_owning_lib');
310         
311         var myorg = findOrgUnit(user.home_ou());
312         var ownerorg = findOrgUnit(cat.owner());
313         show.appendChild(text(ownerorg.name()));
314
315         var selector = null;
316         if( myorg.children() && myorg.children().length > 0 ) {
317                 selector = $n(row, 'sc_edit_owning_lib');
318                 buildOrgSel( selector, myorg, findOrgDepth(myorg), 'shortname');
319                 setSelector( selector, cat.owner() );
320                 unHideMe(selector);
321
322         } else { unHideMe(show); }
323
324         name.focus();
325         name.select();
326
327         if( cat.opac_visible() ) {
328                 $n( $n(row, 'sc_edit_opac_vis'), 
329                         'sc_edit_opac_visibility').checked = true;
330         } else {
331                 $n( $n(row, 'sc_edit_opac_invis'), 
332                         'sc_edit_opac_visibility').checked = true;
333     }
334
335         $n(row, 'sc_edit_submit').onclick = 
336                 function() { scEditGo( type, cat, row, selector ); };
337
338         $n(row, 'sc_edit_delete').onclick = 
339                 function(){ scDelete(type, cat.id()); };
340
341     var rootEditOrg = findReleventRootOrg(PERMS[type].update_stat_cat, cat.owner());
342     var rootDelOrg = findReleventRootOrg(PERMS[type].delete_stat_cat, cat.owner());
343
344     if(!rootEditOrg || rootEditOrg.id() != cat.owner())
345                 $n(row,'sc_edit_submit').disabled = true;
346
347     if(!rootDelOrg || rootDelOrg.id() != cat.owner())
348                 $n(row,'sc_edit_delete').disabled = true;
349 }
350
351 function scEditGo( type, cat, row, selector ) {
352         var name = $n(row, 'sc_edit_name').value;
353         var visible = 
354                 $n( $n(row, 'sc_edit_opac_vis'), 'sc_edit_opac_visibility').checked;
355
356         var newlib = cat.owner();
357         if(selector) newlib = getSelectorVal( selector );
358
359         if(!name) return false;
360
361         var isvisible = false;
362         if( cat.opac_visible() ) isvisible = true;
363
364         if( (name == cat.name()) && (visible == isvisible) 
365                 && (newlib == cat.owner()) ) { return true; }
366
367         cat.name( name );
368         cat.owner( newlib );
369         cat.entries(null);
370         cat.opac_visible(0);
371         if( visible ) cat.opac_visible(1);
372
373         var req = new Request( SC_UPDATE.replace(/TYPE/,type), session, cat );
374         req.send(true);
375         var res = req.result();
376         if(checkILSEvent(res)) throw res;
377         alertId('sc_update_success');
378         scShow(type);
379
380         return true;
381 }
382
383 function scUpdateEntry( cat, entry, tbody, type ) {
384         cleanTbody(tbody, 'edit');
385         var row = $('sc_edit_entry_row').cloneNode(true);
386         row.setAttribute('edit', '1');
387
388         var r = $('sc_tr_' + cat.id());
389         if(r.nextSibling) tbody.insertBefore( row, r.nextSibling );
390         else{ tbody.appendChild(row); }
391
392         $n(row, 'sc_edit_entry_owner').appendChild(text(findOrgUnit(entry.owner()).name()));
393
394         var name = $n(row, 'sc_edit_entry_name');
395         name.value = entry.value();
396         name.focus();
397         name.select();
398
399         $n(row,'sc_edit_entry_name_submit').onclick = 
400                 function(){
401                         if( scEditEntry(cat, entry, name.value, type ) )
402                                 tbody.removeChild(row);
403                         };
404
405         $n(row,'sc_edit_entry_cancel').onclick = function(){tbody.removeChild(row);};
406         $n(row,'sc_edit_entry_delete').onclick = 
407                 function(){ scEntryDelete( cat, entry, type ); }
408
409     var rootEditOrg = findReleventRootOrg(PERMS[type].update_stat_cat_entry, entry.owner());
410     var rootDelOrg = findReleventRootOrg(PERMS[type].delete_stat_cat_entry, entry.owner());
411
412     if(!rootEditOrg || rootEditOrg.id() != entry.owner())
413                 $n(row,'sc_edit_submit').disabled = true;
414
415     if(!rootDelOrg || rootDelOrg.id() != entry.owner())
416                 $n(row,'sc_edit_delete').disabled = true;
417 }
418
419 function scEntryDelete( cat, entry, type ) {
420         if(!confirm($('sc_entry_delete_confirm').innerHTML)) return;
421         var req = new Request( SC_ENTRY_DELETE.replace(/TYPE/,type), session, entry.id() );
422         req.send(true);
423         var res = req.result();
424         if(checkILSEvent(res)) throw res;
425         alertId('sc_update_success');
426         scShow(type);
427 }
428
429 function scEditEntry( cat, entry, newvalue, type ) {
430         if(entry.value() == newvalue) return;
431         entry.value( newvalue );
432         var req = new Request( 
433                 SC_ENTRY_UPDATE.replace(/TYPE/, type), session, entry );
434         req.send(true);
435         var res = req.result();
436         if(checkILSEvent(res)) throw res;
437         scShow(type);
438 }
439