New approach to peer bib passing
authorMike Rylander <mrylander@gmail.com>
Tue, 12 Apr 2011 01:15:36 +0000 (21:15 -0400)
committerMike Rylander <mrylander@gmail.com>
Tue, 12 Apr 2011 01:15:36 +0000 (21:15 -0400)
 * Teach MVR to hold foreign copy maps (it can hold callnumbers already)
 * Push foreign copy maps in into the unique set of MVRs fetched in find_peer_bibs
 * Sort MVRs by title, pass back array instead of hash
 * Use dojo.map to pull copies out of maps in the MVR

Open-ILS/examples/fm_IDL.xml
Open-ILS/src/perlmods/lib/OpenILS/Application/Search/Biblio.pm
Open-ILS/web/opac/skin/default/js/rdetail.js

index 170ccc7..11faf84 100644 (file)
@@ -84,6 +84,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
                        <field name="copy_count" oils_persist:virtual="true" />
                        <field name="series" oils_persist:virtual="true" />
                        <field name="serials" oils_persist:virtual="true" />
+                       <field name="foreign_copy_maps" oils_persist:virtual="true" />
                </fields>
        </class>
 
index b6a6f6d..0bef2bd 100644 (file)
@@ -668,8 +668,8 @@ sub find_peer_bibs {
             {
                 flesh => 2,
                 flesh_fields => {
-                    bpbcm => [ 'target_copy' ],
-                    acp => [ 'call_number', 'location', 'status', 'peer_record_maps' ]
+                    bpbcm => [ 'target_copy', 'peer_type' ],
+                    acp => [ 'call_number', 'location', 'status' ]
                 }
             }
         ]
@@ -680,18 +680,27 @@ sub find_peer_bibs {
     }
 
     if (scalar(@{$multi_home_list})==0) {
-        return { 'records' => [], 'items' => [] };
+        return [];
     }
 
-    my $mods_list = _records_to_mods( map { $_->target_copy->call_number->record; } @{$multi_home_list} );
-    my @copies = map { $_->target_copy } @{$multi_home_list};
+    # create a unique hash of the primary record MVRs for foreign copies
+    # XXX PLEASE let's change to unAPI2 (supports foreign copies) in the TT opac?!?
+    my %rec_hash = map {
+        ($_->target_copy->call_number->record, _records_to_mods( $_->target_copy->call_number->record ))
+    } @$multi_home_list;
 
-    my $obj = {
-        'records' => $mods_list,
-        'items' => \@copies
-    };
+    # set the foreign_copy_maps field to an empty array
+    map { $rec_hash{$_}->foreign_copy_maps([]) } keys( %rec_hash );
+
+    # push the maps onto the correct MVRs
+    for (@$multi_home_list) {
+        push(
+            @{$rec_hash{ $_->target_copy->call_number->record }->foreign_copy_maps()),
+            $_
+        );
+    }
 
-    return $obj;
+    return [sort {$a->title cmp $b->title} values(%rec_hash)];
 };
 
 __PACKAGE__->register_method(
index a78e9f4..1f960fd 100644 (file)
@@ -241,13 +241,13 @@ function rdetailForeignItems(r,id) {
        hideMe($('rdetail_extras_loading'));
     var tbody = $('rdetail_foreign_items_tbody');
 
-    var robj = r.getResultObject(); /* { 'records' : [ mvr1, mvr2, ...], 'items' : [ acp1, acp2, ... ] } */
+    var robj = r.getResultObject(); /* mvr list with foreign_copy_maps fleshed */
 
-    for (var i = 0; i < robj.records.length; i++) {
+    for (var i = 0; i < robj.length; i++) {
         var args = {};
         args.page = RDETAIL;
         args[PARAM_OFFSET] = 0;
-        args[PARAM_RID] = robj.records[i].doc_id();
+        args[PARAM_RID] = robj[i].doc_id();
         var row = elem('tr'); tbody.appendChild(row);
         var td1 = elem('td'); row.appendChild(td1);
         var title = elem(
@@ -256,10 +256,10 @@ function rdetailForeignItems(r,id) {
                 'href' : buildOPACLink(args),
                 'class' : 'classic_link'
             },
-            robj.records[i].title()
+            robj[i].title()
         );
         td1.appendChild(title);
-        var td2 = elem('td',{},robj.records[i].author()); row.appendChild(td2);
+        var td2 = elem('td',{},robj[i].author()); row.appendChild(td2);
         var td3 = elem('td'); row.appendChild(td3);
         var details = elem(
             'a',
@@ -271,8 +271,19 @@ function rdetailForeignItems(r,id) {
         );
         details.onclick = function(idx){
             return function() {
-                cpdBuild( tbody, row, robj.records[idx], null, 1, 0, 1,
-                    dojo.filter( robj.items, function(item) { return item.call_number().record() == robj.records[idx].doc_id(); } ) );
+                cpdBuild(
+                    tbody,
+                    row,
+                    robj[idx],
+                    null,
+                    1,
+                    0,
+                    1,
+                    dojo.map(
+                        robj[idx].foreign_copy_maps(),
+                        function(x){ return x.target_copy(); }
+                    )
+                );
             };
         }(i);
         td3.appendChild(details);