Merge pull request #4327 from solgenomics/topic/reduce_pheno_dl_query_length
[sgn.git] / mason / page / columnar_table.mas
blobc228b9241a6d63939f3a8843532824a2ce8020c4
1 <%doc>
3 =head1 NAME
5 columnar_table.mas - a Mason module to display tables
7 =head1 DESCRIPTION
9 Arguments:
11  headings => [ col name, col name,...],
12  data     => [ [html, html, ...],
13                [ html,
14                  { onmouseover => "alert('ow!')",
15                    content => some html
16                  },
17                  html,
18                  ...
19                        ],
20                  ...
21              ],
22 __align      => 'cccccc...',
23 __tableattrs => 'summary="" cellspacing="0" width="100%"',
24 __border     => 1,
26 __caption    => 'Optional table caption',
28 __alt_freq   => 4,
29 __alt_width  => 2,
30 __alt_offset => 0,
32 # also can generate simple frequency tables of the values in the given
33 # columns, makes one table per column, printed before the main table.
34 # These auxiliary frequency tables will only be printed if there are
35 # more than 4 rows in the table.
36 frequency_tables => ['col name','col name', ...],
38 =head1 AUTHORS
40 Lukas Mueller, based on Perl code by Rob Buels
42 =cut
44 </%doc>
45 <%args>
46   $data
47   $headings  => undef
48   $frequency_tables => []
49 </%args>
50 <%once>
51   use List::Util ();
52   use Lingua::EN::Inflect ();
53   use CXGN::Page::FormattingHelpers qw | columnar_table_html |;
54 </%once>
55 <%perl>
56 if( @$frequency_tables && @$data > 4) {
57     my %heading_idx = do { my $i = 0; map {lc $_ => $i++} @$frequency_tables };
58     for my $colname (@$frequency_tables) {
59         my $idx = $heading_idx{ lc $colname };
60         my $name = $headings->[$idx];
61         my @data_slice = map $_->[$idx], @$data;
62         my %stats;
63         $stats{$_}++ for @data_slice;
64         my @stat_disp = map {
65             [ $stats{$_}, $_ ]
66         } sort keys %stats;
68         if( @stat_disp > 1 ) {
69             push @stat_disp, [ List::Util::sum( map $_->[0], @stat_disp ), '<b>Total</b>' ];
70         }
72         print '<div style="width: 30%; float: left; margin: 2px;">'.columnar_table_html( data => \@stat_disp, __caption => Lingua::EN::Inflect::PL_N( $name ), __align => 'rl' ).'</div>';
73     }
75 </%perl>
76 <% columnar_table_html( %ARGS ) %>