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