r23441@martha (orig r923): groditi | 2008-10-23 22:00:04 -0400
[catagits/Reaction.git] / lib / Reaction / UI / Widget / ListView.pm
1 package Reaction::UI::Widget::ListView;
2
3 use Reaction::UI::WidgetClass;
4
5 use namespace::clean -except => [ qw(meta) ];
6 extends 'Reaction::UI::Widget::Collection::Grid';
7
8 after fragment widget {
9   arg pager_obj => $_{viewport}->pager;
10 };
11
12 implements fragment pager_fragment {
13   my $pager = $_{pager_obj};
14   if( $pager->last_page > $pager->first_page ) {
15     render 'pager';
16   }
17 };
18
19 implements fragment actions {
20   render action => over $_{viewport}->actions;
21 };
22
23 implements fragment action {
24   render 'viewport';
25 };
26
27 around fragment header_cell {
28   arg order_uri => event_uri {
29     order_by => $_,
30     order_by_desc => ((($_{viewport}->order_by||'') ne $_
31                       || $_{viewport}->order_by_desc) ? 0 : 1)
32   };
33   call_next;
34 };
35
36 implements fragment page_list {
37   render numbered_page_fragment
38     => over [ $_{pager_obj}->first_page .. $_{pager_obj}->last_page ];
39 };
40
41 implements fragment numbered_page_fragment {
42   arg page_uri => event_uri { page => $_ };
43   arg page_number => $_;
44   if ($_{pager_obj}->current_page == $_) {
45     render 'numbered_page_this_page';
46   } else {
47     render 'numbered_page';
48   }
49 };
50
51 implements fragment first_page {
52   arg page_uri => event_uri { page => $_{pager_obj}->first_page };
53   arg page_name => 'First';
54   render 'named_page';
55 };
56
57 implements fragment last_page {
58   arg page_uri => event_uri { page => $_{pager_obj}->last_page };
59   arg page_name => localized 'Last';
60   render 'named_page';
61 };
62
63 implements fragment next_page {
64   arg page_name => localized 'Next';
65   if (my $page = $_{pager_obj}->next_page) {
66     arg page_uri => event_uri { page => $page };
67     render 'named_page';
68   } else {
69     render 'named_page_no_page';
70   }
71 };
72
73 implements fragment previous_page {
74   arg page_name => localized 'Previous';
75   if (my $page = $_{pager_obj}->previous_page) {
76     arg page_uri => event_uri { page => $page };
77     render 'named_page';
78   } else {
79     render 'named_page_no_page';
80   }
81 };
82
83 __PACKAGE__->meta->make_immutable;
84
85
86 1;
87
88 __END__;
89
90 =head1 NAME
91
92 Reaction::UI::Widget::ListView
93
94 =head1 DESCRIPTION
95
96 This class is a subclass of L<Reaction::UI::ViewPort::Collection::Grid>
97
98 =head1 FRAGMENTS
99
100 =head2 widget
101
102 Additional arguments available:
103
104 =over 4
105
106 =item B<pager_obj> - The C<pager> object of the viewport
107
108 =back
109
110 =head2 actions
111
112 Render the C<action> fragment for every action in the viewport.
113
114 =head2 action
115
116 Renders the C<action> viewport passed
117
118 =head2 header_cells
119
120 Adds a modifier to render the actions column after the data columns
121
122 =head2 header_cell
123
124 Modify the header_cell fragment to add support for ordering
125
126 Additional arguments available:
127
128 =over 4
129
130 =item B<order_uri> - A URI to the collection view which will order the members
131 using this field. Will toggle ascending / descending order.
132
133 =back
134
135 =head2 header_action_cell
136
137 Additional arguments available:
138
139 =over 4
140
141 =item B<col_count> - Column width to span
142
143 =back
144
145 =head2 page_list
146
147 Will sequentially render a C<numbered_page_fragment> for every page available in
148  the pager object
149
150 =head2 numbered_page_fragment
151
152 Renders a link pointing to the different pages in the pager object. If the current
153 page number is equal to the page number for the page being rendered then the
154 template block C<numbered_page_this_page> is called instead of C<numbered_page>
155
156 Additional arguments available:
157
158 =over 4
159
160 =item B<page_uri> - The URI to the page
161
162 =item B<page_number> - The number of the page
163
164 =back
165
166 =head2 first_page
167
168 =head2 last_page
169
170 =head2 next_page
171
172 =head2 previous_page
173
174 Render links to the first, last, next and previous pages, respectively. All four will
175 render as the C<named_page> template fragment, unless the current page is the last
176 and/or first page, in which case the first and last fragments will render as
177 C<named_page_no_page>
178
179 Additional arguments available:
180
181 =over 4
182
183 =item B<page_uri> - The URI to the page
184
185 =item B<page_number> - The label of the page (First / Last / Next / Previous)
186
187 =back
188
189
190 =head1 AUTHORS
191
192 See L<Reaction::Class> for authors.
193
194 =head1 LICENSE
195
196 See L<Reaction::Class> for the license.
197
198 =cut