From: Simon Elliott Date: Mon, 13 Jun 2011 14:33:08 +0000 (+0100) Subject: form helpers X-Git-Tag: allocate_with_form~2 X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=commitdiff_plain;h=refs%2Fheads%2Fpeople%2Fpurge%2Fform_helpers;p=catagits%2FHTML-Zoom.git form helpers --- diff --git a/lib/HTML/Zoom/FilterBuilder.pm b/lib/HTML/Zoom/FilterBuilder.pm index bfb8f66..3baf494 100644 --- a/lib/HTML/Zoom/FilterBuilder.pm +++ b/lib/HTML/Zoom/FilterBuilder.pm @@ -373,39 +373,69 @@ sub extract_names { }; sub validate_form { - my ($self,$to,$fill) = @_; + my ($self,$to) = @_; $self->collect({ filter => sub { return - $_->select('input')->validate_and_fill($to,$fill) - ->select('select')->validate_and_fill($to,$fill); + $_->select('input')->validation_rules($to) + ->select('select')->validation_rules($to); }, passthrough => 1, }); } -sub val { - my ($self, $value) = @_; - #set value on an element. if its a select select its option - #if it's a checkbox check it otherwise set attr value +sub fill_form { + my ($self,$val) = @_; + $self->collect({ + filter => sub { + return + $_->select('input')->val($val) + #->select('select')->val($val) + ; + }, + passthrough => 1, + }); +} + +sub validation_rules { + my ($self, $to) = @_; sub { - return $self->set_attribute(value => $value); + my ($evt) = @_; + $to->{$evt->{'attrs'}->{'name'}} + = [split ' ', $evt->{'attrs'}->{'data-validate'}||""]; + $evt; } } -sub validate_and_fill { - my ($self, $to, $fill) = @_; +sub val { + #if val is a hashref automatically match to name, otherwise fill as is. + my ($self, $val) = @_; sub { my ($evt) = @_; - my $nm = $evt->{'attrs'}->{'name'}; - if(defined $fill && $fill->{$nm}) { - $evt->{'raw'} = undef; - $evt->{'raw_attrs'} = undef; - push @{$evt->{'attr_names'}}, 'value' unless exists $evt->{'attrs'}->{'value'}; - $evt->{'attrs'}->{'value'} = $fill->{$nm}; + my $attrs = $evt->{'attrs'}; + my $nm = $attrs->{'name'}; + my $tar = defined $val && ref $val eq 'HASH' ? $val->{$nm} : $val; + if(defined $tar) { + if($evt->{'name'} eq 'select') { + #if we are select do something more complicated + warn "Can't do selects yet"; + } else { + $evt->{'raw'} = undef; + $evt->{'raw_attrs'} = undef; + push @{$evt->{'attr_names'}}, 'value' unless exists $attrs->{'value'}; + $attrs->{'value'} = $tar; + #check if we are a checkbox + if($attrs->{'type'} eq 'checkbox') { + if($tar) { + push @{$evt->{'attr_names'}}, 'selected' unless exists $attrs->{'selected'}; + $attrs->{'selected'} = $tar ? 'selected' : ''; + } else { + delete $attrs->{'selected'}; + $evt->{'attr_names'} = [ grep $_ ne 'selected', @{$evt->{'attr_names'}} ]; + } + } + } } - $to->{$nm} = - [split ' ', $evt->{'attrs'}->{'data-validate'}||""]; $evt; } } diff --git a/t/form_helpers.t b/t/form_helpers.t index d19f728..f6a8f8a 100644 --- a/t/form_helpers.t +++ b/t/form_helpers.t @@ -46,7 +46,8 @@ is( 'set value on input=text' ); -($expect = $tmpl) =~ s/name="input_field" /name="input_field" value="testval" /; +$z = HTML::Zoom->from_html($tmpl); +($expect = $tmpl) =~ s/value="0" type="checkbox" name="input_check" /value="1" type="checkbox" name="input_check" selected="selected" /; is( $z->select('input[name="input_check"]')->val(1)->to_html, @@ -54,13 +55,39 @@ is( 'set value on input=checkbox' ); -# my %rules; -# my $validate_and_fill = sub { -# $_ = $_->set_attribute("test" => "test"); -# #use Devel::Dwarn;Dwarn \@_; -# $_; -# }; -# -# print $z->select('form')->validate_form(\%rules, {input_field => "Test", input_field2 => "Moo"})->to_html; -# use Devel::Dwarn;Dwarn \%rules; +($expect = $tmpl) =~ s/value="1" type="checkbox" name="input_check" selected="selected" \>/value="0" type="checkbox" name="input_check" \>/; + +is( + $z->select('input[name="input_check"]')->val(0)->to_html, + $expect, + 'remove value on input=checkbox' +); + +$z = HTML::Zoom->from_html($tmpl); +($expect = $tmpl) =~ s/name="input_field" /name="input_field" value="testval" /; + +is( + $z->select('input')->val({input_field => "testval"})->to_html, + $expect, + 'alternate fill' +); + + +SKIP: { + skip "not implemented",1; + $z = HTML::Zoom->from_html($tmpl); + ($expect = $tmpl) =~ s/option value="2" /option value="2" selected="selected" /; + + is( + $z->select('select[name="select_field"]')->val(2)->to_html, + $expect, + 'Set value on select' + ); + +} + +my %rules; +$z->select('form')->validate_form(\%rules)->to_html; +is(scalar keys %rules, 5, "Correctly extracted validation info"); +done_testing();