summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorYorhel <git@yorhel.nl>2020-05-12 10:25:02 +0200
committerYorhel <git@yorhel.nl>2020-05-12 10:25:02 +0200
commit13d14259b08ab9d40f14bfc3edabb816e3ea8d20 (patch)
tree973e82be525997b212bd2f495af0731b57cd3c2d /lib
parentc18d0d12829c4c42910d66a4d7fbb035ba8dc7ac (diff)
Char::Edit: Initial rewrite of the character edit form, general info first
Diffstat (limited to 'lib')
-rw-r--r--lib/VNDB/Handler/Chars.pm2
-rw-r--r--lib/VNWeb/Chars/Edit.pm81
-rw-r--r--lib/VNWeb/Elm.pm15
3 files changed, 91 insertions, 7 deletions
diff --git a/lib/VNDB/Handler/Chars.pm b/lib/VNDB/Handler/Chars.pm
index ee2452f9..781a5507 100644
--- a/lib/VNDB/Handler/Chars.pm
+++ b/lib/VNDB/Handler/Chars.pm
@@ -11,7 +11,7 @@ use VNDB::Types;
our @EXPORT = ('charBrowseTable');
TUWF::register(
- qr{c(?:([1-9]\d*)(?:\.([1-9]\d*))?/(edit|copy)|/new)}
+ qr{old/c(?:([1-9]\d*)(?:\.([1-9]\d*))?/(edit|copy)|/new)}
=> \&edit,
qr{c/([a-z0]|all)} => \&list,
);
diff --git a/lib/VNWeb/Chars/Edit.pm b/lib/VNWeb/Chars/Edit.pm
new file mode 100644
index 00000000..4c19afce
--- /dev/null
+++ b/lib/VNWeb/Chars/Edit.pm
@@ -0,0 +1,81 @@
+package VNWeb::Chars::Edit;
+
+use VNWeb::Prelude;
+
+
+my $FORM = {
+ id => { required => 0, id => 1 },
+ name => { maxlength => 200 },
+ original => { required => 0, default => '', maxlength => 200 },
+ alias => { required => 0, default => '', maxlength => 500 },
+ desc => { required => 0, default => '', maxlength => 5000 },
+ gender => { default => 'unknown', enum => \%GENDER },
+ b_month => { required => 0, default => 0, uint => 1, range => [ 0, 12 ] },
+ b_day => { required => 0, default => 0, uint => 1, range => [ 0, 31 ] },
+ age => { required => 0, uint => 1, range => [ 0, 32767 ] },
+ s_bust => { required => 0, uint => 1, range => [ 0, 32767 ], default => 0 },
+ s_waist => { required => 0, uint => 1, range => [ 0, 32767 ], default => 0 },
+ s_hip => { required => 0, uint => 1, range => [ 0, 32767 ], default => 0 },
+ height => { required => 0, uint => 1, range => [ 0, 32767 ], default => 0 },
+ weight => { required => 0, uint => 1, range => [ 0, 32767 ] },
+ bloodt => { default => 'unknown', enum => \%BLOOD_TYPE },
+ cup_size => { required => 0, default => '', enum => \%CUP_SIZE },
+ hidden => { anybool => 1 },
+ locked => { anybool => 1 },
+
+ authmod => { _when => 'out', anybool => 1 },
+ editsum => { _when => 'in out', editsum => 1 },
+};
+
+my $FORM_OUT = form_compile out => $FORM;
+my $FORM_IN = form_compile in => $FORM;
+my $FORM_CMP = form_compile cmp => $FORM;
+
+
+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->{authmod} = auth->permDbmod;
+ $e->{editsum} = $e->{chrev} == $e->{maxrev} ? '' : "Reverted to revision c$e->{id}.$e->{chrev}";
+
+ framework_ title => "Edit $e->{name}", type => 'c', dbobj => $e, tab => 'edit',
+ sub {
+ editmsg_ c => $e, "Edit $e->{name}";
+ elm_ CharEdit => $FORM_OUT, $e;
+ };
+};
+
+
+# XXX: Require VN
+TUWF::get qr{/c/new}, sub {
+ return tuwf->resDenied if !can_edit c => undef;
+ framework_ title => 'Add character',
+ sub {
+ editmsg_ c => undef, 'Add character';
+ elm_ CharEdit => $FORM_OUT, {
+ elm_empty($FORM_OUT)->%*,
+ };
+ };
+};
+
+
+elm_api CharEdit => $FORM_OUT, $FORM_IN, sub {
+ my $data = shift;
+ my $new = !$data->{id};
+ my $e = $new ? { id => 0 } : db_entry c => $data->{id} or return tuwf->resNotFound;
+ return elm_Unauth if !can_edit c => $e;
+
+ if(!auth->permDbmod) {
+ $data->{hidden} = $e->{hidden}||0;
+ $data->{locked} = $e->{locked}||0;
+ }
+ $data->{desc} = bb_subst_links $data->{desc};
+ $data->{b_day} = 0 if !$data->{b_month};
+
+ 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";
+};
+
+1;
diff --git a/lib/VNWeb/Elm.pm b/lib/VNWeb/Elm.pm
index 5d287851..247f21b7 100644
--- a/lib/VNWeb/Elm.pm
+++ b/lib/VNWeb/Elm.pm
@@ -172,12 +172,12 @@ sub def_validation {
my %v = $obj->html5_validation();
$data .= def $name, 'List (Html.Attribute msg)', '[ '.join(', ',
- $v{required} ? 'A.required True' : (),
- $v{minlength} ? "A.minlength $v{minlength}" : (),
- $v{maxlength} ? "A.maxlength $v{maxlength}" : (),
- $v{min} ? 'A.min '.string($v{min}) : (),
- $v{max} ? 'A.max '.string($v{max}) : (),
- $v{pattern} ? 'A.pattern '.string($v{pattern}) : ()
+ $v{required} ? 'A.required True' : (),
+ defined $v{minlength} ? "A.minlength $v{minlength}" : (),
+ defined $v{maxlength} ? "A.maxlength $v{maxlength}" : (),
+ defined $v{min} ? 'A.min '.string($v{min}) : (),
+ defined $v{max} ? 'A.max '.string($v{max}) : (),
+ $v{pattern} ? 'A.pattern '.string($v{pattern}) : ()
).']' if !$obj->{keys};
$data;
}
@@ -367,6 +367,9 @@ sub write_types {
$data .= def resolutions=> 'List (String, String)' => list map tuple(string $_, string +($RESOLUTION{$_}{cat}?"$RESOLUTION{$_}{cat} / ":'').$RESOLUTION{$_}{txt}), keys %RESOLUTION;
$data .= def voiced => 'List (Int, String)' => list map tuple($_, string $VOICED{$_}{txt}), keys %VOICED;
$data .= def animated => 'List (Int, String)' => list map tuple($_, string $ANIMATED{$_}{txt}), keys %ANIMATED;
+ $data .= def genders => 'List (String, String)' => list map tuple(string $_, string $GENDER{$_}), keys %GENDER;
+ $data .= def cupSizes => 'List (String, String)' => list map tuple(string $_, string $CUP_SIZE{$_}), keys %CUP_SIZE;
+ $data .= def bloodTypes => 'List (String, String)' => list map tuple(string $_, string $BLOOD_TYPE{$_}), keys %BLOOD_TYPE;
$data .= def curYear => Int => (gmtime)[5]+1900;
write_module Types => $data;