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