diff options
author | edenc <edenc@03d0b0b2-0e1a-0410-a411-fdb2f4bd65d7> | 2008-02-04 12:01:32 +0000 |
---|---|---|
committer | edenc <edenc@03d0b0b2-0e1a-0410-a411-fdb2f4bd65d7> | 2008-02-04 12:01:32 +0000 |
commit | 4ed8c1eb4cb0dde3b509ecdad5321d417f537ac6 (patch) | |
tree | df6b4065e3d7466a5746f9d3d1317b69e040dadc | |
parent | 5332f07e273fb713585aaa49c16a68f621c8e078 (diff) | |
download | reaction-4ed8c1eb4cb0dde3b509ecdad5321d417f537ac6.tar.gz reaction-4ed8c1eb4cb0dde3b509ecdad5321d417f537ac6.zip |
added Field::File and Widget::Image
-rw-r--r-- | lib/Reaction/Types/File.pm | 9 | ||||
-rw-r--r-- | lib/Reaction/UI/ViewPort/Field/File.pm | 45 | ||||
-rw-r--r-- | lib/Reaction/UI/ViewPort/Object.pm | 6 | ||||
-rw-r--r-- | lib/Reaction/UI/Widget/Value/Image.pm | 18 | ||||
-rw-r--r-- | share/skin/default/layout/value/image.tt | 11 |
5 files changed, 55 insertions, 34 deletions
diff --git a/lib/Reaction/Types/File.pm b/lib/Reaction/Types/File.pm index a3b762b..d12408c 100644 --- a/lib/Reaction/Types/File.pm +++ b/lib/Reaction/Types/File.pm @@ -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 diff --git a/lib/Reaction/UI/ViewPort/Field/File.pm b/lib/Reaction/UI/ViewPort/Field/File.pm index b3af0bc..d55091c 100644 --- a/lib/Reaction/UI/ViewPort/Field/File.pm +++ b/lib/Reaction/UI/ViewPort/Field/File.pm @@ -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 diff --git a/lib/Reaction/UI/ViewPort/Object.pm b/lib/Reaction/UI/ViewPort/Object.pm index aa372d2..9f196ad 100644 --- a/lib/Reaction/UI/ViewPort/Object.pm +++ b/lib/Reaction/UI/ViewPort/Object.pm @@ -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 index 0000000..d9495b4 --- /dev/null +++ b/lib/Reaction/UI/Widget/Value/Image.pm @@ -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 index 0000000..5ebea74 --- /dev/null +++ b/share/skin/default/layout/value/image.tt @@ -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 |