From cc46f2a75575cd2c8053ae3fcad100c153a4632c Mon Sep 17 00:00:00 2001 From: dbwells Date: Wed, 11 Aug 2010 21:50:25 +0000 Subject: [PATCH] - Basic OPAC display, including attempt at integration with 'legacy' MFHD display - Rename some display variables and svr fields to be more generic - Add textual holdings 'override' code to MFHD display parser - Support for 'Binding' mode in Items tab - Barcode prompt when creating new units (either receiving or binding) - Add Serial service to example configuration files git-svn-id: svn://svn.open-ils.org/ILS/branches/seials-integration@17178 dcc99617-32d9-48b4-a31d-7c20da2025e4 --- Open-ILS/examples/fm_IDL.xml | 14 +- Open-ILS/examples/opensrf.xml.example | 21 +++ Open-ILS/examples/opensrf_core.xml.example | 1 + Open-ILS/src/extras/ils_events.xml | 10 ++ .../perlmods/OpenILS/Application/Search/Serial.pm | 126 ++++++++++----- Open-ILS/src/perlmods/OpenILS/Utils/MFHDParser.pm | 144 +++++++++++------- Open-ILS/web/js/dojo/openils/opac/nls/opac.js | 9 +- Open-ILS/web/opac/skin/default/js/rdetail.js | 42 ++--- .../xul/staff_client/server/serial/manage_items.js | 169 +++++++++++++++++---- .../staff_client/server/serial/manage_items.xul | 4 +- .../xul/staff_client/server/serial/manage_subs.js | 6 +- .../xul/staff_client/server/serial/manage_subs.xul | 7 +- .../xul/staff_client/server/serial/sdist_editor.js | 14 +- .../staff_client/server/serial/serctrl_main.xul | 14 +- 14 files changed, 410 insertions(+), 171 deletions(-) diff --git a/Open-ILS/examples/fm_IDL.xml b/Open-ILS/examples/fm_IDL.xml index 2dd87c9eb4..9f8e62f1ab 100644 --- a/Open-ILS/examples/fm_IDL.xml +++ b/Open-ILS/examples/fm_IDL.xml @@ -2923,15 +2923,15 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA - + - - - - - - + + + + + + diff --git a/Open-ILS/examples/opensrf.xml.example b/Open-ILS/examples/opensrf.xml.example index 192e94fb8f..5382c85483 100644 --- a/Open-ILS/examples/opensrf.xml.example +++ b/Open-ILS/examples/opensrf.xml.example @@ -976,6 +976,26 @@ vim:et:ts=4:sw=4: + + 3 + 1 + perl + OpenILS::Application::Serial + 17 + + open-ils.serial_unix.sock + open-ils.serial_unix.pid + 1000 + open-ils.serial_unix.log + 5 + 15 + 3 + 5 + + + + + @@ -1016,6 +1036,7 @@ vim:et:ts=4:sw=4: open-ils.trigger open-ils.fielder open-ils.vandelay + open-ils.serial diff --git a/Open-ILS/examples/opensrf_core.xml.example b/Open-ILS/examples/opensrf_core.xml.example index 3097ce053f..0d803fc9a8 100644 --- a/Open-ILS/examples/opensrf_core.xml.example +++ b/Open-ILS/examples/opensrf_core.xml.example @@ -33,6 +33,7 @@ Example OpenSRF bootstrap configuration file for Evergreen open-ils.search open-ils.supercat open-ils.vandelay + open-ils.serial diff --git a/Open-ILS/src/extras/ils_events.xml b/Open-ILS/src/extras/ils_events.xml index b4cb739d10..8affbf7d2f 100644 --- a/Open-ILS/src/extras/ils_events.xml +++ b/Open-ILS/src/extras/ils_events.xml @@ -952,6 +952,16 @@ + + The subscription still has dependent objects + + + + The caption/pattern still has dependent issuances + + + + diff --git a/Open-ILS/src/perlmods/OpenILS/Application/Search/Serial.pm b/Open-ILS/src/perlmods/OpenILS/Application/Search/Serial.pm index ede27064e8..d1b770032d 100644 --- a/Open-ILS/src/perlmods/OpenILS/Application/Search/Serial.pm +++ b/Open-ILS/src/perlmods/OpenILS/Application/Search/Serial.pm @@ -73,40 +73,41 @@ Given a bib record ID, returns a hash of holdings statements =cut -sub bib_to_mfhd_hash { - my ($self, $client, $bib) = @_; - - my $mfhd_hash; - - # XXX perhaps this? --miker -# my $e = OpenILS::Utils::CStoreEditor->new(); -# my $mfhd = $e->search_serial_record_entry({ record => $bib }); -# return $u->generate_svr( $mfhd->[0] ) if (ref $mfhd); -# return undef; - - my @mfhd = $U->cstorereq( "open-ils.cstore.json_query.atomic", { - select => { sre => 'marc' }, - from => 'sre', - where => { record => $bib, deleted => 'f' }, - distinct => 1 - }); - - if (!@mfhd or scalar(@mfhd) == 0) { - return undef; - } - - my $u = OpenILS::Utils::MFHDParser->new(); - $mfhd_hash = $u->generate_svr( $mfhd[0][0]->{id}, $mfhd[0][0]->{marc}, $mfhd[0][0]->{owning_lib} ); - - return $mfhd_hash; -} - -__PACKAGE__->register_method( - method => "bib_to_mfhd_hash", - api_name => "open-ils.search.serial.record.bib_to_mfhd.retrieve", - argc => 1, - note => "Given a bibliographic record ID, return MFHD holdings" -); +# DEFUNCT ? +#sub bib_to_mfhd_hash { +# my ($self, $client, $bib) = @_; +# +# my $mfhd_hash; +# +# # XXX perhaps this? --miker +## my $e = OpenILS::Utils::CStoreEditor->new(); +## my $mfhd = $e->search_serial_record_entry({ record => $bib }); +## return $u->generate_svr( $mfhd->[0] ) if (ref $mfhd); +## return undef; +# +# my @mfhd = $U->cstorereq( "open-ils.cstore.json_query.atomic", { +# select => { sre => 'marc' }, +# from => 'sre', +# where => { record => $bib, deleted => 'f' }, +# distinct => 1 +# }); +# +# if (!@mfhd or scalar(@mfhd) == 0) { +# return undef; +# } +# +# my $u = OpenILS::Utils::MFHDParser->new(); +# $mfhd_hash = $u->generate_svr( $mfhd[0][0]->{id}, $mfhd[0][0]->{marc}, $mfhd[0][0]->{owning_lib} ); +# +# return $mfhd_hash; +#} +# +#__PACKAGE__->register_method( +# method => "bib_to_mfhd_hash", +# api_name => "open-ils.search.serial.record.bib_to_mfhd.retrieve", +# argc => 1, +# note => "Given a bibliographic record ID, return MFHD holdings" +#); sub bib_to_mfhd { my ($self, $client, $bib) = @_; @@ -114,14 +115,61 @@ sub bib_to_mfhd { my $mfhd; my $e = OpenILS::Utils::CStoreEditor->new(); - my $serials = $e->search_serial_record_entry({ record => $bib, deleted => 'f' }); - if (!ref $serials) { + # TODO: 'deleted' ssub support + my $sdists = $e->search_serial_distribution([{ "+ssub" => {"record_entry" => $bib} }, { "flesh" => 1, "flesh_fields" => {'sdist' => [ "record_entry", "basic_summary", "supplement_summary", "index_summary" ]}, "join" => {"ssub" => {}} }]); + my $sres = $e->search_serial_record_entry([{ record => $bib, deleted => 'f', "+sdist" => {"id" => undef} }, { "join" => {"sdist" => { 'type' => 'left' }} }]); + if (!ref $sres and !ref $sdists) { return undef; } - my $u = OpenILS::Utils::MFHDParser->new(); - foreach (@$serials) { - push(@$mfhd, $u->generate_svr($_->id, $_->marc, $_->owning_lib)); + my $mfhd_parser = OpenILS::Utils::MFHDParser->new(); + foreach (@$sdists) { + my $svr; + if (ref $_->record_entry) { + $svr = $mfhd_parser->generate_svr($_->record_entry->id, $_->record_entry->marc, $_->record_entry->owning_lib); + } else { + $svr = Fieldmapper::serial::virtual_record->new; + $svr->sre_id(-1); + $svr->location(-1); #TODO: location support + $svr->owning_lib($_->holding_lib); + $svr->basic_holdings([]); + $svr->supplement_holdings([]); + $svr->index_holdings([]); + $svr->basic_holdings_add([]); + $svr->supplement_holdings_add([]); + $svr->index_holdings_add([]); + $svr->online([]); + $svr->missing([]); + $svr->incomplete([]); + } + if (ref $_->basic_summary) { #TODO: 'show-generated' boolean on summaries + if ($_->basic_summary->generated_coverage) { + push(@{$svr->basic_holdings}, $_->basic_summary->generated_coverage); + } + if ($_->basic_summary->textual_holdings) { + push(@{$svr->basic_holdings_add}, $_->basic_summary->textual_holdings); + } + } + if (ref $_->supplement_summary) { + if ($_->supplement_summary->generated_coverage) { + push(@{$svr->supplement_holdings}, $_->supplement_summary->generated_coverage); + } + if ($_->supplement_summary->textual_holdings) { + push(@{$svr->supplement_holdings_add}, $_->supplement_summary->textual_holdings); + } + } + if (ref $_->index_summary) { + if ($_->index_summary->generated_coverage) { + push(@{$svr->index_holdings}, $_->index_summary->generated_coverage); + } + if ($_->index_summary->textual_holdings) { + push(@{$svr->index_holdings_add}, $_->index_summary->textual_holdings); + } + } + push(@$mfhd, $svr); + } + foreach (@$sres) { + push(@$mfhd, $mfhd_parser->generate_svr($_->id, $_->marc, $_->owning_lib)); } return $mfhd; diff --git a/Open-ILS/src/perlmods/OpenILS/Utils/MFHDParser.pm b/Open-ILS/src/perlmods/OpenILS/Utils/MFHDParser.pm index 2e49cc0778..7a191dd3e0 100644 --- a/Open-ILS/src/perlmods/OpenILS/Utils/MFHDParser.pm +++ b/Open-ILS/src/perlmods/OpenILS/Utils/MFHDParser.pm @@ -59,16 +59,16 @@ sub mfhd_to_hash { my $marc; my $mfhd; - my $location = ''; - my $holdings = []; - my $supplements = []; - my $indexes = []; - my $current_holdings = []; - my $current_supplements = []; - my $current_indexes = []; - my $online = []; # Laurentian extension to MFHD standard - my $missing = []; # Laurentian extension to MFHD standard - my $incomplete = []; # Laurentian extension to MFHD standard + my $location = ''; + my $basic_holdings = []; + my $supplement_holdings = []; + my $index_holdings = []; + my $basic_holdings_add = []; + my $supplement_holdings_add = []; + my $index_holdings_add = []; + my $online = []; # Laurentian extension to MFHD standard + my $missing = []; # Laurentian extension to MFHD standard + my $incomplete = []; # Laurentian extension to MFHD standard try { $marc = MARC::Record->new_from_xml($mfhd_xml); @@ -108,48 +108,89 @@ sub mfhd_to_hash { $location =~ s/ -- $//; + # TODO: for now, we will assume that textual holdings are in addition to the + # computable holdings (that is, they have link IDs greater than the 85X fields) + # or that they fully replace the computable holdings (checking for link ID '0'). + # Eventually this may be handled better by format_holdings() in MFHD.pm + my %skip_computable; try { foreach my $field ($marc->field('866')) { my $textual_holdings = $self->format_textual_holdings($field); if ($textual_holdings) { - push @$holdings, $textual_holdings; + push @$basic_holdings_add, $textual_holdings; + if ($field->subfield('8') eq '0') { + $skip_computable{'basic'} = 1; # link ID 0 trumps computable fields + } } } foreach my $field ($marc->field('867')) { my $textual_holdings = $self->format_textual_holdings($field); if ($textual_holdings) { - push @$supplements, $textual_holdings; + push @$supplement_holdings_add, $textual_holdings; + if ($field->subfield('8') eq '0') { + $skip_computable{'supplement'} = 1; # link ID 0 trumps computable fields + } } } foreach my $field ($marc->field('868')) { my $textual_holdings = $self->format_textual_holdings($field); if ($textual_holdings) { - push @$indexes, $textual_holdings; + push @$index_holdings_add, $textual_holdings; + if ($field->subfield('8') eq '0') { + $skip_computable{'index'} = 1; # link ID 0 trumps computable fields + } } } - foreach my $cap_id ($mfhd->caption_link_ids('853')) { - my @curr_holdings = $mfhd->holdings('863', $cap_id); - next unless scalar @curr_holdings; - foreach (@curr_holdings) { - push @$current_holdings, $_->format(); + if (!exists($skip_computable{'basic'})) { + foreach my $cap_id ($mfhd->caption_link_ids('853')) { + my @holdings = $mfhd->holdings('863', $cap_id); + next unless scalar @holdings; + foreach (@holdings) { + push @$basic_holdings, $_->format(); + } } + if (!@$basic_holdings) { # no computed holdings found + $basic_holdings = $basic_holdings_add; + $basic_holdings_add = []; + } + } else { # textual are non additional, but primary + $basic_holdings = $basic_holdings_add; + $basic_holdings_add = []; } - foreach my $cap_id ($mfhd->caption_link_ids('854')) { - my @curr_supplements = $mfhd->holdings('864', $cap_id); - next unless scalar @curr_supplements; - foreach (@curr_supplements) { - push @$current_supplements, $_->format(); + if (!exists($skip_computable{'supplement'})) { + foreach my $cap_id ($mfhd->caption_link_ids('854')) { + my @supplements = $mfhd->holdings('864', $cap_id); + next unless scalar @supplements; + foreach (@supplements) { + push @$supplement_holdings, $_->format(); + } + } + if (!@$supplement_holdings) { # no computed holdings found + $supplement_holdings = $supplement_holdings_add; + $supplement_holdings_add = []; } + } else { # textual are non additional, but primary + $supplement_holdings = $supplement_holdings_add; + $supplement_holdings_add = []; } - foreach my $cap_id ($mfhd->caption_link_ids('855')) { - my @curr_indexes = $mfhd->holdings('865', $cap_id); - next unless scalar @curr_indexes; - foreach (@curr_indexes) { - push @$current_indexes, $_->format(); + if (!exists($skip_computable{'index'})) { + foreach my $cap_id ($mfhd->caption_link_ids('855')) { + my @indexes = $mfhd->holdings('865', $cap_id); + next unless scalar @indexes; + foreach (@indexes) { + push @$index_holdings, $_->format(); + } + } + if (!@$index_holdings) { # no computed holdings found + $index_holdings = $index_holdings_add; + $index_holdings_add = []; } + } else { # textual are non additional, but primary + $index_holdings = $index_holdings_add; + $index_holdings_add = []; } # Laurentian extensions @@ -179,15 +220,16 @@ sub mfhd_to_hash { }; return { - location => $location, - holdings => $holdings, - current_holdings => $current_holdings, - supplements => $supplements, - current_supplements => $current_supplements, - indexes => $indexes, - current_indexes => $current_indexes, - missing => $missing, - incomplete => $incomplete, + location => $location, + basic_holdings => $basic_holdings, + basic_holdings_add => $basic_holdings_add, + supplement_holdings => $supplement_holdings, + supplement_holdings_add => $supplement_holdings_add, + index_holdings => $index_holdings, + index_holdings_add => $index_holdings_add, + missing => $missing, + incomplete => $incomplete, + online => $online }; } @@ -203,15 +245,15 @@ Initialize the serial virtual record (svr) instance sub init_holdings_virtual_record { my $record = Fieldmapper::serial::virtual_record->new; - $record->id(); + $record->sre_id(); $record->location(); $record->owning_lib(); - $record->holdings([]); - $record->current_holdings([]); - $record->supplements([]); - $record->current_supplements([]); - $record->indexes([]); - $record->current_indexes([]); + $record->basic_holdings([]); + $record->basic_holdings_add([]); + $record->supplement_holdings([]); + $record->supplement_holdings_add([]); + $record->index_holdings([]); + $record->index_holdings_add([]); $record->online([]); $record->missing([]); $record->incomplete([]); @@ -238,7 +280,7 @@ sub generate_svr { my $record = init_holdings_virtual_record(); my $holdings = $self->mfhd_to_hash($mfhd); - $record->id($id); + $record->sre_id($id); $record->owning_lib($owning_lib); if (!$holdings) { @@ -246,12 +288,12 @@ sub generate_svr { } $record->location($holdings->{location}); - $record->holdings($holdings->{holdings}); - $record->current_holdings($holdings->{current_holdings}); - $record->supplements($holdings->{supplements}); - $record->current_supplements($holdings->{current_supplements}); - $record->indexes($holdings->{indexes}); - $record->current_indexes($holdings->{current_indexes}); + $record->basic_holdings($holdings->{basic_holdings}); + $record->basic_holdings_add($holdings->{basic_holdings_add}); + $record->supplement_holdings($holdings->{supplement_holdings}); + $record->supplement_holdings_add($holdings->{supplement_holdings_add}); + $record->index_holdings($holdings->{index_holdings}); + $record->index_holdings_add($holdings->{index_holdings_add}); $record->online($holdings->{online}); $record->missing($holdings->{missing}); $record->incomplete($holdings->{incomplete}); diff --git a/Open-ILS/web/js/dojo/openils/opac/nls/opac.js b/Open-ILS/web/js/dojo/openils/opac/nls/opac.js index 000d879192..7d515bf57e 100644 --- a/Open-ILS/web/js/dojo/openils/opac/nls/opac.js +++ b/Open-ILS/web/js/dojo/openils/opac/nls/opac.js @@ -18,8 +18,10 @@ "EDIT_MFHD_RECORD": "Edit Record", "EDIT_MFHD_MENU": "Edit Holdings", "EDIT_PROPERTIES": "Edit Propeties", - "HOLDINGS": "Previous volumes", - "INDEXES": "Previous indexes", + "BASIC_HOLDINGS": "Volumes", + "BASIC_HOLDINGS_ADD": "Additional Volume Information", + "INDEX_HOLDINGS": "Indexes", + "INDEX_HOLDINGS_ADD": "Additional Index Information", "CURRENT_HOLDINGS": "Current volume", "CURRENT_INDEXES": "Current indexes", "CURRENT_SUPPLEMENTS": "Current supplements", @@ -28,5 +30,6 @@ "MISSING_VOLUMES": "Missing volumes", "ONLINE_VOLUMES": "Online volumes", "SAVE_MFHD_LABEL": "Save MFHD", - "SUPPLEMENTS": "Previous supplements" + "SUPPLEMENT_HOLDINGS": "Supplements", + "SUPPLEMENT_HOLDINGS_ADD": "Additional Supplement Information" } diff --git a/Open-ILS/web/opac/skin/default/js/rdetail.js b/Open-ILS/web/opac/skin/default/js/rdetail.js index 0713e97e2d..de6568c9f1 100644 --- a/Open-ILS/web/opac/skin/default/js/rdetail.js +++ b/Open-ILS/web/opac/skin/default/js/rdetail.js @@ -262,19 +262,19 @@ function _holdingsDrawMFHD(holdings, entryNum) { } } - var hh = holdings.holdings(); - var hch = holdings.current_holdings(); - var hs = holdings.supplements(); - var hcs = holdings.current_supplements(); - var hi = holdings.indexes(); - var hci = holdings.current_indexes(); + var hb = holdings.basic_holdings(); + var hba = holdings.basic_holdings_add(); + var hs = holdings.supplement_holdings(); + var hsa = holdings.supplement_holdings_add(); + var hi = holdings.index_holdings(); + var hia = holdings.index_holdings_add(); var ho = holdings.online(); var hm = holdings.missing(); var hinc = holdings.incomplete(); var hloc = holdings.location() || 'MFHD'; - if ( hh.length == 0 && hch.length == 0 && hs.length == 0 && - hcs.length == 0 && hi.length == 0 && hci.length == 0 && + if ( hb.length == 0 && hba.length == 0 && hs.length == 0 && + hsa.length == 0 && hi.length == 0 && hia.length == 0 && ho.length == 0 && hm.length == 0 && hinc.length == 0 ) { @@ -284,14 +284,14 @@ function _holdingsDrawMFHD(holdings, entryNum) { * record is likely empty or corrupt. This gives cataloguers a * chance to add holdings or correct the record */ - hh = 'PLACEHOLDER'; + hb = ['PLACEHOLDER']; } else { return null; } } // Show entryNum + 1 in staff client for better menu correlation - // Maybe this should be holdings.id() instead? (which could get long after time) + // Maybe this should be holdings.sre_id() instead? (which could get long after time) var entryNumString = ''; if (isXUL()) { var entryNumInc = entryNum + 1; @@ -303,31 +303,31 @@ function _holdingsDrawMFHD(holdings, entryNum) { "", "rdetail_details_table", "after" ); - if (hh.length > 0) { _holdingsDrawMFHDEntry(entryNum, opac_strings.HOLDINGS, hh); } - if (hch.length > 0) { _holdingsDrawMFHDEntry(entryNum, opac_strings.CURRENT_HOLDINGS, hch); } - if (hs.length > 0) { _holdingsDrawMFHDEntry(entryNum, opac_strings.SUPPLEMENTS, hs); } - if (hcs.length > 0) { _holdingsDrawMFHDEntry(entryNum, opac_strings.CURRENT_SUPPLEMENTS, hcs); } - if (hi.length > 0) { _holdingsDrawMFHDEntry(entryNum, opac_strings.INDEXES, hi); } - if (hci.length > 0) { _holdingsDrawMFHDEntry(entryNum, opac_strings.CURRENT_INDEXES, hci); } + if (hb.length > 0) { _holdingsDrawMFHDEntry(entryNum, opac_strings.BASIC_HOLDINGS, hb); } + if (hba.length > 0) { _holdingsDrawMFHDEntry(entryNum, opac_strings.BASIC_HOLDINGS_ADD, hba); } + if (hs.length > 0) { _holdingsDrawMFHDEntry(entryNum, opac_strings.SUPPLEMENT_HOLDINGS, hs); } + if (hsa.length > 0) { _holdingsDrawMFHDEntry(entryNum, opac_strings.SUPPLEMENT_HOLDINGS_ADD, hsa); } + if (hi.length > 0) { _holdingsDrawMFHDEntry(entryNum, opac_strings.INDEX_HOLDINGS, hi); } + if (hia.length > 0) { _holdingsDrawMFHDEntry(entryNum, opac_strings.INDEX_HOLDINGS_ADD, hia); } if (ho.length > 0) { _holdingsDrawMFHDEntry(entryNum, opac_strings.ONLINE_VOLUMES, ho); } if (hm.length > 0) { _holdingsDrawMFHDEntry(entryNum, opac_strings.MISSING_VOLUMES, hm); } if (hinc.length > 0) { _holdingsDrawMFHDEntry(entryNum, opac_strings.INCOMPLETE_VOLUMES, hinc); } if (isXUL()) { - mfhdDetails.push({ 'id' : holdings.id(), 'label' : hloc, 'entryNum' : entryNum, 'owning_lib' : holdings.owning_lib() }); + mfhdDetails.push({ 'id' : holdings.sre_id(), 'label' : hloc, 'entryNum' : entryNum, 'owning_lib' : holdings.owning_lib() }); dojo.require('openils.Event'); dojo.require('openils.PermaCrud'); var mfhd_edit = new dijit.Menu({}); - new dijit.MenuItem({onClick: function(){loadMarcEditor(holdings.id())}, label:opac_strings.EDIT_MFHD_RECORD}).placeAt(mfhd_edit, "first"); + new dijit.MenuItem({onClick: function(){loadMarcEditor(holdings.sre_id())}, label:opac_strings.EDIT_MFHD_RECORD}).placeAt(mfhd_edit, "first"); new dijit.MenuItem({onClick:function(){ var pcrud = new openils.PermaCrud({"authtoken": G.user.session}); - var mfhd_rec = pcrud.retrieve("sre", holdings.id()); + var mfhd_rec = pcrud.retrieve("sre", holdings.sre_id()); if (mfhd_rec) { pcrud.eliminate(mfhd_rec); - alert(dojo.string.substitute(opac_strings.DELETED_MFHD_RECORD, [holdings.id()])); + alert(dojo.string.substitute(opac_strings.DELETED_MFHD_RECORD, [holdings.sre_id()])); } }, label:opac_strings.DELETE_MFHD}).placeAt(mfhd_edit, "last"); - // new dijit.MenuItem({onClick:function(){alert("Edit properties " + holdings.id());}, label:opac_strings.EDIT_PROPERTIES}).placeAt(mfhd_edit, "last"); + // new dijit.MenuItem({onClick:function(){alert("Edit properties " + holdings.sre_id());}, label:opac_strings.EDIT_PROPERTIES}).placeAt(mfhd_edit, "last"); var mfhd_mb = new dijit.form.DropDownButton({dropDown: mfhd_edit, label:opac_strings.EDIT_MFHD_MENU, style:"float:right"}); mfhd_mb.placeAt("mfhdHoldingsCaption" + entryNum, "last"); mfhd_edit.startup(); diff --git a/Open-ILS/xul/staff_client/server/serial/manage_items.js b/Open-ILS/xul/staff_client/server/serial/manage_items.js index 1177e67bd6..7e217ac63c 100644 --- a/Open-ILS/xul/staff_client/server/serial/manage_items.js +++ b/Open-ILS/xul/staff_client/server/serial/manage_items.js @@ -10,6 +10,7 @@ serial.manage_items = function (params) { JSAN.use('OpenILS.data'); this.data = new OpenILS.data(); this.data.init({'via':'stash'}); this.current_sunit_id = -1; //default to **AUTO** + this.mode = 'receive'; } @@ -80,9 +81,8 @@ serial.manage_items.prototype = { ml.addEventListener( 'command', function(ev) { - if (document.getElementById('serial_item_refresh_button')) document.getElementById('serial_item_refresh_button').focus(); - JSAN.use('util.file'); var file = new util.file('serial_items_prefs.'+obj.data.server_unadorned); - util.widgets.save_attributes(file, { 'serial_item_lib_menu' : [ 'value' ], 'mode_receive' : [ 'selected' ], 'mode_bind' : [ 'selected' ], 'serial_manage_items_show_all' : [ 'checked' ] }); + //if (document.getElementById('serial_item_refresh_button')) document.getElementById('serial_item_refresh_button').focus(); + obj.save_settings(); // get latest sdist id list based on library drowdown obj.set_sdist_ids(); obj.refresh_list('main'); @@ -90,6 +90,7 @@ serial.manage_items.prototype = { }, false ); + } else { throw(document.getElementById('catStrings').getString('staff.cat.copy_browser.missing_library') + '\n'); } @@ -100,6 +101,13 @@ serial.manage_items.prototype = { ml.value = org.id(); ml.setAttribute('value',ml.value); } + + // deal with mode radio selectedIndex, as load_attributes is setting a "read-only" value + if ($('mode_receive').getAttribute('selected')) { + $('serial_manage_items_mode').selectedIndex = 0; + } else { + $('serial_manage_items_mode').selectedIndex = 1; + } // setup recent sunits list var recent_sunits_file = new util.file('serial_items_recent_sunits_'+obj.docid+'.'+obj.data.server_unadorned); @@ -125,6 +133,30 @@ serial.manage_items.prototype = { obj.set_sdist_ids(); obj.init_lists(); + var mode_radio_group = $('serial_manage_items_mode'); + obj.set_mode(mode_radio_group.selectedItem.id.substr(5)); + mode_radio_group.addEventListener( + 'command', + function(ev) { + obj.save_settings(); + var mode = ev.target.id.substr(5); //strip out 'mode_' + obj.set_mode(mode); + obj.refresh_list('main'); + obj.refresh_list('workarea'); + }, + false + ); + $('serial_manage_items_show_all').addEventListener( + 'command', + function(ev) { + obj.save_settings(); + obj.set_mode(); + obj.refresh_list('main'); + obj.refresh_list('workarea'); + }, + false + ); + JSAN.use('util.controller'); obj.controller = new util.controller(); obj.controller.init( { @@ -242,6 +274,7 @@ serial.manage_items.prototype = { var sstr_id = target.getAttribute('sstr_id'); obj.set_sunit(sunit_id, label, sdist_id, sstr_id); obj.save_sunit(sunit_id, label, sdist_id, sstr_id); + if (obj.mode == 'bind') obj.refresh_list('workarea'); } catch(E) { obj.error.standard_unexpected_error_alert('cmd_set_sunit failed!',E); } @@ -251,6 +284,7 @@ serial.manage_items.prototype = { ['command'], function() { obj.set_other_sunit(); + if (obj.mode == 'bind') obj.refresh_list('workarea'); } ], 'cmd_predict_items' : [ @@ -273,14 +307,61 @@ serial.manage_items.prototype = { } ); + var method; var success_label; + if (obj.mode == 'receive') { + method = 'open-ils.serial.receive_items'; + success_label = 'received'; + } else { // bind mode + method = 'open-ils.serial.bind_items'; + success_label = 'bound'; + } + + // deal with barcodes for *NEW* units + var barcodes = {}; + if (obj.current_sunit_id < 0) { // **AUTO** or **NEW** units + new_unit_barcode = ''; + for (var i = 0; i < list.length; i++) { + var item = list[i]; + if (new_unit_barcode) { + barcodes[item.id()] = new_unit_barcode; + continue; + } + var prompt_text; + if (obj.current_sunit_id == -1) { + prompt_text = 'Please enter a barcode for '+item.issuance().label()+ ' from Distribution: '+item.stream().distribution().label()+'/'+item.stream().id()+':'; + } else { // must be -2 + prompt_text = 'Please enter a barcode for new unit:'; + } + var barcode = window.prompt(prompt_text, + '', + 'Unit Barcode Prompt'); + barcode = String( barcode ).replace(/\s/g,''); + /* Casting a possibly null input value to a String turns it into "null" */ + if (!barcode || barcode == 'null') { + alert('Invalid barcode entered, defaulting to system-generated.'); + barcode = 'auto'; + } + + var test = obj.network.simple_request('FM_ACP_RETRIEVE_VIA_BARCODE',[ barcode ]); + if (typeof test.ilsevent == 'undefined') { + alert('Another copy has barcode "' + barcode + '", defaulting to system-generated.'); + barcode = 'auto'; + } + barcodes[item.id()] = barcode; + if (obj.current_sunit_id == -2) { + new_unit_barcode = barcode; + } + } + } + var robj = obj.network.request( 'open-ils.serial', - 'open-ils.serial.receive_items', - [ ses(), list ] + method, + [ ses(), list, barcodes ] ); if (typeof robj.ilsevent != 'undefined') throw(robj); //TODO: catch for override - alert('Successfully received '+robj.num_items_received+' item(s)'); + alert('Successfully '+success_label+' '+robj.num_items+' item(s)'); if (obj.current_sunit_id == -2) { obj.current_sunit_id = robj.new_unit_id; @@ -319,7 +400,7 @@ serial.manage_items.prototype = { 'cmd_items_print' : [ ['command'], function() { obj.items_print(obj.selected_list); } ], 'cmd_items_export' : [ ['command'], function() { obj.items_export(obj.selected_list); } ], - 'cmd_refresh_list' : [ ['command'], function() { obj.refresh_list('main'); obj.refresh_list('workarea'); } ] + 'cmd_refresh_list' : [ ['command'], function() { obj.set_sdist_ids(); obj.refresh_list('main'); obj.refresh_list('workarea'); } ] } } ); @@ -472,6 +553,50 @@ serial.manage_items.prototype = { } }, + 'set_mode' : function(mode) { + var obj = this; + + if (!mode) { + mode = obj.mode; + } else { + obj.mode = mode; + } + + if (mode == 'receive') { + $('serial_workarea_mode_label').value = 'Recently Received'; + if ($('serial_manage_items_show_all').checked) { + obj.lists.main.sitem_retrieve_params = {}; + } else { + obj.lists.main.sitem_retrieve_params = {'date_received' : null }; + } + obj.lists.main.sitem_extra_params ={'order_by' : {'sitem' : 'date_expected ASC, stream ASC'}}; + + obj.lists.workarea.sitem_retrieve_params = {'date_received' : {"!=" : null}}; + obj.lists.workarea.sitem_extra_params ={'order_by' : {'sitem' : 'date_received DESC'}, 'limit' : 30}; + } else { // bind mode + $('serial_workarea_mode_label').value = 'Bound Items in Current Working Unit'; + if ($('serial_manage_items_show_all').checked) { + obj.lists.main.sitem_retrieve_params = {}; + } else { + obj.lists.main.sitem_retrieve_params = {'date_received' : {'!=' : null}, 'status' : {'!=' : 'Bindery'} }; + } + obj.lists.main.sitem_extra_params ={'order_by' : {'sitem' : 'date_expected ASC, stream ASC'}}; + + obj.lists.workarea.sitem_retrieve_params = {'status' : 'Bindery'}; // unit set dynamically in 'retrieve' + obj.lists.workarea.sitem_extra_params ={'order_by' : {'sitem' : 'date_received DESC'}}; + + // default to **NEW UNIT** + obj.set_sunit(-2, 'New Unit', '', ''); + } + }, + + 'save_settings' : function() { + var obj = this; + + JSAN.use('util.file'); var file = new util.file('serial_items_prefs.'+obj.data.server_unadorned); + util.widgets.save_attributes(file, { 'serial_item_lib_menu' : [ 'value' ], 'mode_receive' : [ 'selected' ], 'mode_bind' : [ 'selected' ], 'serial_manage_items_show_all' : [ 'checked' ] }); + }, + 'init_lists' : function() { var obj = this; @@ -540,12 +665,6 @@ serial.manage_items.prototype = { } } ); - if (document.getElementById('serial_manage_items_show_all').checked) { - obj.lists.main.sitem_retrieve_params = {}; - } else { - obj.lists.main.sitem_retrieve_params = {'date_received' : null }; - } - obj.lists.main.sitem_extra_params ={'order_by' : {'sitem' : 'date_expected ASC, stream ASC'}}; obj.lists.workarea = new util.list('workarea_tree'); obj.lists.workarea.init( @@ -574,21 +693,11 @@ serial.manage_items.prototype = { } } ); - obj.lists.workarea.sitem_retrieve_params = {'date_received' : {"!=" : null}}; - obj.lists.workarea.sitem_extra_params ={'order_by' : {'sitem' : 'date_received DESC'}, 'limit' : 30}; }, 'refresh_list' : function(list_name) { var obj = this; - // TODO: make this change on the checkbox command event? - if (list_name == 'main') { - if (document.getElementById('serial_manage_items_show_all').checked) { - delete obj.lists.main.sitem_retrieve_params.date_received; - } else { - obj.lists.main.sitem_retrieve_params.date_received = null; - } - } //TODO Optimize this? obj.retrieve(list_name); }, @@ -597,6 +706,8 @@ serial.manage_items.prototype = { var obj = this; var list = obj.lists[list_name]; + list.clear(); + if (!obj.sdist_ids.length) { // no sdists to retrieve items for return; } @@ -604,6 +715,11 @@ serial.manage_items.prototype = { var rparams = list.sitem_retrieve_params; var robj; rparams['+sstr'] = { "distribution" : obj.sdist_ids }; + + if (obj.mode == 'bind' && list_name == 'workarea') { + rparams['unit'] = obj.current_sunit_id; + } + var other_params = list.sitem_extra_params; other_params.join = 'sstr'; @@ -611,17 +727,14 @@ serial.manage_items.prototype = { 'FM_SITEM_ID_LIST', [ ses(), rparams, other_params ] ); - if (typeof robj.ilsevent!='undefined') { - obj.error.standard_unexpected_error_alert('Failed to retrieve serial item ID list',E); - } if (!robj) { robj = []; + } else if (typeof robj.ilsevent!='undefined') { + obj.error.standard_unexpected_error_alert('Failed to retrieve serial item ID list',E); } else if (!robj.length) { robj = [robj]; } - list.clear(); - for (i = 0; i < robj.length; i++) { list.append( { 'row' : { 'my' : { 'sitem_id' : robj[i] } }, 'to_bottom' : true, 'no_auto_select' : true } ); } diff --git a/Open-ILS/xul/staff_client/server/serial/manage_items.xul b/Open-ILS/xul/staff_client/server/serial/manage_items.xul index 5cd6baa3d6..c10c436ea3 100644 --- a/Open-ILS/xul/staff_client/server/serial/manage_items.xul +++ b/Open-ILS/xul/staff_client/server/serial/manage_items.xul @@ -51,6 +51,7 @@ vim:noet:sw=4:ts=4: