diff --git a/lib/MetaCPAN/Web/Controller/Author.pm b/lib/MetaCPAN/Web/Controller/Author.pm index 77a8c7b691..956e9a77a6 100644 --- a/lib/MetaCPAN/Web/Controller/Author.pm +++ b/lib/MetaCPAN/Web/Controller/Author.pm @@ -84,14 +84,15 @@ sub index : Chained('root') PathPart('') Args(0) { # /author/*/releases sub releases : Chained('root') PathPart Args(0) { my ( $self, $c ) = @_; + my $req = $c->req; - my $id = $c->stash->{pauseid}; + my $id = $c->stash->{pauseid}; + my $page_size = $req->get_page_size(100); - my $size = 100; - my $page = $c->req->page > 0 ? $c->req->page : 1; + my $page = $c->req->page > 0 ? $c->req->page : 1; my $author_cv = $c->model('API::Author')->get($id); my $releases_cv - = $c->model('API::Release')->all_by_author( $id, $size, $page ); + = $c->model('API::Release')->all_by_author( $id, $page_size, $page ); my ( $author, $releases ) = ( $author_cv->recv, $releases_cv->recv ); @@ -100,7 +101,7 @@ sub releases : Chained('root') PathPart Args(0) { my $pageset = Data::Pageset->new( { total_entries => $releases->{hits}->{total}, - entries_per_page => $size, + entries_per_page => $page_size, current_page => $page, pages_per_set => 10, mode => 'slide' @@ -109,9 +110,10 @@ sub releases : Chained('root') PathPart Args(0) { $c->stash( { - releases => \@releases, - author => $author, - pageset => $pageset, + releases => \@releases, + author => $author, + pageset => $pageset, + page_size => $page_size, } ); } diff --git a/lib/MetaCPAN/Web/Controller/Favorite.pm b/lib/MetaCPAN/Web/Controller/Favorite.pm index f278098fa0..af599a1756 100644 --- a/lib/MetaCPAN/Web/Controller/Favorite.pm +++ b/lib/MetaCPAN/Web/Controller/Favorite.pm @@ -5,8 +5,12 @@ use base 'MetaCPAN::Web::Controller'; sub recent : Path('/favorite/recent') { my ( $self, $c ) = @_; + my $req = $c->req; - my $data = $c->model('API::Favorite')->recent( $c->req->page )->recv; + my $page_size = $req->get_page_size(100); + + my $data = $c->model('API::Favorite')->recent( $c->req->page, $page_size ) + ->recv; my @faves = map { $_->{_source} } @{ $data->{hits}->{hits} }; my @user_ids = map { $_->{user} } @faves; @@ -30,6 +34,7 @@ sub recent : Path('/favorite/recent') { show_clicked_by => 1, took => $data->{took}, total => $data->{hits}->{total}, + page_size => $page_size, template => 'favorite/recent.html', } ); diff --git a/lib/MetaCPAN/Web/Controller/Recent.pm b/lib/MetaCPAN/Web/Controller/Recent.pm index ea9fc91b41..65efc27293 100644 --- a/lib/MetaCPAN/Web/Controller/Recent.pm +++ b/lib/MetaCPAN/Web/Controller/Recent.pm @@ -5,17 +5,23 @@ use base 'MetaCPAN::Web::Controller'; sub index : Path { my ( $self, $c ) = @_; + my $req = $c->req; + + my $page_size = $req->get_page_size(100); + my ($data) = $c->model('API::Release') - ->recent( $c->req->page, $c->req->params->{f} || 'l' )->recv; + ->recent( $c->req->page, $page_size, $c->req->params->{f} || 'l' ) + ->recv; my $latest = [ map { $_->{fields} } @{ $data->{hits}->{hits} } ]; $c->res->last_modified( $latest->[0]->{date} ) if (@$latest); $c->stash( { - recent => $latest, - took => $data->{took}, - total => $data->{hits}->{total}, - template => 'recent.html' + recent => $latest, + took => $data->{took}, + total => $data->{hits}->{total}, + template => 'recent.html', + page_size => $page_size, } ); } diff --git a/lib/MetaCPAN/Web/Controller/Requires.pm b/lib/MetaCPAN/Web/Controller/Requires.pm index ce09b6a55e..f866730194 100644 --- a/lib/MetaCPAN/Web/Controller/Requires.pm +++ b/lib/MetaCPAN/Web/Controller/Requires.pm @@ -25,15 +25,21 @@ sub index : Chained('/') : PathPart('requires') : CaptureArgs(0) { sub distribution : Chained('index') : PathPart : Args(1) : Does('Sortable') { my ( $self, $c, $distribution, $sort ) = @_; - my $cv = AE::cv(); + my $req = $c->req; + my $cv = AE::cv(); + + my $page_size = $req->get_page_size(50); + my $data = $c->model('API::Release') - ->reverse_dependencies( $distribution, $c->req->page, $sort )->recv; + ->reverse_dependencies( $distribution, $c->req->page, $page_size, + $sort )->recv; $c->stash( { %{$data}, type_of_required => 'distribution', required => $distribution, + page_size => $page_size, template => 'requires.html' } ); @@ -41,15 +47,20 @@ sub distribution : Chained('index') : PathPart : Args(1) : Does('Sortable') { sub module : Chained('index') : PathPart : Args(1) : Does('Sortable') { my ( $self, $c, $module, $sort ) = @_; - my $cv = AE::cv(); + my $req = $c->req; + my $cv = AE::cv(); + + my $page_size = $req->get_page_size(50); + my $data - = $c->model('API::Module')->requires( $module, $c->req->page, $sort ) - ->recv; + = $c->model('API::Module') + ->requires( $module, $c->req->page, $page_size, $sort )->recv; $c->stash( { %{$data}, type_of_required => 'module', required => $module, + page_size => $page_size, template => 'requires.html' } ); diff --git a/lib/MetaCPAN/Web/Controller/Search.pm b/lib/MetaCPAN/Web/Controller/Search.pm index 266b2fd688..4b2dc76e91 100644 --- a/lib/MetaCPAN/Web/Controller/Search.pm +++ b/lib/MetaCPAN/Web/Controller/Search.pm @@ -7,17 +7,13 @@ use Moose; BEGIN { extends 'MetaCPAN::Web::Controller' } -use MetaCPAN::Web::Types qw( PositiveInt ); use Plack::Response; sub index : Path { my ( $self, $c ) = @_; my $req = $c->req; - my $page_size = $req->param('size'); - unless ( is_PositiveInt($page_size) && $page_size <= 500 ) { - $page_size = 20; - } + my $page_size = $req->get_page_size(20); # Redirect back to main page if search query is empty irrespective of # whether we're feeling lucky or not. diff --git a/lib/MetaCPAN/Web/Model/API/Favorite.pm b/lib/MetaCPAN/Web/Model/API/Favorite.pm index b867409c6f..20991d00e7 100644 --- a/lib/MetaCPAN/Web/Model/API/Favorite.pm +++ b/lib/MetaCPAN/Web/Model/API/Favorite.pm @@ -82,12 +82,12 @@ sub by_user { } sub recent { - my ( $self, $page ) = @_; + my ( $self, $page, $page_size ) = @_; $self->request( '/favorite/_search', { - size => 100, - from => ( $page - 1 ) * 100, + size => $page_size, + from => ( $page - 1 ) * $page_size, query => { match_all => {} }, sort => [ { 'date' => { order => 'desc' } } ] } diff --git a/lib/MetaCPAN/Web/Model/API/Module.pm b/lib/MetaCPAN/Web/Model/API/Module.pm index c08d6ae16e..85baa59e35 100644 --- a/lib/MetaCPAN/Web/Model/API/Module.pm +++ b/lib/MetaCPAN/Web/Model/API/Module.pm @@ -427,7 +427,7 @@ sub _search_in_distributions { } sub requires { - my ( $self, $module, $page, $sort ) = @_; + my ( $self, $module, $page, $page_size, $sort ) = @_; $sort ||= { date => 'desc' }; my $cv = $self->cv; $self->request( @@ -449,8 +449,8 @@ sub requires { } } }, - size => 50, - from => $page * 50 - 50, + size => $page_size, + from => $page * $page_size - $page_size, sort => [$sort], } )->cb( diff --git a/lib/MetaCPAN/Web/Model/API/Release.pm b/lib/MetaCPAN/Web/Model/API/Release.pm index e25df2bc37..5147c1eb54 100644 --- a/lib/MetaCPAN/Web/Model/API/Release.pm +++ b/lib/MetaCPAN/Web/Model/API/Release.pm @@ -114,7 +114,7 @@ sub all_by_author { } sub recent { - my ( $self, $page, $type ) = @_; + my ( $self, $page, $page_size, $type ) = @_; my $query; if ( $type eq 'n' ) { $query = $self->_new_distributions_query; @@ -134,8 +134,8 @@ sub recent { $self->request( '/release/_search', { - size => 100, - from => ( $page - 1 ) * 100, + size => $page_size, + from => ( $page - 1 ) * $page_size, query => $query, fields => [qw(name author status abstract date distribution)], sort => [ { 'date' => { order => 'desc' } } ] @@ -242,7 +242,7 @@ sub find { # stolen from Module/requires sub reverse_dependencies { - my ( $self, $distribution, $page, $sort ) = @_; + my ( $self, $distribution, $page, $page_size, $sort ) = @_; $sort ||= { date => 'desc' }; my $cv = $self->cv; @@ -262,8 +262,8 @@ sub reverse_dependencies { } } }, - size => 50, - from => $page * 50 - 50, + size => $page_size, + from => $page * $page_size - $page_size, sort => [$sort], } )->cb( diff --git a/lib/MetaCPAN/Web/Role/Request.pm b/lib/MetaCPAN/Web/Role/Request.pm index e3c41c9eb3..f99f4ff43f 100644 --- a/lib/MetaCPAN/Web/Role/Request.pm +++ b/lib/MetaCPAN/Web/Role/Request.pm @@ -3,6 +3,8 @@ package MetaCPAN::Web::Role::Request; use Moose::Role; use Plack::Session; +use MetaCPAN::Web::Types qw( PositiveInt ); + sub page { my $page = shift->parameters->{p}; return $page && $page =~ /^\d+$/ ? $page : 1; @@ -13,4 +15,15 @@ sub session { return Plack::Session->new( $self->env ); } +sub get_page_size { + my $req = shift; + my $default_page_size = shift; + + my $page_size = $req->param('size'); + unless ( is_PositiveInt($page_size) && $page_size <= 500 ) { + $page_size = $default_page_size; + } + return $page_size; +} + 1; diff --git a/root/author/releases.html b/root/author/releases.html index 74a9f27761..fc0785775f 100644 --- a/root/author/releases.html +++ b/root/author/releases.html @@ -1,3 +1,3 @@ <% title = "All releases by " _ author.pauseid %> <% INCLUDE inc/release-table.html header = 1, tablesorter = 0 %> -<% INCLUDE inc/pager.html %> +<% INCLUDE inc/pager.html size = page_size %> diff --git a/root/favorite/recent.html b/root/favorite/recent.html index 26ed4371af..efc827e437 100644 --- a/root/favorite/recent.html +++ b/root/favorite/recent.html @@ -21,5 +21,5 @@ favorites.push(favorite); END; %> <% INCLUDE inc/favorite-table.html favorites = favorites %> -<% INCLUDE inc/pager.html size = 100 %> +<% INCLUDE inc/pager.html size = page_size %> diff --git a/root/recent.html b/root/recent.html index bf87a60d50..81d456fea3 100644 --- a/root/recent.html +++ b/root/recent.html @@ -27,5 +27,5 @@ releases.push(release); END %> <% INCLUDE inc/release-table.html releases = releases %> -<% INCLUDE inc/pager.html size = 100 %> +<% INCLUDE inc/pager.html size = page_size %> diff --git a/root/requires.html b/root/requires.html index c212bb198f..80774b002c 100644 --- a/root/requires.html +++ b/root/requires.html @@ -11,7 +11,7 @@ Distributions Which Depend on <%- required %> <% IF data.size > 0 %> <% INCLUDE inc/release-table.html releases = data, header = 1, tablesorter = 1, default_sort = '2,1', table_id = "revdep_releases" %> -<% INCLUDE inc/pager.html size = 50 %> +<% INCLUDE inc/pager.html size = page_size %> <% ELSE %>
No distributions depending on <%- required %> could be found
<% END %> diff --git a/root/static/js/cpan.js b/root/static/js/cpan.js index 0c50a3ca8a..72711b8597 100644 --- a/root/static/js/cpan.js +++ b/root/static/js/cpan.js @@ -301,8 +301,36 @@ $(document).ready(function () { $('#size').val(size); } + // TODO use a more specific locator for /author/PAUSID/release ? + set_page_size('a[href*="/releases"', 'releases_page_size'); + set_page_size('a[href*="/recent"', 'recent_page_size'); + set_page_size('a[href*="/requires"','requires_page_size'); + }); +function set_page_size(selector, storage_name) { + $(selector).on('click', function() { + var url = $(this).attr('href'); + var result = /size=(\d+)/.exec(url); + if (result && result[1]) { + var page_size = result[1]; + localStorage.setItem(storage_name, page_size); + return true; + } else { + page_size = localStorage.getItem(storage_name); + if (page_size) { + if (/\?/.exec(url)) { + document.location.href = url + '&size=' + page_size; + } else { + document.location.href = url + '?size=' + page_size; + } + return false; + }; + } + }); +} + + function searchForNearest() { $("#busy").css({ visibility: 'visible'}); navigator.geolocation.getCurrentPosition(function(pos) {