[Bio] / FortyEight / Table.pm Repository:
ViewVC logotype

Annotation of /FortyEight/Table.pm

Parent Directory Parent Directory | Revision Log Revision Log


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

1 : paczian 1.1 package Table;
2 :    
3 :     use strict;
4 :     use warnings;
5 :     use URI::Escape;
6 :    
7 :     1;
8 :    
9 :     # initialize the table
10 :     sub new {
11 :     my ($params) = @_;
12 :    
13 :     # initialize variables
14 :     my $table = "";
15 :    
16 :     # retrieve mandatory data from params
17 :     my @data;
18 :     if (defined($params->{data})) {
19 :     @data = @{$params->{data}};
20 :     } else {
21 :     return "No data passed to table creator!";
22 :     }
23 :     my @columns;
24 :     if (defined($params->{columns})) {
25 :     @columns = @{$params->{columns}};
26 :     } else {
27 :     return "No columns passed to table creator!";
28 :     }
29 :    
30 :     # check for optional parameters in params
31 :     my @available_operators = (
32 :     [ 'like', '≅' ],
33 :     [ 'unlike', '!≅' ],
34 :     [ 'equal', '=' ], [ 'unequal', '!=' ],
35 :     [ 'less', '<' ], [ 'more', '>' ]
36 :     );
37 :     if (defined($params->{available_operators})) {
38 :     @available_operators = @{$params->{available_operators}};
39 :     }
40 :    
41 :     my %preselected_operators = ();
42 :     if (defined($params->{preselected_operators})) {
43 :     %preselected_operators = %{$params->{preselected_operators}};
44 :     }
45 :    
46 :     my %operands = ();
47 :     if (defined($params->{operands})) {
48 :     %operands = %{$params->{operands}};
49 :     }
50 :     unless (scalar(keys(%operands))) {
51 :     if (defined($params->{show_filter})) {
52 :     foreach my $column (@columns) {
53 :     $operands{$column} = "";
54 :     }
55 :     }
56 :     }
57 :    
58 :     my $complex_filter = $params->{complex_filter} || 0;
59 :     my $offset = $params->{offset} || 0;
60 :     my $total = scalar(@data) || 0;
61 :     $params->{total} = $total;
62 :     my $perpage = $params->{perpage} || -1;
63 :     $params->{perpage} = $perpage;
64 :     my $id = $params->{id} || "table";
65 :     $id =~ s/_//g;
66 :     $params->{id} = $id;
67 :     my $img_path = $params->{image_base} || "./Html/";
68 :     $params->{img_path} = $img_path;
69 :     my $show_perpage = $params->{show_perpage} || 0;
70 :     my $show_topbrowse = $params->{show_topbrowse} || 0;
71 :     my $show_bottombrowse = $params->{show_bottombrowse} || 0;
72 : paczian 1.2 my $group_cols = $params->{group_cols} || {};
73 : paczian 1.1 my $sortable = $params->{sortable} || 0;
74 : paczian 1.2 my $sortcols = $params->{sortcols} || { 'all' => 1 };
75 :     my $control_menu = $params->{control_menu};
76 : paczian 1.1 my $column_widths = $params->{column_widths};
77 : paczian 1.2 my $collapsed_columns = $params->{collapsed_columns} || {};
78 : paczian 1.1 unless (defined($column_widths)) {
79 :     foreach (@columns) {
80 :     push(@$column_widths, -1);
81 :     }
82 :     }
83 :     for (my $i=0; $i<scalar(@columns); $i++) {
84 :     unless (defined($column_widths->[$i])) {
85 :     $column_widths->[$i] = -1;
86 :     }
87 :     }
88 :    
89 :     # create an empty data array
90 :     my $empty_array;
91 :     my @good_data;
92 :     foreach my $row (@data) {
93 :     my $empty_row;
94 :     my $good_row;
95 :     foreach my $cell (@$row) {
96 :     if (defined($cell)) {
97 :     push(@$good_row, $cell);
98 :     } else {
99 :     push(@$good_row, "");
100 :     }
101 :     push(@$empty_row, "");
102 :     }
103 :     push(@$empty_array, $empty_row);
104 :     push(@good_data, $good_row);
105 :     }
106 :     @data = @good_data;
107 :     @good_data = undef;
108 :    
109 :     # create onclick event string
110 :     my $onclicks = "";
111 :     {
112 :     my $onclicks_array = $params->{onclicks} || $empty_array;
113 :     my $rows = [];
114 :     foreach my $row (@$onclicks_array) {
115 :     push(@$rows, join("^", @$row));
116 :     }
117 :     $onclicks = join("~", @$rows);
118 :     }
119 :    
120 :     # create popup menu strings if requested
121 :     my $titles = "";
122 :     my $infos = "";
123 :     my $menus = "";
124 :     my $highlights = "";
125 :     my ($titles_array, $infos_array, $menus_array, $highlights_array);
126 :     {
127 :     $titles_array = $params->{popup_menu}->{titles} || $empty_array;
128 :     $infos_array = $params->{popup_menu}->{infos} || $empty_array;
129 :     $menus_array = $params->{popup_menu}->{menus} || $empty_array;
130 :     $highlights_array = $params->{highlights} || $empty_array;
131 :    
132 :     my $rows = [];
133 :     foreach my $row (@$titles_array) {
134 :     push(@$rows, join("^", @$row));
135 :     }
136 :     $titles = join("~", @$rows);
137 :    
138 :     $rows = [];
139 :     foreach my $row (@$infos_array) {
140 :     push(@$rows, join("^", @$row));
141 :     }
142 :     $infos = join("~", @$rows);
143 :    
144 :     $rows = [];
145 :     foreach my $row (@$menus_array) {
146 :     push(@$rows, join("^", @$row));
147 :     }
148 :     $menus = join("~", @$rows);
149 :    
150 :     $rows = [];
151 :     foreach my $row (@$highlights_array) {
152 :     push(@$rows, join("^", @$row));
153 :     }
154 :     $highlights = join("~", @$rows);
155 :    
156 :     # check for unwanted symbols
157 :     $infos =~ s/\n//g;
158 :     $infos =~ s/'/&quot;/g;
159 :     $infos =~ s/"/\\"/g;
160 :     $menus =~ s/\n//g;
161 :     $menus =~ s/'/&quot;/g;
162 :     $menus =~ s/"/\\"/g;
163 :     }
164 :    
165 :     # create stringified data
166 :     my $rows = [];
167 :     foreach my $row (@data) {
168 :     my $quoted_row;
169 :     foreach my $cell (@$row) {
170 :     $cell =~ s/\^/ /g;
171 :     $cell =~ s/\~/ /g;
172 :     push(@$quoted_row, $cell);
173 :     }
174 :     push(@$rows, join("^", @$quoted_row));
175 :     }
176 :     my $data_source = join("~", @$rows);
177 :    
178 :     $data_source =~ s/'/\@1/g;
179 :     $data_source =~ s/"/\@2/g;
180 :    
181 : paczian 1.2 # get the groupcol information
182 :     my @group_cols_array;
183 :     my $num_groupcols = 0;
184 :     for (my $i=0; $i<scalar(@columns); $i++) {
185 :     if (exists($group_cols->{$i})) {
186 :     push(@group_cols_array, 1);
187 :     $num_groupcols++;
188 :     } else {
189 :     push(@group_cols_array, 0);
190 :     }
191 :     }
192 :    
193 : paczian 1.1 # insert hidden fields
194 :     $table .= "\n<input type='hidden' id='table_data_" . $id . "' value='" . $data_source . "'>\n";
195 :     $table .= "<input type='hidden' id='table_onclicks_" . $id . "' value='" . $onclicks . "'>\n";
196 :     $table .= "<input type='hidden' id='table_titles_" . $id . "' value='" . $titles . "'>\n";
197 :     $table .= "<input type='hidden' id='table_infos_" . $id . "' value='" . $infos . "'>\n";
198 :     $table .= "<input type='hidden' id='table_menus_" . $id . "' value='" . $menus . "'>\n";
199 :     $table .= "<input type='hidden' id='table_highlights_" . $id . "' value='" . $highlights . "'>\n";
200 :     $table .= "<input type='hidden' id='table_filtereddata_" . $id . "' value=''>\n";
201 :     $table .= "<input type='hidden' id='table_rows_" . $id . "' value='" . $total . "'>\n";
202 :     $table .= "<input type='hidden' id='table_cols_" . $id . "' value='" . scalar(@columns) . "'>\n";
203 :     $table .= "<input type='hidden' id='table_start_" . $id . "' value='0'>\n";
204 : paczian 1.2 $table .= "<input type='hidden' id='table_numgroups_" . $id . "' value='" . $num_groupcols . "'>\n";
205 :     $table .= "<input type='hidden' id='table_groups_" . $id . "' value='" . join(';', @group_cols_array) . "'>\n";
206 : paczian 1.1 $table .= "<input type='hidden' id='table_sortdirection_" . $id . "' value='up'>\n";
207 :    
208 :     # check for title
209 :     if (defined($params->{title})) {
210 :     $table .= "<p class='table_title'>" . $params->{title} . "</p>\n";
211 :     }
212 :    
213 :     # check if table width was passed
214 :     my $table_width = "";
215 :     if (defined($params->{table_width})) {
216 :     $table_width = "width: " . $params->{table_width} . "px;";
217 :     }
218 :    
219 : paczian 1.2 # check for control menu
220 :     if ($control_menu) {
221 :    
222 :     # surrounding table
223 :     $table .= "<table><tr><td>";
224 :    
225 :     # control tree columns
226 :     $table .= "<table><tr><td>Visible Tree Columns</td></tr>";
227 :     my @sorted_keys = sort(keys(%$group_cols));
228 :     foreach my $key (@sorted_keys) {
229 :     my $colname = $columns[$key];
230 :     $table .= "<tr><td>$colname</td><td><input type='checkbox' name='" . $key ."_vis' id='table_" . $id . "_" . $key ."_vis' checked=checked></td></tr>";
231 :     }
232 :     $table .= "</table></td><td>";
233 :    
234 :     # control data columns
235 :     $table .= "<div style='height: 250px; overflow: auto;'><table><tr><td>Visible Data Columns</td></tr>";
236 :     for (my $i=0; $i<scalar(@columns); $i++) {
237 :     unless ($group_cols->{$i}) {
238 :     $table .= "<tr><td>" . $columns[$i] . "</td><td><input type='checkbox' name='" . $i ."_vis' id='table_" . $id . "_" . $i ."_vis'></td></tr>";
239 :     }
240 :     }
241 :     $table .= "</table></div>";
242 :    
243 :     $table .= "</td></tr></table><input type='button' value='Apply' onclick='reload_table(\"" . $id . "\");'><input type='button' value='Show Data' onclick='switch_data_tree(\"" . $id . "\");' id='table_" . $id . "_switch_button'>";
244 :     }
245 :    
246 : paczian 1.1 # check for display options - select entries per page
247 :     if ($show_perpage) {
248 :     $table .= "<table class='table_table' style='$table_width'>\n<tr><td align=center><span class='table_perpage'>display&nbsp;<input type='text' id='table_perpage_" . $id . "' name='table_perpage_" . $id . "' size='3' value='" . $perpage . "' onkeypress='check_submit_filter(event, \"" . $id . "\")'>&nbsp;items per page</span></td></tr>\n";
249 :     } elsif ($perpage == -1) {
250 :     $table .= "<input type='hidden' id='table_perpage_" . $id . "' name='table_perpage_" . $id . "' value='" . scalar(@data) . "' >\n<table class='table_table' style='$table_width'>\n";
251 :     } else {
252 :     $table .= "<input type='hidden' id='table_perpage_" . $id . "' name='table_perpage_" . $id . "' value='" . $perpage . "' >\n<table class='table_table' style='$table_width'>\n";
253 :     }
254 :    
255 :     # check for display options - display browsing element at the top
256 :     if ($show_topbrowse) {
257 :     $table .= get_browse($params);
258 :     }
259 :    
260 :     # start data table
261 :     $table .= "<tr><td><table id='table_" . $id . "' class='table_table' style='$table_width'>";
262 :    
263 :     # write table header
264 :     $table .= "<tr>";
265 :     my $i = 1;
266 :    
267 :     # check column widths
268 :     my $colwidths;
269 :    
270 :     # iterate through columns
271 :     foreach my $col (@columns) {
272 :     if ($column_widths->[$i - 1] ne -1) {
273 :     push(@$colwidths, "width: " . $column_widths->[$i - 1] . "px;");
274 :     } else {
275 :     push(@$colwidths, "");
276 :     }
277 :    
278 :     # count up column name
279 :     my $name = $id . "_col_" . $i;
280 :    
281 :     # prepare html for sorting according to column
282 :     my $order_img = "<a href='javascript: table_sort(\"" . $id . "\", \"" . $i . "\", \"ASC\");' class='table_first_row' title='Click to sort'>";
283 :    
284 : paczian 1.2 # create row collapse/expand button
285 :     my $collapse_button = "";
286 :     if ($group_cols->{$i - 1}) {
287 :     if ($collapsed_columns->{$col}) {
288 :     $collapse_button = "<img src='./Html/plus.gif' id='table_collapse_" . $id . "_" . ($i - 1) . "' onclick='expand_column(\"" . $id . "\", \"" . ($i - 1) . "\");'>";
289 :     } else {
290 :     $collapse_button = "<img src='./Html/minus.gif' id='table_collapse_" . $id . "_" . ($i - 1) . "' onclick='expand_column(\"" . $id . "\", \"" . ($i - 1) . "\");'>";
291 :     }
292 :     }
293 : paczian 1.1
294 :     # check for simple filter
295 :     my $filter = "";
296 :     if (defined($operands{$col})) {
297 : paczian 1.2 if ($complex_filter) {
298 :    
299 :     # check if there is a preselected value for this filter field
300 :     my $preselected_operand = "";
301 :     if (defined($operands{$col})) {
302 :     $preselected_operand = $operands{$col};
303 :     }
304 :    
305 :     # check for filter comparison operator
306 :     $filter = "<br/><select name='" . $id . "_" . $col . "_operator' id='table_" . $id . "_operator_" . $i . "' style='width: 40px;'>";
307 :    
308 :     foreach my $operator (@available_operators) {
309 :     my $preselected_operator = "";
310 :    
311 :     if (defined($preselected_operators{$col})) {
312 :     if ($preselected_operators{$col} eq $operator->[0]) {
313 :     $preselected_operator = " selected='selected'";
314 :     }
315 :     }
316 :    
317 :     $filter .= "<option value='" . $operator->[0] . "'" . $preselected_operator . ">" . $operator->[1] . "</option>";
318 :     }
319 :     $filter .= "</select><input type='text' name='" . $id . $col . "' class='filter_item' value='" . $preselected_operand . "' id='table_" . $id . "_operand_" . $i . "' onkeypress='check_submit_filter(event, \"" . $id . "\")' style='width: 70%;'>";
320 :     } else {
321 :     my $operator = 'like';
322 :     if (defined($preselected_operators{$col})) {
323 :     $operator = $preselected_operators{$col};
324 :     }
325 :     $filter = "<br/><input type=hidden name='" . $id . "_" . $col . "_operator' value='" . $operator . "' id='table_" . $id . "_operator_" . $i . "'><input type='text' name='" . $id . $col . "' class='filter_item' value='' size=5 id='table_" . $id . "_operand_" . $i . "' onkeypress='check_submit_filter(event, \"" . $id . "\")' style='width: 100%;' title='Enter Search Text'>";
326 :     }
327 : paczian 1.1 }
328 :    
329 :     # check if colum header click should sort
330 :     if ($sortable) {
331 : paczian 1.2 if ($sortcols->{$i} || $sortcols->{'all'}) {
332 :     $table .= "<td name='" . $name . "' class='table_first_row' style='" . $colwidths->[$i - 1] . "'>" . $collapse_button . $order_img . $col . "&nbsp;<img src='./Html/up-arrow.gif'><img src='./Html/down-arrow.gif'></a>" . $filter . "</td>";
333 :     }
334 : paczian 1.1 } else {
335 : paczian 1.2 $table .= "<td name='" . $name . "' class='table_first_row' style='" . $colwidths->[$i - 1] . "'>" . $collapse_button . $col . $filter . "</td>";
336 : paczian 1.1 }
337 :    
338 :     # increase column counter
339 :     $i ++;
340 :     }
341 :     $table .= "</tr>";
342 :    
343 :     # end data table
344 :     $table .= "</table></td></tr>";
345 :    
346 :     # check for display options - display browse element at the bottom
347 :     if ($show_bottombrowse) {
348 :     $table .= get_browse($params);
349 :     }
350 :    
351 :     # end surrounding table
352 :     $table .= "</table>";
353 :    
354 :     # include image for table initialization
355 :     $table .= "<img src='" . $img_path . "clear.gif' onload='initialize_table(\"" . $id . "\")'>";
356 :    
357 :     return $table;
358 :     }
359 :    
360 :     # get the browsing html
361 :     sub get_browse {
362 :     my ($params) = @_;
363 :    
364 :     my $browse = "";
365 :     my $left = "";
366 :     my $right = "";
367 :     my $offset = $params->{offset} || 1;
368 :     my $id = $params->{id} || "table";
369 :     my $perpage = $params->{perpage} || 0;
370 :     my $total = $params->{total} || 2;
371 :    
372 :     if ($offset > 0) {
373 :     $left .= "<a href='javascript: table_first(\"" . $id . "\");' name='table_first_" . $id . "'>&laquo;first</a>&nbsp;&nbsp;<a href='javascript: table_prev(\"" . $id . "\");' name='table_prev_" . $id . "'>&laquo;prev</a>";
374 :     }
375 :    
376 :     if (($offset + $perpage) < $total) {
377 :     $right = "<a href='javascript: table_next(\"" . $id . "\");' name='table_next_" . $id . "'>next&raquo;</a>&nbsp;&nbsp;<a href='javascript: table_last(\"" . $id . "\");' name='table_last_" . $id . "'>last&raquo;</a>";
378 :     }
379 :    
380 :     my $to = $offset + $perpage;
381 :     if (($offset + $perpage) > $total) {
382 :     $to = $total;
383 :     }
384 :    
385 : paczian 1.2 $browse .= "<tr><td><table class='table_browse'><tr><td align='left' width='20%'>" . $left . "</td><td align='center' width='60%'>displaying <span name='table_start_" . $id . "'>" . ($offset + 1) . "</span> - <span name='table_stop_" . $id . "'>" . $to . "</span> of <span name='table_total_" . $id . "'>" . $total . "</span></td><td align='right' width='20%'>" . $right . "</td></tr></table></td></tr>";
386 : paczian 1.1
387 :     return $browse;
388 :     }

MCS Webmaster
ViewVC Help
Powered by ViewVC 1.0.3