Create fields are fixed again. Also fixed: ChooseMany when tryingto remove the last...
groditi [Sat, 26 Jan 2008 03:12:26 +0000 (03:12 +0000)]
12 files changed:
lib/Reaction/InterfaceModel/Reflector/DBIC.pm
lib/Reaction/UI/ViewPort/Field/Array.pm
lib/Reaction/UI/ViewPort/Field/Boolean.pm
lib/Reaction/UI/ViewPort/Field/ChooseMany.pm
lib/Reaction/UI/ViewPort/Field/ChooseOne.pm
lib/Reaction/UI/ViewPort/Field/Collection.pm
lib/Reaction/UI/ViewPort/Field/DateTime.pm
lib/Reaction/UI/ViewPort/Field/HiddenArray.pm
lib/Reaction/UI/ViewPort/Field/Mutable/ChooseMany.pm
lib/Reaction/UI/ViewPort/Field/RelatedObject.pm
lib/Reaction/UI/ViewPort/Field/Role/Mutable.pm
lib/Reaction/UI/Widget/Field/Mutable/ChooseMany.pm

index 1c1feeb..1acc967 100644 (file)
@@ -809,8 +809,8 @@ class DBIC, which {
 
     if ($attr_opts{required}) {
       $attr_opts{lazy} = 1;
-      $attr_opts{default} = $from_attr->has_default ? $from_attr->default :
-        sub{confess("${attr_name} must be provided before calling reader")};
+      $attr_opts{default} = $from_attr->has_default ?
+        $from_attr->default : sub{};
     }
 
     #test for relationships
index 1b7c7d8..92a735e 100644 (file)
@@ -14,12 +14,12 @@ class Array is Field, which {
 
   implements _build_value_names => as {
     my $self = shift;
-    my @all = @{ $self->value || []};
     my $meth = $self->value_map_method;
-    my @names = map { blessed($_) ? $_->$meth : $_ } @all;
+    my @names = map { blessed($_) ? $_->$meth : $_ } @{ $self->value };
     return [ sort @names ];
   };
 
+  implements _empty_value => as { [] };
 };
 
 1;
index a9f4ba5..329ebde 100644 (file)
@@ -5,6 +5,8 @@ use aliased 'Reaction::UI::ViewPort::Field';
 
 class Boolean, is Field, which {
   has '+value' => (isa => 'Bool');
+
+  implements _empty_value => as { undef };
 };
 
 1;
index a391144..8074fd8 100644 (file)
@@ -35,9 +35,7 @@ class ChooseMany is 'Reaction::UI::ViewPort::Field::ChooseOne', which {
     }
   };
 
-  override _build_value => sub {
-    return super() || [];
-  };
+  implements _empty_value => as { [] };
 
   implements is_current_value => as {
     my ($self, $check_value) = @_;
index a44314e..cb34b92 100644 (file)
@@ -34,6 +34,8 @@ class ChooseOne is 'Reaction::UI::ViewPort::Field', which {
     }
   };
 
+  implements _empty_value => as { undef };
+
   implements _build_valid_values => as {
     my $self = shift;
     return [ $self->attribute->all_valid_values($self->action) ];
index ae5b9b0..bca05f0 100644 (file)
@@ -8,7 +8,8 @@ class Collection is Array, which {
 
   #XXX
   override _build_value => sub {
-    return [super()->members];
+    my $collection = super();
+    return blessed($collection) ? [$collection->members] : $collection;
   };
 
 };
index 5d3916c..51232cf 100644 (file)
@@ -1,5 +1,6 @@
 package Reaction::UI::ViewPort::Field::DateTime;
 
+use Scalar::Util 'blessed';
 use Reaction::Class;
 use Reaction::Types::DateTime;
 use aliased 'Reaction::UI::ViewPort::Field';
@@ -18,13 +19,14 @@ class DateTime is Field, which {
     #<mst> it's because if value's calculated
     #<mst> it needs to be possible to clear it
     #<mst> eval { $self->value } ... is probably the best solution atm
-    my $value = eval { $self->value };
-    return '' unless $self->has_value;
+    my $value = $self->value;
+    return '' unless blessed $value;
     my $format = $self->value_string_default_format;
-    return $value->strftime($format) if $value;
-    return '';
+    return $value->strftime($format);
   };
 
+  implements _empty_value => as { undef };
+
 };
 
 1;
index 7f8cc73..13ad420 100644 (file)
@@ -5,11 +5,12 @@ use Reaction::Class;
 class HiddenArray is 'Reaction::UI::ViewPort::Field', which {
 
   has '+value' => (isa => 'ArrayRef');
-  
+
   around value => sub {
     my $orig = shift;
     my $self = shift;
     if (@_) {
+      #this hsould be done with coercions
       $orig->($self, (ref $_[0] eq 'ARRAY' ? $_[0] : [ $_[0] ]));
       $self->sync_to_action;
     } else {
@@ -17,9 +18,10 @@ class HiddenArray is 'Reaction::UI::ViewPort::Field', which {
     }
   };
 
+  implements _empty_value => as { [] };
 };
 
-1;  
+1;
 
 =head1 NAME
 
index 62cfe1a..8108633 100644 (file)
@@ -3,7 +3,7 @@ package Reaction::UI::ViewPort::Field::Mutable::ChooseMany;
 use Reaction::Class;
 
 my $listify = sub{
-  return [] unless defined $_[0];
+  return [] unless defined($_[0]);
   return ref $_[0] eq 'ARRAY' ? $_[0] : [$_[0]];
 };
 
@@ -60,6 +60,7 @@ class ChooseMany is 'Reaction::UI::ViewPort::Field', which {
   around handle_events => sub {
     my $orig = shift;
     my ($self, $events) = @_;
+    $events->{value} = [] if $events->{no_current_value};
     my $ev_value = $listify->($events->{value});
     if (delete $events->{add_all_values}) {
       $events->{value} = [map {$self->obj_to_str($_)} @{$self->valid_values}];
@@ -73,6 +74,7 @@ class ChooseMany is 'Reaction::UI::ViewPort::Field', which {
       my %r = map { ($_ => 1) } @$remove;
       $events->{value} = [ grep { !$r{$_} } @{$ev_value} ];
     }
+
     return $orig->(@_);
   };
 
index 83e0df5..23d715d 100644 (file)
@@ -16,6 +16,8 @@ class RelatedObject is 'Reaction::UI::ViewPort::Field', which {
     return blessed($value) ? $value->$meth : $value;
   };
 
+  implements _empty_value => as { undef };
+
 };
 
 1;
index dfad5bb..8690603 100644 (file)
@@ -22,19 +22,20 @@ role Mutable, which {
     my ($self) = @_;
     return unless $self->needs_sync && $self->has_value;
     my $attr = $self->attribute;
+    my $writer = $attr->get_write_method;
+    confess "No writer for attribute" unless defined($writer);
+
+    my $value = $self->value;
     if (my $tc = $attr->type_constraint) {
-      my $value = $self->value;
       $value = $tc->coercion->coerce($value) if ($tc->has_coercion);
-      my $error = $tc->validate($self->value); # should we be checking against $value?
+      #my $error = $tc->validate($self->value); # should we be checking against $value?
+      my $error = $tc->validate($value);
       if (defined $error) {
         $self->message($error);
         return;
       }
     }
-    my $writer = $attr->get_write_method;
-    confess "No writer for attribute" unless defined($writer);
-    my $value = $self->value;
-    $self->model->$writer($self->value); #should we be passing $value ?
+    $self->model->$writer($value);
     $self->needs_sync(0);
   };
 
index 697e672..2f938d6 100644 (file)
@@ -13,7 +13,14 @@ class ChooseMany is 'Reaction::UI::Widget::Field::Mutable', which {
   };
 
   implements fragment current_values {
-    render hidden_value => over $_{viewport}->current_value_choices;
+    my $current_choices = $_{viewport}->current_value_choices;
+    if( @$current_choices ){
+      render hidden_value => over $current_choices;
+    } else {
+      arg field_name => event_id 'no_current_value';
+      arg '_' => {value => 1};
+      render 'hidden_value';
+    }
   };
 
   implements fragment selected_values {