package ComponentUI::Controller::TestModel::Foo; use base 'Reaction::UI::Controller::Collection::CRUD'; use Reaction::Class; use aliased 'Reaction::UI::ViewPort::SearchableListViewContainer'; use aliased 'ComponentUI::TestModel::Foo::SearchSpec'; use aliased 'ComponentUI::TestModel::Foo::Action::SearchSpec::Update'; __PACKAGE__->config( model_name => 'TestModel', collection_name => 'Foo', action => { base => { Chained => '/base', PathPart => 'testmodel/foo' }, list => { ViewPort => { action_prototypes => { delete_all => 'Delete all records' }, excluded_fields => [qw/id/], action_order => [qw/delete_all create/], enable_order_by => [qw/last_name/], Member => { action_order => [qw/view update delete/], }, }, }, view => { ViewPort => { excluded_fields => [qw/id/], }, }, delete => { ViewPort => {message => 'Are you sure you want to delete this Foo?'} }, }, ); for my $action (qw/view create update/){ __PACKAGE__->config( action => { $action => { ViewPort => { container_layouts => [ { name => 'primary', fields => [qw/first_name last_name/]}, { name => 'secondary', label => 'Optional Label', fields => [qw/bars bazes/], }, ], }, }, } ); } override _build_action_viewport_map => sub { my $map = super(); $map->{list} = SearchableListViewContainer; return $map; }; override _build_action_viewport_args => sub { my $args = super(); $args->{list}{spec_class} = SearchSpec; $args->{list}{action_class} = Update; return $args; }; 1; __END__;