aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authoredenc <edenc@03d0b0b2-0e1a-0410-a411-fdb2f4bd65d7>2008-02-04 12:01:32 +0000
committeredenc <edenc@03d0b0b2-0e1a-0410-a411-fdb2f4bd65d7>2008-02-04 12:01:32 +0000
commit4ed8c1eb4cb0dde3b509ecdad5321d417f537ac6 (patch)
treedf6b4065e3d7466a5746f9d3d1317b69e040dadc
parent5332f07e273fb713585aaa49c16a68f621c8e078 (diff)
downloadreaction-4ed8c1eb4cb0dde3b509ecdad5321d417f537ac6.tar.gz
reaction-4ed8c1eb4cb0dde3b509ecdad5321d417f537ac6.zip
added Field::File and Widget::Image
-rw-r--r--lib/Reaction/Types/File.pm9
-rw-r--r--lib/Reaction/UI/ViewPort/Field/File.pm45
-rw-r--r--lib/Reaction/UI/ViewPort/Object.pm6
-rw-r--r--lib/Reaction/UI/Widget/Value/Image.pm18
-rw-r--r--share/skin/default/layout/value/image.tt11
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