1use strict; 2use warnings; 3use Test::More; 4use HTML::FormHandler::Test; 5 6{ 7 package Test::Form::Theme; 8 use Moose::Role; 9 10 sub build_form_tags {{ 11 form_tag => 1, 12 }} 13 sub build_update_subfields {{ 14 all => { tags => { some_tag => 1, field_tag => 0 } }, 15 foo => { element_class => ['interesting'] } 16 }} 17} 18 19{ 20 package Test::Form; 21 use HTML::FormHandler::Moose; 22 extends 'HTML::FormHandler'; 23 with 'Test::Form::Theme'; 24 25 has_field 'foo' => ( element_class => ['fld_def'] ); 26 has_field 'bar' => ( tags => { field_tag => 1 } ); 27 has_field 'rox' => ( wrapper_class => 'frmwrp' ); 28 29} 30 31my $form = Test::Form->new; 32ok( $form ); 33my $element_class = $form->field('foo')->element_class; 34is_deeply( $element_class, ['interesting', 'fld_def'], 'got both classes' ); 35is_deeply( $form->field('rox')->tags, { some_tag => 1, field_tag => 0 }, 'correct widget tags' ); 36is_deeply( $form->field('bar')->tags, 37 { some_tag => 1, field_tag => 1 }, 'correct widget tags' ); 38 39{ 40 package Test::ClassForm; 41 use HTML::FormHandler::Moose; 42 extends 'HTML::FormHandler'; 43 44 has '+name' => ( default => 'hfhform' ); 45 sub build_update_subfields {{ 46 all => { wrapper_class => 'hfh' } 47 }} 48 has_field 'foo'; 49 has_field 'bar'; 50 has_field 'nox'; 51 52} 53 54$form = Test::ClassForm->new; 55$form->process; 56is_deeply( $form->field('foo')->wrapper_class, ['hfh'], 'foo has class' ); 57is_deeply( $form->field('bar')->wrapper_class, ['hfh'], 'bar has class' ); 58is_deeply( $form->field('nox')->wrapper_class, ['hfh'], 'nox has class' ); 59my $rendered = $form->render; 60my $expected = 61'<form id="hfhform" method="post"> 62 <div class="form_messages"></div> 63 <div class="hfh"> 64 <label for="foo">Foo</label> 65 <input type="text" id="foo" name="foo" value=""> 66 </div> 67 <div class="hfh"> 68 <label for="bar">Bar</label> 69 <input type="text" id="bar" name="bar" value=""> 70 </div> 71 <div class="hfh"> 72 <label for="nox">Nox</label> 73 <input type="text" id="nox" name="nox" value=""> 74 </div> 75</form>'; 76is_html( $rendered, $expected, 'rendered correctly' ); 77 78{ 79 package Test::ElementClassField; 80 use HTML::FormHandler::Moose; 81 extends 'HTML::FormHandler::Field::Text'; 82 83 sub build_element_class { ['foo'] } 84} 85{ 86 package Test::ElementClassForm; 87 use HTML::FormHandler::Moose; 88 extends 'HTML::FormHandler'; 89 90 has_field 'foo' => ( 91 type => '+Test::ElementClassField', 92 element_class => 'bar', 93 ); 94 95 # Note: all => { element_class => 'baz' } does not 96 # override the specific setting on the field. This is 97 # deliberate. The idea is that the more specific setting 98 # should override the general setting. Like all of these things, 99 # sometimes people are going to want it one way and sometimes the 100 # other. If you want to set the element_class for all elements 101 # at once, don't put a specific element_class on the field. 102 sub build_update_subfields { 103 { 104 foo => { element_class => 'baz' }, 105 } 106}; 107} 108$form = Test::ElementClassForm->new; 109$form->process; 110is_deeply( $form->field('foo')->element_class, [qw( baz )], 'foo has correct classes' ); 111 112done_testing; 113