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;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue