1 package Reaction::UI::Widget::ListView;
3 use Reaction::UI::WidgetClass;
5 use namespace::clean -except => [ qw(meta) ];
6 extends 'Reaction::UI::Widget::Collection::Grid';
8 after fragment widget {
9 arg pager_obj => $_{viewport}->pager;
12 implements fragment pager_fragment {
13 my $pager = $_{pager_obj};
14 if( $pager->last_page > $pager->first_page ) {
19 implements fragment actions {
20 render action => over $_{viewport}->actions;
23 implements fragment action {
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';
35 render 'header_cell_contents';
39 implements fragment page_list {
40 render numbered_page_fragment
41 => over [ $_{pager_obj}->first_page .. $_{pager_obj}->last_page ];
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';
50 render 'numbered_page';
54 implements fragment first_page {
55 arg page_uri => event_uri { page => $_{pager_obj}->first_page };
56 arg page_name => 'First';
60 implements fragment last_page {
61 arg page_uri => event_uri { page => $_{pager_obj}->last_page };
62 arg page_name => localized 'Last';
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 };
72 render 'named_page_no_page';
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 };
82 render 'named_page_no_page';
86 __PACKAGE__->meta->make_immutable;
95 Reaction::UI::Widget::ListView - Extends Grid to a full list interface
99 This class is a subclass of L<Reaction::UI::ViewPort::Collection::Grid>. It additionally
100 provides means of paging and actions.
106 Additional arguments available:
110 =item B<pager_obj> - The C<pager> object of the viewport
116 Render the C<action> fragment for every action in the viewport.
120 Renders the C<action> viewport passed
124 Adds a modifier to render the actions column after the data columns
128 Modify the header_cell fragment to add support for ordering
130 Additional arguments available:
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.
139 =head2 header_action_cell
141 Additional arguments available:
145 =item B<col_count> - Column width to span
151 Will sequentially render a C<numbered_page_fragment> for every page available in
154 =head2 numbered_page_fragment
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>
160 Additional arguments available:
164 =item B<page_uri> - The URI to the page
166 =item B<page_number> - The number of the page
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>
183 Additional arguments available:
187 =item B<page_uri> - The URI to the page
189 =item B<page_number> - The label of the page (First / Last / Next / Previous)
196 See L<Reaction::Class> for authors.
200 See L<Reaction::Class> for the license.