HTML-FormFu
view release on metacpan or search on metacpan
lib/HTML/FormFu/Element/ComboBox.pm view on Meta::CPAN
my %args = _parse_args(@_);
my $get_method = "get_${method}s";
my $accessor = "_${method}s";
my @x = @{ $self->$accessor };
push @x, map { @{ $_->$get_method(@_) } } @{ $self->_elements };
return _filter_components( \%args, \@x );
};
my $name = __PACKAGE__ . "::get_${method}s";
## no critic (ProhibitNoStrict);
no strict 'refs';
*{$name} = $sub;
}
after BUILD => sub {
my ( $self, $args ) = @_;
$self->multi_value(1);
$self->empty_first(1);
return;
};
sub options {
my ( $self, @args ) = @_;
if (@args) {
$self->{options} = @args == 1 ? $args[0] : \@args;
return $self;
}
else {
# we're being called as a getter!
# are the child elements made yet?
if ( !@{ $self->_elements } ) {
# need to build the children, so we can return the select options
$self->_add_elements;
}
return $self->_elements->[0]->options;
}
}
sub value {
my ( $self, $value ) = @_;
if ( @_ > 1 ) {
$self->{value} = $value;
# if we're already built - i.e. process() has been called,
# call default() on our children
if ( @{ $self->_elements } ) {
$self->_combobox_defaults;
$self->_elements->[0]->default( $self->select->{default} );
$self->_elements->[1]->default( $self->text->{default} );
}
return $self;
}
return $self->{value};
}
sub _add_elements {
my ($self) = @_;
$self->_elements( [] );
$self->_add_select;
$self->_add_text;
$self->_combobox_defaults;
return;
}
sub _combobox_defaults {
my ($self) = @_;
if ( defined( my $default = $self->default ) ) {
if ( !$self->form->submitted || $self->render_processed_value ) {
for my $deflator ( @{ $self->_deflators } ) {
$default = $deflator->process($default);
}
}
my $select_options = $self->_elements->[0]->options;
if ( $default ne ''
&& any { $_->{value} eq $default } @$select_options )
{
$self->select->{default} = $default;
$self->text->{default} = undef;
}
else {
$self->select->{default} = undef;
$self->text->{default} = $default;
}
}
return;
}
sub _add_select {
my ($self) = @_;
my $select = $self->select;
my $select_name = _build_field_name( $self, 'select' );
my $select_element = $self->element(
{ type => 'Select',
name => $select_name,
} );
apply_all_roles( $select_element,
'HTML::FormFu::Role::Element::MultiElement' );
for my $method (@DEFER_TO_SELECT) {
if ( defined( my $value = $self->$method ) ) {
$select_element->$method($value);
}
}
if ( !@{ $select_element->options } ) {
# we need to access the hashkey directly,
# otherwise we'll have a loop
$select_element->options( $self->{options} );
}
if ( defined( my $default = $select->{default} ) ) {
$select_element->default($default);
}
return;
( run in 0.666 second using v1.01-cache-2.11-cpan-8dfa8b56332 )