Compare commits

...

2 Commits

Author SHA1 Message Date
barnold 386570b2c6 Share page navigation as a partial template. 2022-09-18 14:17:40 +01:00
barnold f4c2fa85a9 Add author page. 2022-09-18 14:09:17 +01:00
7 changed files with 97 additions and 27 deletions

View File

@ -18,6 +18,7 @@ sub startup ($self) {
$r->post('/login')->to('auth#login');
$r->get('/logout')->to('auth#logout');
$r->get('/book/page/<page_number:num>')->to('book#index')->name('book_page');
$r->get('/author/page/<page_number:num>')->to('book#author')->name('author_page');
# Put a route under athentication.
my $auth = $r->under(

View File

@ -1,6 +1,7 @@
package MyApp::Controller::Book;
use Mojo::Base 'Mojolicious::Controller', -signatures;
use MyModel::Book;
use MyModel::Author;
sub index ($self) {
my $page_number = $self->param('page_number') // 1;
@ -13,4 +14,18 @@ sub index ($self) {
);
}
sub author ($self) {
my $page_number = $self->param('page_number') // 1;
my $author_model = MyModel::Author->new;
my $author_page = $author_model->get_page(
$page_number,
$self->param('name_like'),
);
$self->render(
author_page => $author_page,
pager => $author_page->pager,
query_params => $self->req->query_params,
);
}
1;

23
lib/MyModel/Author.pm Normal file
View File

@ -0,0 +1,23 @@
package MyModel::Author;
use feature qw( signatures );
use Moose;
extends 'MyModel';
no warnings qw( experimental::signatures );
sub get_page ($self, $page_number = 1, $name_like = undef) {
my $search_condition = (defined $name_like)
? { "me.name" => { ilike => "\%$name_like\%" } }
: undef;
my $rs = $self->schema->resultset('Author')->search_rs(
$search_condition,
{ prefetch => [ "books" ],
order_by => [ "me.name " ],
page => $page_number,
rows => 10,
},
);
return $rs;
}
no Moose;
__PACKAGE__->meta->make_immutable;

View File

@ -0,0 +1,27 @@
<p/>
Page <%= $pager->current_page %> of <%= $pager->last_page %>
&nbsp;&nbsp;&nbsp;
<%= link_to url_for(page_number => 1)
->query($query_params)
->to_abs => begin %>◄ First<% end %>
% if (my $prev = $pager->previous_page) {
<%= link_to url_for(page_number => $prev)
->query($query_params)
->to_abs => begin %>◄ Prev<% end %>
% } else {
◄ Prev
% }
% if (my $next = $pager->next_page) {
<%= link_to url_for(page_number => $next)
->query($query_params)
->to_abs => begin %>Next ►<% end %>
% } else {
Next ►
% }
<%= link_to url_for(page_number => $pager->last_page)
->query($query_params)
->to_abs => begin %>Last ►<% end %>

View File

@ -0,0 +1,29 @@
% layout 'default';
% title 'Authors';
<h1>Author page</h1>
<%# On a new search, reset the page number to 1. %>
%= form_for author_page => { page_number => 1 } => begin
%= label_for name_like => 'Name like'
%= text_field name_like => flash('name_like')
%= submit_button "Search"
%= end
<p/>
<%= $pager->total_entries %> authors found.
<p/>
<div>
<table>
<tr>
<th>Name</th>
</tr>
% for my $author ($author_page->all) {
<tr>
<td><%= $author->name %></td>
</tr>
% }
</table>
</div>
%= include '_page-navigation'

View File

@ -27,30 +27,4 @@
</table>
</div>
<p/>
Page <%= $pager->current_page %> of <%= $pager->last_page %>
&nbsp;&nbsp;&nbsp;
<%= link_to url_for(page_number => 1)
->query($query_params)
->to_abs => begin %>◄ First<% end %>
% if (my $prev = $pager->previous_page) {
<%= link_to url_for(page_number => $prev)
->query($query_params)
->to_abs => begin %>◄ Prev<% end %>
% } else {
◄ Prev
% }
% if (my $next = $pager->next_page) {
<%= link_to url_for(page_number => $next)
->query($query_params)
->to_abs => begin %>Next ►<% end %>
% } else {
Next ►
% }
<%= link_to url_for(page_number => $pager->last_page)
->query($query_params)
->to_abs => begin %>Last ►<% end %>
%= include '_page-navigation'

View File

@ -6,6 +6,7 @@
<p><%= link_to("About" => 'about') %></p>
<p><%= link_to("Books" => 'book_page' => { page_number => 1 }) %></p>
<p><%= link_to("Authors" => 'author_page' => { page_number => 1 }) %></p>
<p>For this, you'll need to log in, then MyApp will redirect you:</p>
<p><%= link_to("Account" => 'account') %></p>