package VNDB::Handler::ULists; use strict; use warnings; use YAWF ':html', ':xml'; 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{u([1-9]\d*)/wish}, \&wishlist, qr{u([1-9]\d*)/list}, \&vnlist, ); sub vnvote { my($self, $id) = @_; my $uid = $self->authInfo->{id}; return $self->htmlDenied() if !$uid; my $f = $self->formValidate( { name => 'v', enum => [ -1, 1..10 ] } ); return 404 if $f->{_err}; $self->dbVoteDel($uid, $id) if $f->{v} == -1; $self->dbVoteAdd($id, $uid, $f->{v}) if $f->{v} > 0; $self->resRedirect('/v'.$id, 'temp'); } sub vnwish { my($self, $id) = @_; my $uid = $self->authInfo->{id}; return $self->htmlDenied() if !$uid; my $f = $self->formValidate( { name => 's', enum => [ -1, @{$self->{wishlist_status}} ] } ); return 404 if $f->{_err}; $self->dbWishListDel($uid, $id) if $f->{s} == -1; $self->dbWishListAdd($id, $uid, $f->{s}) if $f->{s} != -1; $self->resRedirect('/v'.$id, 'temp'); } sub rlist { my($self, $id) = @_; my $rid = $id; if(!$rid) { my $f = $self->formValidate( { name => 'id', required => 1, template => 'int' } ); return 404 if $f->{_err}; $rid = $f->{id}; } my $uid = $self->authInfo->{id}; return $self->htmlDenied() if !$uid; my $f = $self->formValidate( { name => 'e', required => 1, enum => [ 'del', map("r$_", @{$self->{rlst_rstat}}), map("v$_", @{$self->{rlst_vstat}}) ] }, ); 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'; if($id) { (my $ref = $self->reqHeader('Referer')||"/r$id") =~ s/^\Q$self->{url}//; $self->resRedirect($ref, 'temp'); } else { $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; } } 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 $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 => 'wstat', enum => [qw|title added wstat|] }, { name => 'f', required => 0, default => -1, enum => [ -1, @{$self->{wishlist_status}} ] }, ); return 404 if $f->{_err}; if($own && $self->reqMethod eq 'POST') { my $frm = $self->formValidate( { name => 'sel', required => 0, default => 0, multi => 1, template => 'int' }, { name => 'batchedit', required => 1, enum => [ -1, @{$self->{wishlist_status}} ] }, ); if(!$frm->{_err} && @{$frm->{sel}} && $frm->{sel}[0]) { $self->dbWishListDel($uid, $frm->{sel}) if $frm->{batchedit} == -1; $self->dbWishListAdd($frm->{sel}, $uid, $frm->{batchedit}) if $frm->{batchedit} >= 0; } } my($list, $np) = $self->dbWishListGet( uid => $uid, order => $f->{s}.' '.($f->{o} eq 'a' ? ($f->{s} eq 'wstat' ? 'DESC' : 'ASC' ) : ($f->{s} eq 'wstat' ? 'ASC' : 'DESC')).($f->{s} eq 'wstat' ? ', title ASC' : ''), $f->{f} != -1 ? (wstat => $f->{f}) : (), what => 'vn', results => 50, page => $f->{p}, ); my $title = $own ? mt('_wishlist_title_my') : mt('_wishlist_title_other', $u->{username}); $self->htmlHeader(title => $title, noindex => 1); $self->htmlMainTabs('u', $u, 'wish'); div class => 'mainbox'; h1 $title; if(!@$list && $f->{f} == -1) { p mt '_wishlist_noresults'; end; return $self->htmlFooter; } p class => 'browseopts'; a $f->{f} == $_ ? (class => 'optselected') : (), href => "/u$uid/wish?f=$_", $_ == -1 ? mt '_wishlist_prio_all' : mt "_wish_$_" for (-1, @{$self->{wishlist_status}}); end; end; form action => "/u$uid/wish?f=$f->{f};o=$f->{o};s=$f->{s};p=$f->{p}", method => 'post' if $own; $self->htmlBrowse( class => 'wishlist', items => $list, nextpage => $np, options => $f, pageurl => "/u$uid/wish?f=$f->{f};o=$f->{o};s=$f->{s}", sorturl => "/u$uid/wish?f=$f->{f}", header => [ [ mt('_wishlist_col_title') => 'title' ], [ mt('_wishlist_col_prio') => 'wstat' ], [ mt('_wishlist_col_added') => 'added' ], ], row => sub { my($s, $n, $i) = @_; Tr $n % 2 == 0 ? (class => 'odd') : (); td class => 'tc1'; input type => 'checkbox', name => 'sel', value => $i->{vid} if $own; a href => "/v$i->{vid}", title => $i->{original}||$i->{title}, ' '.shorten $i->{title}, 70; end; td class => 'tc2', mt "_wish_$i->{wstat}"; td class => 'tc3', $self->{l10n}->date($i->{added}, 'compact'); end; }, $own ? (footer => sub { Tr; td colspan => 3; Select name => 'batchedit', id => 'batchedit'; option mt '_wishlist_select'; optgroup label => mt '_wishlist_changeprio'; option value => $_, mt "_wish_$_" for (@{$self->{wishlist_status}}); end; option value => -1, mt '_wishlist_remove'; end; end; end; }) : (), ); end if $own; $self->htmlFooter; } 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 $f = $self->formValidate( { name => 'p', required => 0, default => 1, template => 'int' }, { name => 'o', required => 0, default => 'a', enum => [ 'a', 'd' ] }, { 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 ] }, ); return 404 if $f->{_err}; if($own && $self->reqMethod eq 'POST') { 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}}) ] }, ); 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($list, $np) = $self->dbVNListList( uid => $uid, results => 50, page => $f->{p}, order => $f->{s}.' '.($f->{o} eq 'd' ? 'DESC' : 'ASC').($f->{s} eq 'vote' ? ', title ASC' : ''), voted => $f->{v}, $f->{c} ne 'all' ? (char => $f->{c}) : (), ); my $title = $own ? mt '_rlist_title_my' : mt '_rlist_title_other', $u->{username}; $self->htmlHeader(title => $title, noindex => 1); $self->htmlMainTabs('u', $u, 'list'); # url generator my $url = sub { my($n, $v) = @_; $n ||= ''; local $_ = "/u$uid/list"; $_ .= '?c='.($n eq 'c' ? $v : $f->{c}); $_ .= ';v='.($n eq 'v' ? $v : $f->{v}); if($n eq 'page') { $_ .= ';o='.($n eq 'o' ? $v : $f->{o}); $_ .= ';s='.($n eq 's' ? $v : $f->{s}); } return $_; }; div class => 'mainbox'; h1 $title; p class => 'browseopts'; for ('all', 'a'..'z', 0) { a href => $url->(c => $_), $_ eq $f->{c} ? (class => 'optselected') : (), $_ ? uc $_ : '#'; } end; p class => 'browseopts'; a href => $url->(v => 0), 0 == $f->{v} ? (class => 'optselected') : (), mt '_rlist_voted_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; end; _vnlist_browse($self, $own, $list, $np, $f, $url); $self->htmlFooter; } sub _vnlist_browse { my($self, $own, $list, $np, $f, $url) = @_; form action => $url->(), method => 'post' if $own; $self->htmlBrowse( class => 'rlist', items => $list, nextpage => $np, options => $f, sorturl => $url->(), pageurl => $url->('page'), header => [ [ mt('_rlist_col_title') => 'title', 3 ], sub { td class => 'tc2', id => 'expandall'; lit ''.mt('_rlist_col_releases').'*'; end; }, [ mt('_rlist_col_vote') => 'vote' ], ], row => sub { my($s, $n, $i) = @_; Tr $n % 2 == 0 ? (class => 'odd') : (); td class => 'tc1', colspan => 3; a href => "/v$i->{vid}", title => $i->{original}||$i->{title}, shorten $i->{title}, 70; end; td class => 'tc2'.(@{$i->{rels}} ? ' collapse_but' : ''), id => 'vid'.$i->{vid}; lit ''; 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|$txt| if $finished > $obtained || $finished && $finished == $obtained; $txt = qq|$txt| if $obtained > $finished; lit $txt; end; td class => 'tc3', $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; td class => 'tc2'; cssicon "lang $_", mt "_lang_$_" for @{$_->{languages}}; cssicon "rt$_->{type}", mt "_rtype_$_->{type}"; end; td class => 'tc3'; a href => "/r$_->{rid}", title => $_->{original}||$_->{title}, shorten $_->{title}, 50; end; td colspan => 2, class => 'tc4'; lit liststat($_); end; 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}}); end; optgroup label => mt '_rlist_changeplay'; option value => "v$_", mt "_rlst_vstat_$_" for (@{$self->{rlst_vstat}}); end; option value => 'del', mt '_rlist_del'; end; end; td class => 'tc2', colspan => 2, mt '_rlist_releasenote'; end; }) : (), ); end if $own; } 1;