Ability to create P-type holds; todo, holds display
authorBill Erickson <erickson@esilibrary.com>
Tue, 22 Mar 2011 22:57:38 +0000 (18:57 -0400)
committerBill Erickson <erickson@esilibrary.com>
Tue, 22 Mar 2011 22:57:38 +0000 (18:57 -0400)
Open-ILS/src/perlmods/lib/OpenILS/Application/Search/Biblio.pm
Open-ILS/web/opac/locale/en-US/opac.dtd
Open-ILS/web/opac/skin/default/js/holds.js
Open-ILS/web/opac/skin/default/xml/common/holds.xml

index 6590b22..b19c376 100644 (file)
@@ -2357,6 +2357,65 @@ sub fetch_slim_record {
     return \@res;
 }
 
+__PACKAGE__->register_method(
+    method    => 'rec_hold_parts',
+    api_name  => 'open-ils.search.metabib.record_hold_parts',
+    signature => q/
+       Returns a list of {label :foo, id : bar} objects for viable monograph parts
+       for a given record or metarecord.
+       /
+);
+
+sub rec_hold_parts {
+       my( $self, $conn, $args ) = @_;
+
+    my $rec        = $$args{record};
+    my $mrec       = $$args{metarecord};
+    my $pickup_lib = $$args{pickup_lib};
+    my $e = new_editor();
+
+    my $query = {
+        select => {bmp => ['id', 'label']},
+        from => 'bmp',
+        where => {
+            id => {
+                in => {
+                    select => {'acpm' => ['part']},
+                    where => {'+acp' => { 'deleted' => 'f'}},
+                    distinct => 1,
+                }
+            }
+        }
+    };
+
+    if($rec) {
+        $query->{where}->{id}->{in}->{from} = {acpm => {acp => {join => {acn => {join => 'bre'}}}}};
+        $query->{where}->{id}->{in}->{where}->{'+bre'} = {id => $rec}
+
+    } else {
+
+        $query->{where}->{id}->{in}->{from} = 
+            {acpm => {acp => {join => {acn => {join => {bre => {join => {
+                mmrsm => {
+                    field   =>  'source',
+                    fkey    =>  'id',
+                    filter  =>  {metarecord => $mrec}
+                }
+            }}}}}}}}; # weee
+    }
+
+    if(defined $pickup_lib) {
+        my $hard_boundary = $U->ou_ancestor_setting_value($pickup_lib, OILS_SETTING_HOLD_HARD_BOUNDARY);
+        if($hard_boundary) {
+            my $orgs = $e->json_query({from => ['actor.org_unit_descendants' => $pickup_lib, $hard_boundary]});
+            $query->{where}->{'+acp'}->{circ_lib} = [ map { $_->{id} } @$orgs ];
+        }
+    }
+
+    return $e->json_query($query);
+}
+
+
 
 
 __PACKAGE__->register_method(
index aef4bbb..74b7a27 100644 (file)
@@ -592,6 +592,7 @@ We recommend that you remove this title from any bookbags it may have been added
 <!ENTITY common.call.number.label "Call Number:">
 <!ENTITY common.isbn.label "ISBN:">
 <!ENTITY common.issn.label "ISSN:">
+<!ENTITY common.mono_parts.label "Monograph Parts:">
 <!ENTITY common.copy.barcode.label "Copy Barcode:">
 <!ENTITY common.issuance_label.label "Issuance Label:">
 <!ENTITY common.hold.place "Place hold for my account">
index 748f98c..522978d 100644 (file)
@@ -16,7 +16,8 @@ var holdTargetTypeMap = {
     T : 'record',
     V : 'volume',
     I : 'issuance',
-    C : 'copy'
+    C : 'copy',
+    P : 'part'
 };
 
 
@@ -337,18 +338,55 @@ function _h_set_rec_descriptors(args, doneCallback) {
                                if( args.type == 'M' && ! args.metarecordObject) 
                                        holdArgs.metarecordObject = args.metarecordObject = findRecord(args.metarecord, 'M');   
 
-                               if(doneCallback) doneCallback(args);
+                _h_set_parts(args, doneCallback);
                        }
                );
                req.send();
 
        } else {
-               if(doneCallback) doneCallback(args);
+        _h_set_parts(args, doneCallback);
        }
 
        return args;
 }
 
+function _h_set_parts(args, doneCallback) {
+
+    if(args.recordParts) {
+        if(doneCallback) doneCallback(args);
+    } else {
+               var params = { pickup_lib: args.pickup_lib };
+
+        if (args.type == 'M') {
+               if( !args.metarecord && args.record) {
+                params.metarecord = args.metarecord = args.record;
+                delete(args.record);
+               } else {
+                               params.metarecord = args.metarecordObject.doc_id();
+               }
+        } else {
+               params.record = args.record;
+        }
+
+               if( ! args.record ) {
+                       if( args.metarecord )
+                               params.metarecord = args.metarecord;
+                       else 
+                               params.metarecord = args.metarecordObject.doc_id();
+               }
+
+               var req = new Request('open-ils.search:open-ils.search.metabib.record_hold_parts', params);
+               req.callback(
+                       function(r) {
+                               holdArgs.recordParts = r.getResultObject();
+                if(doneCallback)
+                    doneCallback();
+                       }
+               );
+               req.send();
+    }
+}
+
 
 
 function holdsDrawWindow() {
@@ -453,6 +491,16 @@ function __holdsDrawWindow() {
                hideMe($('holds_issuance_row'));
        }
 
+    if(holdArgs.recordParts && holdArgs.recordParts.length) {
+        unHideMe($('holds_parts_row'));
+        dojo.forEach(
+            holdArgs.recordParts, 
+            function(part) {
+                insertSelectorVal($('holds_parts_selector'), -1, part.label, part.id);
+            }
+        );
+    }
+
        removeChildren($('holds_format'));
 
        var mods_formats = rec.types_of_resource();
@@ -747,7 +795,8 @@ function holdsCheckPossibility(pickuplib, hold, recurse) {
                hold_type : holdArgs.type,
                patronid : holdArgs.recipient.id(),
                depth : 0, 
-               pickup_lib : pickuplib 
+               pickup_lib : pickuplib,
+        partid : holdArgs.part
        };
 
        if(recurse) {
@@ -839,8 +888,16 @@ function holdsBuildHoldFromWindow() {
        else
                hold.email_notify(0);
 
+    var part = getSelectorVal($('holds_parts_selector'));
+    if(part) {
+        holdArgs.type = 'P';
+        holdArgs.part = part;
+    }
+
        var target = holdArgs[holdTargetTypeMap[holdArgs.type]];
 
+    // a mono part is selected
+
        hold.pickup_lib(org); 
        //hold.request_lib(org); 
        hold.requestor(holdArgs.requestor.id());
index 962a366..34d28f5 100644 (file)
                                        <td class='holds_cell' id='holds_physical_desc'> </td>
                                </tr>
 
+                               <tr class='hide_me' id='holds_parts_row'>
+                                       <td class='holds_cell'>&common.mono_parts.label;</td>
+                                       <td class='holds_cell'>
+                        <select id='holds_parts_selector'>
+                            <option value=''></option>
+                        </select>
+                    </td>
+                               </tr>
+
                                <tr class='hide_me' id='holds_cn_row'>
                                        <td class='holds_cell'>&common.call.number.label;</td>
                                        <td class='holds_cell'><b id='holds_cn'/> </td>