added Tabsets. finished toHtml

This commit is contained in:
Doug Bell 2009-11-20 18:12:11 -06:00
parent db785fbc02
commit 38d395e49f
9 changed files with 166 additions and 39 deletions

View file

@ -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
}
#----------------------------------------------------------------------------

View file

@ -115,7 +115,7 @@ sub toHtml {
my ( $self ) = @_;
my $html = '<fieldset><legend>' . $self->label . '</legend>';
$html .= inner();
$html .= join "", map { $_->toHtml } @{$self->objects};
$html .= '</fieldset>';
return $html;

View file

@ -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;
}

View file

@ -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;
}

View file

@ -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;

View file

@ -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;

View file

@ -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 = '<div class="yui-tab">'
. '<div class="yui-tab-label">' . $self->label . '</div>'
;
$html .= inner();
$html .= '</div>';
my $html = join "", map { $_->toHtml } @{$self->objects};
return $html;
}

View file

@ -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<properties> 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( '<div id="%s" class="yui-navset">', $self->name )
. '<ul class="yui-nav">'
;
for ( my $i = 0; $i < @{$self->tabs}; $i++ ) {
my $tab = $self->tabs->[$i];
$html .= sprintf '<li><a href="#tab%i"><em>%s</em></a></li>', $i, $tab->label;
}
$html .= '</ul>'
. '<div class="yui-content">'
;
for ( my $i = 0; $i < @{$self->tabs}; $i++ ) {
my $tab = $self->tabs->[$i];
$html .= sprintf '<div id="tab%i">%s</div>', $i, $tab->toHtml;
}
$html .= '</div>'
. '</div>'
. q{<script type="text/javascript">}
. sprintf( q{var tabView = new YAHOO.widget.TabView('%s');}, $self->name )
. q{</script>}
;
return $html;
}
1;