has
screenCfg
=>
sub
(
$self
) {
my
$cfg
=
$self
->SUPER::screenCfg;
$cfg
->{type} =
'form'
;
$cfg
->{form} =
$self
->formCfg;
return
$cfg
;
};
has
formCfg
=>
sub
{
[];
};
has
formCfgMap
=>
sub
(
$self
) {
my
%map
;
for
my
$row
(@{
$self
->formCfg}){
next
unless
$row
->{key};
$map
{
$row
->{key}} =
$row
;
}
return
\
%map
;
};
sub
formData (
$self
) {
my
$args
=
$self
->args || {};
return
$args
->{currentFormData} ||
$args
->{formData} || {};
};
sub
formPhase (
$self
) {
my
$args
=
$self
->args;
return
'instantiate'
if
$args
->{selection};
if
(
$args
->{currentFormData}) {
return
'reconfigure'
if
$args
->{triggerField};
return
'initialize'
;
}
if
(
$args
->{formData}) {
return
"action:$args->{key}"
if
$args
->{key};
}
if
(
$args
and not
keys
$args
->%*) {
return
'pluginConfig'
;
}
$self
->
log
->
warn
(
'Unknown form phase, args='
, dumper
$args
);
return
'unknown'
;
};
sub
validateData {
my
$self
=
shift
;
my
$fieldName
=
shift
;
my
$formData
=
shift
|| {};
my
$entry
=
$self
->formCfgMap->{
$fieldName
};
if
(not
ref
$entry
){
die
mkerror(4095,trm(
"sorry, don't know the field you are talking about"
));
}
my
$fieldIsEmpty
= (not
defined
$formData
->{
$fieldName
} or
length
(
$formData
->{
$fieldName
}) == 0);
return
if
not
$entry
->{set}{required} and
$fieldIsEmpty
;
if
(
$entry
->{validator}){
my
$start
=
time
;
my
$data
=
$entry
->{validator}->(
$formData
->{
$fieldName
},
$fieldName
,
$formData
);
$self
->
log
->debug(
sprintf
(
"validator %s: %0.2fs"
,
$fieldName
,
time
-
$start
));
return
$data
;
}
elsif
(
$entry
->{set}{required} and
$fieldIsEmpty
){
return
trm(
'The %1 field is required'
,
$fieldName
);
}
return
;
}
sub
processData (
$self
,
$args
,
$extraArgs
=
undef
) {
$self
->args(
$args
)
if
$args
;
my
$form
=
$self
->formCfgMap;
my
$formData
=
$args
->{formData};
for
my
$key
(
keys
%$form
){
if
(
my
$error
=
$self
->validateData(
$key
,
$formData
)){
die
mkerror(7492,
$error
);
}
}
if
(
$args
->{key}){
my
$handler
=
$self
->actionCfgMap->{
$args
->{key}}{actionHandler};
if
(
ref
$handler
eq
'CODE'
){
return
$handler
->(
$self
,
$formData
);
}
$handler
=
$self
->actionCfgMap->{
$args
->{key}}{handler};
if
(
ref
$handler
eq
'CODE'
){
$self
->
log
->
warn
(
"Using handler properties in actionCfg is deprecated. Use actionHandler instead."
);
return
$handler
->(
$formData
);
}
$self
->
log
->error(
'Plugin instance '
.
$self
->name.
" action $args->{key} has a broken handler"
);
die
mkerror(7623,
'Plugin instance '
.
$self
->name.
" action $args->{key} has a broken handler"
);
}
}
sub
saveFormDataToConfig (
$self
,
$formData
) {
my
$form
=
$self
->formCfgMap;
for
my
$key
(
keys
%$form
){
next
if
not
exists
$formData
->{
$key
};
$self
->setConfigValue(
$self
->name.
'::'
.
$key
,
$formData
->{
$key
});
}
}
sub
getFieldValue (
$self
,
$field
) {
my
$entry
=
$self
->formCfgMap->{
$field
};
my
$log
=
$self
->
log
;
return
undef
unless
ref
$entry
eq
'HASH'
;
if
(
$entry
->{getter}){
if
(
ref
$entry
->{getter} eq
'CODE'
){
my
$start
=
time
;
my
$data
=
$entry
->{getter}->(
$self
);
if
(
eval
{ blessed
$data
&&
$data
->isa(
'Mojo::Promise'
)}){
$data
=
$data
->then(
sub
(
$value
) {
$log
->debug(
sprintf
(
"async getter %s: %0.2fs"
,
$field
,
time
-
$start
));
return
$value
;
});
}
else
{
$log
->debug(
sprintf
(
"getter %s: %0.2fs"
,
$field
,
time
-
$start
));
}
return
$data
;
}
else
{
$log
->
warn
(
'Plugin instance'
.
$self
->name.
" field $field has a broken getter\n"
);
}
}
return
$self
->getConfigValue(
$self
->name.
'::'
.
$field
);
}
sub
getAllFieldValues (
$self
,
$parentForm
,
$currentForm
,
$args
) {
my
%map
;
my
@promises
;
$self
->args(
$currentForm
)
if
$currentForm
;
for
my
$key
(
keys
%{
$self
->formCfgMap}){
my
$value
=
$self
->getFieldValue(
$key
);
if
(
eval
{ blessed
$value
&&
$value
->isa(
'Mojo::Promise'
)}){
push
@promises
,
$value
;
$value
->then(
sub
{
$map
{
$key
} =
shift
;
},
sub
{
die
shift
;
}
);
}
else
{
$map
{
$key
} =
$self
->getFieldValue(
$key
);
}
}
if
(
@promises
){
return
Mojo::Promise->new->all(
@promises
)->then(
sub
{
return
\
%map
;
});
}
return
\
%map
;
}
sub
getData (
$self
,
$type
,
@args
) {
if
(
$type
eq
'field'
){
return
$self
->getFieldValue(
@args
);
}
elsif
(
$type
eq
'allFields'
) {
return
$self
->getAllFieldValues(
@args
);
}
else
{
die
mkerror(38334,
'Requested unknown data type '
. (
$type
//
'unknown'
));
}
}
1;