From 6ea53c56571358321f4df14f5559a9825c08e1b6 Mon Sep 17 00:00:00 2001 From: barnold Date: Mon, 19 Sep 2022 10:04:57 +0100 Subject: [PATCH] More on rows-per-page... Added helpers and updated MyModel with a view to making rows-per-page a user preference. --- lib/MyApp.pm | 15 ++++++++++++++- lib/MyApp/Controller/Book.pm | 9 ++++++--- lib/MyModel.pm | 14 ++++++++++++++ lib/MyModel/Book.pm | 2 +- my_app.yml | 1 + t/basic.t | 2 +- templates/auth/account.html.ep | 2 +- templates/layouts/default.html.ep | 4 ++-- 8 files changed, 40 insertions(+), 9 deletions(-) diff --git a/lib/MyApp.pm b/lib/MyApp.pm index 221f099..79394fe 100644 --- a/lib/MyApp.pm +++ b/lib/MyApp.pm @@ -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,7 +52,7 @@ 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'); diff --git a/lib/MyApp/Controller/Book.pm b/lib/MyApp/Controller/Book.pm index 560c04e..dc2cbe3 100644 --- a/lib/MyApp/Controller/Book.pm +++ b/lib/MyApp/Controller/Book.pm @@ -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'), diff --git a/lib/MyModel.pm b/lib/MyModel.pm index 65ef89a..967de3d 100644 --- a/lib/MyModel.pm +++ b/lib/MyModel.pm @@ -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. diff --git a/lib/MyModel/Book.pm b/lib/MyModel/Book.pm index a00fa05..41dcb60 100644 --- a/lib/MyModel/Book.pm +++ b/lib/MyModel/Book.pm @@ -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; diff --git a/my_app.yml b/my_app.yml index 3377b20..479accf 100644 --- a/my_app.yml +++ b/my_app.yml @@ -1,3 +1,4 @@ --- secrets: - 197b9b0060f3285c0909d83598e54f9ec0602151 +default-rows-per-page: 10 diff --git a/t/basic.t b/t/basic.t index 35716a4..b595b47 100644 --- a/t/basic.t +++ b/t/basic.t @@ -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); diff --git a/templates/auth/account.html.ep b/templates/auth/account.html.ep index 2a2807f..86f303e 100644 --- a/templates/auth/account.html.ep +++ b/templates/auth/account.html.ep @@ -1,5 +1,5 @@ % layout 'default'; % title 'Account'; -

<%= session 'logname' %>'s account on MyApp

+

<%= logname %>'s account on MyApp

Account details here. diff --git a/templates/layouts/default.html.ep b/templates/layouts/default.html.ep index 5706b34..2993773 100644 --- a/templates/layouts/default.html.ep +++ b/templates/layouts/default.html.ep @@ -14,8 +14,8 @@ <% } %>
- <% 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') %>