summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorYorhel <git@yorhel.nl>2020-05-12 14:34:47 +0200
committerYorhel <git@yorhel.nl>2020-05-12 14:34:47 +0200
commite169129934ac56d0f0758c981da009523bf4619f (patch)
treedad407687a8d249e5c4348160752c7d04f971834 /lib
parent13d14259b08ab9d40f14bfc3edabb816e3ea8d20 (diff)
Chars::Edit: Add instance editing
Diffstat (limited to 'lib')
-rw-r--r--lib/VNWeb/Chars/Edit.pm13
-rw-r--r--lib/VNWeb/Chars/Elm.pm31
-rw-r--r--lib/VNWeb/Elm.pm10
3 files changed, 54 insertions, 0 deletions
diff --git a/lib/VNWeb/Chars/Edit.pm b/lib/VNWeb/Chars/Edit.pm
index 4c19afce..6dbdf92a 100644
--- a/lib/VNWeb/Chars/Edit.pm
+++ b/lib/VNWeb/Chars/Edit.pm
@@ -20,6 +20,9 @@ my $FORM = {
weight => { required => 0, uint => 1, range => [ 0, 32767 ] },
bloodt => { default => 'unknown', enum => \%BLOOD_TYPE },
cup_size => { required => 0, default => '', enum => \%CUP_SIZE },
+ main => { required => 0, id => 1 },
+ main_ref => { _when => 'out', anybool => 1 },
+ main_name => { _when => 'out', default => '' },
hidden => { anybool => 1 },
locked => { anybool => 1 },
@@ -36,6 +39,9 @@ TUWF::get qr{/$RE{crev}/edit} => sub {
my $e = db_entry c => tuwf->capture('id'), tuwf->capture('rev') or return tuwf->resNotFound;
return tuwf->resDenied if !can_edit c => $e;
+ $e->{main_name} = $e->{main} ? tuwf->dbVali('SELECT name FROM chars WHERE id =', \$e->{main}) : '';
+ $e->{main_ref} = tuwf->dbVali('SELECT 1 FROM chars WHERE main =', \$e->{id})||0;
+
$e->{authmod} = auth->permDbmod;
$e->{editsum} = $e->{chrev} == $e->{maxrev} ? '' : "Reverted to revision c$e->{id}.$e->{chrev}";
@@ -48,6 +54,7 @@ TUWF::get qr{/$RE{crev}/edit} => sub {
# XXX: Require VN
+# TODO: Copy.
TUWF::get qr{/c/new}, sub {
return tuwf->resDenied if !can_edit c => undef;
framework_ title => 'Add character',
@@ -73,6 +80,12 @@ elm_api CharEdit => $FORM_OUT, $FORM_IN, sub {
$data->{desc} = bb_subst_links $data->{desc};
$data->{b_day} = 0 if !$data->{b_month};
+ $data->{main} = undef if $data->{hidden};
+ die "Attempt to set main to self" if $data->{main} && $data->{main} == $e->{id};
+ die "Attempt to set main while this character is already referenced." if $data->{main} && tuwf->dbVali('SELECT 1 AS ref FROM chars WHERE main =', \$e->{id});
+ # It's possible that the referenced character has been deleted since it was added as main, so don't die() on this one, just unset main.
+ $data->{main} = undef if $data->{main} && !tuwf->dbVali('SELECT 1 FROM chars WHERE NOT hidden AND main IS NULL AND id =', \$data->{main});
+
return elm_Unchanged if !$new && !form_changed $FORM_CMP, $data, $e;
my($id,undef,$rev) = db_edit c => $e->{id}, $data;
elm_Redirect "/c$id.$rev";
diff --git a/lib/VNWeb/Chars/Elm.pm b/lib/VNWeb/Chars/Elm.pm
new file mode 100644
index 00000000..c995dc61
--- /dev/null
+++ b/lib/VNWeb/Chars/Elm.pm
@@ -0,0 +1,31 @@
+package VNWeb::Chars::Elm;
+
+use VNWeb::Prelude;
+
+elm_api Chars => undef, { search => {} }, sub {
+ my $q = shift->{search};
+ my $qs = $q =~ s/[%_]//gr;
+
+ my $l = tuwf->dbPagei({ results => 15, page => 1 },
+ 'SELECT c.id, c.name, c.original, c.main, cm.name AS main_name, cm.original AS main_original
+ FROM (SELECT MIN(prio), id FROM (',
+ sql_join('UNION ALL',
+ $q =~ /^$RE{cid}$/ ? sql('SELECT 1, id FROM chars WHERE id =', \"$+{id}") : (),
+ sql('SELECT 1+substr_score(lower(name),' , \$qs, '), id FROM chars WHERE name ILIKE', \"%$qs%"),
+ sql('SELECT 10+substr_score(lower(original),', \$qs, '), id FROM chars WHERE original ILIKE', \"%$qs%"),
+ sql('SELECT 100, id FROM chars WHERE alias ILIKE', \"%$qs%"),
+ ), ') x(prio,id) GROUP BY id) x(prio, id)
+ JOIN chars c ON c.id = x.id
+ LEFT JOIN chars cm ON cm.id = c.main
+ WHERE NOT c.hidden
+ ORDER BY x.prio, c.name
+ ');
+ for (@$l) {
+ $_->{main} = { id => $_->{main}, name => $_->{main_name}, original => $_->{main_original} } if $_->{main};
+ delete $_->{main_name};
+ delete $_->{main_original};
+ }
+ elm_CharResult $l;
+};
+
+1;
diff --git a/lib/VNWeb/Elm.pm b/lib/VNWeb/Elm.pm
index 247f21b7..59574aed 100644
--- a/lib/VNWeb/Elm.pm
+++ b/lib/VNWeb/Elm.pm
@@ -80,6 +80,16 @@ our %apis = (
name => {},
original => { required => 0, default => '' },
} } ],
+ CharResult => [ { aoh => { # Response to 'Chars'
+ id => { id => 1 },
+ name => {},
+ original => { required => 0, default => '' },
+ main => { required => 0, type => 'hash', keys => {
+ id => { id => 1 },
+ name => {},
+ original => { required => 0, default => '' },
+ } }
+ } } ],
ImageResult => [ { aoh => { # Response to 'Images'
id => { }, # image id...
token => { required => 0 },