Просмотр исходного кода

fix #28 along with a couple other paginator bugs

George S. Baugh 5 лет назад
Родитель
Сommit
ab2a960503
3 измененных файлов с 24 добавлено и 12 удалено
  1. 8 6
      lib/Trog/Data/DUMMY.pm
  2. 10 6
      lib/Trog/Routes/HTML.pm
  3. 6 0
      www/templates/paginator.tx

+ 8 - 6
lib/Trog/Data/DUMMY.pm

@@ -191,22 +191,24 @@ sub get ($self, %request) {
     # If an ID is passed, just get that
     @filtered = grep { $_->{id} eq $request{id} } @filtered if $request{id};
 
-    # First, paginate
-    my $offset = int($request{limit});
-    $offset = @filtered < $offset ? @filtered : $offset;
-    @filtered = splice(@filtered, ( int($request{page}) -1) * $offset, $offset) if $request{page} && $request{limit}; 
-
     # Next, handle the query, tags and ACLs
     @filtered = grep { my $tags = $_->{tags}; grep { my $t = $_; grep {$t eq $_ } @{$request{tags}} } @$tags } @filtered if @{$request{tags}};
     @filtered = grep { my $tags = $_->{tags}; grep { my $t = $_; grep {$t eq $_ } @{$request{acls}} } @$tags } @filtered unless grep { $_ eq 'admin' } @{$request{acls}};    
     @filtered = grep { $_->{data} =~ m/\Q$request{like}\E/i } @filtered if $request{like};
 
+    # Finally, paginate
+    my $offset = int($request{limit}); #caller expected to not let this be 0
+    $offset = @filtered < $offset ? @filtered : $offset;
+    my $pages = int(scalar(@filtered) / $offset);
+
+    @filtered = splice(@filtered, ( int($request{page}) -1) * $offset, $offset) if $request{page} && $request{limit};
+    
     # Next, go ahead and build the "post type"
     @filtered = _add_post_type(@filtered);
     # Next, add the type of post this is
     @filtered = _add_media_type(@filtered);
 
-    return \@filtered;
+    return ($pages,\@filtered);
 }
 
 sub total_posts {

+ 10 - 6
lib/Trog/Routes/HTML.pm

@@ -438,10 +438,11 @@ sub post ($query, $input, $render_cb) {
     return forbidden($query, $input, $render_cb) unless grep { $_ eq 'admin' } @{$query->{acls}};
 
     my $tags  = _coerce_array($query->{tag});
-    my $posts = _post_helper($query, $tags, $query->{acls});
+    my ($pages,$posts) = _post_helper($query, $tags, $query->{acls});
     my $css   = _build_themed_styles('post.css');
     my $js    = _build_themed_scripts('post.js');
     push(@$css, '/styles/avatars.css');
+    my (undef, $acls) = _post_helper({}, ['series'], $query->{acls});
 
     return $render_cb->('post.tx', {
         title       => 'New Post',
@@ -454,10 +455,11 @@ sub post ($query, $input, $render_cb) {
         route       => '/posts',
         category    => '/posts',
         page        => int($query->{page} || 1),
-        limit       => int($query->{limit} || 1),
+        limit       => int($query->{limit} || 25),
+        pages       => $pages,
         sizes       => [25,50,100],
         id          => $query->{id},
-        acls        => _post_helper({}, ['series'], $query->{acls}),
+        acls        => $acls,
         edittype    => $query->{type} || 'microblog',
     });
 }
@@ -478,7 +480,7 @@ sub posts ($query, $input, $render_cb) {
 
     #TODO If we have a direct ID query, we should show unlisted videos as well as public ones IFF they have a valid campaign ID attached to query
     push(@{$query->{acls}}, 'public');
-    my $posts = _post_helper($query, $tags, $query->{acls});
+    my ($pages,$posts) = _post_helper($query, $tags, $query->{acls});
 
     return notfound($query,$input,$render_cb) unless @$posts;
 
@@ -508,7 +510,8 @@ sub posts ($query, $input, $render_cb) {
         posts    => $posts,
         route    => $query->{route},
         page     => int($query->{page} || 1),
-        limit    => int($query->{limit} || 1),
+        limit    => int($query->{limit} || 25),
+        pages    => $pages,
         sizes    => [25,50,100],
         rss      => !$query->{id},
         tiled    => scalar(grep { $_ eq $query->{route} } qw{/files /audio /video /image /series}),
@@ -575,7 +578,8 @@ sub sitemap ($query, $input, $render_cb) {
         # Return the map of the particular range of dynamic posts
         $query->{limit} = 50000;
         $query->{page} = $query->{map};
-        @to_map = @{_post_helper($query, [], ['public'])};
+        my (undef, $buf) = _post_helper($query, [], ['public']);
+        @to_map = @$buf;
     }
 
     if ( $query->{xml} ) {

+ 6 - 0
www/templates/paginator.tx

@@ -1,7 +1,13 @@
+:if ( $pages > 1 ) {
 <div>
+: } else {
+<div class="disabled">
+: }
     <div style="float:left; margin-top:.5rem;"> Page <: $page :></div>
     <div style="float:right;">
+        : if ( $page < $pages ) {
         <a href="?page=<: $page + 1 :>&limit=<: $limit :>">Next</a>
+        : }
         : if ( $page > 1 ) {
         <a href="?page=<: $page - 1 :>&limit=<: $limit :>">Prev</a>
         : }