diff options
author | Yorhel <git@yorhel.nl> | 2009-07-04 19:53:09 +0200 |
---|---|---|
committer | Yorhel <git@yorhel.nl> | 2009-07-04 19:53:09 +0200 |
commit | 7f26d42e6bd1710c8f3521919220b1f1db427bee (patch) | |
tree | 563f2354db923157466791d59372a2041a78851d | |
parent | 70d87e3330639295fb656495c2afa1ca258d0867 (diff) |
Separated VN search filters from search box
It was a rather stupid and buggy idea...
-rw-r--r-- | ChangeLog | 1 | ||||
-rw-r--r-- | lib/VNDB/Handler/VNBrowse.pm | 59 | ||||
-rw-r--r-- | static/f/script.js | 75 |
3 files changed, 33 insertions, 102 deletions
@@ -5,6 +5,7 @@ - Proper support for multilingual releases - Copy-add release feature - Automatically fill out title & original title when adding a release + - Separated VN search filters from search box 2.4 - 2009-06-07 - Release search + browser + filters diff --git a/lib/VNDB/Handler/VNBrowse.pm b/lib/VNDB/Handler/VNBrowse.pm index d5791907..db42db81 100644 --- a/lib/VNDB/Handler/VNBrowse.pm +++ b/lib/VNDB/Handler/VNBrowse.pm @@ -21,40 +21,27 @@ sub list { { name => 'p', required => 0, default => 1, template => 'int' }, { name => 'q', required => 0, default => '' }, { name => 'sq', required => 0, default => '' }, + { name => 'ln', required => 0, multi => 1, enum => [ keys %{$self->{languages}} ], default => '' }, + { name => 'pl', required => 0, multi => 1, enum => [ keys %{$self->{platforms}} ], default => '' }, ); return 404 if $f->{_err}; $f->{q} ||= $f->{sq}; - my(@plat, @lang); - my $q = $f->{q}; - if($q) { - # VNDBID - return $self->resRedirect('/'.$1.$2.(!$3 ? '' : $1 eq 'd' ? '#'.$3 : '.'.$3), 'temp') - if $q =~ /^([gvrptud])([0-9]+)(?:\.([0-9]+))?$/; - - if(!($q =~ s/^title://)) { - # platforms - $_ ne 'oth' && $q =~ s/(?:$self->{platforms}{$_}|p:$_)//ig && push @plat, $_ for keys %{$self->{platforms}}; - - # languages - $q =~ s/($self->{languages}{$_}|l:$_)//ig && push @lang, $_ for keys %{$self->{languages}}; - } - } - $q =~ s/ +$//; - $q =~ s/^ +//; + return $self->resRedirect('/'.$1.$2.(!$3 ? '' : $1 eq 'd' ? '#'.$3 : '.'.$3), 'temp') + if $f->{q} && $f->{q} =~ /^([gvrptud])([0-9]+)(?:\.([0-9]+))?$/; my($list, $np) = $self->dbVNGet( $char ne 'all' ? ( char => $char ) : (), - $q ? ( search => $q ) : (), + $f->{q} ? ( search => $f->{q} ) : (), results => 50, page => $f->{p}, order => ($f->{s} eq 'rel' ? 'c_released' : $f->{s} eq 'pop' ? 'c_popularity' : 'title').($f->{o} eq 'a' ? ' ASC' : ' DESC'), - @lang ? ( lang => \@lang ) : (), - @plat ? ( platform => \@plat ) : (), + $f->{pl}[0] ? ( platform => $f->{pl} ) : (), + $f->{ln}[0] ? ( lang => $f->{ln} ) : (), ); $self->resRedirect('/v'.$list->[0]{id}, 'temp') - if $q && @$list == 1; + if $f->{q} && @$list == 1; $self->htmlHeader(title => 'Browse visual novels', search => $f->{q}); _filters($self, $f, $char); @@ -100,11 +87,10 @@ sub list { sub _filters { my($self, $f, $char) = @_; + form action => '/v/all', 'accept-charset' => 'UTF-8', method => 'get'; div class => 'mainbox'; h1 'Browse visual novels'; - form action => '/v/all', 'accept-charset' => 'UTF-8', method => 'get'; - $self->htmlSearchBox('v', $f->{q}); - end; + $self->htmlSearchBox('v', $f->{q}); p class => 'browseopts'; for ('all', 'a'..'z', 0) { a href => "/v/$_", $_ eq $char ? (class => 'optselected') : (), $_ ? uc $_ : '#'; @@ -117,12 +103,13 @@ sub _filters { h2; lit 'Languages <b>(boolean or, selecting more gives more results)</b>'; end; - for(sort @{$self->dbLanguages}) { + for my $i (sort @{$self->dbLanguages}) { span; - input type => 'checkbox', id => "lang_$_"; - label for => "lang_$_"; - cssicon "lang $_", $self->{languages}{$_}; - txt $self->{languages}{$_}; + input type => 'checkbox', name => 'ln', value => $i, id => "lang_$i", + (scalar grep $_ eq $i, @{$f->{ln}}) ? (checked => 'checked') : (); + label for => "lang_$i"; + cssicon "lang $i", $self->{languages}{$i}; + txt $self->{languages}{$i}; end; end; } @@ -130,13 +117,14 @@ sub _filters { h2; lit 'Platforms <b>(boolean or, selecting more gives more results)</b>'; end; - for(sort keys %{$self->{platforms}}) { - next if $_ eq 'oth'; + for my $i (sort keys %{$self->{platforms}}) { + next if $i eq 'oth'; span; - input type => 'checkbox', id => "plat_$_"; - label for => "plat_$_"; - cssicon $_, $self->{platforms}{$_}; - txt $self->{platforms}{$_}; + input type => 'checkbox', id => "plat_$i", name => 'pl', value => $i, + (scalar grep $_ eq $i, @{$f->{pl}}) ? (checked => 'checked') : (); + label for => "plat_$i"; + cssicon $i, $self->{platforms}{$i}; + txt $self->{platforms}{$i}; end; end; } @@ -144,6 +132,7 @@ sub _filters { clearfloat; end; end; + end; } diff --git a/static/f/script.js b/static/f/script.js index b39ba11f..e6eab3bb 100644 --- a/static/f/script.js +++ b/static/f/script.js @@ -53,70 +53,6 @@ function readCookie(n) { - - - -/* A D V A N C E D S E A R C H */ - -function searchInit() { - cl('advselect', function() { - var e = x('advoptions'); - e.className = e.className.indexOf('hidden')>=0 ? '' : 'hidden'; - this.getElementsByTagName('i')[0].innerHTML = e.className.indexOf('hidden')>=0 ? '▸' : '▾'; - return false; - }); - - if(x('advoptions').className.indexOf('vnoptions') < 0) - return; - var l = x('advoptions').getElementsByTagName('input'); - for(i=0;i<l.length;i++) - if(l[i].id.substr(0,5) == 'lang_' || l[i].id.substr(0,5) == 'plat_') - l[i].onclick = function() { - searchParse(0, this.parentNode.getElementsByTagName('acronym')[0].title); - }; - - x('q').onkeyup = searchParse; - searchParse(); -} - -function searchParse(add, term) { - var q = x('q').value; - var i; - - if(add == 0 || add === 1) { - var qn = q; - if(!add) - eval('qn = qn.replace(/'+term+'/gi, "")'); - else { - eval('qn = qn.replace(/(^|[^-])'+term+'/gi, "$1-'+term+'")'); - if(qn == q) - eval('qn = qn.replace(/-'+term+'/gi, "")'); - } - if(qn == q) - q += ' '+term; - else - q = qn; - - q = q.replace(/^ +/, ""); - q = q.replace(/ +$/, ""); - q = q.replace(/ +/g, " "); - - x('q').value = q; - } - - q = q.toLowerCase(); - var l = x('advoptions').getElementsByTagName('input'); - for(i=0;i<l.length;i++) - if(l[i].id.substr(0,5) == 'lang_' || l[i].id.substr(0,5) == 'plat_') - l[i].checked = q.indexOf(l[i].parentNode.getElementsByTagName('acronym')[0].title.toLowerCase()) >= 0 ? true : false; - - return false; -} - - - - - /* I M A G E V I E W E R */ function ivInit() { @@ -511,9 +447,14 @@ DOMLoad(function() { } - // Advanced VN search - if(x('advselect')) - searchInit(); + // Advanced search + cl('advselect', function() { + var e = x('advoptions'); + e.className = e.className.indexOf('hidden')>=0 ? '' : 'hidden'; + this.getElementsByTagName('i')[0].innerHTML = e.className.indexOf('hidden')>=0 ? '▸' : '▾'; + return false; + }); + // show/hide NSFW VN image |