
Property changes on: .
___________________________________________________________________
Name: svn:ignore
   + blib


Index: t/save_to_model/has_many_repeatable_new.yml
===================================================================
--- t/save_to_model/has_many_repeatable_new.yml	(revision 867)
+++ t/save_to_model/has_many_repeatable_new.yml	(working copy)
@@ -25,6 +25,23 @@
   - type: Hidden
     name: count
   
+  - type: Repeatable
+    nested_name: user_bands
+    counter_name: count_bands
+    model_config:
+      DBIC: 
+        new_empty_row: band
+    
+    elements:
+      - type: Hidden
+        name: user
+      
+      - type: Text
+        name: band
+
+      - type: Text
+        name: alias
+
   - type: Submit
     name: submit
 
Index: t/save_to_model/has_many_repeatable_new.t
===================================================================
--- t/save_to_model/has_many_repeatable_new.t	(revision 867)
+++ t/save_to_model/has_many_repeatable_new.t	(working copy)
@@ -10,7 +10,7 @@
     }
 }
 
-plan tests => 9;
+plan tests => 14;
 
 use HTML::FormFu;
 use lib 't/lib';
@@ -25,7 +25,8 @@
 
 my $schema = MySchema->connect('dbi:SQLite:dbname=t/test.db');
 
-my $user_rs    = $schema->resultset('User');
+my $user_rs = $schema->resultset('User');
+my $band_rs = $schema->resultset('Band');
 my $address_rs = $schema->resultset('Address');
 
 {
@@ -50,6 +51,10 @@
     # should get address id 3
     my $a3 = $u2->new_related( 'addresses', { address => 'office' } );
     $a3->insert;
+    
+    # band 1
+    my $b1 = $band_rs->new_result({ band => 'a' });
+    $b1->insert;    
 }
 
 {
@@ -62,9 +67,12 @@
             'addresses.id_2'      => 3,
             'addresses.address_2' => 'new office',
             'addresses.id_3'      => '',
-            'addresses.address_3' => 'new address',
-        } );
-
+            'addresses.address_3' => 'new address',   
+            'user_bands.user_1'   => '', 
+            'user_bands.band_1'   => 1,        
+            'user_bands.alias_1'  => 'alias',        
+        });
+    
     ok( $form->submitted_and_valid );
 
     my $row = $user_rs->find(2);
@@ -87,5 +95,15 @@
 
     is( $add[2]->id,      4 );
     is( $add[2]->address, 'new address' );
+    
+    my @user_bands = $user->user_bands->all;
+    is( scalar @user_bands, 1);
+    
+    is( $user_bands[0]->alias, 'alias');
+    isnt( $user_bands[0]->alias, 'funky');
+    
+    my @bands = $user->bands->all;
+    is( scalar @bands, 1);
+    is( $bands[0]->band, 'a');    
 }
 
Index: t/save_to_model/has_many_repeatable.yml
===================================================================
--- t/save_to_model/has_many_repeatable.yml	(revision 867)
+++ t/save_to_model/has_many_repeatable.yml	(working copy)
@@ -22,6 +22,26 @@
   - type: Hidden
     name: count
   
+  - type: Repeatable
+    nested_name: user_bands
+    counter_name: count_bands
+    model_config:
+      DBIC: 
+        new_empty_row: band
+    
+    elements:
+      - type: Hidden
+        name: user
+      
+      - type: Text
+        name: band
+
+      - type: Text
+        name: alias
+
+  - type: Hidden
+    name: count_bands
+  
   - type: Submit
     name: submit
 
Index: t/lib/MySchema/UserBand.pm
===================================================================
--- t/lib/MySchema/UserBand.pm	(revision 867)
+++ t/lib/MySchema/UserBand.pm	(working copy)
@@ -9,11 +9,12 @@
 __PACKAGE__->table("user_band");
 
 __PACKAGE__->add_columns(
+    band => { data_type => "INTEGER" },
     user => { data_type => "INTEGER" },
-    band => { data_type => "INTEGER" },
+    alias => { data_type => "TEXT" },
 );
 
-__PACKAGE__->set_primary_key( "user", "band" );
+__PACKAGE__->set_primary_key( "band", "user" );
 
 __PACKAGE__->belongs_to( "user", "MySchema::User" );
 
Index: t/defaults_from_model/has_many_repeatable.yml
===================================================================
--- t/defaults_from_model/has_many_repeatable.yml	(revision 867)
+++ t/defaults_from_model/has_many_repeatable.yml	(working copy)
@@ -21,6 +21,23 @@
   
   - type: Hidden
     name: count
-  
+
+  - type: Repeatable
+    nested_name: user_bands
+    counter_name: count_bands
+    
+    elements:
+      - type: Hidden
+        name: user
+      
+      - type: Text
+        name: band
+
+      - type: Text
+        name: alias
+
+  - type: Hidden
+    name: count_bands
+    
   - type: Submit
     name: submit
Index: t/defaults_from_model/has_many_repeatable.t
===================================================================
--- t/defaults_from_model/has_many_repeatable.t	(revision 867)
+++ t/defaults_from_model/has_many_repeatable.t	(working copy)
@@ -10,7 +10,7 @@
     }
 }
 
-plan tests => 8;
+plan tests => 12;
 
 use HTML::FormFu;
 use lib 't/lib';
@@ -26,12 +26,14 @@
 my $schema = MySchema->connect('dbi:SQLite:dbname=t/test.db');
 
 my $rs = $schema->resultset('User');
+my $rs_band = $schema->resultset('Band');
 
 # filler
 
 $rs->create( {
         name      => 'filler',
-        addresses => [ { address => 'somewhere', } ] } );
+        addresses => [ { address => 'somewhere', } ],
+} );
 
 $rs->create( { name => 'filler2', } );
 
@@ -39,10 +41,14 @@
 
 # row we're going to use
 
+my $band = $rs_band->create( { band => 'a' } );
+
 $rs->create( {
         name      => 'nick',
-        addresses => [ { address => 'home', }, { address => 'office', } ] } );
-
+        addresses => [ { address => 'home', }, { address => 'office', } ],
+        user_bands     => [ { alias => 'rockband', band => $band}],
+ } );
+          
 {
     my $row = $rs->find(4);
 
@@ -63,5 +69,16 @@
 
     is( $reps[1]->get_field('id_2')->default,      '3' );
     is( $reps[1]->get_field('address_2')->default, 'office' );
+
+    $block = $form->get_all_element({ nested_name => 'user_bands' });
+    
+    @reps = @{ $block->get_elements };
+
+    is( scalar @reps, 1 );
+    
+    is( $reps[0]->get_field('user_1')->default, '4' );
+    is( $reps[0]->get_field('alias_1')->default, 'rockband' );
+    is( $reps[0]->get_field('band_1')->default, '1' );       
+
 }
 
Index: t/elements/block_repeatable_date.t
===================================================================
--- t/elements/block_repeatable_date.t	(revision 867)
+++ t/elements/block_repeatable_date.t	(working copy)
@@ -18,6 +18,6 @@
 
 # check fields get their names munged
 
-like( $html, qr/select name="foo_day"/ );
-like( $html, qr/select name="foo_month"/ );
-like( $html, qr/select name="foo_year"/ );
+like( $html, qr/select name="foo_1_day"/ );
+like( $html, qr/select name="foo_1_month"/ );
+like( $html, qr/select name="foo_1_year"/ );
Index: lib/HTML/FormFu/Model/DBIC.pm
===================================================================
--- lib/HTML/FormFu/Model/DBIC.pm	(revision 868)
+++ lib/HTML/FormFu/Model/DBIC.pm	(working copy)
@@ -27,10 +27,7 @@
 
         # use first text column
         ($label_col)
-            = grep {
-                my $data_type = $source->column_info($_)->{data_type};
-                defined $data_type && $data_type =~ /text|varchar/i
-            }
+            = grep { $source->column_info($_)->{data_type} =~ /text|varchar/i }
             $source->columns;
     }
     $label_col = $id_col if !defined $label_col;
@@ -177,12 +174,14 @@
         if ( $block->is_repeatable && $block->increment_field_names ) {
 
             # check there's a field name matching the PK
-            my ($pk) = $dbic->$rel->result_source->primary_columns;
-            next
-                unless grep {
-                $pk eq
-                    ( defined $_->original_name ? $_->original_name : $_->name )
-                } @{ $block->get_fields( { type => 'Hidden' } ) };
+		    my @pks = $dbic->$rel->result_source->primary_columns;
+            my $has_all_pks = 1;
+    		foreach my $pk (@pks) {
+	    		$has_all_pks = 0
+    	    		unless grep { $pk eq ( defined $_->original_name ? $_->original_name : $_->name ) }
+        			@{ $block->get_fields };
+    		}
+            next unless $has_all_pks;
 
             my @rows = $dbic->$rel->all;
             my $count
@@ -215,7 +214,7 @@
                     @{ $last_rep->get_fields };
 
                 if ( defined $del_field ) {
-                    $last_rep->remove_element($del_field);
+                    $del_field->parent->remove_element($del_field);
                 }
             }
         }
@@ -334,11 +333,13 @@
 
     # check there's a field name matching the PK
 
-    my ($pk) = $rs->related_source($rel)->primary_columns;
+    my @pks = $rs->related_source($rel)->primary_columns;
 
-    return
-        unless grep { $_->original_name eq $pk }
-            @{ $block->get_fields( { type => 'Hidden' } ) };
+    foreach my $pk (@pks) {
+	    return
+    	    unless grep { defined $_->original_name && $_->original_name eq $pk }
+        	@{ $block->get_fields };
+    }
 
     my @blocks = @{ $block->get_elements };
     my $max    = $#blocks;
@@ -349,18 +350,22 @@
     for my $i ( 0 .. $max ) {
         my $rep = $blocks[$i];
 
-        # find PK field
+        # find PK fields
+        my @pk_fields = ();
+        foreach my $pk (@pks) {
+	        push @pk_fields, grep { defined $_->original_name && $_->original_name eq $pk }
+                                 @{ $rep->get_fields };        	
+        }
+        next unless scalar(@pk_fields) == scalar(@pks);
 
-        my ($pk_field)
-            = grep { $_->original_name eq $pk }
-            @{ $rep->get_fields( { type => 'Hidden' } ) };
+        my %pk_values = ();
+        foreach my $pk_field (@pk_fields) {
+        	$pk_values{$pk_field->original_name} = $form->param_value( $pk_field->nested_name );
+        } 
 
-        next if !defined $pk_field;
-
-        my $value = $form->param_value( $pk_field->nested_name );
         my $row;
 
-        if (   ( !defined $value || $value eq '' )
+        if ( scalar( grep { !defined $_ || $_ eq ''} %pk_values) > 0
             && $i == $max
             && $block->model_config->{DBIC}{new_empty_row} )
         {
@@ -370,11 +375,11 @@
 
             next if !defined $row;
         }
-        elsif ( !defined $value || $value eq '' ) {
+	    elsif (scalar( grep { !defined $_ || $_ eq ''} %pk_values) > 0) {
             next;
         }
         else {
-            $row = $dbic->find_related( $rel, $value );
+            $row = $dbic->find_related( $rel, \%pk_values );
         }
         next if !defined $row;
 
@@ -438,6 +443,8 @@
     my ( $base, $dbic, $form, $attrs, $checkbox, $rels, $cols ) = @_;
 
     my @valid = $form->valid;
+    
+    my @pks = $dbic->primary_columns;    
 
     for my $col (@$cols) {
 
@@ -494,6 +501,9 @@
             # comparing to '' does not work for inflated objects
             && !ref $value 
             && $value eq ''
+            
+            # Shouldn't set primary key columns to undefined.
+            && ! grep { $col eq $_ } @pks            
             )
         {
             $value = undef;
@@ -505,6 +515,11 @@
         {
             $value = $col_info->{default_value};
         }
+        elsif ( (!defined $value || $value eq '') && grep { $col eq $_ } @pks) {
+        	# keep old part of primary key
+        	next;
+        }
+        
         elsif ( defined $value
             || ( defined $nested_name && $checkbox->{$nested_name} ) )
         {
