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::HasFieldsets';
|
||||||
with 'WebGUI::FormBuilder::Role::HasTabs';
|
with 'WebGUI::FormBuilder::Role::HasTabs';
|
||||||
|
|
||||||
|
use WebGUI::FormBuilder::Tab;
|
||||||
|
use WebGUI::FormBuilder::Tabset;
|
||||||
|
use WebGUI::FormBuilder::Fieldset;
|
||||||
|
|
||||||
=head1 METHODS
|
=head1 METHODS
|
||||||
|
|
||||||
#----------------------------------------------------------------------------
|
#----------------------------------------------------------------------------
|
||||||
|
|
@ -75,8 +79,7 @@ Create a clone of this Form
|
||||||
=cut
|
=cut
|
||||||
|
|
||||||
sub clone {
|
sub clone {
|
||||||
my ( $self ) = @_;
|
# TODO
|
||||||
return (ref $self)->newFromHashRef( $self->toHashRef );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#----------------------------------------------------------------------------
|
#----------------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
|
@ -115,7 +115,7 @@ sub toHtml {
|
||||||
my ( $self ) = @_;
|
my ( $self ) = @_;
|
||||||
|
|
||||||
my $html = '<fieldset><legend>' . $self->label . '</legend>';
|
my $html = '<fieldset><legend>' . $self->label . '</legend>';
|
||||||
$html .= inner();
|
$html .= join "", map { $_->toHtml } @{$self->objects};
|
||||||
$html .= '</fieldset>';
|
$html .= '</fieldset>';
|
||||||
|
|
||||||
return $html;
|
return $html;
|
||||||
|
|
|
||||||
|
|
@ -60,6 +60,7 @@ sub addField {
|
||||||
}
|
}
|
||||||
|
|
||||||
push @{$self->fields}, $field;
|
push @{$self->fields}, $field;
|
||||||
|
$self->addObject( $field );
|
||||||
$self->{_fieldsByName}{ $field->get('name') } = $field; # TODO: Must allow multiple fields per name
|
$self->{_fieldsByName}{ $field->get('name') } = $field; # TODO: Must allow multiple fields per name
|
||||||
return $field;
|
return $field;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -48,8 +48,10 @@ sub addFieldset {
|
||||||
$properties{ label } ||= $object->can('label') ? $object->label : "";
|
$properties{ label } ||= $object->can('label') ? $object->label : "";
|
||||||
$fieldset = WebGUI::FormBuilder::Fieldset->new( $self->session, %properties );
|
$fieldset = WebGUI::FormBuilder::Fieldset->new( $self->session, %properties );
|
||||||
if ( $object->DOES('WebGUI::FormBuilder::Role::HasTabs') ) {
|
if ( $object->DOES('WebGUI::FormBuilder::Role::HasTabs') ) {
|
||||||
for my $objectTab ( @{$object->tabs} ) {
|
for my $objectTabset ( @{$object->tabsets} ) {
|
||||||
$fieldset->addTab( $objectTab );
|
for my $objectTab ( @{$objectTabset->tabs} ) {
|
||||||
|
$fieldset->addTab( $objectTab, tabset => $objectTabset->name );
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if ( $object->DOES('WebGUI::FormBuilder::Role::HasFieldsets') ) {
|
if ( $object->DOES('WebGUI::FormBuilder::Role::HasFieldsets') ) {
|
||||||
|
|
@ -68,6 +70,7 @@ sub addFieldset {
|
||||||
$fieldset = WebGUI::FormBuilder::Fieldset->new( $self->session, @properties );
|
$fieldset = WebGUI::FormBuilder::Fieldset->new( $self->session, @properties );
|
||||||
}
|
}
|
||||||
push @{$self->fieldsets}, $fieldset;
|
push @{$self->fieldsets}, $fieldset;
|
||||||
|
$self->addObject( $fieldset );
|
||||||
$self->{_fieldsetsByName}{ $fieldset->name } = $fieldset;
|
$self->{_fieldsetsByName}{ $fieldset->name } = $fieldset;
|
||||||
return $fieldset;
|
return $fieldset;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -10,5 +10,14 @@ has 'objects' => (
|
||||||
|
|
||||||
# Objects combines "fields", "fieldsets", and "tabsets"
|
# Objects combines "fields", "fieldsets", and "tabsets"
|
||||||
|
|
||||||
|
sub addObject {
|
||||||
|
my ( $self, $object ) = @_;
|
||||||
|
push @{$self->objects}, $object;
|
||||||
|
return $object;
|
||||||
|
}
|
||||||
|
|
||||||
|
# Handle re-ordering of objects
|
||||||
|
|
||||||
|
|
||||||
1;
|
1;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -6,12 +6,14 @@ use Moose::Role;
|
||||||
with 'WebGUI::FormBuilder::Role::HasObjects';
|
with 'WebGUI::FormBuilder::Role::HasObjects';
|
||||||
requires 'session', 'pack', 'unpack';
|
requires 'session', 'pack', 'unpack';
|
||||||
|
|
||||||
has 'tabs' => (
|
has 'tabsets' => (
|
||||||
is => 'rw',
|
is => 'rw',
|
||||||
isa => 'ArrayRef[WebGUI::FormBuilder::Tab]',
|
isa => 'ArrayRef[WebGUI::FormBuilder::Tabset]',
|
||||||
default => sub { [] },
|
default => sub { [] },
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
=head1 METHODS
|
=head1 METHODS
|
||||||
|
|
||||||
=cut
|
=cut
|
||||||
|
|
@ -31,15 +33,17 @@ Any sub-tabs or fieldsets will also be included.
|
||||||
=cut
|
=cut
|
||||||
|
|
||||||
sub addTab {
|
sub addTab {
|
||||||
my ($tab, $self);
|
my ($tab, $self, %properties);
|
||||||
if ( blessed( $_[1] ) ) {
|
if ( blessed( $_[1] ) ) {
|
||||||
( $self, my $object, my %properties ) = @_;
|
( $self, my $object, %properties ) = @_;
|
||||||
$properties{ name } ||= $object->can('name') ? $object->name : "";
|
$properties{ name } ||= $object->can('name') ? $object->name : "";
|
||||||
$properties{ label } ||= $object->can('label') ? $object->label : "";
|
$properties{ label } ||= $object->can('label') ? $object->label : "";
|
||||||
$tab = WebGUI::FormBuilder::Tab->new( $self->session, %properties );
|
$tab = WebGUI::FormBuilder::Tab->new( $self->session, %properties );
|
||||||
if ( $object->DOES('WebGUI::FormBuilder::Role::HasTabs') ) {
|
if ( $object->DOES('WebGUI::FormBuilder::Role::HasTabs') ) {
|
||||||
for my $objectTab ( @{$object->tabs} ) {
|
for my $objectTabset ( @{$object->tabsets} ) {
|
||||||
$tab->addTab( $objectTab );
|
for my $objectTab ( @{$objectTabset->tabs} ) {
|
||||||
|
$tab->addTab( $objectTab, tabset => $objectTabset->name );
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if ( $object->DOES('WebGUI::FormBuilder::Role::HasFieldsets') ) {
|
if ( $object->DOES('WebGUI::FormBuilder::Role::HasFieldsets') ) {
|
||||||
|
|
@ -54,16 +58,41 @@ sub addTab {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
( $self, my @properties ) = @_;
|
( $self, %properties ) = @_;
|
||||||
$tab = WebGUI::FormBuilder::Tab->new( $self->session, @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;
|
$self->{_tabsByName}{$tab->name} = $tab;
|
||||||
return $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 )
|
=head2 deleteTab ( name )
|
||||||
|
|
||||||
Delete a tab by name. Returns the tab deleted.
|
Delete a tab by name. Returns the tab deleted.
|
||||||
|
|
@ -73,10 +102,12 @@ Delete a tab by name. Returns the tab deleted.
|
||||||
sub deleteTab {
|
sub deleteTab {
|
||||||
my ( $self, $name ) = @_;
|
my ( $self, $name ) = @_;
|
||||||
my $tab = delete $self->{_tabsByName}{$name};
|
my $tab = delete $self->{_tabsByName}{$name};
|
||||||
for ( my $i = 0; $i < scalar @{$self->tabs}; $i++ ) {
|
for my $tabset ( @{ $self->tabsets } ) {
|
||||||
my $testTab = $self->tabs->[$i];
|
for ( my $i = 0; $i < scalar @{$tabset->tabs}; $i++ ) {
|
||||||
if ( $testTab->name eq $name ) {
|
my $testTab = $tabset->tabs->[$i];
|
||||||
splice @{$self->tabs}, $i, 1;
|
if ( $testTab->name eq $name ) {
|
||||||
|
splice @{$tabset->tabs}, $i, 1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return $tab;
|
return $tab;
|
||||||
|
|
@ -95,4 +126,17 @@ sub getTab {
|
||||||
return $self->{_tabsByName}{$name};
|
return $self->{_tabsByName}{$name};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
=head2 getTabset ( name )
|
||||||
|
|
||||||
|
Get a tabset object by name
|
||||||
|
|
||||||
|
=cut
|
||||||
|
|
||||||
|
sub getTabset {
|
||||||
|
my ( $self, $name ) = @_;
|
||||||
|
return $self->{_tabsetsByName}{$name};
|
||||||
|
}
|
||||||
|
|
||||||
1;
|
1;
|
||||||
|
|
|
||||||
|
|
@ -87,20 +87,13 @@ Get the WebGUI::Session attached to this object
|
||||||
|
|
||||||
=head2 toHtml ( )
|
=head2 toHtml ( )
|
||||||
|
|
||||||
Render this Tab.
|
Render the objects in this tab
|
||||||
|
|
||||||
=cut
|
=cut
|
||||||
|
|
||||||
sub toHtml {
|
sub toHtml {
|
||||||
my ( $self ) = @_;
|
my ( $self ) = @_;
|
||||||
|
my $html = join "", map { $_->toHtml } @{$self->objects};
|
||||||
# Whatever YUI Tabs wants
|
|
||||||
my $html = '<div class="yui-tab">'
|
|
||||||
. '<div class="yui-tab-label">' . $self->label . '</div>'
|
|
||||||
;
|
|
||||||
$html .= inner();
|
|
||||||
$html .= '</div>';
|
|
||||||
|
|
||||||
return $html;
|
return $html;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,10 +1,19 @@
|
||||||
package WebGUI::FormBuilder::Tabset;
|
package WebGUI::FormBuilder::Tabset;
|
||||||
|
|
||||||
use Moose;
|
use Moose;
|
||||||
|
use MooseX::Storage;
|
||||||
|
use WebGUI::FormBuilder::Tab;
|
||||||
|
|
||||||
|
has 'name' => (
|
||||||
|
is => 'ro',
|
||||||
|
isa => 'Str',
|
||||||
|
required => 1,
|
||||||
|
);
|
||||||
|
|
||||||
has 'tabs' => (
|
has 'tabs' => (
|
||||||
is => 'rw',
|
is => 'rw',
|
||||||
isa => 'ArrayRef[WebGUI::FormBuilder::Tab]',
|
isa => 'ArrayRef[WebGUI::FormBuilder::Tab]',
|
||||||
|
default => sub { [] },
|
||||||
);
|
);
|
||||||
|
|
||||||
has 'session' => (
|
has 'session' => (
|
||||||
|
|
@ -16,11 +25,69 @@ has 'session' => (
|
||||||
);
|
);
|
||||||
|
|
||||||
with Storage( format => 'JSON' );
|
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 {
|
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;
|
1;
|
||||||
|
|
|
||||||
|
|
@ -29,13 +29,11 @@ my $session = WebGUI::Test->session;
|
||||||
#----------------------------------------------------------------------------
|
#----------------------------------------------------------------------------
|
||||||
# Tests
|
# 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
|
# Constructor and properties
|
||||||
use_ok( 'WebGUI::FormBuilder' );
|
use_ok( 'WebGUI::FormBuilder' );
|
||||||
use WebGUI::FormBuilder::Tab;
|
|
||||||
use WebGUI::FormBuilder::Fieldset;
|
|
||||||
|
|
||||||
my $fb = WebGUI::FormBuilder->new( $session );
|
my $fb = WebGUI::FormBuilder->new( $session );
|
||||||
isa_ok( $fb, 'WebGUI::FormBuilder' );
|
isa_ok( $fb, 'WebGUI::FormBuilder' );
|
||||||
|
|
@ -74,9 +72,14 @@ is( $fb->name, 'myname' );
|
||||||
my $tab = $fb->addTab( name => "mytab", label => "My Tab" );
|
my $tab = $fb->addTab( name => "mytab", label => "My Tab" );
|
||||||
isa_ok( $tab, 'WebGUI::FormBuilder::Tab' );
|
isa_ok( $tab, 'WebGUI::FormBuilder::Tab' );
|
||||||
is( $fb->getTab('mytab'), $tab, 'getTab returns exact object' );
|
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(
|
cmp_deeply(
|
||||||
$fb->tabs,
|
$fb->tabsets,
|
||||||
|
[ $fb->getTabset( "default" ) ],
|
||||||
|
'tabsets',
|
||||||
|
);
|
||||||
|
cmp_deeply(
|
||||||
|
$fb->tabsets->[0]->tabs,
|
||||||
[ $tab ],
|
[ $tab ],
|
||||||
'tabs',
|
'tabs',
|
||||||
);
|
);
|
||||||
|
|
@ -106,10 +109,13 @@ ok( $newTab->fields->[0], 'field exists' );
|
||||||
is( $newTab->fields->[0]->get('name'), 'search', 'field has same name' );
|
is( $newTab->fields->[0]->get('name'), 'search', 'field has same name' );
|
||||||
ok( $newTab->fieldsets->[0], 'fieldset exists' );
|
ok( $newTab->fieldsets->[0], 'fieldset exists' );
|
||||||
is( $newTab->fieldsets->[0]->name, 'advanced', 'fieldset has same name' );
|
is( $newTab->fieldsets->[0]->name, 'advanced', 'fieldset has same name' );
|
||||||
ok( $newTab->tabs->[0], 'subtab exists' );
|
ok( $newTab->tabsets->[0], 'subtabset exists' );
|
||||||
is( $newTab->tabs->[0]->name, 'more', 'subtab has same name' );
|
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(
|
cmp_deeply(
|
||||||
$fb->tabs,
|
$fb->tabsets->[0]->tabs,
|
||||||
[ $tab, $newTab ],
|
[ $tab, $newTab ],
|
||||||
'added tab',
|
'added tab',
|
||||||
);
|
);
|
||||||
|
|
@ -119,7 +125,7 @@ is( $fb->getTab('newname'), $newTab, 'new tab can be gotten' );
|
||||||
my $deletedTab = $fb->deleteTab( 'newname' );
|
my $deletedTab = $fb->deleteTab( 'newname' );
|
||||||
is( $deletedTab, $newTab, 'deleteTab returns object' );
|
is( $deletedTab, $newTab, 'deleteTab returns object' );
|
||||||
cmp_deeply(
|
cmp_deeply(
|
||||||
$fb->tabs,
|
$fb->tabsets->[0]->tabs,
|
||||||
[ $tab ],
|
[ $tab ],
|
||||||
'deleted tab',
|
'deleted tab',
|
||||||
);
|
);
|
||||||
|
|
@ -164,8 +170,8 @@ ok( $newFset->fields->[0], 'field exists' );
|
||||||
is( $newFset->fields->[0]->get('name'), 'search', 'field has same name' );
|
is( $newFset->fields->[0]->get('name'), 'search', 'field has same name' );
|
||||||
ok( $newFset->fieldsets->[0], 'subfieldset exists' );
|
ok( $newFset->fieldsets->[0], 'subfieldset exists' );
|
||||||
is( $newFset->fieldsets->[0]->name, 'advanced', 'subfieldset has same name' );
|
is( $newFset->fieldsets->[0]->name, 'advanced', 'subfieldset has same name' );
|
||||||
ok( $newFset->tabs->[0], 'tab exists' );
|
ok( $newFset->tabsets->[0]->tabs->[0], 'tab exists' );
|
||||||
is( $newFset->tabs->[0]->name, 'more', 'tab has same name' );
|
is( $newFset->tabsets->[0]->tabs->[0]->name, 'more', 'tab has same name' );
|
||||||
cmp_deeply(
|
cmp_deeply(
|
||||||
$fb->fieldsets,
|
$fb->fieldsets,
|
||||||
[ $fset, $newFset],
|
[ $fset, $newFset],
|
||||||
|
|
@ -237,6 +243,7 @@ my $tab = $fb->addTab( name => 'advanced', label => 'Advanced Search' );
|
||||||
$tab->addField( 'text', name => 'type', label => 'Type' );
|
$tab->addField( 'text', name => 'type', label => 'Type' );
|
||||||
$fb->addField( 'submit', name => 'submit', label => 'Submit' );
|
$fb->addField( 'submit', name => 'submit', label => 'Submit' );
|
||||||
|
|
||||||
|
|
||||||
#----------------------------------------------------------------------------
|
#----------------------------------------------------------------------------
|
||||||
# toHtml
|
# toHtml
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue