summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYorhel <git@yorhel.nl>2020-09-30 11:56:24 +0200
committerYorhel <git@yorhel.nl>2020-09-30 11:56:26 +0200
commita60b87d5abb0795d64ddd3ba9191bf519db839da (patch)
tree27a27aef2749e444d29ae3034229d3622a680f1c
parent17e6e0ca9a055c465484b32c8e05625fadf9b44a (diff)
v2rw/Tags::Index: Rewrite the tag index
Nothing new, but I do see more avenues for consolidation with traits.
-rw-r--r--lib/VNDB/Handler/Tags.pm79
-rw-r--r--lib/VNWeb/Tags/Index.pm117
2 files changed, 117 insertions, 79 deletions
diff --git a/lib/VNDB/Handler/Tags.pm b/lib/VNDB/Handler/Tags.pm
index d80059c4..bced924f 100644
--- a/lib/VNDB/Handler/Tags.pm
+++ b/lib/VNDB/Handler/Tags.pm
@@ -11,8 +11,6 @@ use VNDB::Types;
TUWF::register(
qr{g([1-9]\d*)}, \&tagpage,
- qr{u([1-9]\d*)/tags}, \&usertags,
- qr{g}, \&tagindex,
qr{g/debug}, \&fulltree,
qr{xml/tags\.xml}, \&tagxml,
);
@@ -142,83 +140,6 @@ sub tagpage {
}
-sub tagindex {
- my $self = shift;
-
- $self->htmlHeader(title => 'Tag index');
- div class => 'mainbox';
- a class => 'addnew', href => "/g/new", 'Create new tag' if $self->authCan('tag');
- h1 'Search tags';
- form action => '/g/list', 'accept-charset' => 'UTF-8', method => 'get';
- $self->htmlSearchBox('g', '');
- end;
- end;
-
- my $t = $self->dbTTTree(tag => 0, 2);
- childtags($self, 'Tag tree', 'g', {childs => $t});
-
- table class => 'mainbox threelayout';
- Tr;
-
- # Recently added
- td;
- a class => 'right', href => '/g/list', 'Browse all tags';
- my $r = $self->dbTagGet(sort => 'added', reverse => 1, results => 10, state => 2);
- h1 'Recently added';
- ul;
- for (@$r) {
- li;
- txt fmtage $_->{added};
- txt ' ';
- a href => "/g$_->{id}", $_->{name};
- end;
- }
- end;
- end;
-
- # Popular
- td;
- a class => 'addnew', href => "/g/links", 'Recently tagged';
- $r = $self->dbTagGet(sort => 'items', reverse => 1, searchable => 1, applicable => 1, results => 10);
- h1 'Popular tags';
- ul;
- for (@$r) {
- li;
- a href => "/g$_->{id}", $_->{name};
- txt " ($_->{c_items})";
- end;
- }
- end;
- end;
-
- # Moderation queue
- td;
- h1 'Awaiting moderation';
- $r = $self->dbTagGet(state => 0, sort => 'added', reverse => 1, results => 10);
- ul;
- li 'Moderation queue empty! yay!' if !@$r;
- for (@$r) {
- li;
- txt fmtage $_->{added};
- txt ' ';
- a href => "/g$_->{id}", $_->{name};
- end;
- }
- li;
- br;
- a href => '/g/list?t=0;o=d;s=added', 'Moderation queue';
- txt ' - ';
- a href => '/g/list?t=1;o=d;s=added', 'Denied tags';
- end;
- end;
- end;
-
- end 'tr';
- end 'table';
- $self->htmlFooter;
-}
-
-
# non-translatable debug page
sub fulltree {
my $self = shift;
diff --git a/lib/VNWeb/Tags/Index.pm b/lib/VNWeb/Tags/Index.pm
new file mode 100644
index 00000000..6650705f
--- /dev/null
+++ b/lib/VNWeb/Tags/Index.pm
@@ -0,0 +1,117 @@
+package VNWeb::Tags::Index;
+
+use VNWeb::Prelude;
+
+
+sub tree_ {
+ my $top = tuwf->dbAlli('SELECT id, name, c_items FROM tags WHERE state = 1+1 AND NOT EXISTS(SELECT 1 FROM tags_parents WHERE tag = id) ORDER BY name');
+
+ enrich childs => id => parent => sub { sql
+ 'SELECT tp.parent, t.id, t.name, t.c_items FROM tags t JOIN tags_parents tp ON tp.tag = t.id WHERE state = 1+1 AND tp.parent IN', $_, 'ORDER BY name'
+ }, $top;
+ $top = [ sort { $b->{childs}->@* <=> $a->{childs}->@* } @$top ];
+
+ my sub lnk_ {
+ a_ href => "/g$_[0]{id}", $_[0]{name};
+ b_ class => 'grayedout', " ($_[0]{c_items})" if $_[0]{c_items};
+ }
+ div_ class => 'mainbox', sub {
+ h1_ 'Tag tree';
+ ul_ class => 'tagtree', sub {
+ li_ sub {
+ lnk_ $_;
+ my $sub = $_->{childs};
+ ul_ sub {
+ li_ sub {
+ txt_ '> ';
+ lnk_ $_;
+ } for grep $_, $sub->@[0..4];
+ li_ sub {
+ my $num = @$sub-5;
+ txt_ '> ';
+ a_ href => "/g$_->{id}", style => 'font-style: italic', sprintf '%d more tag%s', $num, $num == 1 ? '' : 's';
+ } if @$sub > 6;
+ } if @$sub;
+ } for @$top;
+ };
+ clearfloat_;
+ br_;
+ };
+}
+
+
+sub recent_ {
+ my $lst = tuwf->dbAlli('SELECT id, name, ', sql_totime('added'), 'AS added FROM tags WHERE state = 1+1 ORDER BY added DESC LIMIT 10');
+ p_ class => 'mainopts', sub {
+ a_ href => '/g/list', 'Browse all tags';
+ };
+ h1_ 'Recently added';
+ ul_ sub {
+ li_ sub {
+ txt_ fmtage $_->{added};
+ txt_ ' ';
+ a_ href => "/g$_->{id}", $_->{name};
+ } for @$lst;
+ };
+}
+
+
+sub popular_ {
+ my $lst = tuwf->dbAlli('SELECT id, name, c_items FROM tags WHERE state = 1+1 AND c_items > 0 AND applicable ORDER BY c_items DESC LIMIT 10');
+ p_ class => 'mainopts', sub {
+ a_ href => '/g/links', 'Recently tagged';
+ };
+ h1_ 'Popular';
+ ul_ sub {
+ li_ sub {
+ a_ href => "/g$_->{id}", $_->{name};
+ txt_ " ($_->{c_items})";
+ } for @$lst;
+ };
+}
+
+
+sub moderation_ {
+ my $lst = tuwf->dbAlli('SELECT id, name, ', sql_totime('added'), 'AS added FROM tags WHERE state = 0 ORDER BY added DESC LIMIT 10');
+ h1_ 'Awaiting moderation';
+ ul_ sub {
+ li_ 'The moderation queue is empty!' if !@$lst;
+ li_ sub {
+ txt_ fmtage $_->{added};
+ txt_ ' ';
+ a_ href => "/g$_->{id}", $_->{name};
+ } for @$lst;
+ li_ sub {
+ br_;
+ a_ href => '/g/list?t=0;o=d;s=added', 'Moderation queue';
+ txt_ ' - ';
+ a_ href => '/g/list?t=1;o=d;s=added', 'Denied tags';
+ };
+ };
+}
+
+
+TUWF::get qr{/g}, sub {
+ framework_ title => 'Tag index', index => 1, sub {
+ div_ class => 'mainbox', sub {
+ p_ class => 'mainopts', sub {
+ a_ href => '/g/new', 'Create a new tag' if can_edit g => {};
+ };
+ h1_ 'Search tags';
+ form_ action => '/g/list', sub {
+ searchbox_ g => '';
+ };
+ };
+ tree_;
+ table_ class => 'mainbox threelayout', sub {
+ tr_ sub {
+ td_ \&recent_;
+ td_ \&popular_;
+ td_ \&moderation_;
+ };
+ };
+
+ };
+};
+
+1;