Skip to content
Merged
18 changes: 10 additions & 8 deletions lib/MetaCPAN/Web/Controller/Author.pm
Original file line number Diff line number Diff line change
Expand Up @@ -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 );

Expand All @@ -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'
Expand All @@ -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,
}
);
}
Expand Down
7 changes: 6 additions & 1 deletion lib/MetaCPAN/Web/Controller/Favorite.pm
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand All @@ -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',
}
);
Expand Down
16 changes: 11 additions & 5 deletions lib/MetaCPAN/Web/Controller/Recent.pm
Original file line number Diff line number Diff line change
Expand Up @@ -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,
}
);
}
Expand Down
21 changes: 16 additions & 5 deletions lib/MetaCPAN/Web/Controller/Requires.pm
Original file line number Diff line number Diff line change
Expand Up @@ -25,31 +25,42 @@ 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'
}
);
}

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'
}
);
Expand Down
6 changes: 1 addition & 5 deletions lib/MetaCPAN/Web/Controller/Search.pm
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down
6 changes: 3 additions & 3 deletions lib/MetaCPAN/Web/Model/API/Favorite.pm
Original file line number Diff line number Diff line change
Expand Up @@ -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' } } ]
}
Expand Down
6 changes: 3 additions & 3 deletions lib/MetaCPAN/Web/Model/API/Module.pm
Original file line number Diff line number Diff line change
Expand Up @@ -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(
Expand All @@ -449,8 +449,8 @@ sub requires {
}
}
},
size => 50,
from => $page * 50 - 50,
size => $page_size,
from => $page * $page_size - $page_size,
sort => [$sort],
}
)->cb(
Expand Down
12 changes: 6 additions & 6 deletions lib/MetaCPAN/Web/Model/API/Release.pm
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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' } } ]
Expand Down Expand Up @@ -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;

Expand All @@ -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(
Expand Down
13 changes: 13 additions & 0 deletions lib/MetaCPAN/Web/Role/Request.pm
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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;
2 changes: 1 addition & 1 deletion root/author/releases.html
Original file line number Diff line number Diff line change
@@ -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 %>
2 changes: 1 addition & 1 deletion root/favorite/recent.html
Original file line number Diff line number Diff line change
Expand Up @@ -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 %>
</div>
2 changes: 1 addition & 1 deletion root/recent.html
Original file line number Diff line number Diff line change
Expand Up @@ -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 %>
</div>
2 changes: 1 addition & 1 deletion root/requires.html
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
<strong>Distributions Which Depend on <a href="/<% type_of_required == 'distribution' ? 'release' : 'module' %>/<%- required %>"><%- required %></a></strong>
<% 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 %>
<p>No distributions depending on <a href="/<% type_of_required == 'distribution' ? 'release' : 'module' %>/<%- required %>"><%- required %></a> could be found</p>
<% END %>
Expand Down
28 changes: 28 additions & 0 deletions root/static/js/cpan.js
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand Down