package Valiant::HTML::FormBuilder::RadioButton;
use Moo;
extends 'Valiant::HTML::FormBuilder';
has 'parent_builder' => (is=>'ro', required=>1);
sub default_theme {
my $self = shift;
return $self->parent_builder->can('default_theme') ?
$self->parent_builder->default_theme :
+{};
}
sub text {
my $self = shift;
return $self->tag_value_for_attribute($self->options->{label_method});
}
sub value {
my $self = shift;
return $self->tag_value_for_attribute($self->options->{value_method});
}
sub checked {
my $self = shift;
return $self->options->{checked};
}
around 'label', sub {
my ($orig, $self, $attrs) = @_;
$attrs = +{} unless defined($attrs);
my $text = $self->human_name_for_label($self->text);
return $self->$orig($self->value, $attrs, $text);
};
around 'radio_button', sub {
my ($orig, $self, $attrs) = @_;
my $attribute = $self->options->{attribute};
$attrs = +{} unless defined($attrs);
$attrs->{name} = $self->name;
$attrs->{checked} = $self->checked;
$attrs->{id} = $self->tag_id_for_attribute($self->value);
$attrs = $self->merge_theme_field_opts(radio_button=>$attrs->{attribute}, $attrs);
my $has_error = 0;
if(my $errors = $self->options->{errors}) {
foreach my $error(@$errors) {
$has_error = 1 if $error->bad_value eq $self->value;
}
}
my $errors_classes = exists($attrs->{errors_classes}) ? delete($attrs->{errors_classes}) : undef;
$attrs->{class} = join(' ', (grep { defined $_ } $attrs->{class}, $errors_classes))
if $errors_classes && $has_error;
return $self->$orig($attribute, $self->value, $attrs);
};
1;
=head1 NAME
Valiant::HTML::FormBuilder::RadioButton - A custom formbuilder for radio button content
=head1 SYNOPSIS
$fb_profile->collection_radio_buttons('state_id', $states, id=>'name', +{ errors_classes=>'is-invalid'}, sub (
my $fb_state = shift;
$fb_state->radio_button(+{class=>"form-check-input"});
$fb_state->label(+{class=>"form-check-label"});
});
=head1 DESCRIPTION
This is a custom subclass of L that modifies the C