From bbe40c903a80ae3098fec19eb7ba8c34e81c1a21 Mon Sep 17 00:00:00 2001
From: Owen Leonard <oleonard@myacpl.org>
Date: Tue, 7 Jan 2020 13:03:18 +0000
Subject: [PATCH] Bug 13121: Move search results "action" links ("Place hold,"
 "Add tag," etc) into include file

This patch moves markup for controls repeated across several OPAC
templates into a single include: Place hold, Request article, Add tag,
Save to lists, and Add to cart.

To test, apply the patch and view the following OPAC pages:

 - Search results
 - Shelf contents view
 - User tags list

On each of these pages all the controls should work correctly:

 - Place hold
 - Request art
 - Add tag
 - Save to lists
 - Add to cart
---
 .../bootstrap/en/includes/title-actions-menu.inc   | 61 ++++++++++++++++++++++
 .../opac-tmpl/bootstrap/en/modules/opac-results.tt | 44 +---------------
 .../opac-tmpl/bootstrap/en/modules/opac-shelves.tt | 50 +-----------------
 .../opac-tmpl/bootstrap/en/modules/opac-tags.tt    |  2 +
 opac/opac-shelves.pl                               | 13 +++++
 opac/opac-tags.pl                                  | 20 +++++++
 6 files changed, 98 insertions(+), 92 deletions(-)
 create mode 100644 koha-tmpl/opac-tmpl/bootstrap/en/includes/title-actions-menu.inc

diff --git a/koha-tmpl/opac-tmpl/bootstrap/en/includes/title-actions-menu.inc b/koha-tmpl/opac-tmpl/bootstrap/en/includes/title-actions-menu.inc
new file mode 100644
index 00000000000..0de923f1b70
--- /dev/null
+++ b/koha-tmpl/opac-tmpl/bootstrap/en/includes/title-actions-menu.inc
@@ -0,0 +1,61 @@
+<div class="actions-menu noprint">
+    [% IF Koha.Preference( 'RequestOnOpac' ) == 1 %]
+        [% UNLESS ( items.norequests ) %]
+            [% IF Koha.Preference( 'opacuserlogin' ) == 1 %]
+                [% IF ( shelf AND op == 'view' ) # Lists view has more granular checking of hold availability %]
+                    [% IF ( items.allow_onshelf_holds ) %]
+                        <span class="actions"><a class="btn btn-link hold" href="/cgi-bin/koha/opac-reserve.pl?biblionumber=[% items.biblionumber | html %]"><i class="fa fa-fw fa-bookmark"></i> Place hold</a></span>
+                    [% ELSE %]
+                        [% IF ( items.itemsissued ) %]
+                            <span class="actions"><a class="btn btn-link hold" href="/cgi-bin/koha/opac-reserve.pl?biblionumber=[% items.biblionumber | html %]"><i class="fa fa-fw fa-bookmark"></i> Place hold</a></span>
+                        [% END %]
+                    [% END %]
+                [% ELSE %]
+                    <span class="actions"><a class="btn btn-link hold" href="/cgi-bin/koha/opac-reserve.pl?biblionumber=[% items.biblionumber | html %]"><i class="fa fa-fw fa-bookmark"></i> Place hold</a></span>
+                [% END %]
+            [% END # / IF opacuserlogin %]
+        [% END # / UNLESS items.norequests %]
+    [% END # / RequestOnOpac %]
+
+    [% IF ( Koha.Preference( 'opacuserlogin' ) == 1 ) %]
+        [% IF items.artreqpossible %]
+            <span class="actions"><a href="/cgi-bin/koha/opac-request-article.pl?biblionumber=[% items.biblionumber | uri %]" class="btn btn-link"><i class="fa fa-file-text"></i> Request article</a></span>
+        [% END %]
+    [% END %]
+
+    [% IF ( TagsInputEnabled ) %]
+        [% IF ( loggedinusername ) %]
+            <span class="actions"><a id="tag_add[% items.biblionumber | html %]" href="#" class="tag_add btn btn-link"><i class="fa fa-tag"></i> Add tag</a></span>
+            <div id="tagform[% items.biblionumber | html %]" class="tag_results_input" style="display:none;">
+                <label for="newtag[% items.biblionumber | html %]">New tag(s), separated by a comma:</label>
+                <input type="text" name="newtag[% items.biblionumber | html %]" id="newtag[% items.biblionumber | html %]" class="newtag" maxlength="100" />
+                <input name="tagbutton" class="btn btn-small tagbutton" title="[% items.biblionumber | html %]" type="submit" value="Add" />
+                <a class="cancel_tag_add" id="cancel[% items.biblionumber | html %]" href="#">(done)</a>
+            </div>
+            <span id="newtag[% items.biblionumber | html %]_status" class="tagstatus" style="display:none;">
+                Tag status here.
+            </span>
+        [% ELSE %]
+            <span class="actions"><span id="login4tags"><a class="btn btn-link loginModal-trigger" href="/cgi-bin/koha/opac-user.pl"><i class="fa fa-tag"></i> Log in to add tags</a></span></span>
+        [% END # IF loggedinusername %]
+    [% END # if TagsInputEnabled %]
+
+    [% IF ( ( Koha.Preference( 'opacuserlogin' ) == 1 ) && loggedinusername && ( Koha.Preference( 'virtualshelves' ) == 1 ) ) %]
+        [% IF ( shelf AND op == 'view' ) %]
+            <span class="actions"><a href="/cgi-bin/koha/opac-addbybiblionumber.pl?biblionumber=[% items.biblionumber | uri %]" onclick="Dopop('opac-addbybiblionumber.pl?biblionumber=[% items.biblionumber | uri %]'); return false;" class="btn btn-link"><i class="fa fa-list"></i> Save to another list</a></span>
+            [% IF can_remove_biblios %]
+                <span class="actions"><a class="btn btn-link removefromlist" href="/cgi-bin/koha/opac-shelves.pl?op=remove_biblios&amp;shelfnumber=[% shelf.shelfnumber | html %]&amp;biblionumber=[% items.biblionumber | html %]"><i class="fa fa-remove"></i> Remove from this list</a></span>
+            [% END %]
+        [% ELSE %]
+            <span class="actions"><a class="addtoshelf btn btn-link" href="/cgi-bin/koha/opac-addbybiblionumber.pl?biblionumber=[% items.biblionumber | html %]" onclick="Dopop('opac-addbybiblionumber.pl?biblionumber=[% items.biblionumber | html %]'); return false;"><i class="fa fa-list"></i> Save to lists</a></span>
+        [% END # /IF ( shelf AND op == 'view' ) %]
+    [% END # /IF Koha.Preference( 'opacuserlogin' ) %]
+
+    [% IF Koha.Preference( 'opacbookbag' ) == 1 %]
+        [% IF ( items.incart ) %]
+            <span class="actions"><a data-biblionumber="[% items.biblionumber | html %]" class="btn btn-link cart cart[% items.biblionumber | html %]" href="#"><i class="fa fa-shopping-cart"></i> In your cart</a> <a data-biblionumber="[% items.biblionumber | html %]" class="btn btn-link remove cartRemove cartR[% items.biblionumber | html %]" href="#">(remove)</a></span>
+        [% ELSE %]
+            <span class="actions"><a data-biblionumber="[% items.biblionumber | html %]" class="btn btn-link addtocart cart cart[% items.biblionumber | html %]" href="#"><i class="fa fa-shopping-cart"></i> Add to cart</a> <a style="display:none;" data-biblionumber="[% items.biblionumber | html %]" class="btn btn-link remove cartRemove cartR[% items.biblionumber | html %]" href="#">(remove)</a></span>
+        [% END %]
+    [% END # / IF opacbookbag %]
+</div>
\ No newline at end of file
diff --git a/koha-tmpl/opac-tmpl/bootstrap/en/modules/opac-results.tt b/koha-tmpl/opac-tmpl/bootstrap/en/modules/opac-results.tt
index 2ad3ee9d683..52371ee7feb 100644
--- a/koha-tmpl/opac-tmpl/bootstrap/en/modules/opac-results.tt
+++ b/koha-tmpl/opac-tmpl/bootstrap/en/modules/opac-results.tt
@@ -536,50 +536,8 @@
                                                     </div> <!-- / .results_summary -->
                                                 [% END # / IF OpacStarRatings %]
 
-                                                <div class="actions-menu noprint">
-                                                        [% IF Koha.Preference( 'RequestOnOpac' ) == 1 %]
-                                                            [% UNLESS ( SEARCH_RESULT.norequests ) %]
-                                                                [% IF ( Koha.Preference( 'opacuserlogin' ) == 1 ) %]
-                                                                    <span class="actions"><a href="/cgi-bin/koha/opac-reserve.pl?biblionumber=[% SEARCH_RESULT.biblionumber | uri %]" class="btn btn-link"><i class="fa fa-bookmark"></i> Place hold</a></span><!-- add back when available 0 holds in queue-->
-                                                                [% END # / IF opacuserlogin && holdable %]
-                                                            [% END # UNLESS SEARCH_RESULT.norequests %]
-                                                        [% END # IF RequestOnOpac %]
-
-                                                        [% IF ( Koha.Preference( 'opacuserlogin' ) == 1 ) %]
-                                                            [% IF SEARCH_RESULT.artreqpossible %]
-                                                                <span class="actions"><a href="/cgi-bin/koha/opac-request-article.pl?biblionumber=[% SEARCH_RESULT.biblionumber | uri %]" class="btn btn-link"><i class="fa fa-file-text"></i> Request article</a></span>
-                                                            [% END %]
-                                                        [% END %]
-
-                                                        [% IF ( TagsInputEnabled ) %]
-                                                            [% IF ( loggedinusername ) %]
-                                                                <span class="actions"><a id="tag_add[% SEARCH_RESULT.biblionumber | html %]" href="#" class="tag_add btn btn-link"><i class="fa fa-tag"></i> Add tag</a></span>
-                                                                <div id="tagform[% SEARCH_RESULT.biblionumber | html %]" class="tag_results_input" style="display:none;">
-                                                                        <label for="newtag[% SEARCH_RESULT.biblionumber | html %]">New tag(s), separated by a comma:</label>
-                                                                        <input type="text" name="newtag[% SEARCH_RESULT.biblionumber | html %]" id="newtag[% SEARCH_RESULT.biblionumber | html %]" class="newtag" maxlength="100" />
-                                                                        <input name="tagbutton" class="btn btn-small tagbutton" title="[% SEARCH_RESULT.biblionumber | html %]" type="submit" value="Add" />
-                                                                        <a class="cancel_tag_add" id="cancel[% SEARCH_RESULT.biblionumber | html %]" href="#">(done)</a>
-                                                                </div>
-                                                                <span id="newtag[% SEARCH_RESULT.biblionumber | html %]_status" class="tagstatus" style="display:none;">
-                                                                    Tag status here.
-                                                                </span>
-                                                            [% ELSE %]
-                                                                <span class="actions"><span id="login4tags"><a class="btn btn-link loginModal-trigger" href="/cgi-bin/koha/opac-user.pl"><i class="fa fa-tag"></i> Log in to add tags</a></span></span>
-                                                            [% END # IF loggedinusername %]
-                                                        [% END # if TagsInputEnabled %]
-
-                                                        [% IF ( ( Koha.Preference( 'opacuserlogin' ) == 1 ) && loggedinusername && ( Koha.Preference( 'virtualshelves' ) == 1 ) ) %]
-                                                            <span class="actions"><a href="/cgi-bin/koha/opac-addbybiblionumber.pl?biblionumber=[% SEARCH_RESULT.biblionumber | uri %]" onclick="Dopop('opac-addbybiblionumber.pl?biblionumber=[% SEARCH_RESULT.biblionumber | uri %]'); return false;" class="btn btn-link"><i class="fa fa-list"></i> Save to lists</a></span>
-                                                        [% END %]
+                                                    [% INCLUDE 'title-actions-menu.inc' items=SEARCH_RESULT %]
 
-                                                        [% IF Koha.Preference( 'opacbookbag' ) == 1 %]
-                                                            [% IF ( SEARCH_RESULT.incart ) %]
-                                                                <span class="actions"><a data-biblionumber="[% SEARCH_RESULT.biblionumber | html %]" class="btn btn-link cart cart[% SEARCH_RESULT.biblionumber | html %]" href="#"><i class="fa fa-shopping-cart"></i> In your cart</a> <a data-biblionumber="[% SEARCH_RESULT.biblionumber | html %]" class="btn btn-link remove cartRemove cartR[% SEARCH_RESULT.biblionumber | html %]" href="#">(remove)</a></span>
-                                                            [% ELSE %]
-                                                                <span class="actions"><a data-biblionumber="[% SEARCH_RESULT.biblionumber | html %]" class="btn btn-link addtocart cart cart[% SEARCH_RESULT.biblionumber | html %]" href="#"><i class="fa fa-shopping-cart"></i> Add to cart</a> <a style="display:none;" data-biblionumber="[% SEARCH_RESULT.biblionumber | html %]" class="btn btn-link remove cartRemove cartR[% SEARCH_RESULT.biblionumber | html %]" href="#">(remove)</a></span>
-                                                            [% END %]
-                                                        [% END # / IF opacbookbag %]
-                                                </div>
                                                 </div>
                                                 [% INCLUDE "openlibrary-readapi.inc" bib = SEARCH_RESULT %]
 
diff --git a/koha-tmpl/opac-tmpl/bootstrap/en/modules/opac-shelves.tt b/koha-tmpl/opac-tmpl/bootstrap/en/modules/opac-shelves.tt
index d7428efc73c..ca5a753c334 100644
--- a/koha-tmpl/opac-tmpl/bootstrap/en/modules/opac-shelves.tt
+++ b/koha-tmpl/opac-tmpl/bootstrap/en/modules/opac-shelves.tt
@@ -463,55 +463,7 @@
                                                         </div>
                                                     [% END %]
 
-                                                    <span class="results_summary">
-
-                                                        [% IF Koha.Preference( 'RequestOnOpac' ) == 1 %]
-                                                            [% UNLESS ( itemsloo.norequests ) %]
-                                                                [% IF Koha.Preference( 'opacuserlogin' ) == 1 %]
-                                                                    [% IF ( itemsloo.allow_onshelf_holds ) %]
-                                                                        <span class="actions"><a class="btn btn-link hold" href="/cgi-bin/koha/opac-reserve.pl?biblionumber=[% itemsloo.biblionumber | html %]"><i class="fa fa-fw fa-bookmark"></i> Place hold</a><!-- add back when available 0 holds in queue--></span>
-                                                                    [% ELSE %]
-                                                                        [% IF ( itemsloo.itemsissued ) %]
-                                                                            <span class="actions"><a class="hold" href="/cgi-bin/koha/opac-reserve.pl?biblionumber=[% itemsloo.biblionumber | html %]"><i class="fa fa-fw fa-bookmark"></i> Place hold</a><!-- add back when available 0 holds in queue--></span>
-                                                                        [% END %]
-                                                                    [% END %]
-                                                                [% END # / IF opacuserlogin %]
-                                                            [% END # / UNLESS itemsloo.norequests %]
-                                                        [% END # / RequestOnOpac %]
-
-                                                        [% IF ( TagsInputEnabled ) %]
-                                                            [% IF ( loggedinusername ) %]
-                                                                <span class="actions"><a class="btn btn-link tag_add hidden" id="tag_add[% itemsloo.biblionumber | html %]" href="#"><i class="fa fa-fw fa-tag"></i> Add tag</a></span>
-                                                                <div id="tagform[% itemsloo.biblionumber | html %]" class="tag_results_input" style="display:none;">
-                                                                    <label for="newtag[% itemsloo.biblionumber | html %]">New tag(s), separated by a comma:</label>
-                                                                    <input type="text" name="newtag[% itemsloo.biblionumber | html %]" id="newtag[% itemsloo.biblionumber | html %]" maxlength="100" />
-                                                                    <input name="tagbutton" class="tagbutton btn btn-small" title="[% itemsloo.biblionumber | html %]" type="submit" value="Add" />
-                                                                    <a class="cancel_tag_add" id="cancel[% itemsloo.biblionumber | html %]" href="#">(done)</a>
-                                                                </div>
-                                                                <div id="newtag[% itemsloo.biblionumber | html %]_status" class="tagstatus" style="display:none;">
-                                                                Tag status here.
-                                                                </div>
-                                                            [% ELSIF ( loop.first ) %]
-                                                                <span class="tagstatus" id="login4tags">Log in to add tags.</span>
-                                                            [% END # / IF loggedinusername %]
-                                                        [% END # / IF TagsInputEnabled %]
-
-                                                        [% IF ( ( Koha.Preference( 'opacuserlogin' ) == 1 ) && loggedinusername && ( Koha.Preference( 'virtualshelves' ) == 1 ) ) %]
-                                                            <span class="actions"><a class="btn btn-link addtoshelf" href="/cgi-bin/koha/opac-addbybiblionumber.pl?biblionumber=[% itemsloo.biblionumber | uri %]" onclick="Dopop('opac-addbybiblionumber.pl?biblionumber=[% itemsloo.biblionumber | uri %]'); return false;"><i class="fa fa-fw fa-list"></i> Save to another list</a></span>
-                                                        [% END %]
-
-                                                        [% IF can_remove_biblios %]
-                                                            <span class="actions"><a class="btn btn-link btn-disabled remove removefromlist" href="/cgi-bin/koha/opac-shelves.pl?op=remove_biblios&amp;shelfnumber=[% shelf.shelfnumber | html %]&amp;biblionumber=[% itemsloo.biblionumber | html %]"><i class="fa fa-fw fa-remove"></i> Remove from this list</a></span>
-                                                        [% END %]
-
-                                                        [% IF Koha.Preference( 'opacbookbag' ) == 1 %]
-                                                            [% IF ( itemsloo.incart ) %]
-                                                                <span class="actions"><a data-biblionumber="[% itemsloo.biblionumber | html %]" class="btn btn-link addtocart cart[% itemsloo.biblionumber | html %] hidden" href="#"><i class="fa fa-fw fa-shopping-cart"></i> In your cart</a> <a data-biblionumber="[% itemsloo.biblionumber | html %]" class="btn btn-link cartRemove cartR[% itemsloo.biblionumber | html %] hidden" href="#">(remove)</a></span>
-                                                            [% ELSE %]
-                                                                <span class="actions"><a data-biblionumber="[% itemsloo.biblionumber | html %]" class="btn btn-link addtocart cart[% itemsloo.biblionumber | html %] hidden" href="#"><i class="fa fa-fw fa-shopping-cart"></i> Add to cart</a> <a style="display:none;" data-biblionumber="[% itemsloo.biblionumber | html %]" class="btn btn-link cartRemove cartR[% itemsloo.biblionumber | html %] hidden" href="#">(remove)</a></span>
-                                                            [% END %]
-                                                        [% END # / IF opacbookbag %]
-                                                    </span> <!-- / .results_summary .actions -->
+                                                    [% INCLUDE 'title-actions-menu.inc' items=itemsloo %]
 
                                                     <!-- COinS / Openurl -->
                                                     <span class="Z3988" title="[% itemsloo.coins | html %]"></span>
diff --git a/koha-tmpl/opac-tmpl/bootstrap/en/modules/opac-tags.tt b/koha-tmpl/opac-tmpl/bootstrap/en/modules/opac-tags.tt
index d5938ecfde4..5b319cefef6 100644
--- a/koha-tmpl/opac-tmpl/bootstrap/en/modules/opac-tags.tt
+++ b/koha-tmpl/opac-tmpl/bootstrap/en/modules/opac-tags.tt
@@ -155,6 +155,8 @@
                                                         by [% MY_TAG.author | html %]
                                                     [% END %]
                                                 [% END # /IF MY_TAG.XSLTBloc %]
+
+                                                [% INCLUDE 'title-actions-menu.inc' items=MY_TAG %]
                                             </td>
                                             <td>
                                                 <span title="[% MY_TAG.date_created | html %]">
diff --git a/opac/opac-shelves.pl b/opac/opac-shelves.pl
index f671f1f3f11..06875d2dfef 100755
--- a/opac/opac-shelves.pl
+++ b/opac/opac-shelves.pl
@@ -267,12 +267,23 @@ if ( $op eq 'view' ) {
 
             my $patron = Koha::Patrons->find( $loggedinuser );
 
+            my $categorycode; # needed for may_article_request
+            if( C4::Context->preference('ArticleRequests') ) {
+                $categorycode = $patron ? $patron->categorycode : undef;
+            }
+
             # Lists display falls back to search results configuration
             my $xslfile = C4::Context->preference('OPACXSLTListsDisplay');
             my $lang   = $xslfile ? C4::Languages::getlanguage()  : undef;
             my $sysxml = $xslfile ? C4::XSLT::get_xslt_sysprefs() : undef;
 
             my $record_processor = Koha::RecordProcessor->new({ filters => 'ViewPolicy' });
+
+            my $art_req_itypes;
+            if( C4::Context->preference('ArticleRequests') ) {
+                $art_req_itypes = Koha::IssuingRules->guess_article_requestable_itemtypes({ $patron ? ( categorycode => $patron->categorycode ) : () });
+            }
+
             my @items;
             while ( my $content = $contents->next ) {
                 my $biblionumber = $content->biblionumber;
@@ -304,6 +315,8 @@ if ( $op eq 'view' ) {
                 $this_item->{'normalized_ean'}  = GetNormalizedEAN( $record, $marcflavour );
                 $this_item->{'normalized_oclc'} = GetNormalizedOCLCNumber( $record, $marcflavour );
                 $this_item->{'normalized_isbn'} = GetNormalizedISBN( undef, $record, $marcflavour );
+                # BZ17530: 'Intelligent' guess if result can be article requested
+                $this_item->{artreqpossible} = ( $art_req_itypes->{ $this_item->{itemtype} // q{} } || $art_req_itypes->{ '*' } ) ? 1 : q{};
 
                 unless ( defined $this_item->{size} ) {
 
diff --git a/opac/opac-tags.pl b/opac/opac-tags.pl
index bc5ac8a9e3d..44a38355c1c 100755
--- a/opac/opac-tags.pl
+++ b/opac/opac-tags.pl
@@ -236,6 +236,20 @@ if ($loggedinuser) {
     $should_hide = ( $should_hide =~ /\S/ ) ? 1 : 0;
     $my_tags = get_tag_rows({borrowernumber=>$loggedinuser});
     my $my_approved_tags = get_approval_rows({ approved => 1 });
+
+    my $art_req_itypes;
+    if( C4::Context->preference('ArticleRequests') ) {
+        $art_req_itypes = Koha::IssuingRules->guess_article_requestable_itemtypes({ $patron ? ( categorycode => $patron->categorycode ) : () });
+    }
+
+    # get biblionumbers stored in the cart
+    my @cart_list;
+
+    if($query->cookie("bib_list")){
+        my $cart_list = $query->cookie("bib_list");
+        @cart_list = split(/\//, $cart_list);
+    }
+
     foreach my $tag (@$my_tags) {
         $tag->{visible} = 0;
         my $biblio = Koha::Biblios->find( $tag->{biblionumber} );
@@ -262,6 +276,8 @@ if ($loggedinuser) {
         $tag->{part_number} = $biblio->part_number;
         $tag->{part_name} = $biblio->part_name;
         $tag->{author} = $biblio->author;
+        # BZ17530: 'Intelligent' guess if result can be article requested
+        $tag->{artreqpossible} = ( $art_req_itypes->{ $tag->{itemtype} // q{} } || $art_req_itypes->{ '*' } ) ? 1 : q{};
 
         my $xslfile = C4::Context->preference('OPACXSLTResultsDisplay');
         my $lang   = $xslfile ? C4::Languages::getlanguage()  : undef;
@@ -279,6 +295,10 @@ if ($loggedinuser) {
         $tag->{time_created_display} = $1;
         $tag->{approved} = ( grep { $_->{term} eq $tag->{term} and $_->{approved} } @$my_approved_tags );
         $tag->{visible} = 1;
+        # while we're checking each line, see if item is in the cart
+        if ( grep {$_ eq $biblio->biblionumber} @cart_list) {
+            $tag->{incart} = 1;
+        }
     }
 }
 
-- 
2.11.0