[Bio] / WebApplication / WebComponent / FilterSelect.pm Repository:
ViewVC logotype

Annotation of /WebApplication/WebComponent/FilterSelect.pm

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.16 - (view) (download) (as text)

1 : paczian 1.1 package WebComponent::FilterSelect;
2 :    
3 :     # FilterSelect - component for a list filtered by an infix search
4 :    
5 : golsen 1.16 # $Id: FilterSelect.pm,v 1.15 2011-06-13 09:44:01 paczian Exp $
6 : paczian 1.1
7 :     use strict;
8 :     use warnings;
9 :    
10 :     use base qw( WebComponent );
11 :    
12 :     1;
13 :    
14 :    
15 :     =pod
16 :    
17 :     =head1 NAME
18 :    
19 :     FilterSelect - component for a list filtered by an infix search
20 :    
21 :     =head1 DESCRIPTION
22 :    
23 :     WebComponent for a list filtered by an infix search
24 :    
25 :     =head1 METHODS
26 :    
27 :     =over 4
28 :    
29 :    
30 :     =item * B<new> ()
31 :    
32 :     Called when the object is initialized. Expands SUPER::new.
33 :    
34 :     =cut
35 :    
36 :     sub new {
37 :    
38 :     my $self = shift->SUPER::new(@_);
39 : devoid 1.14 $self->{html_id} = $self->id();
40 : paczian 1.1 $self->{values} = [];
41 :     $self->{labels} = [];
42 :     $self->{name} = "filter_select";
43 : paczian 1.6 $self->{attributes} = [];
44 : paczian 1.1 $self->{size} = 8;
45 :     $self->{width} = 300;
46 : paczian 1.6 $self->{multiple} = 0;
47 : chenry 1.12 $self->{dropdown} = 0;
48 : paczian 1.6 $self->{auto_place_attribute_boxes} = 1;
49 :     $self->{attribute_boxes} = {};
50 : paczian 1.8 $self->{default} = undef;
51 : chenry 1.13 $self->{initial_text} = '';
52 : paczian 1.1
53 :     return $self;
54 :     }
55 :    
56 :     =item * B<output> ()
57 :    
58 :     Returns the html output of the FilterSelect component.
59 :    
60 :     =cut
61 :    
62 :     sub output {
63 :     my ($self) = @_;
64 :    
65 : paczian 1.6 # no values, no select box
66 : paczian 1.1 unless ($self->values) {
67 :     die "Filter Select called without values";
68 :     }
69 :    
70 : paczian 1.6 # check for attributes
71 : golsen 1.16 my $values_string = join("~", map {defined $_ ? $_ : ''} @{$self->values});
72 : paczian 1.7 $values_string =~ s/'/#/g;
73 : golsen 1.16 my $labels_string = join("~", map {defined $_ ? $_ : ''} @{$self->labels});
74 : paczian 1.7 $labels_string =~ s/'/#/g;
75 : paczian 1.6 my $attribute_values = [];
76 :     my $attribute_names = [];
77 : paczian 1.8 my $attribute_types = [];
78 : paczian 1.6 my $sort_attributes = [];
79 :     foreach my $attribute (@{$self->attributes}) {
80 : parrello 1.9 push(@$attribute_values, join("~", map { defined($_) ? $_ : '' } @{$attribute->{values}}));
81 : paczian 1.6 push(@$attribute_names, $attribute->{name});
82 :     if ($attribute->{sort_attribute}) {
83 :     push(@$sort_attributes, $attribute->{name});
84 : paczian 1.8 push(@$attribute_types, 'sort');
85 :     } else {
86 :     push(@$attribute_types, 'filter');
87 : paczian 1.6 }
88 :     }
89 :     $attribute_values = join("|", @$attribute_values);
90 : paczian 1.8 $attribute_types = join("~", @$attribute_types);
91 : paczian 1.6 $attribute_names = join("~", @$attribute_names);
92 :     $attribute_values =~ s/'//g;
93 : paczian 1.1
94 : paczian 1.6 # create hidden fields
95 : paczian 1.8 my $default_value = "";
96 :     if (defined($self->default())) {
97 :     $default_value = $self->default();
98 :     }
99 : devoid 1.14 my $select = "<input type='hidden' value='" . $values_string . "' id='filter_select_values_" . $self->html_id() . "'>\n";
100 :     $select .= "<input type='hidden' value='" . $labels_string . "' id='filter_select_labels_" . $self->html_id() . "'>\n";
101 :     $select .= "<input type='hidden' value='$default_value' id='filter_select_default_" . $self->html_id() . "'>\n";
102 : paczian 1.6
103 :     # check if attribute fields are neccessary
104 :     if (scalar(@{$self->attributes})) {
105 : devoid 1.14 $select .= "<input type='hidden' value='" . $attribute_names . "' id='filter_select_attribute_names_" . $self->html_id() . "'>\n";
106 :     $select .= "<input type='hidden' value='" . $attribute_values . "' id='filter_select_attribute_values_" . $self->html_id() . "'>\n";
107 :     $select .= "<input type='hidden' value='" . $attribute_types . "' id='filter_select_attribute_types_" . $self->html_id() . "'>\n";
108 : paczian 1.6 }
109 : chenry 1.12
110 : chenry 1.13 my $default_text = "start typing to narrow selection";
111 : chenry 1.12 if ($self->dropdown()) {
112 : devoid 1.14 $select .= "<input type='hidden' value='yes' id='filter_select_dropdown_" . $self->html_id() . "'>\n";
113 : chenry 1.13 $default_text = "click to view and type to filter";
114 :     }
115 :     if (defined($self->{initialtext})) {
116 :     $default_text = $self->{initialtext};
117 : chenry 1.12 }
118 : paczian 1.6
119 :     # create the input field and the select box
120 :     my $multiple = "";
121 :     if ($self->multiple) {
122 :     $multiple = " multiple=multiple";
123 : paczian 1.1 }
124 : devoid 1.14 $select .= "<input type='hidden' id='filter_initial_text_" . $self->html_id() . "' value='$default_text'>\n";
125 :     $select .= "<input type='text' style='width: " . $self->width() . "px;' name='" . $self->name() . "_text' onkeydown='textbox_key_down(event, \"" . $self->html_id() . "\");' onkeyup='textbox_key_up(event, \"" . $self->html_id() . "\");' id='filter_select_textbox_" . $self->html_id() . "' value='".$default_text."'><br/>\n";
126 : chenry 1.12
127 :     # hide the select if dropdown
128 : devoid 1.14 $select .= "<div id='filter_select_" . $self->html_id() . "_div'" . ($self->dropdown() ? " style='display:none; position:absolute;'" : "") . ">";
129 : chenry 1.12
130 : devoid 1.14 $select .= "<select style='width: " . $self->width() . "px;' name='" . $self->name() . "'$multiple id='filter_select_" . $self->html_id(). "' size='" . $self->size() . "'>";
131 : chenry 1.12 $select .= "</select></div>";
132 : paczian 1.1
133 : paczian 1.6 # we have attributes, display the attribute filter
134 :     my $attribute_boxes = {};
135 :     if (scalar(@{$self->attributes})) {
136 :     foreach my $attribute (@{$self->attributes}) {
137 :     my $attribute_box = "";
138 :    
139 :     # sort attributes are handled differently
140 :     next if $attribute->{sort_attribute};
141 :    
142 :     # start the fieldset for this attribute
143 :     $attribute_box .= "<td><fieldset><legend>".$attribute->{name}."</legend><table>";
144 :    
145 :     # check whether this is exclusive or not
146 :     my $type = "checkbox";
147 :     if ($attribute->{exclusive}) {
148 :     $type = "radio";
149 :     $attribute_box .= "<optgroup>";
150 :     }
151 :    
152 :     # create options for every possible value of the attribute
153 :     foreach my $possible_value (@{$attribute->{possible_values}}) {
154 :     my $checked = " checked=checked";
155 :     if (ref($possible_value)) {
156 :     unless ($possible_value->[1]) {
157 :     $checked = "";
158 :     }
159 :     $possible_value = $possible_value->[0];
160 :     }
161 :    
162 : devoid 1.14 $attribute_box .= "<tr><td style='white-space: nowrap;'><input type='$type'$checked value='$possible_value' name='filter_select_" . $self->html_id() . "_" . $attribute->{name} . "' onchange='perform_attribute_filter(\"" . $self->html_id() . "\");'>$possible_value</td></tr>";
163 : paczian 1.6 }
164 :    
165 :     # close optgroup if this is exclusive
166 :     if ($attribute->{exclusive}) {
167 :     $attribute_box .= "</optgroup>";
168 :     }
169 :    
170 :     # close attribute fieldset
171 :     $attribute_box .= "</table></fieldset>";
172 :     $attribute_boxes->{$attribute->{name}} = $attribute_box;
173 :     }
174 :    
175 :     # check if we have any sort attributes
176 :     my $sort_box = "";
177 :     if (scalar(@$sort_attributes)) {
178 :     $sort_box .= "<fieldset><legend>sort</legend><table><optgroup>";
179 : devoid 1.14 $sort_box .= "<tr><td style='white-space: nowrap;'><input type='radio' checked=checked value='alphabetical' name='filter_select_" . $self->html_id() . "_sort' onclick='perform_attribute_sort(\"alphabetical\", \"" . $self->html_id() . "\");'>alphabetical</td></tr>";
180 : paczian 1.6 foreach my $attribute (@$sort_attributes) {
181 : devoid 1.14 $sort_box .= "<tr><td><input type='radio' value='$attribute' name='filter_select_" . $self->html_id() . "_sort' onclick='perform_attribute_sort(\"" . $attribute . "\", \"" . $self->html_id() . "\");'>$attribute</td></tr>";
182 : paczian 1.6 }
183 :     $sort_box .= "</optgroup></table></fieldset>";
184 :     $attribute_boxes->{sort} = $sort_box;
185 :     }
186 :     $self->{attribute_boxes} = $attribute_boxes;
187 :     }
188 :     if ($self->auto_place_attribute_boxes()) {
189 :     $select = "<table><tr><td>".$select."</td>";
190 :     foreach my $key (sort(keys(%$attribute_boxes))) {
191 :     $select .= "<td>".$attribute_boxes->{$key}."</td>";
192 :     }
193 :     $select .= "</tr></table>";
194 :     }
195 : devoid 1.14 $select .= "<img src='$FIG_Config::cgi_url/Html/clear.gif' onload='initialize_filter_select(\"" . $self->html_id() . "\");' />";
196 : paczian 1.6
197 : paczian 1.1 return $select;
198 :     }
199 :    
200 :     =item * B<values> (I<values>)
201 :    
202 :     Getter / Setter for the values attribute.
203 :     These correspond to the values in the list part of the component.
204 :    
205 :     =cut
206 :    
207 :     sub values {
208 :     my ($self, $values) = @_;
209 :    
210 :     if (defined($values)) {
211 :     $self->{values} = $values;
212 :     }
213 :    
214 :     return $self->{values};
215 :     }
216 :    
217 :     =item * B<labels> (I<labels>)
218 :    
219 :     Getter / Setter for the labels attribute.
220 :     These correspond to the labels in the list part of the component.
221 :    
222 :     =cut
223 :    
224 :     sub labels {
225 :     my ($self, $labels) = @_;
226 :    
227 :     if (defined($labels)) {
228 :     $self->{labels} = $labels;
229 :     }
230 :    
231 :     return $self->{labels};
232 :     }
233 :    
234 : paczian 1.6 =item * B<get_attribute_boxes> ()
235 :    
236 :     Getter for the attribute_boxes attribute.
237 :     Returns a hash of the attribute boxes.
238 :    
239 :     =cut
240 :    
241 :     sub get_attribute_boxes {
242 :     my ($self) = @_;
243 :    
244 :     return $self->{attribute_boxes};
245 :     }
246 :    
247 :     =item * B<auto_place_attribute_boxes> (I<boolean>)
248 :    
249 :     Getter / Setter for the auto_place_attribute_filters attribute.
250 :     If this is true (default) the attribute filters will be placed
251 :     automatically. Set this to false and call get_attribute_boxes to
252 :     place them manually.
253 :    
254 :     =cut
255 :    
256 :     sub auto_place_attribute_boxes {
257 :     my ($self, $value) = @_;
258 :    
259 :     if (defined($value)) {
260 :     $self->{auto_place_attribute_boxes} = $value;
261 :     }
262 :    
263 :     return $self->{auto_place_attribute_boxes};
264 :     }
265 :    
266 :     =item * B<multiple> (I<multiple>)
267 :    
268 :     Getter / Setter for the multiple attribute.
269 :     Determines whether this is a multiple select box or not.
270 :    
271 :     =cut
272 :    
273 :     sub multiple {
274 :     my ($self, $multiple) = @_;
275 :    
276 :     if (defined($multiple)) {
277 :     $self->{multiple} = $multiple;
278 :     }
279 :    
280 :     return $self->{multiple};
281 :     }
282 :    
283 :     =item * B<attributes> (I<attributes>)
284 :    
285 :     Getter for the attributes attribute.
286 :     This is an array of attributes for values. Each entry represents an attribute-
287 :     type and must consist of an array with an entry for every value of the select
288 :     box.
289 :    
290 :     =cut
291 :    
292 :     sub attributes {
293 :     my ($self, $attributes) = @_;
294 :    
295 :     if (defined($attributes)) {
296 :     $self->{attributes} = $attributes;
297 :     }
298 :    
299 :     return $self->{attributes};
300 :     }
301 :    
302 :     =item * B<add_attribute> (I<name>, I<values>, I<possible_values>)
303 :    
304 :     Adds an attribute to the attribute array. The name will be the text
305 :     displayed on the attribute filter box. The values must have one entry
306 :     for every item of the selet box. Possible values is an array that
307 :     determines the possible values of an attribute. If an entry in possible
308 :     values is an array, the first entry will determine the value, the second
309 :     a boolean whether this should be initially checked or not. Default is
310 :     checked.
311 :    
312 :     =cut
313 :    
314 :     sub add_attribute {
315 :     my ($self, $attribute) = @_;
316 :    
317 :     push(@{$self->{attributes}}, $attribute);
318 :    
319 :     return $self->{attributes};
320 :     }
321 :    
322 : paczian 1.1 =item * B<name> (I<name>)
323 :    
324 :     Getter / Setter for the name attribute.
325 :     This corresponds to the name of the cgi paramter the selection of this
326 :     component will end up in.
327 :    
328 :     =cut
329 :    
330 :     sub name {
331 :     my ($self, $name) = @_;
332 :    
333 :     if (defined($name)) {
334 :     $self->{name} = $name;
335 :     }
336 :    
337 :     return $self->{name};
338 :     }
339 :    
340 :     =item * B<size> (I<size>)
341 :    
342 :     Getter / Setter for the size attribute.
343 :     This is the length of the list part of the component.
344 :    
345 :     =cut
346 :    
347 :     sub size {
348 :     my ($self, $size) = @_;
349 :    
350 :     if (defined($size)) {
351 : paarmann 1.5 $self->{size} = $size;
352 : paczian 1.1 }
353 :    
354 :     return $self->{size};
355 :     }
356 :    
357 :     =item * B<width> (I<width>)
358 :    
359 :     Getter / Setter for the width attribute.
360 :     This determines the width of the component in pixels.
361 :    
362 :     =cut
363 :    
364 :     sub width {
365 :     my ($self, $width) = @_;
366 :    
367 :     if (defined($width)) {
368 :     $self->{width} = $width;
369 :     }
370 :    
371 :     return $self->{width};
372 :     }
373 :    
374 : paczian 1.8 sub default {
375 :     my ($self, $default) = @_;
376 :    
377 :     if (defined($default)) {
378 :     $self->{default} = $default;
379 :     }
380 :    
381 :     return $self->{default};
382 :     }
383 :    
384 : chenry 1.12 sub initial_text {
385 :     my ($self, $initialtext) = @_;
386 :    
387 :     if (defined($initialtext)) {
388 : chenry 1.13 $self->{initialtext} = $initialtext;
389 : chenry 1.12 }
390 :    
391 : chenry 1.13 return $self->{initialtext};
392 : chenry 1.12 }
393 :    
394 :     sub dropdown {
395 :     my ($self, $dropdown) = @_;
396 :    
397 :     if (defined($dropdown)) {
398 :     $self->{dropdown} = $dropdown;
399 :     }
400 :    
401 :     return $self->{dropdown};
402 :     }
403 :    
404 : devoid 1.14 sub html_id {
405 :     my ($self, $value) = @_;
406 :     if($value) {
407 :     $self->{html_id} = $value;
408 :     }
409 :     return $self->{html_id};
410 :     }
411 :    
412 :    
413 : paczian 1.1 sub require_javascript {
414 : parrello 1.10 return ["$FIG_Config::cgi_url/Html/FilterSelect.js"];
415 : paczian 1.1 }

MCS Webmaster
ViewVC Help
Powered by ViewVC 1.0.3