[tools 2/3] testbot/cgi: Allow reporting multiple errors and multiple invalid fields.
Francois Gouget
fgouget at codeweavers.com
Mon Jul 11 11:46:13 CDT 2022
Signed-off-by: Francois Gouget <fgouget at codeweavers.com>
---
testbot/lib/ObjectModel/CGI/FormPage.pm | 8 ++--
testbot/lib/ObjectModel/CGI/Page.pm | 56 ++++++++++++++++++-------
testbot/lib/WineTestBot/CGI/PageBase.pm | 2 +-
3 files changed, 44 insertions(+), 22 deletions(-)
diff --git a/testbot/lib/ObjectModel/CGI/FormPage.pm b/testbot/lib/ObjectModel/CGI/FormPage.pm
index 67b3fa00d3..688ee13a97 100644
--- a/testbot/lib/ObjectModel/CGI/FormPage.pm
+++ b/testbot/lib/ObjectModel/CGI/FormPage.pm
@@ -505,17 +505,15 @@ sub GenerateBody($)
$self->GenerateFields();
$self->GenerateRequiredLegend();
- my $ErrMessage = $self->GetErrMessage();
- if (defined $ErrMessage)
+ if (defined $self->GetErrMessage())
{
- my $ErrField = $self->GetErrField();
- if (defined $ErrField)
+ foreach my $ErrField (sort $self->GetErrFields())
{
my $PropertyDescriptor = $self->GetPropertyDescriptorByName($ErrField);
if ($PropertyDescriptor and !($self->DisplayProperty($PropertyDescriptor))[0])
{
# The hidden fields should not be invalid
- $self->AddError("Internal error?\n$ErrMessage", $ErrField);
+ $self->AddError("The hidden $ErrField field is invalid (internal error?)", $ErrField);
}
}
$self->GenerateErrorPopup();
diff --git a/testbot/lib/ObjectModel/CGI/Page.pm b/testbot/lib/ObjectModel/CGI/Page.pm
index 1d8a59fe63..37b19c8b0e 100644
--- a/testbot/lib/ObjectModel/CGI/Page.pm
+++ b/testbot/lib/ObjectModel/CGI/Page.pm
@@ -313,9 +313,9 @@ sub GetErrMessage($)
=pod
=over 12
-=head1 C<GetErrField()>
+=head1 C<GetFirstErrField()>
-Returns the name of the invalid field, undef otherwise.
+Returns the name of the first invalid field if any, undef otherwise.
Note that if the error does not concern a specific field this may return
undef even though an error has been set.
@@ -323,10 +323,29 @@ undef even though an error has been set.
=back
=cut
-sub GetErrField($)
+sub GetFirstErrField($)
{
my ($self) = @_;
- return $self->{ErrField};
+ return $self->{ErrFields} ? (sort keys %{$self->{ErrFields}})[0] : undef;
+}
+
+=pod
+=over 12
+
+=head1 C<GetErrFields()>
+
+Returns a list containing the names of the invalid field(s).
+
+Note that if the error does not concern a specific field this may return
+an empty list even though an error has been set.
+
+=back
+=cut
+
+sub GetErrFields($)
+{
+ my ($self) = @_;
+ return $self->{ErrFields} ? keys %{$self->{ErrFields}} : ();
}
=pod
@@ -334,7 +353,7 @@ sub GetErrField($)
=head1 C<IsErrField()>
-Returns true if the error concerns the specified field.
+Returns true if the specified field needs to be fixed.
=back
=cut
@@ -342,7 +361,7 @@ Returns true if the error concerns the specified field.
sub IsErrField($$)
{
my ($self, $FieldName) = @_;
- return (defined $self->{ErrField} and $self->{ErrField} eq $FieldName);
+ return $self->{ErrFields}->{$FieldName};
}
=pod
@@ -350,17 +369,18 @@ sub IsErrField($$)
=head1 C<AddError()>
-Sets the error message to be shown to the user.
+Adds an error message to be shown to the user.
=over
=item ErrMessage
A message to be shown on the page that describes why the form data is invalid.
This should include the display name of the field(s) that need to be fixed.
-If this parameter is false the error message is not modified.
+If this parameter is false, the error message and the list of invalid fields
+are not modified.
-=item ErrField
-If the error concerns a specific field, the name of that field. This can be
-used by the page to highlight the field that needs to be corrected.
+=item ErrFields
+A list of field names related to the error. This can be used by the page to
+highlight the field(s) that needs to be corrected.
=back
@@ -370,14 +390,18 @@ was actually added.
=back
=cut
-sub AddError($$;$)
+sub AddError($$@)
{
- my ($self, $ErrMessage, $ErrField) = @_;
+ my $self = shift;
+ my $ErrMessage = shift;
if ($ErrMessage)
{
- $self->{ErrMessage} = $ErrMessage;
- $self->{ErrField} = $ErrField;
+ $self->{ErrMessage} = "$self->{ErrMessage}\n$ErrMessage";
+ foreach my $ErrField (@_)
+ {
+ $self->{ErrFields}->{$ErrField} = 1;
+ }
}
return $ErrMessage;
}
@@ -387,7 +411,7 @@ sub ResetErrors($)
my ($self) = @_;
delete $self->{ErrMessage};
- delete $self->{ErrField};
+ delete $self->{ErrFields};
}
sub GenerateErrorDiv($)
diff --git a/testbot/lib/WineTestBot/CGI/PageBase.pm b/testbot/lib/WineTestBot/CGI/PageBase.pm
index 0486bbefc2..113e6b9356 100644
--- a/testbot/lib/WineTestBot/CGI/PageBase.pm
+++ b/testbot/lib/WineTestBot/CGI/PageBase.pm
@@ -375,7 +375,7 @@ sub GenerateErrorPopup($$)
print "<script type='text/javascript'>\n";
print "<!--\n";
print "function ShowError() { alert(", $Page->JsQuote($ErrMessage), "); }\n";
- my $ErrField = $Page->GetErrField();
+ my $ErrField = $Page->GetFirstErrField();
if ($ErrField)
{
print "document.forms[0].", $ErrField, ".focus();\n";
--
2.30.2
More information about the wine-devel
mailing list