2 <!-- Application: Evergreen Staff Client -->
3 <!-- Screen: Cataloger's Search Result Screen -->
5 <!-- ///////////////////////////////////////////////////////////////////////////////////////////////////////////// -->
7 <?xml-stylesheet href="chrome://global/skin/" type="text/css"?>
8 <?xml-stylesheet href="chrome://open_ils_staff_client/skin/global.css" type="text/css"?>
10 <!-- ///////////////////////////////////////////////////////////////////////////////////////////////////////////// -->
12 <!DOCTYPE window SYSTEM "chrome://open_ils_staff_client/locale/lang.dtd">
14 <!-- ///////////////////////////////////////////////////////////////////////////////////////////////////////////// -->
16 <?xul-overlay href="chrome://open_ils_staff_client/content/OpenILS/util_overlay.xul"?>
17 <?xul-overlay href="chrome://open_ils_staff_client/content/legacy/browse_list_overlay.xul"?>
19 <window id="browse_list_win"
20 orient="vertical" style="overflow: scroll"
21 onload="try { my_pre_init(); } catch(E) { alert(E); }"
22 xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
24 <!-- ///////////////////////////////////////////////////////////////////////////////////////////////////////////// -->
26 <script type="text/javascript">var myPackageDir = 'open_ils_staff_client'; var IAMXUL = true; var g = {};</script>
27 <script type="text/javascript" src="chrome://open_ils_staff_client/content/main/JSAN.js"/>
28 <script type="text/javascript" src="chrome://open_ils_staff_client/content/main/constants.js"/>
29 <script type="text/javascript" src="chrome://open_ils_staff_client/content/OpenILS/util/fmall.js"/>
30 <scripts id="openils_util_scripts"/>
31 <script type="text/javascript">
34 var parentWindow = {};
39 var org_shortname2id = {};
41 var browse_meter_per = 0;
42 var orgs_with_copies = [];
43 var orgs_with_copies_hash = {};
45 function my_pre_init() {
47 netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
48 if (typeof JSAN == 'undefined') { throw( "The JSAN library object is missing."); }
49 JSAN.errorLevel = "die"; // none, warn, or die
50 JSAN.addRepository('..');
51 JSAN.use('util.error'); g.error = new util.error();
52 g.error.sdump('D_TRACE','my_pre_init() for legacy/_browse.xul');
55 mw.G.main_test_variable = 'Hello World';
57 g.session = g.cgi.param('session');
58 mw.G.auth_ses = [ g.session ];
59 mw.sdump = function(a,b) { g.error.sdump(a,b); }
61 find_this_id = g.cgi.param('docid');
63 JSAN.use('util.network');
64 g.network = new util.network();
66 JSAN.use('OpenILS.data');
67 g.data = new OpenILS.data(); g.data.init({'via':'stash'});
68 XML_HTTP_SERVER = g.data.server_unadorned;
70 mw.G.my_orgs = g.data.list.my_aou;
71 mw.G.my_orgs_hash = g.data.hash.my_aou;
72 mw.G.org_tree = g.data.tree.aou;
73 mw.G.user_ou = g.data.hash.aou[ g.data.list.au[0].home_ou() ];
74 mw.G.aout_list = g.data.list.aout;
75 mw.G.aout_hash = g.data.hash.aout;
76 mw.G.ccs_list = g.data.list.ccs;
77 mw.G.ccs_hash = g.data.hash.ccs;
79 var x = document.getElementById('cmd_copy_edit');
80 x.setAttribute('oncommand','try{spawn_copy_editor();}catch(E){alert(E);}');
82 x = document.getElementById('cmd_copy_add');
83 x.setAttribute('oncommand','try{spawn_copy_add_wizard();}catch(E){alert(E);}');
85 x = document.getElementById('cmd_volume_edit');
86 x.setAttribute('oncommand','try{spawn_volume_editor();}catch(E){alert(E);}');
88 x = document.getElementById('cmd_volume_add');
89 x.setAttribute('oncommand','try{spawn_volume_add_wizard();}catch(E){alert(E);}');
91 x = document.getElementById('browse_list_tree');
92 x.setAttribute('seltype','multiple');
97 var err_msg = "!! This software has encountered an error. Please tell your friendly " +
98 "system administrator or software developer the following:\nlegacy/_browse.xul\n" + E + '\n';
99 try { g.error.sdump('D_ERROR',err_msg); } catch(E) { dump(err_msg); }
104 function timer_init() {
108 function timer_elapsed() {
112 function handle_error(err) {
113 try { alert(js2JSON(err)); } catch(E) { alert(err); }
116 function user_request(a,b,c,d) {
117 return [ g.network.request(a,b,c,d) ];
120 function user_async_request(a,b,c,d) {
121 return [ g.network.request(a,b,c,d) ];
126 function counter_init(id) {
130 function counter_incr(id) {
131 if (! counter[id]) { counter_init(id); }
132 return ++counter[id];
135 function counter_peek(id) {
136 if (! counter[id]) { return 0; }
140 function disable_widgets() {
141 var d = document; var idx = 0;
142 if (arguments[0].nodeName == '#document') {
143 idx = 1; d = arguments[0];
145 for (var i = idx; i < arguments.length; i++) {
146 if (typeof(arguments[i]) == 'object') {
147 arguments[i].disabled = true;
149 var w = d.getElementById( arguments[i] );
157 function enable_widgets() {
158 var d = document; var idx = 0;
159 if (arguments[0].nodeName == '#document') {
160 idx = 1; d = arguments[0];
162 for (var i = idx; i < arguments.length; i++) {
163 if (typeof(arguments[i]) == 'object') {
164 arguments[i].disabled = false;
166 var w = d.getElementById( arguments[i] );
174 function find_ou(tree,id) {
175 if (typeof(id)=='object') { id = id.id(); }
179 for (var i in tree.children()) {
180 var child = tree.children()[i];
181 ou = find_ou( child, id );
182 if (ou) { return ou; }
187 function yesno(value) {
189 case true: case 'true': case '1': case 'on':
196 function empty_widget() {
198 if (arguments.length == 1) {
203 if (typeof(e) != 'object') { e = d.getElementById(e); }
205 if (typeof(e) != 'object') { dump('Failed on empty_widget\n'); return null; }
206 while (e.lastChild) { e.removeChild(e.lastChild); }
209 function get_list_from_tree_selection() {
210 var d = document; var tree_w;
211 if (arguments.length == 1) {
212 tree_w = arguments[0];
215 tree_w = arguments[1];
218 if (typeof(tree_w) != 'object') {
219 hitlist = d.getElementById(tree_w);
224 var start = new Object();
225 var end = new Object();
226 var numRanges = hitlist.view.selection.getRangeCount();
227 for (var t=0; t<numRanges; t++){
228 hitlist.view.selection.getRangeAt(t,start,end);
229 for (var v=start.value; v<=end.value; v++){
230 var i = hitlist.contentView.getItemAtIndex(v);
231 //sdump('D_WIDGETS',i.tagName + '\n');
238 function filter_list(list,f) {
240 for (var i in list) {
241 var t = f( list[i] );
242 if (t) new_list.push( list[i] );
247 function cycle_attribute() {
248 var d; var e; var a; var v;
249 if (arguments.length == 3) {
258 if (typeof(e) != 'object') { e = d.getElementById(e); }
261 if (typeof(e) != 'object') { throw('typeof e != object : typeof e = ' + typeof(e)); }
262 if (!a) { throw('!a : a = ' + a); }
263 if (! e.getAttribute(a) ) { throw(' ! e.getAttribute(a) : a = ' + a); }
264 if (typeof(v) != 'object') { throw('typeof v != object : typeof v = ' + typeof(v)); }
266 var toggle = e.getAttribute(a);
267 var next_one = false;
268 for (var i = 0; i < v.length; i++) {
270 e.setAttribute(a,v[i]);
273 if (toggle == v[i]) {
278 e.setAttribute(a,v[0]);
281 throw('current value not in list');
289 function mapChrome(chrome) {
291 case 'chrome://open_ils_staff_client/content/cat/volume_copy_add_wizard.xul':
292 return 'chrome://open_ils_staff_client/content/legacy/_volume_copy_add_wizard.xul'; break;
293 case 'chrome://open_ils_staff_client/content/cat/copy_add_wizard.xul':
294 return 'chrome://open_ils_staff_client/content/legacy/_copy_add_wizard.xul'; break;
295 case 'chrome://open_ils_staff_client/content/cat/volume_edit_wizard.xul':
296 return 'chrome://open_ils_staff_client/content/legacy/_volume_edit_wizard.xul'; break;
301 parentWindow.new_tab = function() { };
303 parentWindow.replace_tab = function(a,b,c) {
304 if (window.xulG && typeof window.xulG.new_tab == 'function') {
306 var f = window.xulG.new_tab( mapChrome(c), { 'tab_name' : b }, {} );
307 return f.contentWindow;
314 mw.new_window = function(a,b,c) {
315 netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
316 JSAN.use('util.window'); var win = new util.window();
317 return win.open( mapChrome(a), b, c );
320 function spawn_copy_editor() {
322 JSAN.use('util.widgets'); JSAN.use('util.functional');
324 var list = util.widgets.get_list_from_tree_selection('browse_list_tree');
325 list = util.functional.filter_list(
328 return o.getAttribute('object_type') == 'copy';
334 edit = g.network.request(
335 api.PERM_MULTI_ORG_CHECK.app,
336 api.PERM_MULTI_ORG_CHECK.method,
339 g.data.list.au[0].id(),
340 util.functional.map_list(
343 return o.getAttribute('ou_id');
346 [ 'UPDATE_COPY', 'UPDATE_BATCH_COPY' ]
348 ).length == 0 ? 1 : 0;
350 g.error.sdump('D_ERROR','batch permission check: ' + E);
353 list = util.functional.map_list(
356 return o.getAttribute('copy_id');
360 var title = list.length == 1 ? 'Copy' : 'Copies';
362 JSAN.use('util.window'); var win = new util.window();
364 g.data.stash('temp');
366 window.xulG.url_prefix(urls.XUL_COPY_EDITOR)
367 +'?session='+window.escape(g.session)
368 +'©_ids='+window.escape(js2JSON(list))
369 +'&docid='+window.escape(find_this_id)
373 'chrome,modal,resizable'
375 /* FIXME -- need to unique the temp space, and not rely on modalness of window */
376 g.data.stash_retrieve();
377 var copies = JSON2js( g.data.temp );
378 g.error.sdump('D_CAT','in browse, copies =\n<<' + copies + '>>');
379 if (edit=='1' && copies!='' && typeof copies != 'undefined') {
380 refresh_browse_list();
384 function spawn_volume_editor() {
385 JSAN.use('util.widgets'); JSAN.use('util.functional');
386 var list = util.widgets.get_list_from_tree_selection('browse_list_tree');
387 list = util.functional.filter_list(
390 return o.getAttribute('object_type') == 'volume';
396 edit = g.network.request(
397 api.PERM_MULTI_ORG_CHECK.app,
398 api.PERM_MULTI_ORG_CHECK.method,
401 g.data.list.au[0].id(),
402 util.functional.map_list(
405 return o.getAttribute('ou_id');
410 ).length == 0 ? 1 : 0;
412 g.error.sdump('batch permission check: ' + E);
415 if (edit==0) return; // no read-only view for this interface
417 list = util.functional.map_list(
420 return [ o.getAttribute('ou_id'), o.getAttribute('volume_id'), o.getAttribute('callnumber') ];
424 var title = list.length == 1 ? 'Volume' : 'Volumes';
426 JSAN.use('util.window'); var win = new util.window();
428 g.data.stash('temp');
430 window.xulG.url_prefix(urls.XUL_VOLUME_EDITOR)
431 +'?session='+window.escape(g.session)
432 +'&ou_id_volume_id_callnumber_tuples=' + window.escape( js2JSON(list) ),
434 'chrome,modal,resizable'
437 /* FIXME -- need to unique the temp space, and not rely on modalness of window */
438 g.data.stash_retrieve();
439 var volumes = JSON2js( g.data.temp );
440 g.error.sdump('D_CAT','in browse, g.data.temp =\n' + g.data.temp);
441 if (volumes=='') return;
443 volumes = util.functional.filter_list(
446 return o.ischanged() == '1';
450 volumes = util.functional.map_list(
453 o.record( find_this_id ); // staff client 2 didn't do this. Does it matter?
458 if (volumes.length == 0) return;
461 var r = g.network.request(
462 api.FM_ACN_TREE_UPDATE.app,
463 api.FM_ACN_TREE_UPDATE.method,
464 [ g.session, volumes ]
466 /* FIXME -- revisit the return value here */
468 alert('volume update error: ' + js2JSON(E));
470 refresh_browse_list();
474 function spawn_volume_add_wizard() {
475 JSAN.use('util.widgets'); JSAN.use('util.functional');
476 var list = util.widgets.get_list_from_tree_selection('browse_list_tree');
477 list = util.functional.filter_list(
480 return o.getAttribute('object_type') == 'org_unit';
483 list = util.functional.map_list(
486 return o.getAttribute('ou_id');
491 edit = g.network.request(
492 api.PERM_MULTI_ORG_CHECK.app,
493 api.PERM_MULTI_ORG_CHECK.method,
496 g.data.list.au[0].id(),
498 [ 'CREATE_VOLUME', 'CREATE_COPY' ]
500 ).length == 0 ? 1 : 0;
502 g.error.sdump('batch permission check: ' + E);
505 if (edit==0) return; // no read-only view for this interface
507 var title = 'Add Volume/Copy';
509 JSAN.use('util.window'); var win = new util.window();
511 window.xulG.url_prefix(urls.XUL_VOLUME_COPY_CREATOR)
512 +'?session='+window.escape(g.session)
513 +'&doc_id=' + window.escape(find_this_id)
514 +'&ou_ids=' + window.escape( js2JSON(list) ),
516 'chrome,modal,resizable'
519 refresh_browse_list();
522 function spawn_copy_add_wizard() {
523 JSAN.use('util.widgets'); JSAN.use('util.functional');
524 var list = util.widgets.get_list_from_tree_selection('browse_list_tree');
525 list = util.functional.filter_list(
528 return o.getAttribute('object_type') == 'volume';
531 var copy_shortcut = {};
532 list = util.functional.map_list(
535 var ou_id = o.getAttribute('ou_id');
536 var volume_id = o.getAttribute('volume_id');
537 var label = o.getAttribute('callnumber');
538 if (!copy_shortcut[ou_id]) copy_shortcut[ou_id] = {};
539 copy_shortcut[ou_id][ label ] = volume_id;
545 list = []; for (var i in copy_shortcut) { list.push( i ); }
549 edit = g.network.request(
550 api.PERM_MULTI_ORG_CHECK.app,
551 api.PERM_MULTI_ORG_CHECK.method,
554 g.data.list.au[0].id(),
558 ).length == 0 ? 1 : 0;
560 g.error.sdump('batch permission check: ' + E);
563 if (edit==0) return; // no read-only view for this interface
565 var title = 'Add Copy';
567 JSAN.use('util.window'); var win = new util.window();
569 window.xulG.url_prefix(urls.XUL_VOLUME_COPY_CREATOR)
570 +'?session='+window.escape(g.session)
571 +'&doc_id=' + window.escape(find_this_id)
572 +'&ou_ids=' + window.escape( js2JSON(list) )
573 +'©_shortcut=' + window.escape( js2JSON(copy_shortcut) ),
575 'chrome,modal,resizable'
577 refresh_browse_list();
580 function mark_volume() {
581 JSAN.use('util.widgets'); JSAN.use('util.functional');
582 var list = util.widgets.get_list_from_tree_selection('browse_list_tree');
583 list = util.functional.filter_list(
586 return o.getAttribute('object_type') == 'volume';
589 list = util.functional.map_list(
592 return o.getAttribute('volume_id');
596 g.data.marked_volume = list[0];
597 g.data.stash('marked_volume');
598 alert('Volume marked as Copy Transfer Destination');
601 function add_to_bucket() {
603 JSAN.use('util.widgets'); JSAN.use('util.functional');
605 var list = util.widgets.get_list_from_tree_selection('browse_list_tree');
606 list = util.functional.filter_list(
609 return o.getAttribute('object_type') == 'copy';
613 list = util.functional.map_list(
616 return o.getAttribute('copy_id');
620 JSAN.use('util.window'); var win = new util.window();
622 xulG.url_prefix(urls.XUL_COPY_BUCKETS)
623 + '?session=' + window.escape(g.session)
624 + '©_ids=' + js2JSON( list ),
625 'sel_bucket_win' + win.window_name_increment(),
626 'chrome,resizable,modal,center'
633 <!-- The logic for this app -->
634 <Evergreen id="browse_list_js" />
636 <!-- XUL'ified abstraction for logic to attach to widgets -->
637 <commandset id="browse_list_cmds" />
639 <!-- Accelerator Keys (Accessor Keys are in DTD's) -->
640 <keyset id="browse_list_keys" />
642 <!-- Context menus -->
643 <popupset id="browse_list_popupset" />
645 <!-- Layout to be filled in by overlays and javascript -->
647 <caption label="Copy Browser"/>
648 <vbox id="browse_list_vbox" class="test_class"/>