diff --git a/lib/WebGUI/FormBuilder.pm b/lib/WebGUI/FormBuilder.pm index 78f3ff65d..50ddee15a 100644 --- a/lib/WebGUI/FormBuilder.pm +++ b/lib/WebGUI/FormBuilder.pm @@ -119,18 +119,18 @@ Return the HTML for the form =cut -sub toHtml { +override 'toHtml' => sub { my ( $self ) = @_; my @attrs = qw{ action method name enctype }; - my $attrs = join " ", map { qq{$_="} . $self->get($_) . qq{"} } @attrs; + my $attrs = join " ", map { qq{$_="} . $self->$_ . qq{"} } grep { $self->$_ } @attrs; my $html = sprintf '
', $attrs; - $html .= $self->maybe::next::method; + $html .= super(); $html .= '
'; return $html; -} +}; #---------------------------------------------------------------------------- diff --git a/lib/WebGUI/FormBuilder/Fieldset.pm b/lib/WebGUI/FormBuilder/Fieldset.pm index a395dba87..ffc4496c8 100644 --- a/lib/WebGUI/FormBuilder/Fieldset.pm +++ b/lib/WebGUI/FormBuilder/Fieldset.pm @@ -114,8 +114,8 @@ Returns the HTML to render the fieldset. sub toHtml { my ( $self ) = @_; - my $html = '
' . $self->legend . ''; - $html .= $self->maybe::next::method; + my $html = '
' . $self->label . ''; + $html .= inner(); $html .= '
'; return $html; diff --git a/lib/WebGUI/FormBuilder/Role/HasFields.pm b/lib/WebGUI/FormBuilder/Role/HasFields.pm index 4b021ef9f..a05cdb250 100644 --- a/lib/WebGUI/FormBuilder/Role/HasFields.pm +++ b/lib/WebGUI/FormBuilder/Role/HasFields.pm @@ -48,12 +48,12 @@ sub addField { # Is $type a class name? eval { WebGUI::Pluggable::load( $type ) }; if ( $@ ) { - eval { WebGUI::Pluggable::load( "WebGUI::Form::$type" ) }; + eval { WebGUI::Pluggable::load( "WebGUI::Form::" . ucfirst( $type ) ) }; if ( $@ ) { $self->session->error("Could not load field type '$type'. Try loading it manually." ); confess "Could not load field type '$type'. Try loading it manually."; } - $type = "WebGUI::Form::$type"; + $type = "WebGUI::Form::" . ucfirst( $type ); } $field = $type->new( $self->session, { @properties } ); } @@ -65,6 +65,26 @@ sub addField { #---------------------------------------------------------------------------- +=head2 deleteField ( name ) + +Delete a field by name. Returns the field deleted. + +=cut + +sub deleteField { + my ( $self, $name ) = @_; + my $field = delete $self->{_fieldsByName}{$name}; + for ( my $i = 0; $i < scalar @{$self->fields}; $i++ ) { + my $testField = $self->fields->[$i]; + if ( $testField->get('name') eq $name ) { + splice @{$self->fields}, $i, 1; + } + } + return $field; +} + +#---------------------------------------------------------------------------- + =head2 getField ( name ) Get a field by name. Returns the field object. @@ -107,16 +127,15 @@ Render the fields in this part of the form. =cut -sub toHtml { - my ( $self ) = @_; +override 'toHtml' => sub { + my ( $orig, $self ) = @_; - # This will always be the first one called, so no maybe::next::method - my $html = ''; + my $html = super(); for my $field ( @{$self->fields} ) { $html .= $field->toHtmlWithWrapper; } return $html; -} +}; 1; diff --git a/lib/WebGUI/FormBuilder/Role/HasFieldsets.pm b/lib/WebGUI/FormBuilder/Role/HasFieldsets.pm index 977c15b33..620f5b4cc 100644 --- a/lib/WebGUI/FormBuilder/Role/HasFieldsets.pm +++ b/lib/WebGUI/FormBuilder/Role/HasFieldsets.pm @@ -41,12 +41,12 @@ of name => value pairs to override properties in the C (such as name and =cut sub addFieldset { + my ( $fieldset, $self ); if ( blessed( $_[1] ) ) { - my ( $self, $object, %properties ) = @_; + ( $self, my $object, my %properties ) = @_; $properties{ name } ||= $object->can('name') ? $object->name : ""; $properties{ label } ||= $object->can('label') ? $object->label : ""; - my $fieldset = WebGUI::FormBuilder::Fieldset->new( $self->session, %properties ); - push @{$self->fieldsets}, $fieldset; + $fieldset = WebGUI::FormBuilder::Fieldset->new( $self->session, %properties ); if ( $object->DOES('WebGUI::FormBuilder::Role::HasTabs') ) { for my $objectTab ( @{$object->tabs} ) { $fieldset->addTab( $objectTab ); @@ -62,35 +62,14 @@ sub addFieldset { $fieldset->addField( $objectField ); } } - return $fieldset; } else { - my ( $self, @properties ) = @_; - my $fieldset = WebGUI::FormBuilder::Fieldset->new( $self->session, @properties ); - push @{$self->fieldsets}, $fieldset; - $self->{_fieldsetsByName}{ $fieldset->name } = $fieldset; - return $fieldset; + ( $self, my @properties ) = @_; + $fieldset = WebGUI::FormBuilder::Fieldset->new( $self->session, @properties ); } -} - -#---------------------------------------------------------------------------- - -=head2 addFromHashRef( hashRef ) - -Add the fieldsets from the given serialized hashRef. See C for more -information. - -=cut - -sub addFromHashRef { - my ( $self, $hashref ) = @_; - - for my $fieldset ( @{$hashref->{fieldsets}} ) { - my $fs = WebGUI::FormBuilder::Fieldset->newFromHashref( $self->session, $fieldset ); - $self->addFieldset( $fs ); - } - - $self->maybe::next::method; + push @{$self->fieldsets}, $fieldset; + $self->{_fieldsetsByName}{ $fieldset->name } = $fieldset; + return $fieldset; } #---------------------------------------------------------------------------- @@ -134,13 +113,13 @@ Render the fieldsets in this part of the form =cut -sub toHtml { +override 'toHtml' => sub { my ( $self ) = @_; - my $html = $self->maybe::next::method; + my $html = super(); for my $fieldset ( @{$self->fieldsets} ) { $html .= $fieldset->toHtml; } return $html; -} +}; 1; diff --git a/lib/WebGUI/FormBuilder/Role/HasTabs.pm b/lib/WebGUI/FormBuilder/Role/HasTabs.pm index 713b2052b..e31aeeb66 100644 --- a/lib/WebGUI/FormBuilder/Role/HasTabs.pm +++ b/lib/WebGUI/FormBuilder/Role/HasTabs.pm @@ -30,12 +30,12 @@ Any sub-tabs or fieldsets will also be included. =cut sub addTab { + my ($tab, $self); if ( blessed( $_[1] ) ) { - my ( $self, $object, %properties ) = @_; + ( $self, my $object, my %properties ) = @_; $properties{ name } ||= $object->can('name') ? $object->name : ""; $properties{ label } ||= $object->can('label') ? $object->label : ""; - my $tab = WebGUI::FormBuilder::Tab->new( $self->session, %properties ); - push @{ $self->tabs }, $tab; + $tab = WebGUI::FormBuilder::Tab->new( $self->session, %properties ); if ( $object->DOES('WebGUI::FormBuilder::Role::HasTabs') ) { for my $objectTab ( @{$object->tabs} ) { $tab->addTab( $objectTab ); @@ -51,15 +51,14 @@ sub addTab { $tab->addField( $objectField ); } } - return $tab; } else { - my ( $self, @properties ) = @_; - my $tab = WebGUI::FormBuilder::Tab->new( $self->session, @properties ); - push @{$self->tabs}, $tab; - $self->{_tabsByName}{$tab->name} = $tab; - return $tab; + ( $self, my @properties ) = @_; + $tab = WebGUI::FormBuilder::Tab->new( $self->session, @properties ); } + push @{$self->tabs}, $tab; + $self->{_tabsByName}{$tab->name} = $tab; + return $tab; } #---------------------------------------------------------------------------- @@ -97,32 +96,19 @@ sub getTab { #---------------------------------------------------------------------------- -=head2 getTabs ( ) - -Get all tab objects. Returns the arrayref of tabs. - -=cut - -sub getTabs { - my ( $self ) = @_; - return $self->tabs; -} - -#---------------------------------------------------------------------------- - =head2 toHtml ( ) Render the tabs in this part of the form =cut -sub toHtml { +override 'toHtml' => sub { my ( $self ) = @_; - my $html = $self->maybe::next::method; + my $html = super(); for my $tab ( @{$self->tabs} ) { $html .= $tab->toHtml; } return $html; -} +}; 1; diff --git a/lib/WebGUI/FormBuilder/Tab.pm b/lib/WebGUI/FormBuilder/Tab.pm index ecb1ae31b..18401d935 100644 --- a/lib/WebGUI/FormBuilder/Tab.pm +++ b/lib/WebGUI/FormBuilder/Tab.pm @@ -98,7 +98,7 @@ sub toHtml { my $html = '
' . '
' . $self->label . '
' ; - $html .= $self->maybe::next::method; + $html .= inner(); $html .= '
'; return $html; diff --git a/t/FormBuilder.t b/t/FormBuilder.t index 1ac0204f9..ad37d8612 100644 --- a/t/FormBuilder.t +++ b/t/FormBuilder.t @@ -29,7 +29,7 @@ my $session = WebGUI::Test->session; #---------------------------------------------------------------------------- # Tests -plan tests => 53; # Increment this number for each test you create +plan tests => 66; # Increment this number for each test you create #---------------------------------------------------------------------------- # Constructor and properties @@ -108,7 +108,22 @@ ok( $newTab->fieldsets->[0], 'fieldset exists' ); is( $newTab->fieldsets->[0]->name, 'advanced', 'fieldset has same name' ); ok( $newTab->tabs->[0], 'subtab exists' ); is( $newTab->tabs->[0]->name, 'more', 'subtab has same name' ); +cmp_deeply( + $fb->tabs, + [ $tab, $newTab ], + 'added tab', +); +is( $fb->getTab('newname'), $newTab, 'new tab can be gotten' ); +# deleteTab +my $deletedTab = $fb->deleteTab( 'newname' ); +is( $deletedTab, $newTab, 'deleteTab returns object' ); +cmp_deeply( + $fb->tabs, + [ $tab ], + 'deleted tab', +); +ok( !$fb->getTab('newname'), 'deleted tab cannot be gotten' ); # addFieldset with properties $fb = WebGUI::FormBuilder->new( $session ); @@ -151,6 +166,22 @@ ok( $newFset->fieldsets->[0], 'subfieldset exists' ); is( $newFset->fieldsets->[0]->name, 'advanced', 'subfieldset has same name' ); ok( $newFset->tabs->[0], 'tab exists' ); is( $newFset->tabs->[0]->name, 'more', 'tab has same name' ); +cmp_deeply( + $fb->fieldsets, + [ $fset, $newFset], + 'added fieldset', +); +is( $fb->getFieldset('newname'), $newFset, 'new fieldset can be gotten' ); + +# deletefieldset +my $deletedFieldset = $fb->deleteFieldset( 'newname' ); +is( $deletedFieldset, $newFset, 'deletefieldset returns object' ); +cmp_deeply( + $fb->fieldsets, + [ $fset ], + 'deleted fieldset', +); +ok( !$fb->getFieldset('newname'), 'deleted fieldset cannot be gotten' ); # addField with properties $fb = WebGUI::FormBuilder->new( $session ); @@ -185,8 +216,30 @@ cmp_deeply( 'fields 2', ); +# deleteField +my $field3 = $fb->deleteField( 'type' ); +is( $field3, $field2, 'deleteField returns same field' ); +ok( !$fb->getField('type'), 'field is deleted' ); +cmp_deeply( + $fb->fields, + [ $field ], + 'field is deleted from fields', +); + + #---------------------------------------------------------------------------- # Serialize and deserialize +my $fb = WebGUI::FormBuilder->new( $session ); +my $fset = $fb->addFieldset( name => 'search', label => 'Search' ); +$fset->addField( 'text', name => 'keywords', label => 'Keywords' ); +my $tab = $fb->addTab( name => 'advanced', label => 'Advanced Search' ); +$tab->addField( 'text', name => 'type', label => 'Type' ); +$fb->addField( 'submit', name => 'submit', label => 'Submit' ); + +#---------------------------------------------------------------------------- +# toHtml + +print $fb->toHtml; #vim:ft=perl