From 38d395e49ff76b8f1b14838d59a92decf7cc2bca Mon Sep 17 00:00:00 2001 From: Doug Bell Date: Fri, 20 Nov 2009 18:12:11 -0600 Subject: [PATCH] added Tabsets. finished toHtml --- lib/WebGUI/FormBuilder.pm | 7 ++- lib/WebGUI/FormBuilder/Fieldset.pm | 2 +- lib/WebGUI/FormBuilder/Role/HasFields.pm | 1 + lib/WebGUI/FormBuilder/Role/HasFieldsets.pm | 7 ++- lib/WebGUI/FormBuilder/Role/HasObjects.pm | 9 +++ lib/WebGUI/FormBuilder/Role/HasTabs.pm | 70 +++++++++++++++++---- lib/WebGUI/FormBuilder/Tab.pm | 11 +--- lib/WebGUI/FormBuilder/Tabset.pm | 69 +++++++++++++++++++- t/FormBuilder.t | 29 +++++---- 9 files changed, 166 insertions(+), 39 deletions(-) diff --git a/lib/WebGUI/FormBuilder.pm b/lib/WebGUI/FormBuilder.pm index aecd571a7..3a517e237 100644 --- a/lib/WebGUI/FormBuilder.pm +++ b/lib/WebGUI/FormBuilder.pm @@ -21,6 +21,10 @@ with 'WebGUI::FormBuilder::Role::HasFields'; with 'WebGUI::FormBuilder::Role::HasFieldsets'; with 'WebGUI::FormBuilder::Role::HasTabs'; +use WebGUI::FormBuilder::Tab; +use WebGUI::FormBuilder::Tabset; +use WebGUI::FormBuilder::Fieldset; + =head1 METHODS #---------------------------------------------------------------------------- @@ -75,8 +79,7 @@ Create a clone of this Form =cut sub clone { - my ( $self ) = @_; - return (ref $self)->newFromHashRef( $self->toHashRef ); + # TODO } #---------------------------------------------------------------------------- diff --git a/lib/WebGUI/FormBuilder/Fieldset.pm b/lib/WebGUI/FormBuilder/Fieldset.pm index ffc4496c8..37190ec7c 100644 --- a/lib/WebGUI/FormBuilder/Fieldset.pm +++ b/lib/WebGUI/FormBuilder/Fieldset.pm @@ -115,7 +115,7 @@ sub toHtml { my ( $self ) = @_; my $html = '
' . $self->label . ''; - $html .= inner(); + $html .= join "", map { $_->toHtml } @{$self->objects}; $html .= '
'; return $html; diff --git a/lib/WebGUI/FormBuilder/Role/HasFields.pm b/lib/WebGUI/FormBuilder/Role/HasFields.pm index 7481f86ee..c7b0e20d3 100644 --- a/lib/WebGUI/FormBuilder/Role/HasFields.pm +++ b/lib/WebGUI/FormBuilder/Role/HasFields.pm @@ -60,6 +60,7 @@ sub addField { } push @{$self->fields}, $field; + $self->addObject( $field ); $self->{_fieldsByName}{ $field->get('name') } = $field; # TODO: Must allow multiple fields per name return $field; } diff --git a/lib/WebGUI/FormBuilder/Role/HasFieldsets.pm b/lib/WebGUI/FormBuilder/Role/HasFieldsets.pm index 620f5b4cc..06b606135 100644 --- a/lib/WebGUI/FormBuilder/Role/HasFieldsets.pm +++ b/lib/WebGUI/FormBuilder/Role/HasFieldsets.pm @@ -48,8 +48,10 @@ sub addFieldset { $properties{ label } ||= $object->can('label') ? $object->label : ""; $fieldset = WebGUI::FormBuilder::Fieldset->new( $self->session, %properties ); if ( $object->DOES('WebGUI::FormBuilder::Role::HasTabs') ) { - for my $objectTab ( @{$object->tabs} ) { - $fieldset->addTab( $objectTab ); + for my $objectTabset ( @{$object->tabsets} ) { + for my $objectTab ( @{$objectTabset->tabs} ) { + $fieldset->addTab( $objectTab, tabset => $objectTabset->name ); + } } } if ( $object->DOES('WebGUI::FormBuilder::Role::HasFieldsets') ) { @@ -68,6 +70,7 @@ sub addFieldset { $fieldset = WebGUI::FormBuilder::Fieldset->new( $self->session, @properties ); } push @{$self->fieldsets}, $fieldset; + $self->addObject( $fieldset ); $self->{_fieldsetsByName}{ $fieldset->name } = $fieldset; return $fieldset; } diff --git a/lib/WebGUI/FormBuilder/Role/HasObjects.pm b/lib/WebGUI/FormBuilder/Role/HasObjects.pm index f0e89b349..19d1e4ed3 100644 --- a/lib/WebGUI/FormBuilder/Role/HasObjects.pm +++ b/lib/WebGUI/FormBuilder/Role/HasObjects.pm @@ -10,5 +10,14 @@ has 'objects' => ( # Objects combines "fields", "fieldsets", and "tabsets" +sub addObject { + my ( $self, $object ) = @_; + push @{$self->objects}, $object; + return $object; +} + +# Handle re-ordering of objects + + 1; diff --git a/lib/WebGUI/FormBuilder/Role/HasTabs.pm b/lib/WebGUI/FormBuilder/Role/HasTabs.pm index 2ac147bd8..aac5457e0 100644 --- a/lib/WebGUI/FormBuilder/Role/HasTabs.pm +++ b/lib/WebGUI/FormBuilder/Role/HasTabs.pm @@ -6,12 +6,14 @@ use Moose::Role; with 'WebGUI::FormBuilder::Role::HasObjects'; requires 'session', 'pack', 'unpack'; -has 'tabs' => ( +has 'tabsets' => ( is => 'rw', - isa => 'ArrayRef[WebGUI::FormBuilder::Tab]', + isa => 'ArrayRef[WebGUI::FormBuilder::Tabset]', default => sub { [] }, ); + + =head1 METHODS =cut @@ -31,15 +33,17 @@ Any sub-tabs or fieldsets will also be included. =cut sub addTab { - my ($tab, $self); + my ($tab, $self, %properties); if ( blessed( $_[1] ) ) { - ( $self, my $object, my %properties ) = @_; + ( $self, my $object, %properties ) = @_; $properties{ name } ||= $object->can('name') ? $object->name : ""; $properties{ label } ||= $object->can('label') ? $object->label : ""; $tab = WebGUI::FormBuilder::Tab->new( $self->session, %properties ); if ( $object->DOES('WebGUI::FormBuilder::Role::HasTabs') ) { - for my $objectTab ( @{$object->tabs} ) { - $tab->addTab( $objectTab ); + for my $objectTabset ( @{$object->tabsets} ) { + for my $objectTab ( @{$objectTabset->tabs} ) { + $tab->addTab( $objectTab, tabset => $objectTabset->name ); + } } } if ( $object->DOES('WebGUI::FormBuilder::Role::HasFieldsets') ) { @@ -54,16 +58,41 @@ sub addTab { } } else { - ( $self, my @properties ) = @_; - $tab = WebGUI::FormBuilder::Tab->new( $self->session, @properties ); + ( $self, %properties ) = @_; + $tab = WebGUI::FormBuilder::Tab->new( $self->session, %properties ); } - push @{$self->tabs}, $tab; + my $tabsetName = delete $properties{ tabset } || "default"; + my $tabset = $self->getTabset( $tabsetName ) + || $self->addTabset( name => $tabsetName ) + ; + $tabset->addTab( $tab ); $self->{_tabsByName}{$tab->name} = $tab; return $tab; } #---------------------------------------------------------------------------- +=head2 addTabset ( properties ) + +Add a tabset. A tabset holds a bunch of tabs. Returns the WebGUI::FormBuilder::Tabset +object. + +=cut + +sub addTabset { + my ( $self, %properties ) = @_; + if ( $self->{_tabsetsByName}{$properties{name}} ) { + confess "Cannot add another tabset of the same name: $properties{name}\n"; + } + my $tabset = WebGUI::FormBuilder::Tabset->new( $self->session, %properties ); + $self->{_tabsetsByName}{$tabset->name} = $tabset; + push @{$self->tabsets}, $tabset; + $self->addObject( $tabset ); + return $tabset; +} + +#---------------------------------------------------------------------------- + =head2 deleteTab ( name ) Delete a tab by name. Returns the tab deleted. @@ -73,10 +102,12 @@ Delete a tab by name. Returns the tab deleted. sub deleteTab { my ( $self, $name ) = @_; my $tab = delete $self->{_tabsByName}{$name}; - for ( my $i = 0; $i < scalar @{$self->tabs}; $i++ ) { - my $testTab = $self->tabs->[$i]; - if ( $testTab->name eq $name ) { - splice @{$self->tabs}, $i, 1; + for my $tabset ( @{ $self->tabsets } ) { + for ( my $i = 0; $i < scalar @{$tabset->tabs}; $i++ ) { + my $testTab = $tabset->tabs->[$i]; + if ( $testTab->name eq $name ) { + splice @{$tabset->tabs}, $i, 1; + } } } return $tab; @@ -95,4 +126,17 @@ sub getTab { return $self->{_tabsByName}{$name}; } +#---------------------------------------------------------------------------- + +=head2 getTabset ( name ) + +Get a tabset object by name + +=cut + +sub getTabset { + my ( $self, $name ) = @_; + return $self->{_tabsetsByName}{$name}; +} + 1; diff --git a/lib/WebGUI/FormBuilder/Tab.pm b/lib/WebGUI/FormBuilder/Tab.pm index 18401d935..b64555366 100644 --- a/lib/WebGUI/FormBuilder/Tab.pm +++ b/lib/WebGUI/FormBuilder/Tab.pm @@ -87,20 +87,13 @@ Get the WebGUI::Session attached to this object =head2 toHtml ( ) -Render this Tab. +Render the objects in this tab =cut sub toHtml { my ( $self ) = @_; - - # Whatever YUI Tabs wants - my $html = '
' - . '
' . $self->label . '
' - ; - $html .= inner(); - $html .= '
'; - + my $html = join "", map { $_->toHtml } @{$self->objects}; return $html; } diff --git a/lib/WebGUI/FormBuilder/Tabset.pm b/lib/WebGUI/FormBuilder/Tabset.pm index 8a5928f1c..32b46115a 100644 --- a/lib/WebGUI/FormBuilder/Tabset.pm +++ b/lib/WebGUI/FormBuilder/Tabset.pm @@ -1,10 +1,19 @@ package WebGUI::FormBuilder::Tabset; use Moose; +use MooseX::Storage; +use WebGUI::FormBuilder::Tab; + +has 'name' => ( + is => 'ro', + isa => 'Str', + required => 1, +); has 'tabs' => ( is => 'rw', isa => 'ArrayRef[WebGUI::FormBuilder::Tab]', + default => sub { [] }, ); has 'session' => ( @@ -16,11 +25,69 @@ has 'session' => ( ); with Storage( format => 'JSON' ); +with 'WebGUI::FormBuilder::Role::HasObjects'; +#---------------------------------------------------------------------------- + +=head2 new ( session, properties ) + +Create a new Tabset object. C is a list of name => value pairs + +=over 4 + +=item name + +The name of the tabset. Required. + +=back + +=cut + +sub new { + my ( $class, $session, %properties ) = @_; + $properties{ session } = $session; + return $class->SUPER::new( %properties ); +} + +#---------------------------------------------------------------------------- + +sub addTab { + my ( $self, $tab ) = @_; + push @{$self->tabs}, $tab; + $self->addObject( $tab ); + return $tab; +} + +#---------------------------------------------------------------------------- sub toHtml { - # Render the entire tabset + my ( $self ) = @_; + my $html = sprintf( '
', $self->name ) + . '
    ' + ; + + for ( my $i = 0; $i < @{$self->tabs}; $i++ ) { + my $tab = $self->tabs->[$i]; + $html .= sprintf '
  • %s
  • ', $i, $tab->label; + } + $html .= '
' + . '
' + ; + + for ( my $i = 0; $i < @{$self->tabs}; $i++ ) { + my $tab = $self->tabs->[$i]; + $html .= sprintf '
%s
', $i, $tab->toHtml; + } + + $html .= '
' + . '
' + . q{} + ; + + return $html; } 1; diff --git a/t/FormBuilder.t b/t/FormBuilder.t index ad37d8612..1279ecb21 100644 --- a/t/FormBuilder.t +++ b/t/FormBuilder.t @@ -29,13 +29,11 @@ my $session = WebGUI::Test->session; #---------------------------------------------------------------------------- # Tests -plan tests => 66; # Increment this number for each test you create +plan tests => 69; # Increment this number for each test you create #---------------------------------------------------------------------------- # Constructor and properties use_ok( 'WebGUI::FormBuilder' ); -use WebGUI::FormBuilder::Tab; -use WebGUI::FormBuilder::Fieldset; my $fb = WebGUI::FormBuilder->new( $session ); isa_ok( $fb, 'WebGUI::FormBuilder' ); @@ -74,9 +72,14 @@ is( $fb->name, 'myname' ); my $tab = $fb->addTab( name => "mytab", label => "My Tab" ); isa_ok( $tab, 'WebGUI::FormBuilder::Tab' ); is( $fb->getTab('mytab'), $tab, 'getTab returns exact object' ); -is( $fb->tabs, $fb->tabs, 'tabs always returns same arrayref' ); +is( $fb->tabsets, $fb->tabsets, 'tabsets always returns same arrayref' ); cmp_deeply( - $fb->tabs, + $fb->tabsets, + [ $fb->getTabset( "default" ) ], + 'tabsets', +); +cmp_deeply( + $fb->tabsets->[0]->tabs, [ $tab ], 'tabs', ); @@ -106,10 +109,13 @@ ok( $newTab->fields->[0], 'field exists' ); is( $newTab->fields->[0]->get('name'), 'search', 'field has same name' ); 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' ); +ok( $newTab->tabsets->[0], 'subtabset exists' ); +is( $newTab->tabsets->[0]->name, 'default', 'subtabset has correct name' ); +ok( $newTab->tabsets->[0]->tabs->[0], 'subtab exists' ); +is( $newTab->tabsets->[0]->tabs->[0]->name, 'more', 'subtab has correct name' ); + cmp_deeply( - $fb->tabs, + $fb->tabsets->[0]->tabs, [ $tab, $newTab ], 'added tab', ); @@ -119,7 +125,7 @@ is( $fb->getTab('newname'), $newTab, 'new tab can be gotten' ); my $deletedTab = $fb->deleteTab( 'newname' ); is( $deletedTab, $newTab, 'deleteTab returns object' ); cmp_deeply( - $fb->tabs, + $fb->tabsets->[0]->tabs, [ $tab ], 'deleted tab', ); @@ -164,8 +170,8 @@ ok( $newFset->fields->[0], 'field exists' ); is( $newFset->fields->[0]->get('name'), 'search', 'field has same name' ); 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' ); +ok( $newFset->tabsets->[0]->tabs->[0], 'tab exists' ); +is( $newFset->tabsets->[0]->tabs->[0]->name, 'more', 'tab has same name' ); cmp_deeply( $fb->fieldsets, [ $fset, $newFset], @@ -237,6 +243,7 @@ my $tab = $fb->addTab( name => 'advanced', label => 'Advanced Search' ); $tab->addField( 'text', name => 'type', label => 'Type' ); $fb->addField( 'submit', name => 'submit', label => 'Submit' ); + #---------------------------------------------------------------------------- # toHtml