toward a details extras pane for peer bibs
authorJason Etheridge <jason@esilibrary.com>
Mon, 11 Apr 2011 11:04:09 +0000 (07:04 -0400)
committerJason Etheridge <jason@esilibrary.com>
Mon, 11 Apr 2011 11:04:09 +0000 (07:04 -0400)
Open-ILS/src/perlmods/lib/OpenILS/Application/Search/Biblio.pm
Open-ILS/web/opac/common/js/config.js
Open-ILS/web/opac/locale/en-US/opac.dtd
Open-ILS/web/opac/skin/default/js/rdetail.js
Open-ILS/web/opac/skin/default/xml/rdetail/rdetail_extras.xml

index 7c2d8ff..1130440 100644 (file)
@@ -626,6 +626,73 @@ sub title_id_by_item_barcode {
     }
 }
 
+__PACKAGE__->register_method(
+    method        => 'find_peer_bibs',
+    api_name      => 'open-ils.search.peer_bibs.test',
+    authoritative => 1,
+    signature => {
+        desc   => 'Tests to see if the specified record is a peer record.',
+        params => [
+            { desc => 'Biblio record entry Id', type => 'number' }
+        ],
+        return => {
+            desc => 'True if specified id can be found in biblio.peer_record_copy_map.peer_record.',
+            type => 'bool'
+        }
+    }
+);
+
+__PACKAGE__->register_method(
+    method        => 'find_peer_bibs',
+    api_name      => 'open-ils.search.peer_bibs',
+    authoritative => 1,
+    signature => {
+        desc   => 'Return acps and mvrs for multi-home items linked to specified peer record.',
+        params => [
+            { desc => 'Biblio record entry Id', type => 'number' }
+        ],
+        return => {
+            desc => '{ records => Array of mvrs, items => array of acps }',
+        }
+    }
+);
+
+
+sub find_peer_bibs {
+       my( $self, $client, $doc_id ) = @_;
+    my $e = new_editor();
+
+    my $multi_home_list = $e->search_biblio_peer_bib_copy_map(
+        [
+            { peer_record => $doc_id },
+            {
+                flesh => 2,
+                flesh_fields => {
+                    bpbcm => [ 'target_copy' ],
+                    acp => [ 'call_number' ]
+                }
+            }
+        ]
+    );
+
+    if ($self->api_name =~ /test/) {
+        return scalar( @{$multi_home_list} ) > 0 ? 1 : 0;
+    }
+
+    if (scalar(@{$multi_home_list})==0) {
+        return { 'records' => [], 'items' => [] };
+    }
+
+    my $mods_list = _records_to_mods( map { $_->target_copy->call_number->record; } @{$multi_home_list} );
+    my @copies = map { $_->target_copy } @{$multi_home_list};
+
+    my $obj = {
+        'records' => $mods_list,
+        'items' => \@copies
+    };
+
+    return $obj;
+};
 
 __PACKAGE__->register_method(
     method   => "biblio_copy_to_mods",
index 29c54e9..287a126 100644 (file)
@@ -383,6 +383,8 @@ var FETCH_USER_NOTES                                = 'open-ils.actor:open-ils.actor.note.retrieve.all';
 var FETCH_ORG_BY_SHORTNAME             = 'open-ils.actor:open-ils.actor.org_unit.retrieve_by_shortname';
 var FETCH_BIB_IDS_BY_BARCODE = 'open-ils.search:open-ils.search.multi_home.bib_ids.by_barcode';
 var FETCH_ORG_SETTING = 'open-ils.actor:open-ils.actor.ou_setting.ancestor_default';
+var TEST_PEER_BIBS                             = 'open-ils.search:open-ils.search.peer_bibs.test';
+var FETCH_PEER_BIBS                            = 'open-ils.search:open-ils.search.peer_bibs';
 
 /* ---------------------------------------------------------------------------- */
 
index 4cf0cd3..b52813a 100644 (file)
@@ -550,6 +550,7 @@ We recommend that you remove this title from any bookbags it may have been added
 <!ENTITY rdetail.extras.author.notes "Author Notes">
 <!ENTITY rdetail.extras.annotation "Annotation">
 <!ENTITY rdetail.extras.marc "MARC Record">
+<!ENTITY rdetail.extras.foreign_items "Linked Titles">
 <!ENTITY rdetail.extras.call.null "There are no call numbers for this item at this location.">
 <!ENTITY rdetail.extras.call.local "Local Call Numbers:">
 <!ENTITY rdetail.extras.preview.fulltext "Full text">
index b1fc03b..f3af696 100644 (file)
@@ -237,6 +237,43 @@ function rdetailViewMarc(r,id) {
        $('rdetail_view_marc_box').insertBefore(span, $('rdetail_view_marc_box').firstChild);
 }
 
+function rdetailForeignItems(r,id) {
+       hideMe($('rdetail_extras_loading'));
+    var tbody = $('rdetail_foreign_items_tbody');
+
+    var robj = r.getResultObject(); /* { 'records' : [ mvr1, mvr2, ...], 'items' : [ acp1, acp2, ... ] } */
+
+    for (var i = 0; i < robj.records.length; i++) {
+        var args = {};
+        args.page = RDETAIL;
+        args[PARAM_OFFSET] = 0;
+        args[PARAM_RID] = robj.records[i].doc_id();
+        var row = elem('tr'); tbody.appendChild(row);
+        var td1 = elem('td'); row.appendChild(td1);
+        var title = elem(
+            'a',
+            {
+                'href' : buildOPACLink(args),
+                'class' : 'classic_link'
+            },
+            robj.records[i].title()
+        );
+        td1.appendChild(title);
+        var td2 = elem('td',{},robj.records[i].author()); row.appendChild(td2);
+        var td3 = elem('td'); row.appendChild(td3);
+        var details = elem(
+            'a',
+            {
+                'href' : 'javascript:alert("foo")',
+                'class' : 'classic_link'
+            },
+            'Copy Details'
+        );
+        td3.appendChild(details);
+    }
+}
+
+
 
 function rdetailShowLocalCopies() {
        rdetailShowLocal = true;
@@ -566,6 +603,16 @@ function _rdetailDraw(r) {
     if (novelist && currentISBN) {
         unHideMe($('rdetail_novelist_link'));
     }
+
+    // Multi-Home / Foreign Items / Peer Bibs
+    var req = new Request( TEST_PEER_BIBS, record.doc_id() );
+    req.callback(function(r){
+        var test = r.getResultObject();
+        if (test == "1") {
+            unHideMe($('rdetail_foreign_items_link'));
+        }
+    }); 
+    req.send();
 }
 
 
@@ -635,6 +682,7 @@ function rdetailAddToBookbag() {
 
 
 var rdetailMarcFetched = false;
+var rdetailForeignItemsFetched = false;
 function rdetailShowExtra(type, args) {
 
        hideMe($('rdetail_copy_info_div'));
@@ -648,6 +696,7 @@ function rdetailShowExtra(type, args) {
        hideMe($('cn_browse'));
        hideMe($('rdetail_cn_browse_div'));
        hideMe($('rdetail_novelist_div'));
+       hideMe($('rdetail_foreign_items_div'));
        hideMe($('rdetail_notes_div'));
 
        removeCSSClass($('rdetail_copy_info_link'), 'rdetail_extras_selected');
@@ -661,6 +710,7 @@ function rdetailShowExtra(type, args) {
        removeCSSClass($('rdetail_annotation_link'), 'rdetail_extras_selected');
        removeCSSClass($('rdetail_viewmarc_link'), 'rdetail_extras_selected');
        removeCSSClass($('rdetail_novelist_link'), 'rdetail_extras_selected');
+       removeCSSClass($('rdetail_foreign_items_link'), 'rdetail_extras_selected');
 
        switch(type) {
 
@@ -716,6 +766,17 @@ function rdetailShowExtra(type, args) {
                        unHideMe($('rdetail_novelist_div')); 
                        break;
 
+               case "foreign_items": 
+                       addCSSClass($('rdetail_foreign_items_link'), 'rdetail_extras_selected');
+                       unHideMe($('rdetail_foreign_items_div')); 
+            if(rdetailForeignItemsFetched) return;
+                       unHideMe($('rdetail_extras_loading'));
+            rdetailForeignItemsFetched = true;
+                       var req = new Request( FETCH_PEER_BIBS, record.doc_id() );
+                       req.callback(rdetailForeignItems); 
+                       req.send();
+                       break;
+
                case 'cn':
                        addCSSClass($('rdetail_viewcn_link'), 'rdetail_extras_selected');
                        unHideMe($('rdetail_cn_browse_div'));
index 4a2b94d..4245824 100644 (file)
                                                class='classic_link'>&rdetail.extras.novelist;</a>
                                </td>
 
+                               <td id='rdetail_foreign_items_link' class='hide_me rdetail_extras_td'
+                                       style='padding-right: 15px; padding-left: 15px;' >
+                                       <a href='javascript:rdetailShowExtra("foreign_items");'
+                                               class='classic_link'>&rdetail.extras.foreign_items;</a>
+                               </td>
+
                        </tr>
                </thead>
        </table>
             </div>
         </div>
 
+               <div id='rdetail_foreign_items_div' class='rdetail_extras_div hide_me'>
+            <table width='100%' class='data_grid data_grid_center' id='rdetail_foreign_items_table'>
+                <thead>
+                    <tr> <td>&common.title;</td> <td>&common.authors;</td> <td>&nbsp;</td></tr>
+                </thead>
+                <tbody id='rdetail_foreign_items_tbody'>
+                </tbody>
+            </table>
+        </div>
                <div id='rdetail_cn_browse_div' style='text-align: center;' class='hide_me'>
 
                        <div id='cn_browse_none' class='hide_me color_4' style='width: 90%; text-align: center; margin: 10px;'>