choosemany is still broken (not applying changes) but everything else is looking...
groditi [Wed, 2 Jan 2008 22:57:32 +0000 (22:57 +0000)]
14 files changed:
lib/Reaction/UI/View.pm
lib/Reaction/UI/ViewPort.pm
lib/Reaction/UI/ViewPort/Action.pm
lib/Reaction/UI/ViewPort/Field/Mutable/ChooseMany.pm
lib/Reaction/UI/ViewPort/Field/Mutable/DateTime.pm
lib/Reaction/UI/ViewPort/Field/Role/Choices.pm
lib/Reaction/UI/ViewPort/Field/Role/Mutable.pm
lib/Reaction/UI/ViewPort/Object.pm
lib/Reaction/UI/Widget/Field.pm
lib/Reaction/UI/Widget/Field/Integer.pm [new file with mode: 0644]
lib/Reaction/UI/Widget/Field/Mutable.pm
lib/Reaction/UI/Widget/Field/Mutable/Integer.pm [new file with mode: 0644]
share/skin/default/layout/field/mutable/choose_many.tt
share/skin/default/layout/field/mutable/integer.tt [new file with mode: 0644]

index daf1bbc..5fb9056 100644 (file)
@@ -89,7 +89,8 @@ class View which {
       #warn "Loaded ${class}" unless $@;
       $@ ? next : return $cache->{ $lset_name } = $class;
     }
-    confess "Couldn't load widget '$tail': tried: @haystack";
+    confess "Couldn't load widget '$tail' for layout '$lset_name': tried: " .
+      join(", ", @haystack);
   };
 
   implements 'layout_set_for' => as {
index 8cc6917..d7c1980 100644 (file)
@@ -1,6 +1,7 @@
 package Reaction::UI::ViewPort;
 
 use Reaction::Class;
+use Scalar::Util qw/blessed/;
 
 class ViewPort which {
 
@@ -15,7 +16,6 @@ class ViewPort which {
     isa => 'HashRef', is => 'ro', default => sub { {} }
   );
   has ctx => (isa => 'Catalyst', is => 'ro', required => 1);
-  has column_order => (is => 'rw');
 
   implements _build_layout => as {
     '';
@@ -60,6 +60,8 @@ class ViewPort which {
   implements apply_child_events => as {
     my ($self, $ctx, $events) = @_;
     foreach my $child ($self->child_event_sinks) {
+      confess blessed($child) ."($child) is not a valid object"
+        unless blessed($child) && $child->can('apply_events');
       $child->apply_events($ctx, $events);
     }
   };
index 9da7191..c382bdb 100644 (file)
@@ -37,13 +37,13 @@ class Action is 'Reaction::UI::ViewPort::Object', which {
   };
 
   implements _build_ok_label           => as{ 'ok'     };
-  implements _build_apply_label_       => as{ 'apply'  };
+  implements _build_apply_label        => as{ 'apply'  };
   implements _build_close_label_close  => as{ 'close'  };
   implements _build_close_label_cancel => as{ 'cancel' };
 
   implements can_apply => as {
     my ($self) = @_;
-    foreach my $field ( @{ $self->ordered_fields } ) {
+    foreach my $field ( @{ $self->fields } ) {
       return 0 if $field->needs_sync;
       # if e.g. a datetime field has an invalid value that can't be re-assembled
       # into a datetime object, the action may be in a consistent state but
@@ -96,11 +96,11 @@ class Action is 'Reaction::UI::ViewPort::Object', which {
 
   implements sync_action_from_fields => as {
     my ($self) = @_;
-    foreach my $field ($self->fields) {
+    foreach my $field (@{$self->fields}) {
       $field->sync_to_action; # get the field to populate the $action if possible
     }
-    $self->action->sync_all;
-    foreach my $field ($self->fields) {
+    $self->model->sync_all;
+    foreach my $field (@{$self->fields}) {
       $field->sync_from_action; # get errors from $action if applicable
     }
   };
index f60d433..17cdf53 100644 (file)
@@ -14,13 +14,14 @@ class ChooseMany is 'Reaction::UI::ViewPort::Field', which {
   does 'Reaction::UI::ViewPort::Field::Role::Mutable';
   does 'Reaction::UI::ViewPort::Field::Role::Choices';
 
+
   around value => sub {
     my $orig = shift;
     my $self = shift;
     return $orig->($self) unless @_;
     my $value = $listify->(shift);
     $_ = $self->str_to_ident($_) for @$value;
-    my $checked = $self->attribute->check_valid_value($self->action, $value);
+    my $checked = $self->attribute->check_valid_value($self->model, $value);
     # i.e. fail if any of the values fail
     confess "Not a valid set of values"
       if (@$checked < @$value || grep { !defined($_) } @$checked);
@@ -32,6 +33,10 @@ class ChooseMany is 'Reaction::UI::ViewPort::Field', which {
     return super() || [];
   };
 
+  implements _build_value_string => as {
+    join ", ", @{ shift->current_value_choices }
+  };
+
   implements is_current_value => as {
     my ($self, $check_value) = @_;
     my @our_values = @{$self->value||[]};
index 4950aa1..71428e5 100644 (file)
@@ -4,7 +4,8 @@ use Reaction::Class;
 use Time::ParseDate;
 use DateTime;
 
-class 'Reaction::UI::ViewPort::Field::Mutable::DateTime', is 'Reaction::UI::ViewPort::Field::DateTime', which {
+class 'Reaction::UI::ViewPort::Field::Mutable::DateTime',
+  is 'Reaction::UI::ViewPort::Field::DateTime', which {
 
   does 'Reaction::UI::ViewPort::Field::Role::Mutable';
 
index 326dc54..09874a5 100644 (file)
@@ -39,7 +39,7 @@ role Choices, which {
 
   implements _build_valid_values => as {
     my $self = shift;
-    return [ $self->attribute->all_valid_values($self->action) ];
+    return [ $self->attribute->all_valid_values($self->model) ];
   };
 
   implements _build_value_choices => sub{
index db6c4f3..66a46cf 100644 (file)
@@ -33,14 +33,14 @@ role Mutable, which {
     }
     my $writer = $attr->get_write_method;
     confess "No writer for attribute" unless defined($writer);
-    $self->action->$writer($self->value); #should we be passing $value ?
+    $self->model->$writer($self->value); #should we be passing $value ?
     $self->needs_sync(0);
   };
 
   implements sync_from_action => as {
     my ($self) = @_;
     return unless !$self->needs_sync; # && $self->has_attribute;
-    $self->message($self->action->error_for($self->attribute) || '');
+    $self->message($self->model->error_for($self->attribute) || '');
   };
 
   around accept_events => sub { ('value', shift->(@_)) };
index 326394f..9730b5f 100644 (file)
@@ -61,7 +61,7 @@ class Object is 'Reaction::UI::ViewPort', which {
   };
 
   override child_event_sinks => sub {
-    return ( shift->fields, super());
+    return ( @{shift->fields}, super());
   };
 
   #candidate for shared role!
index 4d91afa..fbfe1eb 100644 (file)
@@ -12,7 +12,7 @@ class Field, which {
     }
   };
 
-  implements fragment label_fragment {
+  implements fragment label_layout {
     if (my $label = $_{viewport}->label) {
       arg label => $label;
       render 'label';
diff --git a/lib/Reaction/UI/Widget/Field/Integer.pm b/lib/Reaction/UI/Widget/Field/Integer.pm
new file mode 100644 (file)
index 0000000..5b5e724
--- /dev/null
@@ -0,0 +1,29 @@
+package Reaction::UI::Widget::Field::Integer;
+
+use Reaction::UI::WidgetClass;
+
+class Integer is 'Reaction::UI::Widget::Field', which {
+
+};
+
+1;
+
+__END__;
+
+=head1 NAME
+
+Reaction::UI::Widget::DisplayField::Integer
+
+=head1 DESCRIPTION
+
+See L<Reaction::UI::Widget::Field>
+
+=head1 AUTHORS
+
+See L<Reaction::Class> for authors.
+
+=head1 LICENSE
+
+See L<Reaction::Class> for the license.
+
+=cut
index 2ff669a..5d658dc 100644 (file)
@@ -2,7 +2,7 @@ package Reaction::UI::Widget::Field::Mutable;
 
 use Reaction::UI::WidgetClass;
 
-class Field is 'Reaction::UI::Widget::Field', which {
+class Mutable is 'Reaction::UI::Widget::Field', which {
 
    before fragment widget {
      arg 'field_id' => event_id 'value';
diff --git a/lib/Reaction/UI/Widget/Field/Mutable/Integer.pm b/lib/Reaction/UI/Widget/Field/Mutable/Integer.pm
new file mode 100644 (file)
index 0000000..677082d
--- /dev/null
@@ -0,0 +1,30 @@
+package Reaction::UI::Widget::Field::Mutable::Integer;
+
+use Reaction::UI::WidgetClass;
+
+class Integer is 'Reaction::UI::Widget::Field::Mutable', which {
+
+};
+
+1;
+
+__END__;
+
+=head1 NAME
+
+Reaction::UI::Widget::Field::Integer
+
+=head1 DESCRIPTION
+
+See L<Reaction::UI::Widget::Field>
+See L<Reaction::UI::Widget::Field::Mutable>
+
+=head1 AUTHORS
+
+See L<Reaction::Class> for authors.
+
+=head1 LICENSE
+
+See L<Reaction::Class> for the license.
+
+=cut
index ef0b937..ed6c136 100644 (file)
 =for layout available_values
 
 <select size="10" multiple="multiple"  name="[% event_id_add_values %]">
-  [% call_next %]
+ [% call_next %]
 </select>
 
 =for layout selected_values
 
 <select size="10" multiple="multiple"  name="[% event_id_remove_values %]">
-  [% call_next %]
+ [% call_next %]
 </select>
 
 =for layout hidden_value
diff --git a/share/skin/default/layout/field/mutable/integer.tt b/share/skin/default/layout/field/mutable/integer.tt
new file mode 100644 (file)
index 0000000..05a69a5
--- /dev/null
@@ -0,0 +1,3 @@
+=extends field/mutable
+
+=cut