diff options
-rw-r--r-- | data/style.css | 3 | ||||
-rw-r--r-- | lib/VNDB/Handler/Producers.pm | 58 | ||||
-rw-r--r-- | lib/VNWeb/Producers/List.pm | 62 |
3 files changed, 63 insertions, 60 deletions
diff --git a/data/style.css b/data/style.css index a9c673b6..95358b13 100644 --- a/data/style.css +++ b/data/style.css @@ -601,8 +601,7 @@ div#vntags { margin: 0 30px 0 30px; border-top: 1px solid $bo /***** Producer list ******/ -div.producerbrowse { padding-bottom: 10px } -.producerbrowse ul { float: left; margin-top: -5px; margin-left: 3%; width: 28%; } +.producerbrowse ul { -webkit-column-width: 250px; -moz-column-width: 250px; column-width: 250px; margin-bottom: 10px } .producerbrowse ul li { list-style-type: none; } .producerbrowse ul li abbr { margin-right: 5px; margin-top: 1px; } diff --git a/lib/VNDB/Handler/Producers.pm b/lib/VNDB/Handler/Producers.pm index e25e3320..44201e79 100644 --- a/lib/VNDB/Handler/Producers.pm +++ b/lib/VNDB/Handler/Producers.pm @@ -9,68 +9,10 @@ use VNDB::Types; TUWF::register( - qr{p/([a-z0]|all)} => \&list, qr{xml/producers\.xml} => \&pxml, ); -sub list { - my($self, $char) = @_; - - my $f = $self->formValidate( - { get => 'p', required => 0, default => 1, template => 'page' }, - { get => 'q', required => 0, default => '' }, - ); - return $self->resNotFound if $f->{_err}; - - my($list, $np) = $self->dbProducerGet( - $char ne 'all' ? ( char => $char ) : (), - $f->{q} ? ( search => $f->{q} ) : (), - results => 150, - page => $f->{p} - ); - - $self->htmlHeader(title => 'Browse producers'); - - div class => 'mainbox'; - h1 'Browse producers'; - form action => '/p/all', 'accept-charset' => 'UTF-8', method => 'get'; - $self->htmlSearchBox('p', $f->{q}); - end; - p class => 'browseopts'; - for ('all', 'a'..'z', 0) { - a href => "/p/$_", $_ eq $char ? (class => 'optselected') : (), $_ eq 'all' ? 'ALL' : $_ ? uc $_ : '#'; - } - end; - end; - - my $pageurl = "/p/$char" . ($f->{q} ? "?q=$f->{q}" : ''); - $self->htmlBrowseNavigate($pageurl, $f->{p}, $np, 't'); - div class => 'mainbox producerbrowse'; - h1 $f->{q} ? 'Search results' : 'Producer list'; - if(!@$list) { - p 'No results found'; - } else { - # spread the results over 3 equivalent-sized lists - my $perlist = @$list/3 < 1 ? 1 : @$list/3; - for my $c (0..(@$list < 3 ? $#$list : 2)) { - ul; - for ($perlist*$c..($perlist*($c+1))-1) { - li; - cssicon 'lang '.$list->[$_]{lang}, $LANGUAGE{$list->[$_]{lang}}; - a href => "/p$list->[$_]{id}", title => $list->[$_]{original}, $list->[$_]{name}; - end; - } - end; - } - } - clearfloat; - end 'div'; - $self->htmlBrowseNavigate($pageurl, $f->{p}, $np, 'b'); - $self->htmlFooter; -} - - # peforms a (simple) search and returns the results in XML format sub pxml { my $self = shift; diff --git a/lib/VNWeb/Producers/List.pm b/lib/VNWeb/Producers/List.pm new file mode 100644 index 00000000..bd301aaf --- /dev/null +++ b/lib/VNWeb/Producers/List.pm @@ -0,0 +1,62 @@ +package VNWeb::Producers::List; + +use VNWeb::Prelude; + + +sub listing_ { + my($opt, $list, $count) = @_; + + my sub url { '?'.query_encode %$opt, @_ } + + paginate_ \&url, $opt->{p}, [$count, 150], 't'; + div_ class => 'mainbox producerbrowse', sub { + h1_ $opt->{q} ? 'Search results' : 'Browse producers'; + if(!@$list) { + p_ 'No results found.'; + } else { + ul_ sub { + li_ sub { + abbr_ class => "icons lang $_->{lang}", title => $LANGUAGE{$_->{lang}}, ''; + a_ href => "/p$_->{id}", title => $_->{original}||$_->{name}, $_->{name}; + } for @$list; + } + } + }; + paginate_ \&url, $opt->{p}, [$count, 150], 'b'; +} + + +TUWF::get qr{/p/(?<char>all|[a-z0])}, sub { + my $char = tuwf->capture('char'); + my $opt = tuwf->validate(get => + p => { upage => 1 }, + q => { onerror => '' }, + )->data; + + my $qs = defined $opt->{q} && '%'.sql_like($opt->{q}).'%'; + my $where = sql_and 'NOT p.hidden', + $qs ? sql 'p.name ILIKE', \$qs, 'OR p.original ILIKE', \$qs, 'OR p.alias ILIKE', \$qs : (), + $char eq 0 ? "ascii(p.name) not between ascii('a') and ascii('z') AND ascii(p.name) not between ascii('A') and ascii('Z')" : + $char ne 'all' ? sql 'p.name ILIKE', \"$char%" : (); + + my $count = tuwf->dbVali('SELECT COUNT(*) FROM producers p WHERE', $where); + my $list = tuwf->dbPagei({ results => 150, page => $opt->{p} }, + 'SELECT p.id, p.name, p.original, p.lang FROM producers p WHERE', $where, 'ORDER BY p.name' + ); + + framework_ title => 'Browse producers', sub { + div_ class => 'mainbox', sub { + h1_ 'Browse producers'; + form_ action => '/p/all', method => 'get', sub { + searchbox_ p => $opt->{q}; + }; + p_ class => 'browseopts', sub { + a_ href => "/p/$_", $_ eq $char ? (class => 'optselected') : (), $_ eq 'all' ? 'ALL' : $_ ? uc $_ : '#' + for ('all', 'a'..'z', 0); + }; + }; + listing_ $opt, $list, $count; + }; +}; + +1; |