summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--data/style.css3
-rw-r--r--lib/VNDB/Handler/Producers.pm58
-rw-r--r--lib/VNWeb/Producers/List.pm62
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;