diff options
Diffstat (limited to 'lib/VNDB/Handler/Tags.pm')
-rw-r--r-- | lib/VNDB/Handler/Tags.pm | 125 |
1 files changed, 94 insertions, 31 deletions
diff --git a/lib/VNDB/Handler/Tags.pm b/lib/VNDB/Handler/Tags.pm index 43137506..cff5d980 100644 --- a/lib/VNDB/Handler/Tags.pm +++ b/lib/VNDB/Handler/Tags.pm @@ -34,12 +34,14 @@ sub tagpage { { get => 'o', required => 0, default => 'd', enum => [ 'a','d' ] }, { get => 'p', required => 0, default => 1, template => 'int' }, { get => 'm', required => 0, default => -1, enum => [qw|0 1 2|] }, + { get => 'fil', required => 0 }, ); return $self->resNotFound if $f->{_err}; my $tagspoil = $self->reqCookie('tagspoil')||''; $f->{m} = $tagspoil =~ /^[0-2]$/ ? $tagspoil : 0 if $f->{m} == -1; + $f->{fil} //= $self->authPref('filter_vn'); - my($list, $np) = $t->{meta} || $t->{state} != 2 ? ([],0) : $self->filFetchDB(vn => undef, undef, { + my($list, $np) = $t->{meta} || $t->{state} != 2 ? ([],0) : $self->filFetchDB(vn => $f->{fil}, undef, { what => 'rating', results => 50, page => $f->{p}, @@ -94,6 +96,11 @@ sub tagpage { lit bb2html $t->{description}; end; } + p class => 'center'; + b mt('_tagp_cat'); + br; + txt mt("_tagcat_$t->{cat}"); + end; if(@{$t->{aliases}}) { p class => 'center'; b mt('_tagp_aliases'); @@ -106,23 +113,32 @@ sub tagpage { _childtags($self, $t) if @{$t->{childs}}; if(!$t->{meta} && $t->{state} == 2) { + form action => "/g$t->{id}", 'accept-charset' => 'UTF-8', method => 'get'; div class => 'mainbox'; a class => 'addnew', href => "/g/links?t=$tag", mt '_tagp_rawvotes'; h1 mt '_tagp_vnlist'; + p class => 'browseopts'; - a href => "/g$t->{id}?m=0", $f->{m} == 0 ? (class => 'optselected') : (), onclick => "setCookie('tagspoil', 0);return true;", mt '_tagp_spoil0'; - a href => "/g$t->{id}?m=1", $f->{m} == 1 ? (class => 'optselected') : (), onclick => "setCookie('tagspoil', 1);return true;", mt '_tagp_spoil1'; - a href => "/g$t->{id}?m=2", $f->{m} == 2 ? (class => 'optselected') : (), onclick => "setCookie('tagspoil', 2);return true;", mt '_tagp_spoil2'; + a href => "/g$t->{id}?fil=$f->{fil};m=0", $f->{m} == 0 ? (class => 'optselected') : (), onclick => "setCookie('tagspoil', 0);return true;", mt '_tagp_spoil0'; + a href => "/g$t->{id}?fil=$f->{fil};m=1", $f->{m} == 1 ? (class => 'optselected') : (), onclick => "setCookie('tagspoil', 1);return true;", mt '_tagp_spoil1'; + a href => "/g$t->{id}?fil=$f->{fil};m=2", $f->{m} == 2 ? (class => 'optselected') : (), onclick => "setCookie('tagspoil', 2);return true;", mt '_tagp_spoil2'; + end; + + a id => 'filselect', href => '#v'; + lit '<i>▸</i> '.mt('_js_fil_filters').'<i></i>'; end; + input type => 'hidden', class => 'hidden', name => 'fil', id => 'fil', value => $f->{fil}; + if(!@$list) { p; br; br; txt mt '_tagp_novn'; end; } p; br; txt mt '_tagp_cached'; end; end 'div'; - $self->htmlBrowseVN($list, $f, $np, "/g$t->{id}?m=$f->{m}", 1) if @$list; + end 'form'; + $self->htmlBrowseVN($list, $f, $np, "/g$t->{id}?fil=$f->{fil};m=$f->{m}", 1) if @$list; } - $self->htmlFooter; + $self->htmlFooter(prefs => ['filter_vn']); } @@ -198,6 +214,8 @@ sub tagedit { $frm = $self->formValidate( { post => 'name', required => 1, maxlength => 250, regex => [ qr/^[^,]+$/, 'A comma is not allowed in tag names' ] }, { post => 'state', required => 0, default => 0, enum => [ 0..2 ] }, + { post => 'cat', required => 1, enum => $self->{tag_categories} }, + { post => 'catrec', required => 0 }, { post => 'meta', required => 0, default => 0 }, { post => 'alias', required => 0, maxlength => 1024, default => '', regex => [ qr/^[^,]+$/s, 'No comma allowed in aliases' ] }, { post => 'description', required => 0, maxlength => 10240, default => '' }, @@ -220,11 +238,13 @@ sub tagedit { $_ = $c->[0]{id}; } } + if(!$frm->{_err}) { $frm->{state} = $frm->{meta} = 0 if !$self->authCan('tagmod'); my %opts = ( name => $frm->{name}, state => $frm->{state}, + cat => $frm->{cat}, description => $frm->{description}, meta => $frm->{meta}?1:0, aliases => \@aliases, @@ -234,6 +254,7 @@ sub tagedit { $tag = $self->dbTagAdd(%opts); } else { $self->dbTagEdit($tag, %opts, upddate => $frm->{state} == 2 && $t->{state} != 2); + _set_childs_cat($self, $tag, $frm->{cat}) if $frm->{catrec}; } $self->dbTagMerge($tag, @merge) if $self->authCan('tagmod') && @merge; $self->resRedirect("/g$tag", 'post'); @@ -242,7 +263,7 @@ sub tagedit { } if($tag) { - $frm->{$_} ||= $t->{$_} for (qw|name meta description state|); + $frm->{$_} ||= $t->{$_} for (qw|name meta description state cat|); $frm->{alias} ||= join "\n", @{$t->{aliases}}; $frm->{parents} ||= join ', ', map $_->{name}, @{$t->{parents}}; } @@ -274,6 +295,12 @@ sub tagedit { $tag ? [ static => content => mt '_tagedit_frm_meta_warn' ] : (), ) : (), + [ select => short => 'cat', name => mt('_tagedit_frm_cat'), options => [ + map [$_, mt "_tagcat_$_"], @{$self->{tag_categories}} ] ], + $self->authCan('tagmod') && $tag ? ( + [ checkbox => short => 'catrec', name => mt '_tagedit_frm_catrec' ], + [ static => content => mt '_tagedit_frm_catrec_warn' ], + ) : (), [ textarea => short => 'alias', name => mt('_tagedit_frm_alias'), cols => 30, rows => 4 ], [ textarea => short => 'description', name => mt '_tagedit_frm_desc' ], [ static => content => mt '_tagedit_frm_desc_msg' ], @@ -288,6 +315,27 @@ sub tagedit { $self->htmlFooter; } +# recursively edit all child tags and set the category field +# Note: this can be done more efficiently by doing everything in one UPDATE +# query, but that takes more code and this feature isn't used very often +# anyway. +sub _set_childs_cat { + my($self, $tag, $cat) = @_; + my %done; + + my $e; + $e = sub { + my $l = shift; + for (@$l) { + $self->dbTagEdit($_->{id}, cat => $cat) if !$done{$_->{id}}++; + $e->($_->{sub}) if $_->{sub}; + } + }; + + my $childs = $self->dbTagTree($tag, 25); + $e->($childs); +} + sub taglist { my $self = shift; @@ -579,30 +627,7 @@ sub vntagmod { end; end; end 'tfoot'; tbody id => 'tagtable'; - for my $t (sort { $a->{name} cmp $b->{name} } @$tags) { - my $m = (grep $_->{tag} == $t->{id}, @$my)[0] || {}; - Tr id => "tgl_$t->{id}"; - td class => 'tc_tagname'; a href => "/g$t->{id}", $t->{name}; end; - td class => 'tc_myvote', $m->{vote}||0; - if($self->authCan('tagmod')) { - td class => 'tc_myover'; - input type => 'checkbox', name => 'overrule', value => $t->{id}, - $m->{vote} && !$m->{ignore} && $t->{overruled} ? (checked => 'checked') : () - if $t->{cnt} > 1; - end; - } - td class => 'tc_myspoil', defined $m->{spoiler} ? $m->{spoiler} : -1; - td class => 'tc_allvote'; - tagscore $t->{rating}; - i $t->{overruled} ? (class => 'grayedout') : (), " ($t->{cnt})"; - b class => 'standout', style => 'font-weight: bold', ' !' if $t->{overruled}; - end; - td class => 'tc_allspoil', sprintf '%.2f', $t->{spoiler}; - td class => 'tc_allwho'; - a href => "/g/links?v=$vid;t=$t->{id}", mt '_tagv_who'; - end; - end; - } + _tagmod_list($self, $vid, $tags, $my); end 'tbody'; end 'table'; } ], @@ -610,6 +635,44 @@ sub vntagmod { $self->htmlFooter; } +sub _tagmod_list { + my($self, $vid, $tags, $my) = @_; + + my %my = map +($_->{tag} => $_), @$my; + + for my $cat (@{$self->{tag_categories}}) { + my @tags = grep $_->{cat} eq $cat, @$tags; + next if !@tags; + Tr class => 'tagmod_cat'; + td colspan => 7, mt "_tagcat_$cat"; + end; + for my $t (@tags) { + my $m = $my{$t->{id}}; + Tr id => "tgl_$t->{id}"; + td class => 'tc_tagname'; a href => "/g$t->{id}", $t->{name}; end; + td class => 'tc_myvote', $m->{vote}||0; + if($self->authCan('tagmod')) { + td class => 'tc_myover'; + input type => 'checkbox', name => 'overrule', value => $t->{id}, + $m->{vote} && !$m->{ignore} && $t->{overruled} ? (checked => 'checked') : () + if $t->{cnt} > 1; + end; + } + td class => 'tc_myspoil', defined $m->{spoiler} ? $m->{spoiler} : -1; + td class => 'tc_allvote'; + tagscore $t->{rating}; + i $t->{overruled} ? (class => 'grayedout') : (), " ($t->{cnt})"; + b class => 'standout', style => 'font-weight: bold', title => mt('_tagv_overruletip'), ' !' if $t->{overruled}; + end; + td class => 'tc_allspoil', sprintf '%.2f', $t->{spoiler}; + td class => 'tc_allwho'; + a href => "/g/links?v=$vid;t=$t->{id}", mt '_tagv_who'; + end; + end; + } + } +} + sub tagindex { my $self = shift; |