diff options
author | Yorhel <git@yorhel.nl> | 2020-05-12 14:34:47 +0200 |
---|---|---|
committer | Yorhel <git@yorhel.nl> | 2020-05-12 14:34:47 +0200 |
commit | e169129934ac56d0f0758c981da009523bf4619f (patch) | |
tree | dad407687a8d249e5c4348160752c7d04f971834 /lib | |
parent | 13d14259b08ab9d40f14bfc3edabb816e3ea8d20 (diff) |
Chars::Edit: Add instance editing
Diffstat (limited to 'lib')
-rw-r--r-- | lib/VNWeb/Chars/Edit.pm | 13 | ||||
-rw-r--r-- | lib/VNWeb/Chars/Elm.pm | 31 | ||||
-rw-r--r-- | lib/VNWeb/Elm.pm | 10 |
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 }, |