summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYorhel <git@yorhel.nl>2009-02-22 21:38:39 +0100
committerYorhel <git@yorhel.nl>2009-02-22 21:38:39 +0100
commitfe3f588b873346789de148dda832fa19e8f10d07 (patch)
treea7dafc781abbc99118de697dfe2368d7a2adfa36
parente0390c46122dd2d4d14b7b7f2eeee27b679c133e (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.pm6
-rw-r--r--lib/VNDB/Handler/Tags.pm66
-rw-r--r--static/f/forms.js71
-rw-r--r--static/f/script.js2
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)