Compare commits

...

3 Commits

Author SHA1 Message Date
barnold be0b5673de Add a little CSS and drop the static index page. 2022-09-19 12:29:08 +01:00
barnold 2ac594269d Make rows-per-page a user preference. 2022-09-19 11:50:01 +01:00
barnold 6ea53c5657 More on rows-per-page...
Added helpers and updated MyModel with a view to making rows-per-page
a user preference.
2022-09-19 10:04:57 +01:00
13 changed files with 71 additions and 26 deletions

View File

@ -10,6 +10,19 @@ sub add_my_helpers ($self) {
return scalar reverse $rev;
}
);
$self->helper(
default_rpp => sub ($self) {
return $self->config->{'default-rows-per-page'};
}
);
$self->helper(
logname => sub ($self) { $self->session('logname'); }
);
$self->helper(
rpp => sub ($self) {
$self->session('rows_per_page') // $self->default_rpp;
}
);
return;
}
@ -39,14 +52,15 @@ sub startup ($self) {
# Put a route under athentication.
my $auth = $r->under(
'/' => sub ($c) {
return 1 if ($c->session('logname'));
return 1 if ($c->logname);
$c->flash('naughty' => 1);
$c->session('post_login' => $c->current_route);
$c->redirect_to('auth');
return undef;
}
);
$auth->get('/account')->to('auth#account');
$auth->get('/account')->to('auth#account')->name('account');
$auth->post('/preferences')->to('auth#preferences')->name('preferences');
}
1;

View File

@ -26,4 +26,12 @@ sub logout ($self) {
$self->redirect_to('home');
}
sub preferences ($self) {
$self->session(rows_per_page => $self->param('rows_per_page'));
$self->flash(
confirmation => sprintf("Updated rows per page to %s.", $self->rpp)
);
$self->redirect_to('account');
}
1;

View File

@ -5,8 +5,11 @@ use MyModel::Author;
sub books ($self) {
my $page_number = $self->param('page_number') // 1;
my $book_model = MyModel::Book->new;
my $book_page = $book_model->get_page($page_number, $self->param('title_like'));
my $book_model = MyModel::Book->new(rows_per_page => $self->rpp);
my $book_page = $book_model->get_page(
$page_number,
$self->param('title_like'),
);
$self->render(
book_page => $book_page,
pager => $book_page->pager,
@ -15,7 +18,7 @@ sub books ($self) {
sub authors ($self) {
my $page_number = $self->param('page_number') // 1;
my $author_model = MyModel::Author->new;
my $author_model = MyModel::Author->new(rows_per_page => $self->rpp);;
my $author_page = $author_model->get_page(
$page_number,
$self->param('name_like'),

View File

@ -1,10 +1,24 @@
package MyModel;
use feature qw( signatures );
use Moose;
use Moose::Util::TypeConstraints;
use Mojo::Log;
use Book::Schema;
use List::Util qw( max min );
no warnings qw( experimental::signatures );
# Keep rows-per-page within a sane range.
subtype 'RowsPerPage',
as 'Int',
where { 5 <= $_ && $_ <= 100 };
has 'rows_per_page' => (
is => 'rw',
isa => 'RowsPerPage',
required => 1,
default => 20,
);
our $logger = Mojo::Log->new;
# Share this among all model instances.

View File

@ -13,7 +13,7 @@ sub get_page ($self, $page_number = 1, $name_like = undef) {
{ prefetch => [ "books" ],
order_by => [ "me.name " ],
page => $page_number,
rows => 10,
rows => $self->rows_per_page,
},
);
return $rs;

View File

@ -18,7 +18,7 @@ sub get_page ($self, $page_number = 1, $title_like = undef) {
{ prefetch => [ "author" ],
order_by => [ "me.title " ],
page => $page_number,
rows => 10,
rows => $self->rows_per_page,
},
);
return $rs;

View File

@ -1,3 +1,4 @@
---
secrets:
- 197b9b0060f3285c0909d83598e54f9ec0602151
default-rows-per-page: 10

3
public/default.css Normal file
View File

@ -0,0 +1,3 @@
table {
border: 1px solid grey;
}

View File

@ -1,11 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<title>Welcome to the Mojolicious real-time web framework!</title>
</head>
<body>
<h2>Welcome to the Mojolicious real-time web framework!</h2>
This is the static document "public/index.html",
<a href="/">click here</a> to get back to the start.
</body>
</html>

View File

@ -10,7 +10,7 @@ $t->get_ok('/about')->status_is(200)->content_like(qr/about/i);
$t->get_ok('/account')->status_is(302);
$t->get_ok('/auth')->status_is(200)->content_like(qr/login/i);
$t->post_ok('/login' => form => { logname => 'Dobby' });
$t->get_ok('/')->status_is(200)->content_like(qr/dobby/i);
$t->get_ok('/account')->status_is(200)->content_like(qr/dobby/i);
$t->get_ok('/books/1')->status_is(200)->content_like(qr/[[:digit:]] books found/i);
$t->get_ok('/authors/1')->status_is(200)->content_like(qr/[[:digit:]] authors found/i);
$t->get_ok('/logout')->status_is(302);

View File

@ -1,8 +1,10 @@
<p/>
Page <%= commify($pager->current_page) %>
Showing <%= $pager->entries_on_this_page %> items
on page <%= commify($pager->current_page) %>
of <%= commify($pager->last_page) %>
&nbsp;&nbsp;&nbsp;
<% if ($pager->total_entries > rpp) { %>
<br/>
<%= link_to url_with(page_number => 1) => begin %>◄ First<% end %>
% if (my $prev = $pager->previous_page) {
@ -18,3 +20,4 @@ Next ►
% }
<%= link_to url_with(page_number => $pager->last_page) => begin %>Last ►<% end %>
<% } %>

View File

@ -1,5 +1,12 @@
% layout 'default';
% title 'Account';
<h1><%= session 'logname' %>'s account on MyApp</h1>
<h1><%= logname %>'s account on MyApp</h1>
Account details here.
%= form_for preferences => begin
%= label_for rows_per_page => 'Rows per page'
<%= number_field rows_per_page => $c->rpp,
min => 5, max => 100, maxlength => 4, size => 4 %>
%= submit_button "Update"
% end
<p/>
%= flash('confirmation')

View File

@ -1,6 +1,9 @@
<!DOCTYPE html>
<html>
<head><title><%= title %></title></head>
<head>
<title><%= title %></title>
<link rel="stylesheet" href="/default.css">
</head>
<body>
<div>
<%= content %>
@ -14,8 +17,8 @@
<% } %>
</div>
<div>
<% if (session('logname')) { %>
You are logged in as <%= session 'logname' %>.
<% if (logname) { %>
You are logged in as <%= logname %>.
<%= link_to("Logout" => 'logout') %>
<% } elsif (current_route ne 'auth') { %>
<%= link_to("Login" => 'auth') %>