From 2a7236184180f24169d454396b482d923beb21b5 Mon Sep 17 00:00:00 2001 From: Yorhel Date: Thu, 11 Nov 2010 14:45:22 +0100 Subject: Display releases grouped by VNs on producer pages A nice expanded view. It also happens to be faster than the old view in terms of SQL queries. (In most cases at least) Can be improved a little more by: - Adding an 'expand/collapse' feature to list only the VNs - Adding a column indicating the role of the producer (dev/pub) --- lib/VNDB/Handler/Producers.pm | 80 +++++++++++++++++++++++++++++++++---------- 1 file changed, 62 insertions(+), 18 deletions(-) (limited to 'lib/VNDB/Handler/Producers.pm') diff --git a/lib/VNDB/Handler/Producers.pm b/lib/VNDB/Handler/Producers.pm index e6ccdffb..12485629 100644 --- a/lib/VNDB/Handler/Producers.pm +++ b/lib/VNDB/Handler/Producers.pm @@ -45,7 +45,7 @@ sub page { my $p = $self->dbProducerGet( id => $pid, - what => 'vn extended relations'.($rev ? ' changes' : ''), + what => 'extended relations'.($rev ? ' changes' : ''), $rev ? ( rev => $rev ) : () )->[0]; return 404 if !$p->{id}; @@ -76,7 +76,7 @@ sub page { ); } - div class => 'mainbox producerpage'; + div class => 'mainbox'; $self->htmlItemMessage('p', $p); h1 $p->{name}; h2 class => 'alttitle', $p->{original} if $p->{original}; @@ -117,28 +117,72 @@ sub page { lit bb2html $p->{desc}; end; } - end; - div class => 'mainbox producerpage'; - h1 mt '_prodpage_vnrel'; - if(!@{$p->{vn}}) { + + _releases($self, $p); + + $self->htmlFooter; +} + +sub _releases { + my($self, $p) = @_; + + # prodpage_(dev|pub) + my $r = $self->dbReleaseGet(pid => $p->{id}, results => 999, what => 'vn platforms'); + div class => 'mainbox prodrel'; + h1 mt '_prodpage_rel'; + if(!@$r) { p mt '_prodpage_norel'; - } else { - ul; - for (@{$p->{vn}}) { - li; - i; - lit $self->{l10n}->datestr($_->{date}); + end; + return; + } + + my %vn; # key = vid, value = [ $r1, $r2, $r3, .. ] + my @vn; # $vn objects in order of first release + for my $rel (@$r) { + for my $v (@{$rel->{vn}}) { + push @vn, $v if !$vn{$v->{vid}}; + push @{$vn{$v->{vid}}}, $rel; + } + } + + table; + for my $v (@vn) { + Tr class => 'vn'; + td colspan => 5; + a href => "/v$v->{vid}", title => $v->{original}, $v->{title}; + end; + end; + for my $rel (@{$vn{$v->{vid}}}) { + Tr; + td class => 'tc1'; lit $self->{l10n}->datestr($rel->{released}); end; + td class => 'tc2', !defined($rel->{minage}) ? '' : minage $rel->{minage}; + td class => 'tc3'; + for (sort @{$rel->{platforms}}) { + next if $_ eq 'oth'; + cssicon $_, mt "_plat_$_"; + } + cssicon "lang $_", mt "_lang_$_" for (@{$rel->{languages}}); + cssicon "rt$rel->{type}", mt "_rtype_$rel->{type}"; + end; + td class => 'tc4'; + a href => "/r$rel->{id}", title => $rel->{original}||$rel->{title}, $rel->{title}; + b class => 'grayedout', ' '.mt '_vnpage_rel_patch' if $rel->{patch}; + end; + td class => 'tc5'; + if($rel->{website}) { + a href => $rel->{website}, rel => 'nofollow'; + cssicon 'ext', mt '_vnpage_rel_extlink'; + end; + } else { + txt ' '; + } end; - a href => "/v$_->{id}", title => $_->{original}, $_->{title}; - b class => 'grayedout', ' ('.join(', ', - $_->{developer} ? mt '_prodpage_dev' : (), $_->{publisher} ? mt '_prodpage_pub' : ()).')'; end; } - end; - } + } + end; end; - $self->htmlFooter; } -- cgit v1.2.3