From f88b64577b5ca15d910484d64686676dfce3da43 Mon Sep 17 00:00:00 2001 From: Bill Erickson Date: Tue, 22 Mar 2011 18:57:38 -0400 Subject: [PATCH] Ability to create P-type holds; todo, holds display --- .../lib/OpenILS/Application/Search/Biblio.pm | 59 ++++++++++++++++++++ Open-ILS/web/opac/locale/en-US/opac.dtd | 1 + Open-ILS/web/opac/skin/default/js/holds.js | 65 ++++++++++++++++++++-- .../web/opac/skin/default/xml/common/holds.xml | 9 +++ 4 files changed, 130 insertions(+), 4 deletions(-) diff --git a/Open-ILS/src/perlmods/lib/OpenILS/Application/Search/Biblio.pm b/Open-ILS/src/perlmods/lib/OpenILS/Application/Search/Biblio.pm index 6590b225f2..b19c376cb0 100644 --- a/Open-ILS/src/perlmods/lib/OpenILS/Application/Search/Biblio.pm +++ b/Open-ILS/src/perlmods/lib/OpenILS/Application/Search/Biblio.pm @@ -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( diff --git a/Open-ILS/web/opac/locale/en-US/opac.dtd b/Open-ILS/web/opac/locale/en-US/opac.dtd index aef4bbb430..74b7a2739b 100644 --- a/Open-ILS/web/opac/locale/en-US/opac.dtd +++ b/Open-ILS/web/opac/locale/en-US/opac.dtd @@ -592,6 +592,7 @@ We recommend that you remove this title from any bookbags it may have been added + diff --git a/Open-ILS/web/opac/skin/default/js/holds.js b/Open-ILS/web/opac/skin/default/js/holds.js index 748f98c27e..522978d3e3 100644 --- a/Open-ILS/web/opac/skin/default/js/holds.js +++ b/Open-ILS/web/opac/skin/default/js/holds.js @@ -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()); diff --git a/Open-ILS/web/opac/skin/default/xml/common/holds.xml b/Open-ILS/web/opac/skin/default/xml/common/holds.xml index 962a366fbe..34d28f5679 100644 --- a/Open-ILS/web/opac/skin/default/xml/common/holds.xml +++ b/Open-ILS/web/opac/skin/default/xml/common/holds.xml @@ -51,6 +51,15 @@ + + &common.mono_parts.label; + + + + + &common.call.number.label; -- 2.11.0