This applies to CollectionBlocks as well as FormPages.
Signed-off-by: Francois Gouget fgouget@codeweavers.com --- .../lib/ObjectModel/CGI/CollectionBlock.pm | 24 +++++++++--- testbot/lib/ObjectModel/CGI/FormPage.pm | 39 +++++++++++-------- 2 files changed, 42 insertions(+), 21 deletions(-)
diff --git a/testbot/lib/ObjectModel/CGI/CollectionBlock.pm b/testbot/lib/ObjectModel/CGI/CollectionBlock.pm index 14e3cfe54..b2ebb2eec 100644 --- a/testbot/lib/ObjectModel/CGI/CollectionBlock.pm +++ b/testbot/lib/ObjectModel/CGI/CollectionBlock.pm @@ -166,10 +166,15 @@ sub GenerateErrorPopup($)
=item C<DisplayProperty()>
-Specifies whether to hide the given property. +Specifies whether to hide the given property and how to format it.
-Any value evaluating to false specifies that the property should be hidden and -all others that it should be shown. +Returns a (display, format) array where the format value is optional. +If the display value is false the property is hidden. Otherwise it should be +"ro" to get a read-only view. + +The format value is passed to GenerateDataView() which can use it to decide +how to format the property. By default it is simply passed to +ValueFormatter::GenerateValueHTML().
=back =cut @@ -299,6 +304,14 @@ The object for the current row. Furthermore one can get the link to the current object's details page by passing the row to GetDetailsLink().
+The Col parameter has the following extra field: +=over 12 +=item Format +The format to be used to display the property. +If undefined the default formatting is used. + +=back + =back =cut
@@ -308,7 +321,7 @@ sub GenerateDataView($$$)
my $PropertyName = $Col->{Descriptor}->GetName(); my $Value = $Row->{Item}->$PropertyName; - GenerateValueHTML($self, $Col->{Descriptor}, $Value); + GenerateValueHTML($self, $Col->{Descriptor}, $Value, $Col->{Format}); }
@@ -419,10 +432,11 @@ sub GenerateList($) my (@Cols, $HasDT); foreach my $PropertyDescriptor (@$PropertyDescriptors) { - my $Display = $self->DisplayProperty($PropertyDescriptor); + my ($Display, $Format) = $self->DisplayProperty($PropertyDescriptor); next if (!$Display); push @Cols, {Descriptor => $PropertyDescriptor, Display => $Display, + Format => $Format, Index => $ColIndex++}; $HasDT ||= ($PropertyDescriptor->GetClass() eq "Basic" and $PropertyDescriptor->GetType() eq "DT"); diff --git a/testbot/lib/ObjectModel/CGI/FormPage.pm b/testbot/lib/ObjectModel/CGI/FormPage.pm index 7fd2f561e..e286880fd 100644 --- a/testbot/lib/ObjectModel/CGI/FormPage.pm +++ b/testbot/lib/ObjectModel/CGI/FormPage.pm @@ -156,16 +156,18 @@ sub GetPropertyDescriptorByName($$)
=item C<DisplayProperty()>
-Specifies whether to hide, display or allow editing the given property. +Specifies whether to hide, display or allow editing the given property, and +optionally how to format it.
-Return values: +Returns a (display, format) array where the display value is one of the +following: =over =item "" Any value evaluating to false specifies that the property should be hidden.
=item "ro" Specifies that the property is read-only, i.e. GenerateField() should display -it instead of generating an edit field. +it using the default format instead of generating an edit field.
=item "rw" Specifies that GenerateField() should allow editing the property. @@ -174,6 +176,11 @@ HTTP parameter name.
=back
+The optional format value is passed to GenerateValueInput() and +GenerateValueView() which can use it to decide how to present the value. +In the default implementation the format is only used for read-only properties +and is passed to ValueFormatter::GenerateValueHTML(). + =back =cut
@@ -278,11 +285,11 @@ Generates an HTML snippet representing the value in a user-readable form. =back =cut
-sub GenerateValueView($$$) +sub GenerateValueView($$$$) { - my ($self, $PropertyDescriptor, $Value) = @_; + my ($self, $PropertyDescriptor, $Value, $Format) = @_;
- GenerateValueHTML($self, $PropertyDescriptor, $Value); + GenerateValueHTML($self, $PropertyDescriptor, $Value, $Format); }
sub GetInputType($$) @@ -329,9 +336,9 @@ Generates an HTML snippet allowing the specified value to be edited. =back =cut
-sub GenerateValueInput($$$) +sub GenerateValueInput($$$$) { - my ($self, $PropertyDescriptor, $Value) = @_; + my ($self, $PropertyDescriptor, $Value, $_Format) = @_;
my $InputType = $self->GetInputType($PropertyDescriptor); if ($InputType eq "checkbox") @@ -419,9 +426,9 @@ sub GenerateFormStart($) "' method='$self->{Method}' enctype='multipart/form-data'>\n"; }
-sub GenerateField($$$) +sub GenerateField($$$$) { - my ($self, $PropertyDescriptor, $Display) = @_; + my ($self, $PropertyDescriptor, $Display, $Format) = @_;
print "<div class='ItemProperty'><label>", $self->escapeHTML($self->GetDisplayName($PropertyDescriptor)), @@ -431,12 +438,12 @@ sub GenerateField($$$) if ($Display eq "rw") { print "<div class='ItemValue'>"; - $self->GenerateValueInput($PropertyDescriptor, $Value); + $self->GenerateValueInput($PropertyDescriptor, $Value, $Format); print "</div>"; } else { - $self->GenerateValueView($PropertyDescriptor, $Value); + $self->GenerateValueView($PropertyDescriptor, $Value, $Format); }
print "</div>\n"; @@ -448,8 +455,8 @@ sub GenerateFields($)
foreach my $PropertyDescriptor (@{$self->GetPropertyDescriptors()}) { - my $Display = $self->DisplayProperty($PropertyDescriptor); - $self->GenerateField($PropertyDescriptor, $Display) if ($Display); + my ($Display, $Format) = $self->DisplayProperty($PropertyDescriptor); + $self->GenerateField($PropertyDescriptor, $Display, $Format) if ($Display); } }
@@ -498,7 +505,7 @@ sub GenerateBody($) if (defined $self->{ErrField}) { my $PropertyDescriptor = $self->GetPropertyDescriptorByName($self->{ErrField}); - if ($PropertyDescriptor and !$self->DisplayProperty($PropertyDescriptor)) + if ($PropertyDescriptor and !($self->DisplayProperty($PropertyDescriptor))[0]) { $self->{ErrMessage} = "Internal error?\n$self->{ErrMessage}"; } @@ -599,7 +606,7 @@ sub Save($) { if ($PropertyDescriptor->GetClass() eq "Basic" && $PropertyDescriptor->GetType() eq "B" && - $self->DisplayProperty($PropertyDescriptor) eq "rw" && + ($self->DisplayProperty($PropertyDescriptor))[0] eq "rw" && ! defined($self->GetParam($PropertyDescriptor->GetName()))) { if (! $self->SaveProperty($PropertyDescriptor, ""))