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 )