diff options
author | Yorhel <git@yorhel.nl> | 2020-05-12 10:25:02 +0200 |
---|---|---|
committer | Yorhel <git@yorhel.nl> | 2020-05-12 10:25:02 +0200 |
commit | 13d14259b08ab9d40f14bfc3edabb816e3ea8d20 (patch) | |
tree | 973e82be525997b212bd2f495af0731b57cd3c2d /lib | |
parent | c18d0d12829c4c42910d66a4d7fbb035ba8dc7ac (diff) |
Char::Edit: Initial rewrite of the character edit form, general info first
Diffstat (limited to 'lib')
-rw-r--r-- | lib/VNDB/Handler/Chars.pm | 2 | ||||
-rw-r--r-- | lib/VNWeb/Chars/Edit.pm | 81 | ||||
-rw-r--r-- | lib/VNWeb/Elm.pm | 15 |
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; |