From c8fd07b3a9768dc6d80a6d490c12069c214dcfdf Mon Sep 17 00:00:00 2001
From: Jonathan Druart <jonathan.druart@biblibre.com>
Date: Mon, 23 Mar 2015 14:43:24 +0100
Subject: [PATCH] Bug 13894: Make reserve.pl not using C4::Members::Search

Important note: This will modify the UI.
The patron list will now be displayed in a table (instead of a select).

Test plan:
1/ Place a hold on a record
2/ Search for a patron
3/ Select a patron and submit
4/ The hold workflow should continue as previously

No beviavior changes should be observed.
---
 C4/Utils/DataTables/Members.pm                     |  2 +-
 .../prog/en/modules/reserve/request.tt             | 60 +++++++++++++++++-----
 reserve/request.pl                                 | 29 +++++++----
 3 files changed, 68 insertions(+), 23 deletions(-)

diff --git a/C4/Utils/DataTables/Members.pm b/C4/Utils/DataTables/Members.pm
index c9ad109..767fc46 100644
--- a/C4/Utils/DataTables/Members.pm
+++ b/C4/Utils/DataTables/Members.pm
@@ -37,7 +37,7 @@ sub search {
         borrowers.address2, borrowers.city, borrowers.state, borrowers.zipcode,
         borrowers.country, cardnumber, borrowers.dateexpiry,
         borrowers.borrowernotes, borrowers.branchcode, borrowers.email,
-        borrowers.userid, borrowers.dateofbirth,
+        borrowers.userid, borrowers.dateofbirth, borrowers.categorycode,
         categories.description AS category_description, categories.category_type,
         branches.branchname";
     my $from = "FROM borrowers
diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/reserve/request.tt b/koha-tmpl/intranet-tmpl/prog/en/modules/reserve/request.tt
index db044b5..04023d3 100644
--- a/koha-tmpl/intranet-tmpl/prog/en/modules/reserve/request.tt
+++ b/koha-tmpl/intranet-tmpl/prog/en/modules/reserve/request.tt
@@ -6,6 +6,8 @@
     <title>Koha &rsaquo; Circulation &rsaquo; Holds &rsaquo; Confirm holds</title>
 [% END %]
 [% INCLUDE 'doc-head-close.inc' %]
+<link rel="stylesheet" type="text/css" href="[% themelang %]/css/datatables.css" />
+[% INCLUDE 'datatables.inc' %]
 [% INCLUDE 'calendar.inc' %]
 <script type="text/javascript">
     // <![CDATA[
@@ -24,6 +26,23 @@ $(document).ready(function() {
     [% IF AutoResumeSuspendedHolds %]
         $(".suspend_until_datepicker, .datepickerfrom, .datepickerto").datepicker("option", "minDate", 1);
     [% END %]
+
+    var table = $("#table_borrowers").dataTable($.extend(true, {}, dataTablesDefaults, {
+        "aoColumnDefs": [
+            { "aTargets": [ 0 ], "bSortable": false, "bSearchable": false },
+        ],
+        "aaSorting": [[ 2, "asc" ]],
+        "sDom": "t",
+        "iDisplayLength": -1
+    }));
+    $(table).find('tbody tr').filter(':has(:radio:checked)').end().click(function(event) {
+        $('#table_borrowers tbody tr').removeClass('selected');
+        $(this).addClass('selected');
+        if (event.target.type !== 'radio') {
+            $(':radio', this).attr('checked', 'true')
+        }
+    });
+
 });
 
 function check() {
@@ -144,7 +163,7 @@ function checkMultiHold() {
 
     $('#hold-request-form').preventDoubleFormSubmit();
 
-[% UNLESS ( borrowernumber || borrower_list || noitems ) %]
+[% UNLESS ( borrowernumber || borrowers || noitems ) %]
     [% IF ( CircAutocompl ) %]
     $( "#patron" ).autocomplete({
         source: "/cgi-bin/koha/circ/ysearch.pl",
@@ -218,7 +237,7 @@ function checkMultiHold() {
       <div class="dialog alert"><h3>Patron not found</h3><p>No patron with this name, please, try another</p> </div>
     [% END %]
     <form  id="holds_patronsearch" action="request.pl?biblionumber=[% biblionumber %]" method="post">
-        [% UNLESS borrower_list %]
+        [% UNLESS borrowers %]
             <fieldset class="brief">
                 <label for="patron">Patron: </label>
                 <div class="hint">Enter patron card number or partial name:</div>
@@ -228,16 +247,33 @@ function checkMultiHold() {
             </fieldset>
         [% ELSE %]
           <fieldset>
-            <select size="7" name="borrowernumber">
-            [% FOREACH borrower IN borrower_list %]
-                <option value="[% borrower.borrowernumber %]">
-[% borrower.surname -%], [% borrower.firstname -%]
- ... ( [% borrower.cardnumber -%] - [% borrower.categorycode -%] - [% borrower.branchcode %]
-) ... [% borrower.address %]
-                </option>
-            [% END %]
-            </select>
-            <input type="hidden" name="biblionumber" value="[% biblionumber %]" /><fieldset class="action"><input type="submit" value="Select" /></fieldset></fieldset>
+            <table id="table_borrowers">
+                <thead>
+                    <tr>
+                        <th></th>
+                        <th>Name</th>
+                        <th>Cardnumber</th>
+                        <th>Category</th>
+                        <th>Library</th>
+                        <th>Address</th>
+                    </tr>
+                </thead>
+                <tbody>
+                    [% FOREACH borrower IN borrowers %]
+                    <tr>
+                        <td><input type="radio" name="borrowernumber" value="[% borrower.borrowernumber %]" /></td>
+                        <td>[% borrower.surname %], [% borrower.firstname %]</td>
+                        <td>[% borrower.cardnumber %]</td>
+                        <td>[% borrower.categorycode %]</td>
+                        <td>[% borrower.branchcode %]</td>
+                        <td>[% borrower.address %]</td>
+                    </tr>
+                    [% END %]
+                </tbody>
+            </table>
+            <input type="hidden" name="biblionumber" value="[% biblionumber %]" />
+            <fieldset class="action"><input type="submit" value="Select" /></fieldset>
+          </fieldset>
 
         [% END %]
         [% IF ( multi_hold ) %]
diff --git a/reserve/request.pl b/reserve/request.pl
index ce0e70f..abac090 100755
--- a/reserve/request.pl
+++ b/reserve/request.pl
@@ -40,6 +40,7 @@ use C4::Items;
 use C4::Koha;
 use C4::Circulation;
 use C4::Dates qw/format_date/;
+use C4::Utils::DataTables::Members;
 use C4::Members;
 use C4::Search;		# enabled_staff_search_views
 use Koha::DateUtils;
@@ -102,17 +103,25 @@ if ( $action eq 'move' ) {
 }
 
 if ($findborrower) {
-    my $borrowers = Search($findborrower, 'cardnumber');
-
-    if ($borrowers && @$borrowers) {
-        if ( @$borrowers == 1 ) {
-            $borrowernumber_hold = $borrowers->[0]->{'borrowernumber'};
-        }
-        else {
-            $template->param( borrower_list => sort_borrowerlist($borrowers));
-        }
+    my $borrower = C4::Members::GetMember( cardnumber => $findborrower );
+    if ( $borrower ) {
+        $borrowernumber_hold = $borrower->{borrowernumber};
     } else {
-        $messageborrower = "'$findborrower'";
+        my $dt_params = { iDisplayLength => -1 };
+        my $results = C4::Utils::DataTables::Members::search(
+            {
+                searchmember => $findborrower,
+                dt_params => $dt_params,
+            }
+        );
+        my $borrowers = $results->{patrons};
+        if ( scalar @$borrowers == 1 ) {
+            $borrowernumber_hold = $borrower->[0]->{borrowernumber};
+        } elsif ( @$borrowers ) {
+            $template->param( borrowers => $borrowers );
+        } else {
+            $messageborrower = "'$findborrower'";
+        }
     }
 }
 
-- 
2.1.0