Commit | Line | Data |
7adfd53f |
1 | package Reaction::UI::Widget::ListView; |
2 | |
3 | use Reaction::UI::WidgetClass; |
7adfd53f |
4 | |
bae75bee |
5 | use namespace::clean -except => [ qw(meta) ]; |
6 | extends 'Reaction::UI::Widget::Collection::Grid'; |
7adfd53f |
7 | |
bae75bee |
8 | after fragment widget { |
9 | arg pager_obj => $_{viewport}->pager; |
10 | }; |
b8faba69 |
11 | |
bae75bee |
12 | implements fragment pager_fragment { |
13 | my $pager = $_{pager_obj}; |
14 | if( $pager->last_page > $pager->first_page ) { |
15 | render 'pager'; |
16 | } |
17 | }; |
b8faba69 |
18 | |
bae75bee |
19 | implements fragment actions { |
20 | render action => over $_{viewport}->actions; |
21 | }; |
49170400 |
22 | |
bae75bee |
23 | implements fragment action { |
24 | render 'viewport'; |
25 | }; |
b8faba69 |
26 | |
c1b16a7d |
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 | } |
bae75bee |
37 | }; |
664d660c |
38 | |
bae75bee |
39 | implements fragment page_list { |
40 | render numbered_page_fragment |
41 | => over [ $_{pager_obj}->first_page .. $_{pager_obj}->last_page ]; |
42 | }; |
664d660c |
43 | |
bae75bee |
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 | }; |
664d660c |
53 | |
bae75bee |
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 | }; |
664d660c |
59 | |
bae75bee |
60 | implements fragment last_page { |
61 | arg page_uri => event_uri { page => $_{pager_obj}->last_page }; |
d219104c |
62 | arg page_name => localized 'Last'; |
bae75bee |
63 | render 'named_page'; |
64 | }; |
7adfd53f |
65 | |
bae75bee |
66 | implements fragment next_page { |
d219104c |
67 | arg page_name => localized 'Next'; |
bae75bee |
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 | } |
7adfd53f |
74 | }; |
75 | |
bae75bee |
76 | implements fragment previous_page { |
d219104c |
77 | arg page_name => localized 'Previous'; |
bae75bee |
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 | |
7adfd53f |
89 | 1; |
49170400 |
90 | |
91 | __END__; |
92 | |
93 | =head1 NAME |
94 | |
f9b32c83 |
95 | Reaction::UI::Widget::ListView - Extends Grid to a full list interface |
49170400 |
96 | |
97 | =head1 DESCRIPTION |
98 | |
f9b32c83 |
99 | This class is a subclass of L<Reaction::UI::ViewPort::Collection::Grid>. It additionally |
100 | provides means of paging and actions. |
49170400 |
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 |