Mojolicious-Plugin-SemanticUIPageNavigator
view release on metacpan or search on metacpan
lib/Mojolicious/Plugin/SemanticUIPageNavigator.pm view on Meta::CPAN
package Mojolicious::Plugin::SemanticUIPageNavigator;
use Mojo::Base 'Mojolicious::Plugin';
use POSIX( qw/ceil/ );
use Mojo::DOM;
use Mojo::ByteStream 'b';
use Modern::Perl;
our $VERSION = 0.03;
# ABSTRACT: Mojolicious::Plugin::SemanticUIPageNavigator
sub register{
my ($self, $app, $args) = @_;
$args ||={};
$app->helper( page_navigator => sub{
my ( $self, $actual, $count, $opts ) = @_;
$count = ceil($count);
return "" unless $count > 1;
$opts = {} unless $opts;
my $round = $opts->{round} || 3;
my $param = $opts->{param} || 'p';
my $outer = $opts->{outer} || 2;
my @current = ($actual - $round .. $actual + $round );
my @first = ( $round > $actual ? (1 .. $round * 3) : (1..$outer) );
my @tail = ( $count - $round < $actual
? ($count - $round * 2 + 1 .. $count)
: ($count - $outer + 1 .. $count)
);
my @ret = ();
my $last = undef;
foreach my $number( sort { $a <=> $b} @current, @first, @tail ){
next if $last && $last == $number;
next if $number <= 0 ;
last if $number > $count;
push @ret, ".." if( $last && $last + 1 != $number );
push @ret, $number;
$last = $number;
}
my $dom = Mojo::DOM->new('<div class="pagination_outer"><div class="pagination_inner"></div></div>');
$dom->at('.pagination_outer')->attr({style => "margin: 10px auto; text-align: center"});
$dom->at('.pagination_inner')->append_content('<a class="semantic_pagination_1">é¦é¡µ</a><a class="semantic_pagination_2">ä¸ä¸é¡µ</a>');
$dom->at('.pagination_inner')->attr({class => 'ui pagination menu'});
$dom->at(".semantic_pagination_1")->attr( {class => 'item', href => $self->url_for->clone->query($param => 1)} );
$dom->at(".semantic_pagination_2")->attr( {class => 'item', href => $self->url_for->clone->query($param => $actual - 1)} );
for my $number ( @ret ){
if( $number eq '..'){
$dom->at('.pagination')->append_content('<a class="item">..</a>');
}else {
my $tmp_class = "se-pa-a$number";
$dom->at(".pagination")->append_content("<a class = $tmp_class >$number</a>");
my $real_class = $number eq $actual ? 'active teal item' : 'item';
$dom->at(".$tmp_class")->attr( {class => $real_class, href => $self->url_for->clone->query($param => $number) } );
}
}
$dom->at('.pagination')->append_content('<a class="last1">ä¸ä¸é¡µ</a><a class="last2">æ«é¡µ</a>');
$dom->at(".last1")->attr( {class => 'item', href => $self->url_for->clone->query($param => $actual + 1 > $count ? $count : $actual + 1 ) } );
$dom->at(".last2")->attr( {class => 'item', href => $self->url_for->clone->query($param => $count)} );
return b($dom);
});
}
1;
__END__
( run in 2.231 seconds using v1.01-cache-2.11-cpan-0bb4e1dffa6 )