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