From 3d58b60a2c7452f301625ffc056541ca58ef97d3 Mon Sep 17 00:00:00 2001 From: Alex Buckley Date: Thu, 8 Mar 2018 19:26:50 +0000 Subject: [PATCH] Bug 20346 - Amended Server side patron filtering The number of results returned has been fixed so it is not affected by what the user sets for the number of records they want displayed on each page. In addition to ensuring all matching patrons are returned no matter what the numberof patrons to be displayed on each page is, filtering also takes place over all returned patrons and not just those displayed on the current page this ensures filtering finds all matching patrons. Test plan: The same as the previous bug 20346 patch Sponsored-By: Catalyst IT --- svc/members/search | 69 +++++++++++++++++++++++++++++++++++++----------------- 1 file changed, 48 insertions(+), 21 deletions(-) diff --git a/svc/members/search b/svc/members/search index a1d2f72..fcce3b1 100755 --- a/svc/members/search +++ b/svc/members/search @@ -26,7 +26,6 @@ use C4::Utils::DataTables qw( dt_get_params ); use C4::Utils::DataTables::Members qw( search ); use Koha::DateUtils qw( output_pref dt_from_string ); use Koha::Patrons; -use Data::Dumper; use Time::Piece; use JSON::XS qw( ); use HTML::Entities qw( encode_entities ); @@ -77,18 +76,49 @@ if ( $searchmember } if $member; } -# Perform the patrons search -$results = C4::Utils::DataTables::Members::search( - { - searchmember => $first_query, - firstletter => $firstletter, - categorycode => $categorycode, - branchcode => $branchcode, - searchtype => $searchtype, - searchfieldstype => $searchfieldstype, - dt_params => \%dt_params, - } -) unless $results; +my $filterable_results; +if ($searchmember ne $first_query) { + # Perform the patrons search + $results = C4::Utils::DataTables::Members::search( + { + searchmember => $first_query, + firstletter => $firstletter, + categorycode => $categorycode, + branchcode => $branchcode, + searchtype => $searchtype, + searchfieldstype => $searchfieldstype, + dt_params => \%dt_params, + } + ) unless $results; + my $value_to_display = $dt_params{'iDisplayLength'}; + $dt_params{'iDisplayLength'} = -1; + + # Retreive all patrons matching the $first_query value. These will be filtered + $filterable_results = C4::Utils::DataTables::Members::search( + { + searchmember => $first_query, + firstletter => $firstletter, + categorycode => $categorycode, + branchcode => $branchcode, + searchtype => $searchtype, + searchfieldstype => $searchfieldstype, + dt_params => \%dt_params, + } + ) unless $filterable_results; +} else { + # Perform the patrons search + $results = C4::Utils::DataTables::Members::search( + { + searchmember => $first_query, + firstletter => $firstletter, + categorycode => $categorycode, + branchcode => $branchcode, + searchtype => $searchtype, + searchfieldstype => $searchfieldstype, + dt_params => \%dt_params, + } + ) unless $results; +} # It is not recommanded to use the has_permission param if you use the pagination # The filter is done AFTER requested the data @@ -115,13 +145,12 @@ $results = C4::Utils::DataTables::Members::search( } my $date_format = C4::Context->preference("dateformat"); - if ($searchmember) { + if ($searchmember ne $first_query) { my @filtered_patron_list; my $count; - for my $patron ( @{ $results->{patrons} } ) { + for my $patron ( @{ $filterable_results->{patrons} } ) { my $match; for my $value (values $patron) { - warn $value; my $lc_patron_value = lc $value; my $lc_searchmember = lc $searchmember; @@ -138,14 +167,10 @@ $results = C4::Utils::DataTables::Members::search( } } - warn $lc_patron_value; - warn $lc_searchmember; if ($searchtype eq "start_with") { #Find a match starting with the start of a value in the patron record if (index($lc_patron_value, $lc_searchmember) == 0) { $match = 1; - warn $lc_patron_value; - warn $lc_searchmember; } } else { if (($lc_patron_value) =~ /($lc_searchmember)/) { @@ -159,7 +184,9 @@ $results = C4::Utils::DataTables::Members::search( } } $results->{patrons} = \@filtered_patron_list; - $results->{iTotalDisplayRecords} = scalar( @filtered_patron_list ); + if ($searchmember ne $first_query) { + $results->{iTotalDisplayRecords} = scalar @{$results->{patrons}}; + } } my $date_format = C4::Context->preference("dateformat"); -- 2.1.4