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