form helpers people/purge/form_helpers
Simon Elliott [Mon, 13 Jun 2011 14:33:08 +0000 (15:33 +0100)]
lib/HTML/Zoom/FilterBuilder.pm
t/form_helpers.t

index bfb8f66..3baf494 100644 (file)
@@ -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;
   }
 }
index d19f728..f6a8f8a 100644 (file)
@@ -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();