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