use strict; use warnings; use Test::More; use HTML::FormHandler::Test; { package MyApp::Form::Controls::Theme; use Moose::Role; # widget wrapper must be set before the fields are built in BUILD sub before_build { my $self = shift; $self->set_widget_wrapper('Bootstrap'); } sub build_do_form_wrapper {1} sub build_form_element_class {['form-horizontal']} sub build_form_wrapper_class {['span8']} sub build_form_tags {{ wrapper_tag => 'div', after_start => '
Controls Bootstrap supports', before_end => '
', }} sub build_update_subfields {{ input01 => { tags => { after_element => '

In addition to freeform text, any HTML5 text-based input appears like so.

' }, element_attr => { class => 'input-xlarge' }, }, optionsCheckbox => { option_label => 'Option one is this and that—be sure to include why it’s great' }, fileInput => { element_attr => { class => 'input-file' } }, textarea => { element_attr => { class => 'input-xlarge' } }, actions => { element_attr => { class => 'form-actions' } }, }} } { package MyApp::Form::Component::Actions; use HTML::FormHandler::Moose::Role; has_field 'actions' => ( type => 'Compound', order => 99, widget_wrapper => 'Simple', do_wrapper => 1, do_label => 0, wrapper_attr => { class => 'form-actions' } ); has_field 'actions.save' => ( type => 'Submit', widget => 'ButtonTag', element_attr => { class => ['btn', 'btn-primary'] }, widget_wrapper => 'None', value => "Save changes" ); has_field 'actions.cancel' => ( type => 'Reset', widget => 'ButtonTag', element_attr => { class => ['btn'] }, widget_wrapper => 'None', value => "Cancel" ); } { package MyApp::Form::Controls; use HTML::FormHandler::Moose; extends 'HTML::FormHandler'; with 'MyApp::Form::Controls::Theme'; with 'MyApp::Form::Component::Actions'; has '+name' => ( default => 'control_form' ); has_field 'input01' => ( type => 'Text', label => 'Text input' ); has_field 'optionsCheckbox' => ( type => 'Checkbox', checkbox_value => "option1", label => 'Checkbox' ); has_field 'select01' => ( type => 'Select', label => 'Select list' ); has_field 'multiSelect' => ( type => 'Multiple', label => 'Multi-select' ); has_field 'fileInput' => ( type => 'File', label => 'File input' ); has_field 'textarea' => ( type => 'TextArea', cols => 20, rows => 4 ); sub options_select01 { return ( 1 => 1, 2 => 2, 3 => 3, 4 => 4, 5 => 5 ); } sub options_multiSelect { return ( 1 => 1, 2 => 2, 3 => 3, 4 => 4, 5 => 5 ); } } my $form = MyApp::Form::Controls->new; $form->process; my $rendered = $form->render_start; my $expected = '
Controls Bootstrap supports'; is($rendered, $expected, 'form start rendered correctly'); # text field $expected = '

In addition to freeform text, any HTML5 text-based input appears like so.

'; $rendered = $form->field('input01')->render; is_html($rendered, $expected, 'input01 field rendered correctly'); # checkbox $expected = '
'; is( $form->field('optionsCheckbox')->widget_wrapper, 'Bootstrap', 'correct wrapper' ); $rendered = $form->field('optionsCheckbox')->render; is_html($rendered, $expected, 'optionsCheckbox field rendered correctly'); # select $expected = '
'; $rendered = $form->field('select01')->render; is_html($rendered, $expected, 'select01 renders ok' ); # multiple select $expected = '
'; $rendered = $form->field('multiSelect')->render; is_html($rendered, $expected, 'multiSelect renders ok' ); # file $expected = '
'; $rendered = $form->field('fileInput')->render; is_html($rendered, $expected, 'fileInput render ok' ); # textarea $expected = '
'; $rendered = $form->field('textarea')->render; is_html($rendered, $expected, 'textarea renders ok' ); # actions $expected = '
'; $rendered = $form->field('actions')->render; is_html($rendered, $expected, 'actions renders ok' ); $expected = '
Controls Bootstrap supports

In addition to freeform text, any HTML5 text-based input appears like so.

'; $rendered = $form->render; is_html( $rendered, $expected, 'form renders correctly' ); done_testing;