diff options
Diffstat (limited to 'lib/VNDB/Handler/ULists.pm')
-rw-r--r-- | lib/VNDB/Handler/ULists.pm | 237 |
1 files changed, 164 insertions, 73 deletions
diff --git a/lib/VNDB/Handler/ULists.pm b/lib/VNDB/Handler/ULists.pm index 6efb0a13..403b391d 100644 --- a/lib/VNDB/Handler/ULists.pm +++ b/lib/VNDB/Handler/ULists.pm @@ -10,8 +10,9 @@ use VNDB::Func; YAWF::register( qr{v([1-9]\d*)/vote}, \&vnvote, qr{v([1-9]\d*)/wish}, \&vnwish, - qr{r([1-9]\d*)/list}, \&rlist, - qr{xml/rlist.xml}, \&rlist, + qr{v([1-9]\d*)/list}, \&vnlist_e, + qr{r([1-9]\d*)/list}, \&rlist_e, + qr{xml/rlist.xml}, \&rlist_e, qr{([uv])([1-9]\d*)/votes}, \&votelist, qr{u([1-9]\d*)/wish}, \&wishlist, qr{u([1-9]\d*)/list}, \&vnlist, @@ -56,7 +57,26 @@ sub vnwish { } -sub rlist { +sub vnlist_e { + my($self, $id) = @_; + + my $uid = $self->authInfo->{id}; + return $self->htmlDenied() if !$uid; + + return if !$self->authCheckCode; + my $f = $self->formValidate( + { name => 'e', enum => [ -1, @{$self->{vnlist_status}} ] } + ); + return 404 if $f->{_err}; + + $self->dbVNListDel($uid, $id) if $f->{e} == -1; + $self->dbVNListAdd($uid, $id, $f->{e}) if $f->{e} != -1; + + $self->resRedirect('/v'.$id, 'temp'); +} + + +sub rlist_e { my($self, $id) = @_; my $rid = $id; @@ -73,27 +93,21 @@ sub rlist { return if !$self->authCheckCode; my $f = $self->formValidate( - { name => 'e', required => 1, enum => [ 'del', map("r$_", @{$self->{rlst_rstat}}), map("v$_", @{$self->{rlst_vstat}}) ] }, + { name => 'e', required => 1, enum => [ -1, @{$self->{rlist_status}} ] } ); return 404 if $f->{_err}; - $self->dbVNListDel($uid, $rid) if $f->{e} eq 'del'; - $self->dbVNListAdd( - rid => $rid, - uid => $uid, - $f->{e} =~ /^([rv])(\d+)$/ && $1 eq 'r' ? (rstat => $2) : (vstat => $2) - ) if $f->{e} ne 'del'; + $self->dbRListDel($uid, $rid) if $f->{e} == -1; + $self->dbRListAdd($uid, $rid, $f->{e}) if $f->{e} >= 0; if($id) { (my $ref = $self->reqHeader('Referer')||"/r$id") =~ s/^\Q$self->{url}//; $self->resRedirect($ref, 'temp'); } else { + # doesn't really matter what we return, as long as it's XML $self->resHeader('Content-type' => 'text/xml'); - my $st = $self->dbVNListGet(uid => $self->authInfo->{id}, rid => [$rid])->[0]; xml; - tag 'rlist', uid => $self->authInfo->{id}, rid => $rid; - txt $st ? liststat $st : '--'; - end; + tag 'done', ''; } } @@ -101,17 +115,32 @@ sub rlist { sub votelist { my($self, $type, $id) = @_; - my $obj = $type eq 'v' ? $self->dbVNGet(id => $id)->[0] : $self->dbUserGet(uid => $id)->[0]; + my $obj = $type eq 'v' ? $self->dbVNGet(id => $id)->[0] : $self->dbUserGet(uid => $id, what => 'hide_list')->[0]; return 404 if !$obj->{id}; my $own = $type eq 'u' && $self->authInfo->{id} && $self->authInfo->{id} == $id; - return 404 if $type eq 'u' && !$own && !($obj->{show_list} || $self->authCan('usermod')); + return 404 if $type eq 'u' && !$own && !(!$obj->{hide_list} || $self->authCan('usermod')); my $f = $self->formValidate( { name => 'p', required => 0, default => 1, template => 'int' }, { name => 'o', required => 0, default => 'd', enum => ['a', 'd'] }, { name => 's', required => 0, default => 'date', enum => [qw|date title vote|] }, + { name => 'c', required => 0, default => 'all', enum => [ 'all', 'a'..'z', 0 ] }, ); + return 404 if $f->{_err}; + + if($own && $self->reqMethod eq 'POST') { + return if !$self->authCheckCode; + my $frm = $self->formValidate( + { name => 'vid', required => 1, multi => 1, template => 'int' }, + { name => 'batchedit', required => 1, enum => [ -2, -1, 1..10 ] }, + ); + my @vid = grep $_ > 0, @{$frm->{vid}}; + if(!$frm->{_err} && @vid && $frm->{batchedit} > -2) { + $self->dbVoteDel($id, \@vid) if $frm->{batchedit} == -1; + $self->dbVoteAdd(\@vid, $id, $frm->{batchedit}) if $frm->{batchedit} >= 0; + } + } my($list, $np) = $self->dbVoteGet( $type.'id' => $id, @@ -121,24 +150,35 @@ sub votelist { sort => $f->{s} eq 'title' && $type eq 'v' ? 'username' : $f->{s}, reverse => $f->{o} eq 'd', results => 50, - page => $f->{p} + page => $f->{p}, + $f->{c} ne 'all' ? ($type eq 'u' ? 'vn_char' : 'user_char', $f->{c}) : (), ); - return 404 if !@$list; my $title = mt $type eq 'v' ? '_votelist_title_vn' : '_votelist_title_user', $obj->{title} || $obj->{username}; $self->htmlHeader(noindex => 1, title => $title); $self->htmlMainTabs($type => $obj, 'votes'); div class => 'mainbox'; h1 $title; + p class => 'browseopts'; + for ('all', 'a'..'z', 0) { + a href => "/$type$id/votes?c=$_", $_ eq $f->{c} ? (class => 'optselected') : (), $_ eq 'all' ? mt('_char_all') : $_ ? uc $_ : '#'; + } + end; + p mt '_votelist_novotes' if !@$list; end; - $self->htmlBrowse( + if($own) { + my $code = $self->authGetCode("/u$id/votes"); + form action => "/u$id/votes?formcode=$code;c=$f->{c};s=$f->{s};p=$f->{p}", method => 'post'; + } + + @$list && $self->htmlBrowse( class => 'votelist', items => $list, options => $f, nextpage => $np, - pageurl => "/$type$id/votes?o=$f->{o};s=$f->{s}", - sorturl => "/$type$id/votes", + pageurl => "/$type$id/votes?c=$f->{c};o=$f->{o};s=$f->{s}", + sorturl => "/$type$id/votes?c=$f->{c}", header => [ [ mt('_votelist_col_date'), 'date' ], [ mt('_votelist_col_vote'), 'vote' ], @@ -147,15 +187,33 @@ sub votelist { row => sub { my($s, $n, $l) = @_; Tr $n % 2 ? (class => 'odd') : (); - td class => 'tc1', $self->{l10n}->date($l->{date}); + td class => 'tc1'; + input type => 'checkbox', name => 'vid', value => $l->{vid} if $own; + txt ' '.$self->{l10n}->date($l->{date}); + end; td class => 'tc2', $l->{vote}; td class => 'tc3'; a href => $type eq 'v' ? ("/u$l->{uid}", $l->{username}) : ("/v$l->{vid}", shorten $l->{title}, 100); end; end; }, + $own ? (footer => sub { + Tr; + td colspan => 3, class => 'tc1'; + input type => 'checkbox', class => 'checkall', name => 'vid', value => -1; + txt ' '; + Select name => 'batchedit', id => 'batchedit'; + option value => -2, '-- with selected --'; + optgroup label => 'Change vote'; + option value => $_, "$_ (".mt("_vote_$_").')' for (reverse 1..10); + end; + option value => -1, 'revoke'; + end; + end; + end; + }) : (), ); - + end if $own; $self->htmlFooter; } @@ -164,8 +222,8 @@ sub wishlist { my($self, $uid) = @_; my $own = $self->authInfo->{id} && $self->authInfo->{id} == $uid; - my $u = $self->dbUserGet(uid => $uid)->[0]; - return 404 if !$u || !$own && !($u->{show_list} || $self->authCan('usermod')); + my $u = $self->dbUserGet(uid => $uid, what => 'hide_list')->[0]; + return 404 if !$u || !$own && !(!$u->{hide_list} || $self->authCan('usermod')); my $f = $self->formValidate( { name => 'p', required => 0, default => 1, template => 'int' }, @@ -266,8 +324,8 @@ sub vnlist { my($self, $uid) = @_; my $own = $self->authInfo->{id} && $self->authInfo->{id} == $uid; - my $u = $self->dbUserGet(uid => $uid)->[0]; - return 404 if !$u || !$own && !($u->{show_list} || $self->authCan('usermod')); + my $u = $self->dbUserGet(uid => $uid, what => 'hide_list')->[0]; + return 404 if !$u || !$own && !(!$u->{hide_list} || $self->authCan('usermod')); my $f = $self->formValidate( { name => 'p', required => 0, default => 1, template => 'int' }, @@ -275,33 +333,40 @@ sub vnlist { { name => 's', required => 0, default => 'title', enum => [ 'title', 'vote' ] }, { name => 'c', required => 0, default => 'all', enum => [ 'all', 'a'..'z', 0 ] }, { name => 'v', required => 0, default => 0, enum => [ -1..1 ] }, + { name => 't', required => 0, default => -1, enum => [ -1, @{$self->{vnlist_status}} ] }, ); return 404 if $f->{_err}; if($own && $self->reqMethod eq 'POST') { return if !$self->authCheckCode; my $frm = $self->formValidate( - { name => 'sel', required => 0, default => 0, multi => 1, template => 'int' }, - { name => 'batchedit', required => 1, enum => [ 'del', map("r$_", @{$self->{rlst_rstat}}), map("v$_", @{$self->{rlst_vstat}}) ] }, + { name => 'vid', required => 0, default => 0, multi => 1, template => 'int' }, + { name => 'rid', required => 0, default => 0, multi => 1, template => 'int' }, + { name => 'not', required => 0, default => '', maxlength => 2000 }, + { name => 'vns', required => 1, enum => [ -2, -1, @{$self->{vnlist_status}}, 999 ] }, + { name => 'rel', required => 1, enum => [ -2, -1, @{$self->{rlist_status}} ] }, ); - if(!$frm->{_err} && @{$frm->{sel}} && $frm->{sel}[0]) { - $self->dbVNListDel($uid, $frm->{sel}) if $frm->{batchedit} eq 'del'; - $self->dbVNListAdd( - rid => $frm->{sel}, - uid => $uid, - $frm->{batchedit} =~ /^([rv])(\d+)$/ && $1 eq 'r' ? (rstat => $2) : (vstat => $2) - ) if $frm->{batchedit} ne 'del'; + my @vid = grep $_ > 0, @{$frm->{vid}}; + my @rid = grep $_ > 0, @{$frm->{rid}}; + if(!$frm->{_err} && @vid && $frm->{vns} > -2) { + $self->dbVNListDel($uid, \@vid) if $frm->{vns} == -1; + $self->dbVNListAdd($uid, \@vid, $frm->{vns}) if $frm->{vns} >= 0 && $frm->{vns} < 999; + $self->dbVNListAdd($uid, \@vid, undef, $frm->{not}) if $frm->{vns} == 999; + } + if(!$frm->{_err} && @rid && $frm->{rel} > -2) { + $self->dbRListDel($uid, \@rid) if $frm->{rel} == -1; + $self->dbRListAdd($uid, \@rid, $frm->{rel}) if $frm->{rel} >= 0; } } - my($list, $np) = $self->dbVNListList( uid => $uid, results => 50, page => $f->{p}, sort => $f->{s}, reverse => $f->{o} eq 'd', - voted => $f->{v}, + voted => $f->{v} == 0 ? undef : $f->{v} < 0 ? 0 : $f->{v}, $f->{c} ne 'all' ? (char => $f->{c}) : (), + $f->{t} >= 0 ? (status => $f->{t}) : (), ); my $title = $own ? mt '_rlist_title_my' : mt '_rlist_title_other', $u->{username}; @@ -315,6 +380,7 @@ sub vnlist { local $_ = "/u$uid/list"; $_ .= '?c='.($n eq 'c' ? $v : $f->{c}); $_ .= ';v='.($n eq 'v' ? $v : $f->{v}); + $_ .= ';t='.($n eq 't' ? $v : $f->{t}); if($n eq 'page') { $_ .= ';o='.($n eq 'o' ? $v : $f->{o}); $_ .= ';s='.($n eq 's' ? $v : $f->{s}); @@ -330,10 +396,14 @@ sub vnlist { } end; p class => 'browseopts'; - a href => $url->(v => 0), 0 == $f->{v} ? (class => 'optselected') : (), mt '_rlist_voted_all'; + a href => $url->(v => 0), 0 == $f->{v} ? (class => 'optselected') : (), mt '_rlist_all'; a href => $url->(v => 1), 1 == $f->{v} ? (class => 'optselected') : (), mt '_rlist_voted_only'; a href => $url->(v => -1), -1 == $f->{v} ? (class => 'optselected') : (), mt '_rlist_voted_none'; end; + p class => 'browseopts'; + a href => $url->(t => -1), -1 == $f->{t} ? (class => 'optselected') : (), mt '_rlist_all'; + a href => $url->(t => $_), $_ == $f->{t} ? (class => 'optselected') : (), mt '_vnlist_status_'.$_ for @{$self->{vnlist_status}}; + end; end; _vnlist_browse($self, $own, $list, $np, $f, $url, $uid); @@ -343,8 +413,11 @@ sub vnlist { sub _vnlist_browse { my($self, $own, $list, $np, $f, $url, $uid) = @_; - form action => $url->().';formcode='.$self->authGetCode("/u$uid/list"), method => 'post' - if $own; + if($own) { + form action => $url->(), method => 'post'; + input type => 'hidden', class => 'hidden', name => 'not', id => 'not', value => ''; + input type => 'hidden', class => 'hidden', name => 'formcode', id => 'formcode', value => $self->authGetCode("/u$uid/list"); + } $self->htmlBrowse( class => 'rlist', @@ -354,66 +427,84 @@ sub _vnlist_browse { sorturl => $url->(), pageurl => $url->('page'), header => [ - [ mt('_rlist_col_title') => 'title', 3 ], - sub { td class => 'tc2', id => 'expandall'; lit '<i>▸</i>'.mt('_rlist_col_releases').'*'; end; }, + [ '' ], + sub { td class => 'tc2', id => 'expandall'; lit '▸'; end; }, + [ mt('_rlist_col_title') => 'title' ], + [ '' ], [ '' ], + [ mt('_rlist_col_status') ], + [ mt('_rlist_col_releases').'*' ], [ mt('_rlist_col_vote') => 'vote' ], ], row => sub { my($s, $n, $i) = @_; Tr $n % 2 == 0 ? (class => 'odd') : (); - td class => 'tc1', colspan => 3; + td class => 'tc1'; input type => 'checkbox', name => 'vid', value => $i->{vid} if $own; end; + if(@{$i->{rels}}) { + td class => 'tc2 collapse_but', id => "vid$i->{vid}"; lit '▸'; end; + } else { + td class => 'tc2', ''; + } + td class => 'tc3_5', colspan => 3; a href => "/v$i->{vid}", title => $i->{original}||$i->{title}, shorten $i->{title}, 70; + b class => 'grayedout', $i->{notes} if $i->{notes}; end; - td class => 'tc2'.(@{$i->{rels}} ? ' collapse_but' : ''), id => 'vid'.$i->{vid}; - lit '<i>▸</i>'; - my $obtained = grep $_->{rstat}==2, @{$i->{rels}}; - my $finished = grep $_->{vstat}==2, @{$i->{rels}}; - my $txt = sprintf '%d/%d/%d', $obtained, $finished, scalar @{$i->{rels}}; - $txt = qq|<b class="done">$txt</b>| if $finished > $obtained || $finished && $finished == $obtained; - $txt = qq|<b class="todo">$txt</b>| if $obtained > $finished; + td class => 'tc6', $i->{status} ? mt '_vnlist_status_'.$i->{status} : ''; + td class => 'tc7'; + my $obtained = grep $_->{status}==2, @{$i->{rels}}; + my $total = scalar @{$i->{rels}}; + my $txt = sprintf '%d/%d', $obtained, $total; + $txt = qq|<b class="done">$txt</b>| if $total && $obtained == $total; + $txt = qq|<b class="todo">$txt</b>| if $obtained < $total; lit $txt; end; - td class => 'tc3', $i->{vote} || '-'; + td class => 'tc8', $i->{vote} || '-'; end; for (@{$i->{rels}}) { - Tr class => "collapse relhid collapse_vid$i->{vid}"; - td class => 'tc1'.($own ? ' own' : ''); - input type => 'checkbox', name => 'sel', value => $_->{rid} - if $own; - lit $self->{l10n}->datestr($_->{released}); - end; + Tr class => "collapse relhid collapse_vid$i->{vid}".($n%2 ? '':' odd'); + td class => 'tc1', ''; td class => 'tc2'; + input type => 'checkbox', name => 'rid', value => $_->{rid} if $own; + end; + td class => 'tc3', $self->{l10n}->datestr($_->{released}); + td class => 'tc4'; cssicon "lang $_", mt "_lang_$_" for @{$_->{languages}}; cssicon "rt$_->{type}", mt "_rtype_$_->{type}"; end; - td class => 'tc3'; + td class => 'tc5'; a href => "/r$_->{rid}", title => $_->{original}||$_->{title}, shorten $_->{title}, 50; end; - td colspan => 2, class => 'tc4'; - lit liststat($_); - end; + td class => 'tc6', $_->{status} ? mt '_rlist_status_'.$_->{status} : ''; + td class => 'tc7_8', colspan => 2, ''; end; } }, $own ? (footer => sub { Tr; - td class => 'tc1', colspan => 3; - Select id => 'batchedit', name => 'batchedit'; - option mt '_rlist_selection'; - optgroup label => mt '_rlist_changerel'; - option value => "r$_", mt "_rlst_rstat_$_" - for (@{$self->{rlst_rstat}}); + td class => 'tc1'; input type => 'checkbox', name => 'vid', value => -1, class => 'checkall'; end; + td class => 'tc2'; input type => 'checkbox', name => 'rid', value => -1, class => 'checkall'; end; + td class => 'tc3_6', colspan => 4; + Select id => 'vns', name => 'vns'; + option value => -2, mt '_rlist_withvn'; + optgroup label => mt '_rlist_changestat'; + option value => $_, mt "_vnlist_status_$_" + for (@{$self->{vnlist_status}}); end; - optgroup label => mt '_rlist_changeplay'; - option value => "v$_", mt "_rlst_vstat_$_" - for (@{$self->{rlst_vstat}}); + option value => 999, mt '_rlist_setnote'; + option value => -1, mt '_rlist_del'; + end; + Select id => 'rel', name => 'rel'; + option value => -2, mt '_rlist_withrel'; + optgroup label => mt '_rlist_changestat'; + option value => $_, mt "_rlist_status_$_" + for (@{$self->{rlist_status}}); end; - option value => 'del', mt '_rlist_del'; + option value => -1, mt '_rlist_del'; end; + input type => 'submit', value => mt '_rlist_update'; end; - td class => 'tc2', colspan => 2, mt '_rlist_releasenote'; + td class => 'tc7_8', colspan => 2, mt '_rlist_releasenote'; end; }) : (), ); |