diff options
Diffstat (limited to 'lib/VNWeb/TT/TagLinks.pm')
-rw-r--r-- | lib/VNWeb/TT/TagLinks.pm | 119 |
1 files changed, 119 insertions, 0 deletions
diff --git a/lib/VNWeb/TT/TagLinks.pm b/lib/VNWeb/TT/TagLinks.pm new file mode 100644 index 00000000..0948a309 --- /dev/null +++ b/lib/VNWeb/TT/TagLinks.pm @@ -0,0 +1,119 @@ +package VNWeb::TT::TagLinks; + +use VNWeb::Prelude; +use VNWeb::TT::Lib; + + +sub listing_ { + my($opt, $lst, $np, $url) = @_; + + paginate_ $url, $opt->{p}, $np, 't'; + div_ class => 'mainbox browse taglinks', sub { + table_ class => 'stripe', sub { + thead_ sub { tr_ sub { + td_ class => 'tc1', sub { txt_ 'Date'; sortable_ 'date', $opt, $url; debug_ $lst; }; + td_ class => 'tc2', 'User'; + td_ class => 'tc3', 'Rating'; + td_ class => 'tc4', sub { txt_ 'Tag'; sortable_ 'tag', $opt, $url }; + td_ class => 'tc5', 'Spoiler'; + td_ class => 'tc6', 'Visual novel'; + td_ class => 'tc7', 'Note'; + }}; + tr_ sub { + my $i = $_; + td_ class => 'tc1', fmtdate $i->{date}; + td_ class => 'tc2', sub { + a_ href => $url->(u => $i->{uid}, p=>undef), class => 'setfil', '> ' if $i->{uid} && !defined $opt->{u}; + user_ $i; + }; + td_ class => 'tc3', sub { tagscore_ $i->{vote}, $i->{ignore} }; + td_ class => 'tc4', sub { + a_ href => $url->(t => $i->{tag}, p=>undef), class => 'setfil', '> ' if !defined $opt->{t}; + a_ href => "/g$i->{tag}", $i->{name}; + }; + td_ class => 'tc5', sub { + my $s = !defined $i->{spoiler} ? '' : fmtspoil $i->{spoiler}; + b_ class => 'grayedout', $s if $i->{ignore}; + txt_ $s if !$i->{ignore}; + }; + td_ class => 'tc6', sub { + a_ href => $url->(v => $i->{vid}, p=>undef), class => 'setfil', '> ' if !defined $opt->{v}; + a_ href => "/v$i->{vid}", shorten $i->{title}, 50; + }; + td_ class => 'tc7', $i->{notes}; + } for @$lst; + }; + }; + paginate_ $url, $opt->{p}, $np, 'b'; +} + + +TUWF::get qr{/g/links}, sub { + my $opt = tuwf->validate(get => + p => { page => 1 }, + o => { onerror => 'd', enum => ['a', 'd'] }, + s => { onerror => 'date', enum => [qw|date tag|] }, + v => { onerror => undef, id => 1 }, + u => { onerror => undef, id => 1 }, + t => { onerror => undef, id => 1 }, + )->data; + + my $where = sql_and + defined $opt->{v} ? sql('tv.vid =', \$opt->{v}) : (), + defined $opt->{u} ? sql('tv.uid =', \$opt->{u}) : (), + defined $opt->{t} ? sql('tv.tag =', \$opt->{t}) : (); + + my $filt = defined $opt->{u} || defined $opt->{t} || defined $opt->{v}; + + my $count = $filt && tuwf->dbVali('SELECT COUNT(*) FROM tags_vn tv WHERE', $where); + my($lst, $np) = tuwf->dbPagei({ page => $opt->{p}, results => 50 }, ' + SELECT tv.vid, tv.uid, tv.tag, tv.vote, tv.spoiler,', sql_totime('tv.date'), 'as date, tv.ignore OR (u.id IS NOT NULL AND NOT u.perm_tag) AS ignore, tv.notes, v.title,', sql_user(), ', t.name + FROM tags_vn tv + JOIN vn v ON v.id = tv.vid + LEFT JOIN users u ON u.id = tv.uid + JOIN tags t ON t.id = tv.tag + WHERE', $where, ' + ORDER BY', { date => 'tv.date', tag => 't.name' }->{$opt->{s}}, { a => 'ASC', d => 'DESC' }->{$opt->{o}} + ); + $np = [ $count, 50 ] if $count; + + my sub url { '?'.query_encode %$opt, @_ } + + framework_ title => 'Tag link browser', sub { + div_ class => 'mainbox', sub { + h1_ 'Tag link browser'; + if($filt) { + p_ 'Active filters:'; + ul_ sub { + li_ sub { + txt_ '['; a_ href => url(u=>undef, p=>undef), 'remove'; txt_ '] '; + txt_ 'User: '; + user_ tuwf->dbRowi('SELECT', sql_user(), 'FROM users u WHERE id=', \$opt->{u}); + } if defined $opt->{u}; + li_ sub { + txt_ '['; a_ href => url(t=>undef, p=>undef), 'remove'; txt_ '] '; + txt_ 'Tag:'; txt_ ' '; + a_ href => "/g$opt->{t}", tuwf->dbVali('SELECT name FROM tags WHERE id=', \$opt->{t})||'Unknown tag'; + } if defined $opt->{t}; + li_ sub { + txt_ '['; a_ href => url(v=>undef, p=>undef), 'remove'; txt_ '] '; + txt_ 'Visual novel'; txt_ ' '; + a_ href => "/v$opt->{v}", tuwf->dbVali('SELECT title FROM vn WHERE id=', \$opt->{v})||'Unknown VN'; + } if defined $opt->{v}; + } + } + if($lst && @$lst) { + br_; + p_ 'Click the arrow before a user, tag or VN to add it as a filter.' + unless defined $opt->{u} && defined $opt->{t} && defined $opt->{v}; + } else { + br_; + p_ 'No tag votes matching the requested filters.'; + } + }; + + listing_ $opt, $lst, $np, \&url if $lst && @$lst; + }; +}; + +1; |