1 dump('entering cat.record_buckets.js\n');
3 if (typeof cat == 'undefined') cat = {};
4 cat.record_buckets = function (params) {
6 JSAN.use('util.error'); this.error = new util.error();
7 JSAN.use('util.network'); this.network = new util.network();
9 JSAN.use('OpenILS.data'); this.data = new OpenILS.data(); this.data.init({'via':'stash'});
10 this.first_pause = true;
13 cat.record_buckets.prototype = {
14 'selection_list1' : [],
15 'selection_list2' : [],
16 'bucket_id_name_map' : {},
18 'render_pending_records' : function() {
19 if (this.first_pause) {
20 this.first_pause = false;
22 alert("Action completed.");
26 for (var i = 0; i < obj.record_ids.length; i++) {
27 var item = obj.flesh_item_for_list( obj.record_ids[i] );
28 if (item) obj.list1.append( item );
32 'init' : function( params ) {
36 obj.record_ids = params['record_ids'] || [];
38 JSAN.use('circ.util');
39 var columns = circ.util.columns(
41 'title' : { 'hidden' : false },
42 'author' : { 'hidden' : false },
43 'edition' : { 'hidden' : false },
44 'publisher' : { 'hidden' : false },
45 'pubdate' : { 'hidden' : false },
46 'isbn' : { 'hidden' : false },
47 'tcn' : { 'hidden' : false },
51 JSAN.use('util.list');
53 obj.list1 = new util.list('pending_records_list');
57 'map_row_to_columns' : circ.util.std_map_row_to_columns(),
58 'on_select' : function(ev) {
60 JSAN.use('util.functional');
61 var sel = obj.list1.retrieve_selection();
62 document.getElementById('clip_button1').disabled = sel.length < 1;
63 obj.selection_list1 = util.functional.map_list(
65 function(o) { return JSON2js(o.getAttribute('retrieve_id')); }
67 obj.error.sdump('D_TRACE','circ/record_buckets: selection list 1 = ' + js2JSON(obj.selection_list1) );
68 if (obj.selection_list1.length == 0) {
69 obj.controller.view.record_buckets_sel_add.disabled = true;
71 obj.controller.view.record_buckets_sel_add.disabled = false;
81 obj.render_pending_records();
83 obj.list2 = new util.list('records_in_bucket_list');
87 'map_row_to_columns' : circ.util.std_map_row_to_columns(),
88 'on_select' : function(ev) {
90 JSAN.use('util.functional');
91 var sel = obj.list2.retrieve_selection();
92 document.getElementById('clip_button2').disabled = sel.length < 1;
93 obj.selection_list2 = util.functional.map_list(
95 function(o) { return JSON2js(o.getAttribute('retrieve_id')); }
97 obj.error.sdump('D_TRACE','circ/record_buckets: selection list 2 = ' + js2JSON(obj.selection_list2) );
98 if (obj.selection_list2.length == 0) {
99 obj.controller.view.record_buckets_delete_item.disabled = true;
100 obj.controller.view.record_buckets_delete_item.setAttribute('disabled','true');
101 obj.controller.view.record_buckets_export.disabled = true;
102 obj.controller.view.record_buckets_export.setAttribute('disabled','true');
104 obj.controller.view.record_buckets_delete_item.disabled = false;
105 obj.controller.view.record_buckets_delete_item.setAttribute('disabled','false');
106 obj.controller.view.record_buckets_export.disabled = false;
107 obj.controller.view.record_buckets_export.setAttribute('disabled','false');
110 alert('FIXME: ' + E);
116 JSAN.use('util.controller'); obj.controller = new util.controller();
122 function() { obj.list2.save_columns(); }
126 function() { obj.list1.save_columns(); }
130 function() { obj.list2.clipboard(); }
134 function() { obj.list1.clipboard(); }
136 'record_buckets_menulist_placeholder' : [
140 JSAN.use('util.widgets'); JSAN.use('util.functional');
141 var buckets = obj.network.simple_request(
142 'BUCKET_RETRIEVE_VIA_USER',
143 [ ses(), obj.data.list.au[0].id() ]
145 if (typeof buckets.ilsevent != 'undefined') {
146 obj.error.standard_unexpected_error_alert('Could not retrieve your buckets.',buckets);
149 var items = [ ['Choose a bucket...',''], ['Retrieve shared bucket...',-1] ].concat(
150 util.functional.map_list(
151 util.functional.filter_list(
154 return o.btype() == 'staff_client';
158 obj.bucket_id_name_map[ o.id() ] = o.name();
159 return [ o.name(), o.id() ];
163 if (a[0] < b[0]) return -1;
164 if (a[0] > b[0]) return 1;
169 obj.error.sdump('D_TRACE','items = ' + js2JSON(items));
170 util.widgets.remove_children( e );
171 var ml = util.widgets.make_menulist(
175 ml.setAttribute('id','bucket_menulist');
176 ml.setAttribute('accesskey','');
178 function change_bucket(ev) {
179 var bucket_id = ev.target.value;
180 if (bucket_id < 0 ) {
181 bucket_id = window.prompt('Enter bucket number:');
182 ev.target.value = bucket_id;
183 ev.target.setAttribute('value',bucket_id);
185 if (!bucket_id) return;
186 var bucket = obj.network.simple_request(
188 [ ses(), 'biblio', bucket_id ]
190 if (typeof bucket.ilsevent != 'undefined') {
191 if (bucket.ilsevent == 1506 /* CONTAINER_NOT_FOUND */) {
192 alert('Could not find a bucket with ID = ' + bucket_id);
194 obj.error.standard_unexpected_error_alert('Error retrieving bucket. Did you use a valid bucket id?',bucket);
199 var x = document.getElementById('info_box');
200 x.setAttribute('hidden','false');
201 x = document.getElementById('bucket_number');
202 x.setAttribute('value',bucket.id());
203 x = document.getElementById('bucket_name');
204 x.setAttribute('value',bucket.name());
205 x = document.getElementById('bucket_owner');
206 var s = bucket.owner(); JSAN.use('patron.util');
207 if (s && typeof s != "object") s = patron.util.retrieve_fleshed_au_via_id(ses(),s);
208 x.setAttribute('value',s.card().barcode() + " @ " + obj.data.hash.aou[ s.home_ou() ].shortname());
212 var items = bucket.items() || [];
214 for (var i = 0; i < items.length; i++) {
215 var item = obj.flesh_item_for_list(
216 items[i].target_biblio_record_entry(),
219 if (item) obj.list2.append( item );
223 ml.addEventListener( 'change_bucket', change_bucket , false);
224 ml.addEventListener( 'command', function() {
225 JSAN.use('util.widgets'); util.widgets.dispatch('change_bucket',ml);
227 obj.controller.view.bucket_menulist = ml;
228 JSAN.use('util.widgets'); util.widgets.dispatch('change_bucket',ml);
229 document.getElementById('refresh').addEventListener( 'command', function() {
230 JSAN.use('util.widgets'); util.widgets.dispatch('change_bucket',ml);
236 'record_buckets_add' : [
239 var bucket_id = obj.controller.view.bucket_menulist.value;
240 if (!bucket_id) return;
241 for (var i = 0; i < obj.record_ids.length; i++) {
242 var bucket_item = new cbrebi();
243 bucket_item.isnew('1');
244 bucket_item.bucket(bucket_id);
245 bucket_item.target_biblio_record_entry( obj.record_ids[i] );
247 var robj = obj.network.simple_request('BUCKET_ITEM_CREATE',
248 [ ses(), 'biblio', bucket_item ]);
250 if (typeof robj == 'object') throw robj;
252 var item = obj.flesh_item_for_list( obj.record_ids[i], robj );
255 obj.list2.append( item );
262 'record_buckets_sel_add' : [
265 var bucket_id = obj.controller.view.bucket_menulist.value;
266 if (!bucket_id) return;
267 for (var i = 0; i < obj.selection_list1.length; i++) {
268 var docid = obj.selection_list1[i].docid;
269 var bucket_item = new cbrebi();
270 bucket_item.isnew('1');
271 bucket_item.bucket(bucket_id);
272 bucket_item.target_biblio_record_entry( docid );
274 var robj = obj.network.simple_request('BUCKET_ITEM_CREATE',
275 [ ses(), 'biblio', bucket_item ]);
277 if (typeof robj == 'object') throw robj;
279 var item = obj.flesh_item_for_list( docid, robj );
282 obj.list2.append( item );
290 'record_buckets_export' : [
293 for (var i = 0; i < obj.selection_list2.length; i++) {
294 var docid = obj.selection_list2[i].docid;
295 var item = obj.flesh_item_for_list( docid );
297 obj.list1.append( item );
298 obj.record_ids.push( docid );
304 'record_buckets_delete_item' : [
307 for (var i = 0; i < obj.selection_list2.length; i++) {
309 var bucket_item_id = obj.selection_list2[i].bucket_item_id;
310 var robj = obj.network.simple_request('BUCKET_ITEM_DELETE',
311 [ ses(), 'biblio', bucket_item_id ]);
312 if (typeof robj == 'object') throw robj;
317 alert("Action completed.");
320 JSAN.use('util.widgets');
321 util.widgets.dispatch('change_bucket',obj.controller.view.bucket_menulist);
326 'record_buckets_delete_bucket' : [
330 var bucket = obj.controller.view.bucket_menulist.value;
331 var name = obj.bucket_id_name_map[ bucket ];
332 var conf = window.confirm('Delete the bucket named ' + name + '?');
335 var robj = obj.network.simple_request('BUCKET_DELETE',[ses(),'biblio',bucket]);
336 if (typeof robj == 'object') throw robj;
337 alert("Action completed.");
338 obj.controller.render('record_buckets_menulist_placeholder');
341 JSAN.use('util.widgets');
342 util.widgets.dispatch('change_bucket',obj.controller.view.bucket_menulist);
347 alert('FIXME -- ' + E);
351 'record_buckets_new_bucket' : [
355 var name = prompt('What would you like to name the bucket?','','Bucket Creation');
358 var bucket = new cbreb();
359 bucket.btype('staff_client');
360 bucket.owner( obj.data.list.au[0].id() );
363 var robj = obj.network.simple_request('BUCKET_CREATE',[ses(),'biblio',bucket]);
365 if (typeof robj == 'object') {
366 if (robj.ilsevent == 1710 /* CONTAINER_EXISTS */) {
367 alert('You already have a bucket with that name.');
374 alert('Bucket "' + name + '" created.');
376 obj.controller.render('record_buckets_menulist_placeholder');
377 obj.controller.view.bucket_menulist.value = robj;
380 JSAN.use('util.widgets');
381 util.widgets.dispatch('change_bucket',obj.controller.view.bucket_menulist);
391 'cmd_record_buckets_export' : [
394 obj.list2.on_all_fleshed = function() {
396 dump(obj.list2.dump_csv() + '\n');
397 copy_to_clipboard(obj.list2.dump_csv());
398 setTimeout(function(){obj.list2.on_all_fleshed = null;},0);
403 obj.list2.full_retrieve();
410 obj.list1.on_all_fleshed = function() {
412 dump(obj.list1.dump_csv() + '\n');
413 copy_to_clipboard(obj.list1.dump_csv());
414 setTimeout(function(){obj.list1.on_all_fleshed = null;},0);
419 obj.list1.full_retrieve();
423 'cmd_print_export1' : [
427 obj.list1.on_all_fleshed =
430 dump( obj.list1.dump_csv() + '\n' );
431 //copy_to_clipboard(obj.list.dump_csv());
432 JSAN.use('util.print'); var print = new util.print();
433 print.simple(obj.list1.dump_csv(),{'content_type':'text/plain'});
434 setTimeout(function(){ obj.list1.on_all_fleshed = null; },0);
436 obj.error.standard_unexpected_error_alert('print export',E);
439 obj.list1.full_retrieve();
441 obj.error.standard_unexpected_error_alert('print export',E);
447 'cmd_print_export2' : [
451 obj.list2.on_all_fleshed =
454 dump( obj.list2.dump_csv() + '\n' );
455 //copy_to_clipboard(obj.list.dump_csv());
456 JSAN.use('util.print'); var print = new util.print();
457 print.simple(obj.list2.dump_csv(),{'content_type':'text/plain'});
458 setTimeout(function(){ obj.list2.on_all_fleshed = null; },0);
460 obj.error.standard_unexpected_error_alert('print export',E);
463 obj.list2.full_retrieve();
465 obj.error.standard_unexpected_error_alert('print export',E);
470 'cmd_export_records_usmarc' : [
472 function () { return cat.export_records('usmarc') }
475 'cmd_export_records_unimarc' : [
477 function () { return cat.export_records('unimarc') }
480 'cmd_export_records_xml' : [
482 function () { return cat.export_records('xml') }
485 'cmd_export_records_bre' : [
487 function () { return cat.export_records('bre') }
490 'cmd_merge_records' : [
494 obj.list2.select_all();
495 obj.data.stash_retrieve();
496 JSAN.use('util.functional');
498 var record_ids = util.functional.map_list(
499 obj.list2.dump_retrieve_ids(),
501 return JSON2js(o).docid; // docid
505 netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect UniversalBrowserWrite');
506 var top_xml = '<vbox xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul" flex="1" >';
507 top_xml += '<description>Merge these records? (Select the "lead" record first)</description>';
508 top_xml += '<hbox><button id="lead" disabled="true" label="Merge" name="fancy_submit"/><button label="Cancel" accesskey="C" name="fancy_cancel"/></hbox></vbox>';
510 var xml = '<form xmlns="http://www.w3.org/1999/xhtml">';
511 xml += '<table><tr valign="top">';
512 for (var i = 0; i < record_ids.length; i++) {
513 xml += '<td><input value="Lead" id="record_' + record_ids[i] + '" type="radio" name="lead"';
514 xml += ' onclick="' + "try { var x = document.getElementById('lead'); x.setAttribute('value',";
515 xml += record_ids[i] + '); x.disabled = false; } catch(E) { alert(E); }">';
516 xml += '</input>Lead Record? #' + record_ids[i] + '</td>';
518 xml += '</tr><tr valign="top">';
519 for (var i = 0; i < record_ids.length; i++) {
520 xml += '<td nowrap="nowrap"><iframe src="' + urls.XUL_BIB_BRIEF;
521 xml += '?docid=' + record_ids[i] + '"/></td>';
523 xml += '</tr><tr valign="top">';
524 for (var i = 0; i < record_ids.length; i++) {
525 html = obj.network.simple_request('MARC_HTML_RETRIEVE',[ record_ids[i] ]);
526 xml += '<td nowrap="nowrap"><iframe style="min-height: 1000px; min-width: 300px;" flex="1" src="data:text/html,' + window.escape(html) + '"/></td>';
528 xml += '</tr></table></form>';
529 //obj.data.temp_merge_top = top_xml; obj.data.stash('temp_merge_top');
530 //obj.data.temp_merge_mid = xml; obj.data.stash('temp_merge_mid');
531 JSAN.use('util.window'); var win = new util.window();
532 var fancy_prompt_data = win.open(
533 urls.XUL_FANCY_PROMPT,
534 //+ '?xml_in_stash=temp_merge_mid'
535 //+ '&top_xml_in_stash=temp_merge_top'
536 //+ '&title=' + window.escape('Record Merging'),
537 'fancy_prompt', 'chrome,resizable,modal,width=700,height=500',
539 'top_xml' : top_xml, 'xml' : xml, 'title' : 'Record Merging'
542 //obj.data.stash_retrieve();
544 if (typeof fancy_prompt_data.fancy_status == 'undefined' || fancy_prompt_data.fancy_status == 'incomplete') { alert('Merge Aborted'); return; }
545 var robj = obj.network.simple_request('MERGE_RECORDS',
548 fancy_prompt_data.lead,
549 util.functional.filter_list( record_ids,
551 return o != fancy_prompt_data.lead;
556 if (typeof robj.ilsevent != 'undefined') {
559 alert('Records were successfully merged.');
562 obj.render_pending_records(); // FIXME -- need a generic refresh for lists
565 JSAN.use('util.widgets');
566 util.widgets.dispatch('change_bucket',obj.controller.view.bucket_menulist);
570 obj.error.standard_unexpected_error_alert('Records were not likely merged.',E);
576 'cmd_delete_records' : [
580 obj.list2.select_all();
581 obj.data.stash_retrieve();
582 JSAN.use('util.functional');
584 var record_ids = util.functional.map_list(
585 obj.list2.dump_retrieve_ids(),
587 return JSON2js(o).docid; // docid
591 netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect UniversalBrowserWrite');
592 var top_xml = '<vbox xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul" flex="1" >';
593 top_xml += '<description>Delete these records?</description>';
594 top_xml += '<hbox><button id="lead" disabled="false" label="Delete" name="fancy_submit"/><button label="Cancel" accesskey="C" name="fancy_cancel"/></hbox></vbox>';
596 var xml = '<form xmlns="http://www.w3.org/1999/xhtml">';
597 xml += '<table><tr valign="top">';
598 for (var i = 0; i < record_ids.length; i++) {
599 xml += '<td>Record #' + record_ids[i] + '</td>';
601 xml += '</tr><tr valign="top">';
602 for (var i = 0; i < record_ids.length; i++) {
603 xml += '<td nowrap="nowrap"><iframe src="' + urls.XUL_BIB_BRIEF;
604 xml += '?docid=' + record_ids[i] + '"/></td>';
606 xml += '</tr><tr valign="top">';
607 for (var i = 0; i < record_ids.length; i++) {
608 html = obj.network.simple_request('MARC_HTML_RETRIEVE',[ record_ids[i] ]);
609 xml += '<td nowrap="nowrap"><iframe style="min-height: 1000px; min-width: 300px;" flex="1" src="data:text/html,' + window.escape(html) + '"/></td>';
611 xml += '</tr></table></form>';
612 //obj.data.temp_merge_top = top_xml; obj.data.stash('temp_merge_top');
613 //obj.data.temp_merge_mid = xml; obj.data.stash('temp_merge_mid');
614 JSAN.use('util.window'); var win = new util.window();
615 var fancy_prompt_data = win.open(
616 urls.XUL_FANCY_PROMPT,
617 //+ '?xml_in_stash=temp_merge_mid'
618 //+ '&top_xml_in_stash=temp_merge_top'
619 //+ '&title=' + window.escape('Record Purging'),
620 'fancy_prompt', 'chrome,resizable,modal,width=700,height=500',
622 'top_xml' : top_xml, 'xml' : xml, 'title' : 'Record Purging'
625 //obj.data.stash_retrieve();
626 if (typeof fancy_prompt_data.fancy_status == 'undefined' || fancy_prompt_data.fancy_status != 'complete') { alert('Delete Aborted'); return; }
628 for (var i = 0; i < record_ids.length; i++) {
629 var robj = obj.network.simple_request('FM_BRE_DELETE',[ses(),record_ids[i]]);
630 if (typeof robj.ilsevent != 'undefined') {
631 if (!s) s = 'Error deleting these records:\n';
632 s += 'Record #' + record_ids[i] + ' : ' + robj.textcode + ' : ' + robj.desc + '\n';
635 if (s) { alert(s); } else { alert('Records deleted.'); }
637 obj.render_pending_records(); // FIXME -- need a generic refresh for lists
640 JSAN.use('util.widgets');
641 util.widgets.dispatch('change_bucket',obj.controller.view.bucket_menulist);
645 obj.error.standard_unexpected_error_alert('Records were not likely deleted.',E);
653 function() { alert('Not Yet Implemented'); }
655 'cmd_record_buckets_done' : [
665 obj.list2.select_all();
666 JSAN.use('util.functional');
667 var docids = util.functional.map_list(
668 obj.list2.dump_retrieve_ids(),
670 return JSON2js(o).docid; // docid
673 for (var i = 0; i < docids.length; i++) {
674 var doc_id = docids[i];
675 var opac_url = xulG.url_prefix( urls.opac_rdetail ) + '?r=' + doc_id;
676 var content_params = {
678 'authtime' : ses('authtime'),
679 'opac_url' : opac_url,
682 xulG.url_prefix(urls.XUL_OPAC_WRAPPER),
683 {'tab_name':'Retrieving title...'},
688 obj.error.standard_unexpected_error_alert('Showing in OPAC',E);
696 this.controller.render();
698 if (typeof xulG == 'undefined') {
699 obj.controller.view.cmd_sel_opac.disabled = true;
700 obj.controller.view.cmd_sel_opac.setAttribute('disabled',true);
702 obj.controller.view.cmd_record_buckets_done.disabled = true;
703 obj.controller.view.cmd_record_buckets_done.setAttribute('disabled',true);
707 'flesh_item_for_list' : function(docid,bucket_item_id) {
710 var record = obj.network.simple_request( 'MODS_SLIM_RECORD_RETRIEVE', [ docid ]);
711 if (record == null || typeof(record.ilsevent) != 'undefined') {
715 'retrieve_id' : js2JSON( { 'docid' : docid, 'bucket_item_id' : bucket_item_id } ),
725 obj.error.standard_unexpected_error_alert('Could not retrieve this record: ' + docid,E);
733 cat.pick_file = function (default) {
734 netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
736 var nsIFilePicker = Components.interfaces.nsIFilePicker;
737 var fp = Components.classes["@mozilla.org/filepicker;1"].createInstance( nsIFilePicker );
739 fp.init( window, "Save File As", nsIFilePicker.modeSave );
741 fp.defaultString = default;
743 fp.appendFilters( nsIFilePicker.filterAll );
745 var result = fp.show();
746 if ( (result == nsIFilePicker.returnOK || result == nsIFilePicker.returnReplace) && fp.file ) {
753 cat.export_records = function(output_type) {
755 netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
756 obj.list2.select_all();
757 obj.data.stash_retrieve();
758 JSAN.use('util.functional');
760 var record_ids = util.functional.map_list(
761 obj.list2.dump_retrieve_ids(),
762 function (o) { return JSON2js(o).docid }
765 var persist = Components.classes["@mozilla.org/embedding/browser/nsWebBrowserPersist;1"]
766 .createInstance(Components.interfaces.nsIWebBrowserPersist);
768 var proto_uri = 'http://' + window.location.hostname + '/exporter';
770 dump('Record Export URI is ' + proto_uri + '?id=' + record_ids.join('&id=') + '\n');
772 var uri = Components.classes["@mozilla.org/network/io-service;1"]
773 .getService(Components.interfaces.nsIIOService)
774 .newURI( proto_uri + '?id=' + record_ids.join('&id='), null, null );
776 var file = pick_file('bucket.' + output_type);
779 persist.saveURI(uri,null,null,null,null,file);
781 alert("File not downloaded.");
785 obj.error.standard_unexpected_error_alert('Records could not be exported.',E);
789 dump('exiting cat.record_buckets.js\n');