added Field::File and Widget::Image
edenc [Mon, 4 Feb 2008 12:01:32 +0000 (12:01 +0000)]
lib/Reaction/Types/File.pm
lib/Reaction/UI/ViewPort/Field/File.pm
lib/Reaction/UI/ViewPort/Object.pm
lib/Reaction/UI/Widget/Value/Image.pm [new file with mode: 0644]
share/skin/default/layout/value/image.tt [new file with mode: 0644]

index a3b762b..d12408c 100644 (file)
@@ -8,9 +8,18 @@ use Catalyst::Request::Upload;
 
 subtype File
   => as Object
+  => where { $_->isa('Path::Class::File') }
+  => message { "Must be a file" };
+
+subtype Upload
+  => as Object
   => where { $_->isa('Catalyst::Request::Upload') }
   => message { "Must be a file" };
 
+coerce File
+  => from Upload
+    => via { Path::Class::File->new($_->tempname) };
+    
 1;
 
 =head1 NAME
index b3af0bc..d55091c 100644 (file)
@@ -1,47 +1,24 @@
 package Reaction::UI::ViewPort::Field::File;
 
 use Reaction::Class;
-use Reaction::Types::File;
 
 class File is 'Reaction::UI::ViewPort::Field', which {
 
-  has '+value' => (isa => 'File', required => 0);
+  has uri    => ( is => 'rw', lazy_build => 1);
 
-  #has '+layout' => (default => 'file');
+  has action => (isa => 'CodeRef', is => 'rw', required   => 1);
 
-  override value_string => sub { '' };
-
-  override apply_our_events => sub {
-    my ($self, $ctx, $events) = @_;
-    my $value_key = join(':', $self->location, 'value');
-    if (my $upload = $ctx->req->upload($value_key)) {
-      local $events->{$value_key} = $upload;
-      return super();
-    } else {
-      return super();
-    }
+  implements _build_uri => as{
+    my $self = shift;
+    my $c = $self->ctx;
+    my ($c_name, $a_name, @rest) = @{ $self->action->($self->model, $c) };
+    $c->uri_for($c->controller($c_name)->action_for($a_name),@rest);
   };
 
+  implements _value_string_from_value => as {
+      shift->value->stringify;
+  };
+    
 };
 
 1;
-
-=head1 NAME
-
-Reaction::UI::ViewPort::Field::File
-
-=head1 DESCRIPTION
-
-=head1 SEE ALSO
-
-=head2 L<Reaction::UI::ViewPort::Field>
-
-=head1 AUTHORS
-
-See L<Reaction::Class> for authors.
-
-=head1 LICENSE
-
-See L<Reaction::Class> for the license.
-
-=cut
index aa372d2..9f196ad 100644 (file)
@@ -11,6 +11,7 @@ use aliased 'Reaction::UI::ViewPort::Field::DateTime';
 use aliased 'Reaction::UI::ViewPort::Field::RelatedObject';
 use aliased 'Reaction::UI::ViewPort::Field::Array';
 use aliased 'Reaction::UI::ViewPort::Field::Collection';
+use aliased 'Reaction::UI::ViewPort::Field::File';
 
 use aliased 'Reaction::InterfaceModel::Object' => 'IM_Object';
 
@@ -172,6 +173,11 @@ class Object is 'Reaction::UI::ViewPort', which {
     $self->_build_simple_field(attribute => $attr, class => Array, %$args);
   };
 
+  implements _build_fields_for_type_File => as {
+    my ($self, $attr, $args) = @_;
+    $self->_build_simple_field(attribute => $attr, class => File, %$args);
+  };
+
   implements _build_fields_for_type_Reaction_InterfaceModel_Object => as {
     my ($self, $attr, $args) = @_;
     #XXX
diff --git a/lib/Reaction/UI/Widget/Value/Image.pm b/lib/Reaction/UI/Widget/Value/Image.pm
new file mode 100644 (file)
index 0000000..d9495b4
--- /dev/null
@@ -0,0 +1,18 @@
+package Reaction::UI::Widget::Value::Image;
+
+use Reaction::UI::WidgetClass;
+
+class Image, which {
+
+  implements fragment image {
+    if($_{viewport}->value_string) {
+      arg uri => $_{viewport}->uri;
+      render 'has_image';
+    } else {
+      render 'no_image';
+    }
+  };
+
+};
+
+1;
diff --git a/share/skin/default/layout/value/image.tt b/share/skin/default/layout/value/image.tt
new file mode 100644 (file)
index 0000000..5ebea74
--- /dev/null
@@ -0,0 +1,11 @@
+=for layout widget
+
+[% image %]
+
+=for layout has_image
+
+<img src="[% uri %]">
+
+=for layout no_image
+
+=cut
\ No newline at end of file