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