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;
11 var x = document.getElementById("record_buckets_tabbox");
12 if (x) x.selectedIndex = 2;
15 cat.record_buckets.pick_file = function (defaultFileName) {
16 netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
18 var nsIFilePicker = Components.interfaces.nsIFilePicker;
19 var fp = Components.classes["@mozilla.org/filepicker;1"].createInstance( nsIFilePicker );
21 fp.init( window, "Save File As", nsIFilePicker.modeSave );
23 fp.defaultString = defaultFileName;
25 fp.appendFilters( nsIFilePicker.filterAll );
27 var result = fp.show();
28 if ( (result == nsIFilePicker.returnOK || result == nsIFilePicker.returnReplace) && fp.file ) {
35 cat.record_buckets.export_records = function(obj, output_type) {
37 netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
38 obj.list2.select_all();
39 obj.data.stash_retrieve();
40 JSAN.use('util.functional');
42 var record_ids = util.functional.map_list(
43 obj.list2.dump_retrieve_ids(),
44 function (o) { return JSON2js(o).docid }
47 var persist = Components.classes["@mozilla.org/embedding/browser/nsWebBrowserPersist;1"]
48 .createInstance(Components.interfaces.nsIWebBrowserPersist);
50 var proto_uri = 'http://' + window.location.hostname + '/exporter?format=' + output_type;
52 dump('Record Export URI is ' + proto_uri + '&id=' + record_ids.join('&id=') + '\n');
54 var uri = Components.classes["@mozilla.org/network/io-service;1"]
55 .getService(Components.interfaces.nsIIOService)
56 .newURI( proto_uri + '&id=' + record_ids.join('&id='), null, null );
58 var file = cat.record_buckets.pick_file('bucket.' + output_type);
61 persist.saveURI(uri,null,null,null,null,file);
63 alert("File not downloaded.");
67 obj.error.standard_unexpected_error_alert('Records could not be exported.',E);
72 cat.record_buckets.prototype = {
73 'selection_list1' : [],
74 'selection_list2' : [],
75 'bucket_id_name_map' : {},
77 'render_pending_records' : function() {
78 if (this.first_pause) {
79 this.first_pause = false;
81 alert("Action completed.");
85 for (var i = 0; i < obj.record_ids.length; i++) {
86 var item = obj.flesh_item_for_list( obj.record_ids[i] );
87 if (item) obj.list1.append( item );
91 'init' : function( params ) {
95 obj.record_ids = params['record_ids'] || [];
97 JSAN.use('circ.util');
98 var columns = circ.util.columns(
100 'title' : { 'hidden' : false },
101 'author' : { 'hidden' : false },
102 'edition' : { 'hidden' : false },
103 'publisher' : { 'hidden' : false },
104 'pubdate' : { 'hidden' : false },
105 'isbn' : { 'hidden' : false },
106 'tcn' : { 'hidden' : false },
110 JSAN.use('util.list');
112 obj.list1 = new util.list('pending_records_list');
116 'map_row_to_columns' : circ.util.std_map_row_to_columns(),
117 'on_select' : function(ev) {
119 JSAN.use('util.functional');
120 var sel = obj.list1.retrieve_selection();
121 obj.controller.view.sel_clip1.setAttribute('disabled', sel.length < 1 ? "true" : "false");
122 obj.selection_list1 = util.functional.map_list(
124 function(o) { return JSON2js(o.getAttribute('retrieve_id')); }
126 obj.error.sdump('D_TRACE','circ/record_buckets: selection list 1 = ' + js2JSON(obj.selection_list1) );
127 if (obj.selection_list1.length == 0) {
128 obj.controller.view.cmd_record_buckets_sel_add.setAttribute('disabled','true');
130 obj.controller.view.cmd_record_buckets_sel_add.setAttribute('disabled','false');
133 alert('FIXME: ' + E);
140 obj.render_pending_records();
142 obj.list2 = new util.list('records_in_bucket_list');
146 'map_row_to_columns' : circ.util.std_map_row_to_columns(),
147 'on_select' : function(ev) {
149 JSAN.use('util.functional');
150 var sel = obj.list2.retrieve_selection();
151 obj.controller.view.sel_clip2.setAttribute('disabled', sel.length < 1 ? "true" : "false");
152 obj.selection_list2 = util.functional.map_list(
154 function(o) { return JSON2js(o.getAttribute('retrieve_id')); }
156 obj.error.sdump('D_TRACE','circ/record_buckets: selection list 2 = ' + js2JSON(obj.selection_list2) );
157 if (obj.selection_list2.length == 0) {
158 obj.controller.view.cmd_record_buckets_delete_item.setAttribute('disabled','true');
159 obj.controller.view.cmd_pending_buckets_to_record_buckets.setAttribute('disabled','true');
161 obj.controller.view.cmd_record_buckets_delete_item.setAttribute('disabled','false');
162 obj.controller.view.cmd_pending_buckets_to_record_buckets.setAttribute('disabled','false');
165 alert('FIXME: ' + E);
171 JSAN.use('util.controller'); obj.controller = new util.controller();
177 function() { obj.list2.save_columns(); }
181 function() { obj.list1.save_columns(); }
185 function() { obj.list2.clipboard(); }
189 function() { obj.list1.clipboard(); }
191 'record_buckets_menulist_placeholder' : [
195 JSAN.use('util.widgets'); JSAN.use('util.functional');
196 var buckets = obj.network.simple_request(
197 'BUCKET_RETRIEVE_VIA_USER',
198 [ ses(), obj.data.list.au[0].id() ]
200 if (typeof buckets.ilsevent != 'undefined') {
201 obj.error.standard_unexpected_error_alert('Could not retrieve your buckets.',buckets);
204 var items = [ ['Choose a bucket...',''], ['Retrieve shared bucket...',-1] ].concat(
205 util.functional.map_list(
206 util.functional.filter_list(
209 return o.btype() == 'staff_client';
213 obj.bucket_id_name_map[ o.id() ] = o.name();
214 return [ o.name(), o.id() ];
218 if (a[0] < b[0]) return -1;
219 if (a[0] > b[0]) return 1;
224 obj.error.sdump('D_TRACE','items = ' + js2JSON(items));
225 util.widgets.remove_children( e );
226 var ml = util.widgets.make_menulist(
230 ml.setAttribute('id','bucket_menulist');
231 ml.setAttribute('accesskey','');
233 function change_bucket(ev) {
234 var bucket_id = ev.target.value;
235 if (bucket_id < 0 ) {
236 bucket_id = window.prompt('Enter bucket number:');
237 ev.target.value = bucket_id;
238 ev.target.setAttribute('value',bucket_id);
240 if (!bucket_id) return;
241 var x = document.getElementById('info_box');
242 x.setAttribute('hidden','true');
243 obj.controller.view.cmd_record_buckets_delete_bucket.setAttribute('disabled','true');
244 obj.controller.view.cmd_record_buckets_refresh.setAttribute('disabled','true');
245 obj.controller.view.record_buckets_export_records.disabled = true;
246 obj.controller.view.cmd_merge_records.setAttribute('disabled','true');
247 obj.controller.view.cmd_delete_records.setAttribute('disabled','true');
248 obj.controller.view.cmd_sel_opac.setAttribute('disabled','true');
249 obj.controller.view.record_buckets_list_actions.disabled = true;
250 var bucket = obj.network.simple_request(
252 [ ses(), 'biblio', bucket_id ]
254 if (typeof bucket.ilsevent != 'undefined') {
255 if (bucket.ilsevent == 1506 /* CONTAINER_NOT_FOUND */) {
256 alert('Could not find a bucket with ID = ' + bucket_id);
258 obj.error.standard_unexpected_error_alert('Error retrieving bucket. Did you use a valid bucket id?',bucket);
263 obj.controller.view.cmd_record_buckets_delete_bucket.setAttribute('disabled','false');
264 obj.controller.view.cmd_record_buckets_refresh.setAttribute('disabled','false');
265 obj.controller.view.record_buckets_export_records.disabled = false;
266 obj.controller.view.cmd_merge_records.setAttribute('disabled','false');
267 obj.controller.view.cmd_delete_records.setAttribute('disabled','false');
268 obj.controller.view.cmd_sel_opac.setAttribute('disabled','false');
269 obj.controller.view.record_buckets_list_actions.disabled = false;
271 var x = document.getElementById('info_box');
272 x.setAttribute('hidden','false');
273 x = document.getElementById('bucket_number');
274 x.setAttribute('value',bucket.id());
275 x = document.getElementById('bucket_name');
276 x.setAttribute('value',bucket.name());
277 x = document.getElementById('bucket_owner');
278 var s = bucket.owner(); JSAN.use('patron.util');
279 if (s && typeof s != "object") s = patron.util.retrieve_fleshed_au_via_id(ses(),s);
280 x.setAttribute('value',s.card().barcode() + " @ " + obj.data.hash.aou[ s.home_ou() ].shortname());
284 var items = bucket.items() || [];
286 for (var i = 0; i < items.length; i++) {
287 var item = obj.flesh_item_for_list(
288 items[i].target_biblio_record_entry(),
291 if (item) obj.list2.append( item );
295 ml.addEventListener( 'change_bucket', change_bucket , false);
296 ml.addEventListener( 'command', function() {
297 JSAN.use('util.widgets'); util.widgets.dispatch('change_bucket',ml);
299 obj.controller.view.bucket_menulist = ml;
300 JSAN.use('util.widgets'); util.widgets.dispatch('change_bucket',ml);
305 'cmd_record_buckets_refresh' : [
308 JSAN.use('util.widgets'); util.widgets.dispatch('change_bucket',obj.controller.view.bucket_menulist);
312 'cmd_record_buckets_add' : [
315 var bucket_id = obj.controller.view.bucket_menulist.value;
316 if (!bucket_id) return;
317 for (var i = 0; i < obj.record_ids.length; i++) {
318 var bucket_item = new cbrebi();
319 bucket_item.isnew('1');
320 bucket_item.bucket(bucket_id);
321 bucket_item.target_biblio_record_entry( obj.record_ids[i] );
323 var robj = obj.network.simple_request('BUCKET_ITEM_CREATE',
324 [ ses(), 'biblio', bucket_item ]);
326 if (typeof robj == 'object') throw robj;
328 var item = obj.flesh_item_for_list( obj.record_ids[i], robj );
331 obj.list2.append( item );
338 'cmd_record_buckets_sel_add' : [
341 var bucket_id = obj.controller.view.bucket_menulist.value;
342 if (!bucket_id) return;
343 for (var i = 0; i < obj.selection_list1.length; i++) {
344 var docid = obj.selection_list1[i].docid;
345 var bucket_item = new cbrebi();
346 bucket_item.isnew('1');
347 bucket_item.bucket(bucket_id);
348 bucket_item.target_biblio_record_entry( docid );
350 var robj = obj.network.simple_request('BUCKET_ITEM_CREATE',
351 [ ses(), 'biblio', bucket_item ]);
353 if (typeof robj == 'object') throw robj;
355 var item = obj.flesh_item_for_list( docid, robj );
358 obj.list2.append( item );
366 'cmd_pending_buckets_to_record_buckets' : [
369 for (var i = 0; i < obj.selection_list2.length; i++) {
370 var docid = obj.selection_list2[i].docid;
371 var item = obj.flesh_item_for_list( docid );
373 obj.list1.append( item );
374 obj.record_ids.push( docid );
380 'cmd_record_buckets_delete_item' : [
383 for (var i = 0; i < obj.selection_list2.length; i++) {
385 var bucket_item_id = obj.selection_list2[i].bucket_item_id;
386 var robj = obj.network.simple_request('BUCKET_ITEM_DELETE',
387 [ ses(), 'biblio', bucket_item_id ]);
388 if (typeof robj == 'object') throw robj;
393 alert("Action completed.");
396 JSAN.use('util.widgets');
397 util.widgets.dispatch('change_bucket',obj.controller.view.bucket_menulist);
402 'cmd_record_buckets_delete_bucket' : [
406 var bucket = obj.controller.view.bucket_menulist.value;
407 var name = obj.bucket_id_name_map[ bucket ];
408 var conf = window.confirm('Delete the bucket named ' + name + '?');
411 var robj = obj.network.simple_request('BUCKET_DELETE',[ses(),'biblio',bucket]);
412 if (typeof robj == 'object') throw robj;
413 alert("Action completed.");
414 var x = document.getElementById('info_box');
415 x.setAttribute('hidden','true');
416 obj.controller.view.cmd_record_buckets_delete_bucket.setAttribute('disabled','true');
417 obj.controller.view.cmd_record_buckets_refresh.setAttribute('disabled','true');
418 obj.controller.view.record_buckets_export_records.disabled = true;
419 obj.controller.view.cmd_merge_records.setAttribute('disabled','true');
420 obj.controller.view.cmd_delete_records.setAttribute('disabled','true');
421 obj.controller.view.cmd_sel_opac.setAttribute('disabled','true');
422 obj.controller.view.record_buckets_list_actions.disabled = true;
423 obj.controller.render('record_buckets_menulist_placeholder');
426 JSAN.use('util.widgets');
427 util.widgets.dispatch('change_bucket',obj.controller.view.bucket_menulist);
432 alert('FIXME -- ' + E);
436 'cmd_record_buckets_new_bucket' : [
440 var name = prompt('What would you like to name the bucket?','','Bucket Creation');
443 var bucket = new cbreb();
444 bucket.btype('staff_client');
445 bucket.owner( obj.data.list.au[0].id() );
448 var robj = obj.network.simple_request('BUCKET_CREATE',[ses(),'biblio',bucket]);
450 if (typeof robj == 'object') {
451 if (robj.ilsevent == 1710 /* CONTAINER_EXISTS */) {
452 alert('You already have a bucket with that name.');
459 alert('Bucket "' + name + '" created.');
461 obj.controller.render('record_buckets_menulist_placeholder');
462 obj.controller.view.bucket_menulist.value = robj;
465 JSAN.use('util.widgets');
466 util.widgets.dispatch('change_bucket',obj.controller.view.bucket_menulist);
476 'cmd_pending_buckets_csv_to_clipboard' : [ ['command'], function() { obj.list1.dump_csv_to_clipboard(); } ],
477 'cmd_record_buckets_csv_to_clipboard' : [ ['command'], function() { obj.list2.dump_csv_to_clipboard(); } ],
478 'cmd_pending_buckets_csv_to_printer' : [ ['command'], function() { obj.list1.dump_csv_to_printer(); } ],
479 'cmd_record_buckets_csv_printer' : [ ['command'], function() { obj.list2.dump_csv_to_printer(); } ],
480 'cmd_pending_buckets_csv_to_file' : [ ['command'], function() { obj.list1.dump_csv_to_file( { 'defaultFileName' : 'pending_records.txt' } ); } ],
481 'cmd_record_buckets_csv_file' : [ ['command'], function() { obj.list2.dump_csv_to_file( { 'defaultFileName' : 'bucket_records.txt' } ); } ],
483 'cmd_export_records_usmarc' : [
485 function () { return cat.record_buckets.export_records(obj, 'usmarc') }
488 'cmd_export_records_unimarc' : [
490 function () { return cat.record_buckets.export_records(obj, 'unimarc') }
493 'cmd_export_records_xml' : [
495 function () { return cat.record_buckets.export_records(obj, 'xml') }
498 'cmd_export_records_bre' : [
500 function () { return cat.record_buckets.export_records(obj, 'bre') }
503 'cmd_merge_records' : [
507 obj.list2.select_all();
508 obj.data.stash_retrieve();
509 JSAN.use('util.functional');
511 var record_ids = util.functional.map_list(
512 obj.list2.dump_retrieve_ids(),
514 return JSON2js(o).docid; // docid
518 netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect UniversalBrowserWrite');
519 var top_xml = '<vbox xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul" flex="1" >';
520 top_xml += '<description>Merge these records? (Select the "lead" record first)</description>';
521 top_xml += '<hbox><button id="lead" disabled="true" label="Merge" name="fancy_submit"/><button label="Cancel" accesskey="C" name="fancy_cancel"/></hbox></vbox>';
523 var xml = '<form xmlns="http://www.w3.org/1999/xhtml">';
524 xml += '<table><tr valign="top">';
525 for (var i = 0; i < record_ids.length; i++) {
526 xml += '<td><input value="Lead" id="record_' + record_ids[i] + '" type="radio" name="lead"';
527 xml += ' onclick="' + "try { var x = document.getElementById('lead'); x.setAttribute('value',";
528 xml += record_ids[i] + '); x.disabled = false; } catch(E) { alert(E); }">';
529 xml += '</input>Lead Record? #' + record_ids[i] + '</td>';
531 xml += '</tr><tr valign="top">';
532 for (var i = 0; i < record_ids.length; i++) {
533 xml += '<td nowrap="nowrap"><iframe src="' + urls.XUL_BIB_BRIEF;
534 xml += '?docid=' + record_ids[i] + '"/></td>';
536 xml += '</tr><tr valign="top">';
537 for (var i = 0; i < record_ids.length; i++) {
538 html = obj.network.simple_request('MARC_HTML_RETRIEVE',[ record_ids[i] ]);
539 xml += '<td nowrap="nowrap"><iframe style="min-height: 1000px; min-width: 300px;" flex="1" src="data:text/html,' + window.escape(html) + '"/></td>';
541 xml += '</tr></table></form>';
542 //obj.data.temp_merge_top = top_xml; obj.data.stash('temp_merge_top');
543 //obj.data.temp_merge_mid = xml; obj.data.stash('temp_merge_mid');
544 JSAN.use('util.window'); var win = new util.window();
545 var fancy_prompt_data = win.open(
546 urls.XUL_FANCY_PROMPT,
547 //+ '?xml_in_stash=temp_merge_mid'
548 //+ '&top_xml_in_stash=temp_merge_top'
549 //+ '&title=' + window.escape('Record Merging'),
550 'fancy_prompt', 'chrome,resizable,modal,width=700,height=500',
552 'top_xml' : top_xml, 'xml' : xml, 'title' : 'Record Merging'
555 //obj.data.stash_retrieve();
557 if (typeof fancy_prompt_data.fancy_status == 'undefined' || fancy_prompt_data.fancy_status == 'incomplete') { alert('Merge Aborted'); return; }
558 var robj = obj.network.simple_request('MERGE_RECORDS',
561 fancy_prompt_data.lead,
562 util.functional.filter_list( record_ids,
564 return o != fancy_prompt_data.lead;
569 if (typeof robj.ilsevent != 'undefined') {
572 alert('Records were successfully merged.');
575 obj.render_pending_records(); // FIXME -- need a generic refresh for lists
578 JSAN.use('util.widgets');
579 util.widgets.dispatch('change_bucket',obj.controller.view.bucket_menulist);
583 obj.error.standard_unexpected_error_alert('Records were not likely merged.',E);
589 'cmd_delete_records' : [
593 obj.list2.select_all();
594 obj.data.stash_retrieve();
595 JSAN.use('util.functional');
597 var record_ids = util.functional.map_list(
598 obj.list2.dump_retrieve_ids(),
600 return JSON2js(o).docid; // docid
604 netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect UniversalBrowserWrite');
605 var top_xml = '<vbox xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul" flex="1" >';
606 top_xml += '<description>Delete these records?</description>';
607 top_xml += '<hbox><button id="lead" disabled="false" label="Delete" name="fancy_submit"/><button label="Cancel" accesskey="C" name="fancy_cancel"/></hbox></vbox>';
609 var xml = '<form xmlns="http://www.w3.org/1999/xhtml">';
610 xml += '<table><tr valign="top">';
611 for (var i = 0; i < record_ids.length; i++) {
612 xml += '<td>Record #' + record_ids[i] + '</td>';
614 xml += '</tr><tr valign="top">';
615 for (var i = 0; i < record_ids.length; i++) {
616 xml += '<td nowrap="nowrap"><iframe src="' + urls.XUL_BIB_BRIEF;
617 xml += '?docid=' + record_ids[i] + '"/></td>';
619 xml += '</tr><tr valign="top">';
620 for (var i = 0; i < record_ids.length; i++) {
621 html = obj.network.simple_request('MARC_HTML_RETRIEVE',[ record_ids[i] ]);
622 xml += '<td nowrap="nowrap"><iframe style="min-height: 1000px; min-width: 300px;" flex="1" src="data:text/html,' + window.escape(html) + '"/></td>';
624 xml += '</tr></table></form>';
625 //obj.data.temp_merge_top = top_xml; obj.data.stash('temp_merge_top');
626 //obj.data.temp_merge_mid = xml; obj.data.stash('temp_merge_mid');
627 JSAN.use('util.window'); var win = new util.window();
628 var fancy_prompt_data = win.open(
629 urls.XUL_FANCY_PROMPT,
630 //+ '?xml_in_stash=temp_merge_mid'
631 //+ '&top_xml_in_stash=temp_merge_top'
632 //+ '&title=' + window.escape('Record Purging'),
633 'fancy_prompt', 'chrome,resizable,modal,width=700,height=500',
635 'top_xml' : top_xml, 'xml' : xml, 'title' : 'Record Purging'
638 //obj.data.stash_retrieve();
639 if (typeof fancy_prompt_data.fancy_status == 'undefined' || fancy_prompt_data.fancy_status != 'complete') { alert('Delete Aborted'); return; }
641 for (var i = 0; i < record_ids.length; i++) {
642 var robj = obj.network.simple_request('FM_BRE_DELETE',[ses(),record_ids[i]]);
643 if (typeof robj.ilsevent != 'undefined') {
644 if (!s) s = 'Error deleting these records:\n';
645 s += 'Record #' + record_ids[i] + ' : ' + robj.textcode + ' : ' + robj.desc + '\n';
648 if (s) { alert(s); } else { alert('Records deleted.'); }
650 obj.render_pending_records(); // FIXME -- need a generic refresh for lists
653 JSAN.use('util.widgets');
654 util.widgets.dispatch('change_bucket',obj.controller.view.bucket_menulist);
658 obj.error.standard_unexpected_error_alert('Records were not likely deleted.',E);
666 function() { alert('Not Yet Implemented'); }
672 obj.list2.select_all();
673 JSAN.use('util.functional');
674 var docids = util.functional.map_list(
675 obj.list2.dump_retrieve_ids(),
677 return JSON2js(o).docid; // docid
681 for (var i = 0; i < docids.length; i++) {
682 var doc_id = docids[i];
683 if (seen[doc_id]) continue; seen[doc_id] = true;
684 var opac_url = xulG.url_prefix( urls.opac_rdetail ) + '?r=' + doc_id;
685 var content_params = {
687 'authtime' : ses('authtime'),
688 'opac_url' : opac_url,
691 xulG.url_prefix(urls.XUL_OPAC_WRAPPER),
692 {'tab_name':'Retrieving title...'},
697 obj.error.standard_unexpected_error_alert('Showing in OPAC',E);
701 'record_buckets_export_records' : [ ['render'], function(){} ],
702 'record_buckets_list_actions' : [ ['render'], function(){} ]
706 this.controller.render();
708 if (typeof xulG == 'undefined') {
709 obj.controller.view.cmd_sel_opac.disabled = true;
710 obj.controller.view.cmd_sel_opac.setAttribute('disabled',true);
714 'flesh_item_for_list' : function(docid,bucket_item_id) {
717 var record = obj.network.simple_request( 'MODS_SLIM_RECORD_RETRIEVE.authoritative', [ docid ]);
718 if (record == null || typeof(record.ilsevent) != 'undefined') {
722 'retrieve_id' : js2JSON( { 'docid' : docid, 'bucket_item_id' : bucket_item_id } ),
732 obj.error.standard_unexpected_error_alert('Could not retrieve this record: ' + docid,E);
740 dump('exiting cat.record_buckets.js\n');