leetle bug fix
[catagits/Reaction.git] / lib / Reaction / UI / ViewPort / Collection / Grid.pm
1 package Reaction::UI::ViewPort::Collection::Grid;
2
3 use Reaction::Class;
4
5 use aliased 'Reaction::InterfaceModel::Collection' => 'IM_Collection';
6 use aliased 'Reaction::UI::ViewPort::Collection::Grid::Member';
7
8 class Grid is 'Reaction::UI::ViewPort::Collection', which {
9
10   has field_order     => ( is => 'ro', isa => 'ArrayRef', lazy_build => 1);
11   has excluded_fields => ( is => 'ro', isa => 'ArrayRef', lazy_build => 1);
12   has field_labels    => ( is => 'ro', isa => 'HashRef',  lazy_build => 1);
13
14   has computed_field_order => (is => 'ro', isa => 'ArrayRef', lazy_build => 1);
15
16   ####################################
17   implements _build_member_class => as { Member };
18
19   implements _build_field_labels => as {
20     my $self = shift;
21     my %labels;
22     for my $field ( @{$self->computed_field_order}){
23       $labels{$field} = join(' ', map{ ucfirst } split('_', $field));
24     }
25     return \%labels;
26   };
27
28   implements _build_field_order     => as { []; };
29   implements _build_excluded_fields => as { []; };
30
31   implements _build_computed_field_order => as {
32     my ($self) = @_;
33     confess("current_collection lacks a value for 'member_type' attribute")
34       unless $self->current_collection->has_member_type;
35     my %excluded = map { $_ => undef } @{ $self->excluded_fields };
36     #treat _$field_name as private and exclude fields with no reader
37     my @names = grep { $_ !~ /^_/ && !exists($excluded{$_})} map { $_->name }
38       grep {
39         !($_->has_type_constraint &&
40           ($_->type_constraint->is_a_type_of('ArrayRef') ||
41            eval {$_->type_constraint->name->isa('Reaction::InterfaceModel::Collection')} ||
42            eval { $_->_isa_metadata->isa('Reaction::InterfaceModel::Collection') }
43           )
44          )  }
45         grep { defined $_->get_read_method }
46           $self->current_collection->member_type->meta->parameter_attributes;
47
48     return $self->sort_by_spec($self->field_order, \@names);
49   };
50
51   before _build_members => sub {
52     my ($self) = @_;
53     $self->member_args->{computed_field_order} ||= $self->computed_field_order;
54   };
55
56 };
57
58 1;
59
60 __END__;
61
62 =head1 NAME
63
64 Reaction::UI::ViewPort::Collection
65
66 =head1 DESCRIPTION
67
68 This subclass of L<Reaction::UI::ViewPort::Collection> allows you to display a
69 homogenous collection of Reaction::InterfaceModel::Objects as a grid.
70
71 =head1 ATTRIBUTES
72
73 =head2 field_order
74
75 =head2 excluded_fields
76
77 =head2 field_labels
78
79 =head2 computed_field_order
80
81 =head1
82
83 =head1 INTERNAL METHODS
84
85 These methods, although stable, are subject to change without notice. These are meant
86 to be used only by developers. End users should refrain from using these methods to
87 avoid potential breakages.
88
89 =head1 SEE ALSO
90
91 L<Reaction::UI::ViewPort::Collection>
92
93 =head1 AUTHORS
94
95 See L<Reaction::Class> for authors.
96
97 =head1 LICENSE
98
99 See L<Reaction::Class> for the license.
100
101 =cut