diff --git a/docs/changelog/7.x.x.txt b/docs/changelog/7.x.x.txt index a914eec40..5b7214678 100644 --- a/docs/changelog/7.x.x.txt +++ b/docs/changelog/7.x.x.txt @@ -2,6 +2,7 @@ - fixed: IE6 shows Admin Bar over Asset Manager - fixed #9808: Search i18n - fixed #9818: deleteAttachedFiles bug (THE REVENGE) + - fixed #9809: Pagination list up to 10/20: not working correctly on last pages. 7.6.13 - fixed AdSpace bug: impressions and clicks for most non-human web clients will not be counted. diff --git a/lib/WebGUI/Paginator.pm b/lib/WebGUI/Paginator.pm index 6a84feca6..8305552e2 100644 --- a/lib/WebGUI/Paginator.pm +++ b/lib/WebGUI/Paginator.pm @@ -504,6 +504,10 @@ sub getPageLinks { my $start = ($minPage > 0) ? $minPage : 1; my $maxPage = $start + $limit - 1; my $end = ($maxPage < $self->getPageNumber) ? $self->getPageNumber : $maxPage; + if ($maxPage > $self->getNumberOfPages) { + $end = $self->getNumberOfPages; + $start = $self->getNumberOfPages - $limit + 1; + } my @temp; foreach my $page (@pages) { if ($i <= $end && $i >= $start) { @@ -754,5 +758,24 @@ sub setAlphabeticalKey { return 1; } +#------------------------------------------------------------------- + +=head2 setPageNumber ( pageNumber ) + +Sets the page number. This is really a convenience method for testing. +Returns the page number that was set. + +=head3 pageNumber + +Sets the pageNumber. Setting the pageNumber outside of the set of +pages would cause the Paginator to behave poorly. + +=cut + +sub setPageNumber { + my $self = shift; + $self->{_pn} = shift; +} + 1; diff --git a/t/Paginator.t b/t/Paginator.t index 31802d95b..f1c16d90d 100644 --- a/t/Paginator.t +++ b/t/Paginator.t @@ -20,15 +20,17 @@ use WebGUI::Paginator; use Test::More; # increment this value for each test you create use Test::Deep; use POSIX qw(ceil); +use Storable qw/dclone/; +use Data::Dumper; my $session = WebGUI::Test->session; +plan tests => 26; # increment this value for each test you create + my $startingRowNum = 0; my $endingRowNum = 99; my @paginatingData = ($startingRowNum..$endingRowNum); -plan tests => 15; # increment this value for each test you create - my $rowCount = $endingRowNum - $startingRowNum + 1; my $NumberOfPages = ceil($rowCount/25); ##Default page size=25 my $url = "/home"; @@ -47,7 +49,26 @@ cmp_bag([0..24], $p->getPageData(1), 'page 1 data correct'); cmp_bag([25..49], $p->getPageData(2), 'page 2 data correct'); cmp_bag([ ], $p->getPageData(5), 'page 5 data correct'); -# Test getPageLinks +######################################################################## +# +# getPageNumber, setPageNumber +# +######################################################################## + +my $p2 = WebGUI::Paginator->new($session, '/work'); + +is($p2->getPageNumber, 1, 'pageNumber set to 1 at object creation by default'); +is($p2->setPageNumber(0), 0, 'setPageNumber returns the page number set'); +is($p2->getPageNumber, 0, 'pageNumber set by setPageNumber'); +is($p2->setPageNumber(3), 3, 'setPageNumber returns the page number set'); +is($p2->getPageNumber, 3, 'pageNumber set by setPageNumber'); + +######################################################################## +# +# getPageLinks +# +######################################################################## + my $expectedPages; $expectedPages = [ map { +{ 'pagination.text' => ( $_ + 1 ), @@ -63,7 +84,6 @@ cmp_deeply( 'page links correct', ); - $startingRowNum = 0; $endingRowNum = 100; @paginatingData = ($startingRowNum..$endingRowNum); @@ -78,7 +98,7 @@ $p->setDataByArrayRef(\@paginatingData); is($p->getRowCount, $rowCount, '(101) paginator returns correct number of rows'); is($p->getNumberOfPages, $NumberOfPages, '(101) paginator returns right number of pages (default setting)'); -my $page1Data = $p->getPageData(1); +$page1Data = $p->getPageData(1); cmp_bag([0..24], $p->getPageData(1), '(101) page 1 data correct'); cmp_bag([25..49], $p->getPageData(2), '(101) page 2 data correct'); cmp_bag([100 ], $p->getPageData(5), '(101) page 5 data correct'); @@ -95,11 +115,105 @@ $expectedPages = [ map { +{ $expectedPages->[0]->{'pagination.activePage'} = 'true'; +######################################################################## +# +# getPageLinks with limits +# +######################################################################## -# Test getPageLinks cmp_deeply( ($p->getPageLinks)[0], $expectedPages, - 'page links correct', + 'set of 5 pages looks right', ); +$startingRowNum = 0; +$endingRowNum = 199; +@paginatingData = ($startingRowNum..$endingRowNum); + + +$p = WebGUI::Paginator->new($session, '/home', 10); + +$rowCount = $endingRowNum - $startingRowNum + 1; +$NumberOfPages = ceil($rowCount/10); ##Default page size=25 + +$p->setDataByArrayRef(\@paginatingData); + +$expectedPages = [ map { +{ + 'pagination.text' => ( $_ + 1 ), + 'pagination.range' => ( 10 * $_ + 1 ) . "-" . ( $_ * 10 + 10 <= $endingRowNum + 1 ? $_ * 10 + 10 : $endingRowNum + 1 ), # First row number - Last row number + 'pagination.url' => ( '/home?pn=' . ( $_ + 1 ) ), # Current page has no URL + } } (0..$NumberOfPages-1) ]; + + +my $copy; +$copy = dclone($expectedPages); +$copy->[0]->{'pagination.activePage'} = 'true'; +$copy->[0]->{'pagination.url'} = ''; + +cmp_deeply( + ($p->getPageLinks)[0], + $copy, + 'set of 20 pages looks right', +); + +my @pageWindow; +$copy = dclone($expectedPages); +$copy->[0]->{'pagination.activePage'} = 'true'; +$copy->[0]->{'pagination.url'} = ''; +@pageWindow = @{ $copy }[0..9]; + +cmp_deeply( + ($p->getPageLinks(10))[0], + \@pageWindow, + 'set of first 10 pages selected correctly', +); + +$p->setPageNumber(10); +my $copy = dclone($expectedPages); +$copy->[9]->{'pagination.activePage'} = 'true'; +$copy->[9]->{'pagination.url'} = ''; +@pageWindow = @{ $copy }[4..13]; + +cmp_deeply( + ($p->getPageLinks(10))[0], + \@pageWindow, + 'set of middle 10 pages @10 selected correctly', +); + +$p->setPageNumber(3); +my $copy = dclone($expectedPages); +$copy->[2]->{'pagination.activePage'} = 'true'; +$copy->[2]->{'pagination.url'} = ''; +delete $copy->[0]->{'pagination.activePage'}; +@pageWindow = @{ $copy }[0..9]; + +cmp_deeply( + ($p->getPageLinks(10))[0], + \@pageWindow, + 'set of 10 pages selected correctly, with off edge page number (3/20)', +); + +$p->setPageNumber(17); +my $copy = dclone($expectedPages); +$copy->[16]->{'pagination.activePage'} = 'true'; +$copy->[16]->{'pagination.url'} = ''; +@pageWindow = @{ $copy }[10..19]; + +cmp_deeply( + ($p->getPageLinks(10))[0], + \@pageWindow, + 'set of last 10 pages selected correctly, (17/20)', +); + +$p->setPageNumber(20); +my $copy = dclone($expectedPages); +$copy->[19]->{'pagination.activePage'} = 'true'; +$copy->[19]->{'pagination.url'} = ''; +@pageWindow = @{ $copy }[10..19]; + +cmp_deeply( + ($p->getPageLinks(10))[0], + \@pageWindow, + 'set of last 10 pages selected correctly, (20/20)', +);