LP#1673857: teach catalog how to search and display copy tags
authorGalen Charlton <gmc@equinoxinitiative.org>
Wed, 29 Mar 2017 20:15:31 +0000 (16:15 -0400)
committerGalen Charlton <gmc@equinoxinitiative.org>
Mon, 24 Jul 2017 15:29:03 +0000 (11:29 -0400)
When the opac.search.enable_bookplate_search library setting is
set to true, the catalog will display a "Digital Bookplates" search
field in the drop-downs on both the search bar and the advanced search
page. Using this will add a "copy_tag(*, search_terms)" filter
to the search, i.e., all visible copy tags will be searched regardless
of type.  Users can also use the copy_tag() search filter directly.

Visible copy tags are displayed in the copy table in the record
summary page. Note that copy tags are displayed regardless of whether
or not opac.search.enable_bookplate_search is on or off.

Mike Rylander also contributed to this patch.

Signed-off-by: Galen Charlton <gmc@equinoxinitiative.org>
Signed-off-by: Josh Stompro <stomproj@larl.org>
Signed-off-by: Galen Charlton <gmc@equinoxinitiative.org>
Open-ILS/src/perlmods/lib/OpenILS/WWW/EGCatLoader/Record.pm
Open-ILS/src/perlmods/lib/OpenILS/WWW/EGCatLoader/Search.pm
Open-ILS/src/templates/opac/css/style.css.tt2
Open-ILS/src/templates/opac/parts/qtype_selector.tt2
Open-ILS/src/templates/opac/parts/record/copy_table.tt2

index 114de0c..a7f56a2 100644 (file)
@@ -102,6 +102,7 @@ sub load_record {
     $ctx->{copies} = $copy_rec->gather(1);
 
     # Add public copy notes to each copy - and while we're in there, grab peer bib records
+    # and copy tags
     my %cached_bibs = ();
     foreach my $copy (@{$ctx->{copies}}) {
         $copy->{notes} = $U->simplereq(
@@ -110,6 +111,19 @@ sub load_record {
             {itemid => $copy->{id}, pub => 1 }
         );
         $self->timelog("past copy note retrieval call");
+        my $meth = 'open-ils.circ.copy_tags.retrieve';
+        $meth .= ".staff" if $ctx->{is_staff};
+        $copy->{tags} = $U->simplereq(
+            'open-ils.circ',
+            $meth,
+            {
+                ($ctx->{is_staff} ? (authtoken => $ctx->{authtoken}) : ()),
+                copy_id  => $copy->{id},
+                scope    => $org,
+                depth    => $copy_depth,
+            }
+        );
+        $self->timelog("past copy tag retrieval call");
         $copy->{peer_bibs} = $U->simplereq(
             'open-ils.search',
             'open-ils.search.multi_home.bib_ids.by_barcode',
index 72faa1c..fa72bc9 100644 (file)
@@ -20,11 +20,21 @@ sub _prepare_biblio_search_basics {
     $parts{$_} = [ $cgi->param($_) ] for (@part_names);
 
     my $full_query = '';
+    my @bookplate_queries = ();
     for (my $i = 0; $i < scalar @{$parts{'qtype'}}; $i++) {
         my ($qtype, $contains, $query, $bool) = map { $parts{$_}->[$i] } @part_names;
 
         next unless $query =~ /\S/;
 
+        # Hack for bookplates; "bookplate" is not a real search
+        # class, so grabbing them out of the advanced search query
+        # params to convert to a copy_tag(*,...) filter later
+        if ($qtype eq 'bookplate') {
+            $query =~ s/[)(]/ /g; # don't break on 'foo(bar)baz'
+            push @bookplate_queries, $query;
+            next;
+        }
         # Hack for journal title
         my $jtitle = 0;
         if ($qtype eq 'jtitle') {
@@ -63,15 +73,23 @@ sub _prepare_biblio_search_basics {
         $full_query = $full_query ? "($full_query $bool $query)" : $query;
     }
 
-    return $full_query;
+    return $full_query, \@bookplate_queries;
 }
 
 sub _prepare_biblio_search {
     my ($cgi, $ctx) = @_;
 
     # XXX This will still contain the jtitle hack...
-    my $user_query = _prepare_biblio_search_basics($cgi) || '';
+    my ($user_query, $bookplate_queries) = _prepare_biblio_search_basics($cgi);
+    $user_query //= '';
+    $bookplate_queries //= [];
     my $query = $user_query;
+    if (@$bookplate_queries) {
+        $query .= " " . join(" ", map { "copy_tag(*,$_)" } @$bookplate_queries);
+        # hack to handle the case where a bookplate comes from the
+        # simple search box
+        $user_query = $bookplate_queries->[0] if $user_query eq '';
+    }
 
     $query .= ' ' . $ctx->{global_search_filter} if $ctx->{global_search_filter};
 
index a8884db..226b294 100644 (file)
@@ -714,6 +714,15 @@ div.format_icon {
     word-wrap:normal;
 }
 
+#rdetails_status tbody td.copy_tag {
+    border-color: [% css_colors.primary %];
+    border-style: dashed;
+    border-width: 2px;
+}
+#rdetails_status tbody .copy_tag_value {
+    font-weight: bolder;
+}
+
 .rdetail_extras {
     background-color: [% css_colors.primary_fade %];
     border: 1px solid [% css_colors.primary %];
index 4ed9e63..ff3247e 100644 (file)
@@ -5,7 +5,13 @@
     {value => "author", label => l("Author"), plural_label => l("Authors"), browse => 1},
     {value => "subject", label => l("Subject"), plural_label => l("Subjects"), browse => 1},
     {value => "series", label => l("Series"), plural_label => l("Series"), browse => 1}
-] %]
+];
+    IF  ctx.get_org_setting(ctx.search_ou, 'opac.search.enable_bookplate_search');
+        query_types.push(
+            {value => "bookplate", label => l("Digital Bookplate"), plural_label => l("Digital Bookplates")}
+        );
+    END;
+-%]
 <select name="[% name || 'qtype' %]"[% IF id; ' id="'; id ; '"' ; END -%]
     title="[% l('Select query type:') %]">
     [%  query_type = query_type || CGI.param('qtype') || search.default_qtypes.0;
index 3205b0e..8636fe9 100644 (file)
@@ -231,6 +231,17 @@ END; # FOREACH bib
             [% END %]
         [% END %]
 
+        [% IF copy_info.tags; %]
+            [% FOREACH tag IN copy_info.tags; %]
+                <tr class="copy_tag_row">
+                    <td>&nbsp;</td>
+                    <td class="copy_tag" colspan="4"</td>
+                        <span class="copy_tag_value">[% tag.value | html %]</span>
+                    </td>
+                <tr>
+            [% END %]
+        [% END %]
+
 <tr><td>
 [%- IF copy_info.peer_bib_marc.size > 1;
 '<ul>';