summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--data/lang.txt183
-rw-r--r--data/style.css4
-rw-r--r--lib/VNDB/DB/Traits.pm8
-rw-r--r--lib/VNDB/Handler/Tags.pm2
-rw-r--r--lib/VNDB/Handler/Traits.pm146
-rw-r--r--lib/VNDB/Util/CommonHTML.pm1
-rw-r--r--lib/VNDB/Util/LayoutHTML.pm1
7 files changed, 330 insertions, 15 deletions
diff --git a/data/lang.txt b/data/lang.txt
index 3674bd2a..3d488d2a 100644
--- a/data/lang.txt
+++ b/data/lang.txt
@@ -1580,6 +1580,13 @@ cs : Tagy
hu : Címkék
nl :
+:_menu_traits
+en : Traits
+ru*:
+cs*:
+hu*:
+nl : Kenmerken
+
:_menu_users
en : Users
ru : Пользователи
@@ -2019,6 +2026,13 @@ cs : Tagy
hu : Címkék
nl :
+:_searchbox_traits
+en : Traits
+ru*:
+cs*:
+hu*:
+nl : Kenmerken
+
:_searchbox_users
en : Users
ru : Пользователи
@@ -3974,13 +3988,6 @@ cs : Závislé tagy
hu : Alcímkék
nl : Subtags
-:_tagp_tree
-en : Tag tree
-ru : Древо тега
-cs : Strom tagů
-hu : Címke fa
-nl : Taglijst
-
:_tagp_moretags
en : [_1] more [quant,_1,tag,tags]
ru : ещё [_1] [quant,_1,тег,тега,тегов]
@@ -4675,6 +4682,13 @@ cs : Hledat tag
hu : Címkék keresése
nl : Zoek tags
+:_tagidx_tree
+en : Tag tree
+ru : Древо тега
+cs : Strom tagů
+hu : Címke fa
+nl : Taglijst
+
:_tagidx_browseall
en : Browse all tags
ru : Обзор всех тегов
@@ -4815,7 +4829,7 @@ hu*:
nl : nog [_1] [quant,_1,kenmerk,kenmerken]
-# Trait add/edit form (/i+/edit, /i+/add, /i/add)
+# Trait add/edit form (/i+/edit, /i+/add, /i/new)
:_traite_title_add
en : Add child trait to [_1]
@@ -4942,6 +4956,159 @@ hu*:
nl : Kommagescheiden lijst van hoofdkenmerken.
+# Plain trait browser (/i/list)
+
+:_traitb_title
+en : Browse traits
+ru*:
+cs*:
+hu*:
+nl : Browse kenmerken
+
+:_traitb_state-1
+en : All
+ru : Все
+cs : Všechny
+hu : Mind
+nl : Alle
+
+:_traitb_state0
+en : Awaiting moderation
+ru : Ожидающие модерации
+cs : Čekající na schválení
+hu : Moderálásra vár
+nl : Wachtend op goedkeuring
+
+:_traitb_state1
+en : Deleted
+ru : Удалённые
+cs : Smazané
+hu : Törölve
+nl : Verwijderd
+
+:_traitb_state2
+en : Accepted
+ru : Одобренные
+cs : Přijaté
+hu : Elfogadva
+nl : Geaccepteerd
+
+:_traitb_noresults
+en : No results found
+ru : Совпадений не найдено
+cs : Nenalezeny žádné výsledky
+hu : Keresés sikertelen
+nl : Geen resultaten gevonden
+
+:_traitb_col_added
+en : Created
+ru : Созданы
+cs : Vytvořené
+hu : Létrehozva
+nl : Aangemaakt
+
+:_traitb_col_name
+en : Trait
+ru*:
+cs*:
+hu*:
+nl : Kenmerk
+
+:_traitb_note_awaiting
+en : awaiting moderation
+ru : ожидает модерации
+cs : čeká na schválení
+hu : moderálásra vár
+nl : wachtend op goedkeuring
+
+:_traitb_note_del
+en : deleted
+ru : удалён
+cs : smazán
+hu : törölve
+nl : verwijderd
+
+
+# Trait index (/g)
+
+:_traiti_title
+en : Trait index
+ru*:
+cs*:
+hu*:
+nl : Kenmerkenindex
+
+:_traiti_create
+en : Create new trait
+ru*:
+cs*:
+hu*:
+nl : Nieuw kenmerk
+
+:_traiti_search
+en : Search traits
+ru*:
+cs*:
+hu*:
+nl : Zoek kenmerken
+
+:_traiti_tree
+en : Trait tree
+ru*:
+cs*:
+hu*:
+nl : Kenmerkenlijst
+
+:_traiti_browseall
+en : Browse all traits
+ru*:
+cs*:
+hu*:
+nl : Browse alle kenmerken
+
+:_traiti_recent
+en : Recently added
+ru : Недавно добавлены
+cs : Poslední přidané
+hu : Nemrég hozzáadva
+nl : Recentelijk toegevoegd
+
+:_traiti_popular
+en : Popular traits
+ru*:
+cs*:
+hu*:
+nl : Populaire kenmerken
+
+:_traiti_queue
+en : Awaiting moderation
+ru : Ожидают модерации
+cs : Čekající na schválení
+hu : Moderálásra vár
+nl : Wacht op goedkeuring
+
+:_traiti_queue_empty
+en : Moderation queue empty! yay!
+ru : В очереди модерации пусто! Няа!
+cs : Fronta ke schválení prázdná! Jej!
+hu : Moderálásra váró lista üres! Hurrá!
+nl : Alles is gemodereerd! yay!
+
+:_traiti_queue_link
+en : Moderation queue
+ru : Очередь модерации
+cs : Fronta ke schválení
+hu : Moderálásra váró lista
+nl : Moderatiewachtrij
+
+:_traiti_denied
+en : Denied traits
+ru*:
+cs*:
+hu*:
+nl : Geweigerde kenmerken
+
+
#############################################################################
diff --git a/data/style.css b/data/style.css
index f5445c2a..99b0f9e6 100644
--- a/data/style.css
+++ b/data/style.css
@@ -459,7 +459,7 @@ p#searchtabs a:hover, p#searchtabs a.sel {
padding: 1px 5px 2px 5px;
background: $secbg$ url($_boxbg$) repeat;
}
-#q { width: 350px }
+#q { width: 450px }
/* history browser */
div.history table { table-layout: fixed }
@@ -944,7 +944,7 @@ div.uposts td.tc4 b { margin-left: 10px }
.tagvnlist .tc4 { padding: 0; }
.tagvnlist .tc6 { text-align: right; padding-right: 10px; }
-/***** Tag list *****/
+/***** Tag/trait list (/g/list, /i/list) *****/
.browse.taglist .tc1 { width: 80px }
diff --git a/lib/VNDB/DB/Traits.pm b/lib/VNDB/DB/Traits.pm
index 8b9849ed..d30477c6 100644
--- a/lib/VNDB/DB/Traits.pm
+++ b/lib/VNDB/DB/Traits.pm
@@ -25,11 +25,19 @@ sub dbTraitGet {
@_,
);
+ $o{search} =~ s/%//g if $o{search};
+
my %where = (
$o{id} ? ('t.id = ?' => $o{id}) : (),
$o{noid} ? ('t.id <> ?' => $o{noid}) : (),
$o{name} ? (
't.id = (SELECT id FROM traits LEFT JOIN traits_aliases ON id = trait WHERE lower(name) = ? OR lower(alias) = ? LIMIT 1)' => [ lc $o{name}, lc $o{name} ]) : (),
+ defined $o{state} && $o{state} != -1 ? (
+ 't.state = ?' => $o{state} ) : (),
+ !defined $o{state} && !$o{id} && !$o{name} ? (
+ 't.state = 2' => 1 ) : (),
+ $o{search} ? (
+ 't.id IN (SELECT id FROM traits LEFT JOIN traits_aliases ON id = trait WHERE name ILIKE ? OR alias ILIKE ?)' => [ "%$o{search}%", "%$o{search}%" ] ) : (),
);
my @select = (
diff --git a/lib/VNDB/Handler/Tags.pm b/lib/VNDB/Handler/Tags.pm
index 6e48cc26..6ddac04d 100644
--- a/lib/VNDB/Handler/Tags.pm
+++ b/lib/VNDB/Handler/Tags.pm
@@ -625,7 +625,7 @@ sub tagindex {
end;
my $t = $self->dbTagTree(0, 2);
- childtags($self, mt('_tagp_tree'), 'g', {childs => $t});
+ childtags($self, mt('_tagidx_tree'), 'g', {childs => $t});
table class => 'mainbox threelayout';
Tr;
diff --git a/lib/VNDB/Handler/Traits.pm b/lib/VNDB/Handler/Traits.pm
index d505b6c7..7f79aa27 100644
--- a/lib/VNDB/Handler/Traits.pm
+++ b/lib/VNDB/Handler/Traits.pm
@@ -8,10 +8,12 @@ use VNDB::Func;
TUWF::register(
- qr{i([1-9]\d*)}, \&traitpage,
- qr{i([1-9]\d*)/(edit)}, \&traitedit,
- qr{i([1-9]\d*)/(add)}, \&traitedit,
- qr{i/new}, \&traitedit,
+ qr{i([1-9]\d*)}, \&traitpage,
+ qr{i([1-9]\d*)/(edit)}, \&traitedit,
+ qr{i([1-9]\d*)/(add)}, \&traitedit,
+ qr{i/new}, \&traitedit,
+ qr{i/list}, \&traitlist,
+ qr{i}, \&traitindex,
);
@@ -175,5 +177,141 @@ sub traitedit {
}
+sub traitlist {
+ my $self = shift;
+
+ my $f = $self->formValidate(
+ { get => 's', required => 0, default => 'name', enum => ['added', 'name'] },
+ { get => 'o', required => 0, default => 'a', enum => ['a', 'd'] },
+ { get => 'p', required => 0, default => 1, template => 'int' },
+ { get => 't', required => 0, default => -1, enum => [ -1..2 ] },
+ { get => 'q', required => 0, default => '' },
+ );
+ return $self->resNotFound if $f->{_err};
+
+ my($t, $np) = $self->dbTraitGet(
+ sort => $f->{s}, reverse => $f->{o} eq 'd',
+ page => $f->{p},
+ results => 50,
+ state => $f->{t},
+ search => $f->{q}
+ );
+
+ $self->htmlHeader(title => mt '_traitb_title');
+ div class => 'mainbox';
+ h1 mt '_traitb_title';
+ form action => '/i/list', 'accept-charset' => 'UTF-8', method => 'get';
+ input type => 'hidden', name => 't', value => $f->{t};
+ $self->htmlSearchBox('i', $f->{q});
+ end;
+ p class => 'browseopts';
+ a href => "/i/list?q=$f->{q};t=-1", $f->{t} == -1 ? (class => 'optselected') : (), mt '_traitb_state-1';
+ a href => "/i/list?q=$f->{q};t=0", $f->{t} == 0 ? (class => 'optselected') : (), mt '_traitb_state0';
+ a href => "/i/list?q=$f->{q};t=1", $f->{t} == 1 ? (class => 'optselected') : (), mt '_traitb_state1';
+ a href => "/i/list?q=$f->{q};t=2", $f->{t} == 2 ? (class => 'optselected') : (), mt '_traitb_state2';
+ end;
+ if(!@$t) {
+ p mt '_traitb_noresults';
+ }
+ end 'div';
+ if(@$t) {
+ $self->htmlBrowse(
+ class => 'taglist',
+ options => $f,
+ nextpage => $np,
+ items => $t,
+ pageurl => "/i/list?t=$f->{t};q=$f->{q};s=$f->{s};o=$f->{o}",
+ sorturl => "/i/list?t=$f->{t};q=$f->{q}",
+ header => [
+ [ mt('_traitb_col_added'), 'added' ],
+ [ mt('_traitb_col_name'), 'name' ],
+ ],
+ row => sub {
+ my($s, $n, $l) = @_;
+ Tr $n % 2 ? (class => 'odd') : ();
+ td class => 'tc1', $self->{l10n}->age($l->{added});
+ td class => 'tc3';
+ a href => "/i$l->{id}", $l->{name};
+ if($f->{t} == -1) {
+ b class => 'grayedout', ' '.mt '_traitb_note_awaiting' if $l->{state} == 0;
+ b class => 'grayedout', ' '.mt '_traitb_note_del' if $l->{state} == 1;
+ }
+ end;
+ end 'tr';
+ }
+ );
+ }
+ $self->htmlFooter;
+}
+
+
+sub traitindex {
+ my $self = shift;
+
+ $self->htmlHeader(title => mt '_traiti_title');
+ div class => 'mainbox';
+ a class => 'addnew', href => "/i/new", mt '_traiti_create' if $self->authCan('charedit');
+ h1 mt '_traiti_search';
+ form action => '/i/list', 'accept-charset' => 'UTF-8', method => 'get';
+ $self->htmlSearchBox('i', '');
+ end;
+ end;
+
+ my $t = $self->dbTraitTree(0, 2);
+ childtags($self, mt('_traiti_tree'), 'i', {childs => $t});
+
+ table class => 'mainbox threelayout';
+ Tr;
+
+ # Recently added
+ td;
+ a class => 'right', href => '/i/list', mt '_traiti_browseall';
+ my $r = $self->dbTraitGet(sort => 'added', reverse => 1, results => 10);
+ h1 mt '_traiti_recent';
+ ul;
+ for (@$r) {
+ li;
+ txt $self->{l10n}->age($_->{added});
+ txt ' ';
+ a href => "/i$_->{id}", $_->{name};
+ end;
+ }
+ end;
+ end;
+
+ # Popular
+ td;
+ h1 mt '_traiti_popular';
+ p 'TODO';
+ end;
+
+ # Moderation queue
+ td;
+ h1 mt '_traiti_queue';
+ $r = $self->dbTraitGet(state => 0, sort => 'added', reverse => 1, results => 10);
+ ul;
+ li mt '_traiti_queue_empty' if !@$r;
+ for (@$r) {
+ li;
+ txt $self->{l10n}->age($_->{added});
+ txt ' ';
+ a href => "/i$_->{id}", $_->{name};
+ end;
+ }
+ li;
+ br;
+ a href => '/i/list?t=0;o=d;s=added', mt '_traiti_queue_link';
+ txt ' - ';
+ a href => '/i/list?t=1;o=d;s=added', mt '_traiti_denied';
+ end;
+ end;
+ end;
+
+ end 'tr';
+ end 'table';
+ $self->htmlFooter;
+}
+
+
1;
diff --git a/lib/VNDB/Util/CommonHTML.pm b/lib/VNDB/Util/CommonHTML.pm
index ce086e55..ba03aeac 100644
--- a/lib/VNDB/Util/CommonHTML.pm
+++ b/lib/VNDB/Util/CommonHTML.pm
@@ -405,6 +405,7 @@ sub htmlSearchBox {
a href => '/r', $sel eq 'r' ? (class => 'sel') : (), mt '_searchbox_releases';
a href => '/p/all', $sel eq 'p' ? (class => 'sel') : (), mt '_searchbox_producers';
a href => '/g', $sel eq 'g' ? (class => 'sel') : (), mt '_searchbox_tags';
+ a href => '/i', $sel eq 'i' ? (class => 'sel') : (), mt '_searchbox_traits';
a href => '/u/all', $sel eq 'u' ? (class => 'sel') : (), mt '_searchbox_users';
end;
input type => 'text', name => 'q', id => 'q', class => 'text', value => $v;
diff --git a/lib/VNDB/Util/LayoutHTML.pm b/lib/VNDB/Util/LayoutHTML.pm
index 7c03b6a3..ada9e17b 100644
--- a/lib/VNDB/Util/LayoutHTML.pm
+++ b/lib/VNDB/Util/LayoutHTML.pm
@@ -66,6 +66,7 @@ sub _menu {
a href => '/r', mt '_menu_releases'; br;
a href => '/p/all', mt '_menu_producers'; br;
a href => '/g', mt '_menu_tags'; br;
+ a href => '/i', mt '_menu_traits'; br;
a href => '/u/all', mt '_menu_users'; br;
a href => '/hist', mt '_menu_recent_changes'; br;
a href => '/t', mt '_menu_discussion_board'; br;