diff options
author | Yorhel <git@yorhel.nl> | 2009-02-22 21:38:39 +0100 |
---|---|---|
committer | Yorhel <git@yorhel.nl> | 2009-02-22 21:38:39 +0100 |
commit | fe3f588b873346789de148dda832fa19e8f10d07 (patch) | |
tree | a7dafc781abbc99118de697dfe2368d7a2adfa36 | |
parent | e0390c46122dd2d4d14b7b7f2eeee27b679c133e (diff) |
vntagmod: Adding tags using dropdown search
The usual: it's still pretty much useless and unfinished, will polish
up things later.
-rw-r--r-- | lib/VNDB/DB/Tags.pm | 6 | ||||
-rw-r--r-- | lib/VNDB/Handler/Tags.pm | 66 | ||||
-rw-r--r-- | static/f/forms.js | 71 | ||||
-rw-r--r-- | static/f/script.js | 2 |
4 files changed, 126 insertions, 19 deletions
diff --git a/lib/VNDB/DB/Tags.pm b/lib/VNDB/DB/Tags.pm index fb8ebca5..aca87677 100644 --- a/lib/VNDB/DB/Tags.pm +++ b/lib/VNDB/DB/Tags.pm @@ -8,7 +8,7 @@ use Exporter 'import'; our @EXPORT = qw|dbTagGet dbTagEdit dbTagAdd dbTagDel dbTagLinks dbVNTags|; -# %options->{ id name page results order what } +# %options->{ id name search page results order what } # what: parents childs(n) sub dbTagGet { my $self = shift; @@ -20,11 +20,15 @@ sub dbTagGet { @_ ); + $o{search} =~ s/%//g if $o{search}; + my %where = ( $o{id} ? ( 't.id = ?' => $o{id} ) : (), $o{name} ? ( 'lower(t.name) = ?' => lc $o{name} ) : (), + $o{search} ? ( + '(t.name ILIKE ? OR t.alias ILIKE ?)' => [ "%$o{search}%", "%$o{search}%" ] ) : (), ); my($r, $np) = $self->dbPage(\%o, q| diff --git a/lib/VNDB/Handler/Tags.pm b/lib/VNDB/Handler/Tags.pm index 3f18aa14..dfd992f2 100644 --- a/lib/VNDB/Handler/Tags.pm +++ b/lib/VNDB/Handler/Tags.pm @@ -4,7 +4,7 @@ package VNDB::Handler::Tags; use strict; use warnings; -use YAWF ':html'; +use YAWF ':html', ':xml'; use VNDB::Func; @@ -16,6 +16,7 @@ YAWF::register( qr{g/new}, \&tagedit, qr{v([1-9]\d*)/tagmod}, \&vntagmod, qr{g}, \&tagtree, + qr{xml/tags\.xml}, \&tagxml, ); @@ -239,24 +240,31 @@ sub vntagmod { thead; Tr; td $_ for('Tag', 'Users', 'Rating', 'Spoiler', 'Your vote', 'Your spoiler'); end; end; - my $cnt = 0; - for my $t (sort { $a->{name} cmp $b->{name} } @$tags) { - Tr ++$cnt % 2 == 0 ? (class => 'odd') : (); - td; - a href => "/g$t->{id}", $t->{name}; - end; - td $t->{users}; - td sprintf '%.2f', $t->{rating}; - td $t->{spoiler}; - my $m = (grep $_->{tag} == $t->{id}, @$my)[0] || {}; - td; - input type => 'text', class => 'text', name => "tagvote_$t->{id}", value => $m->{vote}||'0', style => 'width: 15px; height: 14px'; - end; - td; - input type => 'text', class => 'text', name => "tagspoil_$t->{id}", value => $m->{spoiler}||'-', style => 'width: 15px; height: 14px'; + tfoot; Tr; + td colspan => 6; + input type => 'text', class => 'text', name => 'addtag', value => ''; + input type => 'button', class => 'submit', value => 'Add tag'; + end; + end; end; + tbody; + for my $t (sort { $a->{name} cmp $b->{name} } @$tags) { + Tr; + td; + a href => "/g$t->{id}", $t->{name}; + end; + td $t->{users}; + td sprintf '%.2f', $t->{rating}; + td $t->{spoiler}; + my $m = (grep $_->{tag} == $t->{id}, @$my)[0] || {}; + td; + input type => 'text', class => 'text', name => "tagvote_$t->{id}", value => $m->{vote}||'0', style => 'width: 15px; height: 14px'; + end; + td; + input type => 'text', class => 'text', name => "tagspoil_$t->{id}", value => $m->{spoiler}||'-', style => 'width: 15px; height: 14px'; + end; end; - end; - } + } + end; end; } ], ]); @@ -291,4 +299,26 @@ sub tagtree { } +sub tagxml { + my $self = shift; + + my $q = $self->formValidate({ name => 'q', maxlength => 500 }); + return 404 if $q->{_err}; + $q = $q->{q}; + + my($list, $np) = $self->dbTagGet( + $q =~ /^g([1-9]\d*)/ ? (id => $1) : $q =~ /^name:(.+)$/ ? (name => $1) : (search => $q), + results => 10, + page => 1, + ); + + $self->resHeader('Content-type' => 'text/xml; charset=UTF-8'); + xml; + tag 'tags', more => $np ? 'yes' : 'no', query => $q; + for(@$list) { + tag 'item', id => $_->{id}, meta => $_->{meta} ? 'yes' : 'no', $_->{name}; + } + end; +} + 1; diff --git a/static/f/forms.js b/static/f/forms.js index 3a09dc88..1ebd9e92 100644 --- a/static/f/forms.js +++ b/static/f/forms.js @@ -860,3 +860,74 @@ function vnpSerialize(type) { } + + + + + /****************************************************\ + * V I S U A L N O V E L T A G L I N K I N G * + \****************************************************/ + + +function tglLoad() { + var n = x('tagtable').getElementsByTagName('tfoot')[0].getElementsByTagName('input'); + dsInit(n[0], '/xml/tags.xml?q=', function(item, tr) { + var td = document.createElement('td'); + td.innerHTML = shorten(item.firstChild.nodeValue, 40); + if(item.getAttribute('meta') == 'yes') + td.innerHTML = '<b class="grayedout">'+td.innerHTML+'</b> (meta)'; + tr.appendChild(td); + }, function(item) { + return item.firstChild.nodeValue; + }, tglAdd); + n[1].onclick = tglAdd; + tglStripe(); +} + +function tglAdd() { + var n = x('tagtable').getElementsByTagName('tfoot')[0].getElementsByTagName('input'); + n[0].disabled = n[1].disabled = true; + n[1].value = 'loading...'; + ajax('/xml/tags.xml?q=name:'+encodeURIComponent(n[0].value), function(hr) { + n[0].disabled = n[1].disabled = false; + n[1].value = 'Add tag'; + + var items = hr.responseXML.getElementsByTagName('item'); + if(items.length < 1) + return alert('Item not found!'); + if(items[0].getAttribute('meta') == 'yes') + return alert('Can\'t use meta tags here!'); + var name = items[0].firstChild.nodeValue; + var l = x('tagtable').getElementsByTagName('a'); + for(var i=0; i<l.length; i++) + if(l[i].innerHTML == shorten(name, 40)) + return alert('Tag is already present!'); + + var tr = document.createElement('tr'); + var td = document.createElement('td'); + td.innerHTML = '<a href="/g'+items[0].getAttribute('id')+'">'+name+'</a>'; + tr.appendChild(td); + td = document.createElement('td'); + td.innerHTML = '1'; + tr.appendChild(td); + td = document.createElement('td'); + td.innerHTML = '2.00'; + tr.appendChild(td); + td = document.createElement('td'); + td.innerHTML = '0'; + tr.appendChild(td); + td = document.createElement('td'); + td.setAttribute('colspan', 2); + td.innerHTML = '-TODO-'; + tr.appendChild(td); + x('tagtable').getElementsByTagName('tbody')[0].appendChild(tr); + tglStripe(); + }); +} + +function tglStripe() { + var l = x('tagtable').getElementsByTagName('tbody')[0].getElementsByTagName('tr'); + for(var i=0;i<l.length;i++) + l[i].className = i%2 ? 'odd' : ''; +} + diff --git a/static/f/script.js b/static/f/script.js index 069b5e5d..25dbeca4 100644 --- a/static/f/script.js +++ b/static/f/script.js @@ -500,6 +500,8 @@ DOMLoad(function() { vnpLoad('vn'); if(x('jt_box_producers')) vnpLoad('producers'); + if(x('taglinks')) + tglLoad(); // spam protection on all forms if(document.forms.length >= 1) |