added Tabsets. finished toHtml
This commit is contained in:
parent
db785fbc02
commit
38d395e49f
9 changed files with 166 additions and 39 deletions
|
|
@ -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
|
||||
}
|
||||
|
||||
#----------------------------------------------------------------------------
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue