The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
use strict;
use warnings;
use Test::More;
use HTML::FormHandler::Test;

# an example of how to setup a form for adding repeatable elements.
{
    package MyApp::Form::Test;
    use HTML::FormHandler::Moose;
    extends 'HTML::FormHandler';
    with 'HTML::FormHandler::Render::RepeatableJs';

    # Note: if using RepeatableJs, repeatable elements must be
    # wrapped in a 'controls' div (like the Bootstrap wrapper)
    #       set 'setup_for_js' flag
    #       do_wrapper is turned on by 'setup_for_js' flag
    has_field 'foo' => (
        type => 'Repeatable',
        setup_for_js => 1,
        do_wrapper => 1,
        tags => { controls_div => 1 },
    );

    # The 'remove' doesn't have to be a display field. It could be other html associated
    # with the repeatable element wrapper or label.
    has_field 'foo.remove' => (
        type => 'RmElement',
        value => 'Remove',
    );
    has_field 'foo.one';
    has_field 'foo.two';

    # 'AddElement' field is right after repeatable field
    # It also doesn't need to be a display field. Any way to get the correct HTML in is ok.
    # It requires the name of the repeatable (as accessed from AddElement parent)
    # The 'value' is the button text. See the AddElement field for requirements.
    has_field 'add_element' => (
        type => 'AddElement',
        repeatable => 'foo',
        value => 'Add another foo',
    );
    has_field 'bar';

}

my $form = MyApp::Form::Test->new;
ok( $form );

ok( $form->has_for_js, 'for_js data is built');

my $js = $form->render_repeatable_js;
ok( $js, 'got some javascript' );

my $expected = '
<div>
  <div class="add_element btn" data-rep-id="foo" id="add_element">Add another foo</div>
</div>';
my $rendered = $form->field('add_element')->render;
is_html( $rendered, $expected, 'add_element rendered ok' );

$expected = '
<fieldset id="foo">
  <div class="controls">
    <div class="hfh-repinst" id="foo.0">
      <div>
          <div class="rm_element btn" data-rep-elem-id="foo.0" id="foo.0.remove">Remove</div>
      </div>
      <div>
        <label for="foo.0.one">One</label>
        <input id="foo.0.one" name="foo.0.one" type="text" value="" />
      </div>
      <div>
        <label for="foo.0.two">Two</label>
        <input id="foo.0.two" name="foo.0.two" type="text" value="" />
      </div>
    </div>
  </div>
</fieldset>';
$rendered = $form->field('foo')->render;
is_html( $rendered, $expected, 'repeatable field renders ok' );


done_testing;