From 37728bbad6840485e4d0e3a504dfdc851e7378c3 Mon Sep 17 00:00:00 2001 From: groditi Date: Sat, 11 Oct 2008 21:15:47 +0000 Subject: completely new way of handling action prototypes for actions in CRUD that is much saner and less reliant on $ctx. also more flexible and configurable --- lib/Reaction/UI/ViewPort/Role/Actions.pm | 61 ++++++++++++++++++++++++-------- 1 file changed, 46 insertions(+), 15 deletions(-) (limited to 'lib/Reaction/UI/ViewPort/Role/Actions.pm') diff --git a/lib/Reaction/UI/ViewPort/Role/Actions.pm b/lib/Reaction/UI/ViewPort/Role/Actions.pm index 7da0072..a8e6e28 100644 --- a/lib/Reaction/UI/ViewPort/Role/Actions.pm +++ b/lib/Reaction/UI/ViewPort/Role/Actions.pm @@ -1,33 +1,64 @@ package Reaction::UI::ViewPort::Role::Actions; use Reaction::Role; -use Reaction::UI::ViewPort::Action::Link; +use Reaction::UI::ViewPort::URI; use namespace::clean -except => [ qw(meta) ]; +has actions => ( + is => 'ro', + isa => 'ArrayRef', + lazy_build => 1 +); + +has action_order => ( + is => 'ro', + isa => 'ArrayRef' +); + +has action_prototypes => ( + is => 'ro', + isa => 'HashRef', + required => 1, + default => sub{ {} } +); + +has computed_action_order => ( + is => 'ro', + isa => 'ArrayRef', + lazy_build => 1 +); + +sub _build_computed_action_order { + my $self = shift; + my $ordered = $self->sort_by_spec( + ($self->has_action_order ? $self->action_order : []), + [ keys %{ $self->action_prototypes } ] + ); + return $ordered ; +} -has actions => (is => 'ro', isa => 'ArrayRef', lazy_build => 1); -has action_prototypes => (is => 'ro', isa => 'ArrayRef', lazy_build => 1); -sub _build_action_prototypes { [] }; sub _build_actions { my ($self) = @_; my (@act, $i); my $ctx = $self->ctx; my $loc = $self->location; - foreach my $proto (@{ $self->action_prototypes }) { - my $action = Reaction::UI::ViewPort::Action::Link->new - ( - ctx => $ctx, - target => $self->model, - location => join ('-', $loc, 'action', $i++), - %$proto, - ); + my $target = $self->model; + + foreach my $proto_name ( @{ $self->computed_action_order } ) { + my $proto = $self->action_prototypes->{$proto_name}; + my $uri = $proto->{uri} or confess('uri is required in prototype action'); + my $label = exists $proto->{label} ? $proto->{label} : $proto_name; + + my $action = Reaction::UI::ViewPort::URI->new( + location => join ('-', $loc, 'action', $i++), + uri => ( ref($uri) eq 'CODE' ? $uri->($target, $ctx) : $uri ), + display => ( ref($label) eq 'CODE' ? $label->($target, $ctx) : $label ), + ); push(@act, $action); } return \@act; -}; - - +} 1; -- cgit v1.2.3-54-g00ecf