use strict;
use warnings;
use Test::More;
use HTML::FormHandler::Test;
{
package Test::Form;
use HTML::FormHandler::Moose;
extends 'HTML::FormHandler';
sub build_update_subfields {{
by_flag => { repeatable => { do_wrapper => 1, do_label => 1 } }
}}
has '+name' => ( default => 'test_form' );
has_field 'foo' => ( type => 'Repeatable', num_when_empty => 2,
wrapper_attr => { class => 'hfhrep' }, label => 'Foo Records',
wrap_repeatable_element_method => \&wrap_foo_elements,
);
has_field 'foo.id' => ( type => 'PrimaryKey' );
has_field 'foo.one';
has_field 'foo.two';
has_field 'foo.three';
has_field 'bar';
sub wrap_foo_elements {
my ( $self, $input, $field_name ) = @_;
my $output = qq{\n<div class="somewrapper">};
$output .= qq{<span>$field_name</span>};
$output .= $input;
$output .= qq{</div>};
}
sub html_attributes {
my ( $self, $field, $type, $attr ) = @_;
if( $type eq 'wrapper' && $field->has_flag('is_contains') ) {
$attr->{class} = ['hfh', 'repinst'];
}
return $attr;
}
}
my $form = Test::Form->new;
$form->process({});
ok( $form, 'form built' );
my $rendered = $form->render;
my $expected =
'<form id="test_form" method="post">
<div class="form_messages"></div>
<fieldset class="hfhrep" id="foo"><legend>Foo Records</legend>
<div class="somewrapper"><span>0</span>
<div class="hfh repinst" id="foo.0">
<div><input type="hidden" name="foo.0.id" id="foo.0.id" value="" /></div>
<div>
<label for="foo.0.one">One</label>
<input type="text" name="foo.0.one" id="foo.0.one" value="" />
</div>
<div>
<label for="foo.0.two">Two</label>
<input type="text" name="foo.0.two" id="foo.0.two" value="" />
</div>
<div>
<label for="foo.0.three">Three</label>
<input type="text" name="foo.0.three" id="foo.0.three" value="" />
</div>
</div>
</div>
<div class="somewrapper"><span>1</span>
<div class="hfh repinst" id="foo.1">
<div><input type="hidden" name="foo.1.id" id="foo.1.id" value="" /></div>
<div><label for="foo.1.one">One</label>
<input type="text" name="foo.1.one" id="foo.1.one" value="" />
</div>
<div>
<label for="foo.1.two">Two</label>
<input type="text" name="foo.1.two" id="foo.1.two" value="" />
</div>
<div>
<label for="foo.1.three">Three</label>
<input type="text" name="foo.1.three" id="foo.1.three" value="" />
</div>
</div>
</div>
</fieldset>
<div>
<label for="bar">Bar</label>
<input type="text" name="bar" id="bar" value="" />
</div>
</form>';
is_html( $rendered, $expected, 'rendered as expected');
done_testing;