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 = '
'; 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 = '