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