File Coverage

lib/CGI/OptimalQuery/RecView.pm
Criterion Covered Total %
statement 12 179 6.7
branch 0 102 0.0
condition 0 42 0.0
subroutine 4 5 80.0
pod 0 1 0.0
total 16 329 4.8


line stmt bran cond sub pod time code
1             package CGI::OptimalQuery::InteractiveQuery2;
2              
3 1     1   598 use strict;
  1         1  
  1         23  
4 1     1   3 use warnings;
  1         2  
  1         21  
5 1     1   2 no warnings qw( uninitialized redefine );
  1         1  
  1         25  
6 1     1   2 use base 'CGI::OptimalQuery::Base';
  1         1  
  1         1670  
7              
8             sub output {
9 0     0 0   my $o = shift;
10              
11 0           my %opts = %{ $o->get_opts() };
  0            
12            
13             # evalulate code refs
14 0           for (qw(httpHeader htmlFooter htmlHeader OQdocTop
15             OQdocBottom OQformTop OQformBottom )) {
16 0 0         $opts{$_} = $opts{$_}->($o) if ref($opts{$_}) eq 'CODE';
17             }
18              
19             # define defaults
20 0   0       $opts{OQdocTop} ||= '';
21 0   0       $opts{OQdocBottom} ||= '';
22 0   0       $opts{OQformTop} ||= '';
23 0   0       $opts{OQformBottom} ||= '';
24 0   0       $opts{editButtonLabel}||= 'edit';
25 0   0       $opts{disable_sort} ||= 0;
26 0   0       $opts{disable_filter} ||= 0;
27 0   0       $opts{disable_select} ||= 0;
28 0   0       $opts{mutateRecord} ||= undef;
29 0   0       $opts{editLink} ||= undef;
30 0   0       $opts{htmlExtraHead} ||= "";
31 0 0         if (! exists $opts{usePopups}) {
32 0           $opts{usePopups}=1;
33             } else {
34 0 0         $opts{usePopups}=($opts{usePopups}) ? 1 : 0;
35             }
36 0 0         if (! exists $opts{useAjax}) {
37 0           $opts{useAjax} = $opts{usePopups};
38             } else {
39 0 0         $opts{useAjax}=($opts{useAjax}) ? 1 : 0;
40             }
41              
42             $opts{httpHeader} = $$o{q}->header(-type=>'text/html',-expires=>'now')
43 0 0         unless exists $opts{httpHeader};
44             $opts{htmlFooter} = "\n\n"
45 0 0         unless exists $opts{htmlFooter};
46              
47 0           my $newBut;
48 0 0 0       if ($opts{NewButton}) {
    0          
    0          
    0          
49 0 0         $newBut = (ref($opts{NewButton}) eq 'CODE') ? $opts{NewButton}->($o, \%opts) : $opts{NewButton};
50             }
51             elsif (ref($opts{buildNewLink}) eq 'CODE') {
52 0           my $link = $opts{buildNewLink}->($o, \%opts);
53 0 0         if ($link ne '') {
54 0           $newBut = "
55 0 0         if ($opts{usePopups}) {
56 0           my $target = uc($link); $target =~ s/\W//g;
  0            
57 0           $newBut .= " data-target='$target'";
58             }
59 0           $newBut .= " data-href='".escapeHTML($link)."'>new";
60             }
61             }
62             elsif (exists $opts{buildNewLink} && $opts{buildNewLink} eq '') {}
63             elsif ($opts{editLink} ne '') {
64 0 0         my $link = $opts{editLink}.(($opts{editLink} =~ /\?/)?'&':'?')."on_update=OQrefresh&act=new";
65 0 0         if ($link ne '') {
66 0           $newBut = "
67 0 0         if ($opts{usePopups}) {
68 0           my $target = uc($opts{editLink}); $target =~ s/\W//g;
  0            
69 0           $newBut .= " data-target='$target'";
70             }
71 0           $newBut .= " data-href='".escapeHTML($link)."'>new";
72             }
73             }
74              
75 0           my $ver = "ver=$CGI::OptimalQuery::VERSION";
76 0           my $buf;
77 0           my $dataonly = $$o{q}->param('dataonly');
78 0 0         if ($dataonly) {
79 0           $buf = $opts{httpHeader}."\n";
80             } else {
81 0           my $script;
82 0 0         $script .= "window.OQWindowHeight=$opts{WindowHeight};\n" if $opts{WindowHeight};
83 0 0         $script .= "window.OQWindowWidth=$opts{WindowWidth};\n" if $opts{WindowWidth};
84 0           $script .= "window.OQuseAjax=$opts{useAjax};\n";
85 0           $script .= "window.OQusePopups=$opts{usePopups};\n";
86              
87 0 0         if (! exists $opts{htmlHeader}) {
88             $opts{htmlHeader} =
89             "
90            
91            
92             ".escapeHTML($o->get_title)."
93            
94            
95 0           ".$opts{htmlExtraHead}."
96             ";
97             } else {
98 0           $script .= "
99             if (! document.getElementById('OQIQ2CSS')) {
100             var a = document.createElement('link');
101             a.setAttribute('rel','stylesheet');
102             a.setAttribute('type','text/css');
103             a.setAttribute('id','OQIQ2CSS');
104             a.setAttribute('href','$$o{schema}{resourceURI}/InteractiveQuery2.css?1');
105             document.getElementsByTagName('head')[0].appendChild(a);
106             }\n";
107             }
108              
109 0 0         if ($opts{color}) {
110 0           $script .= "
111             var d = document.createElement('style');
112             var r = document.createTextNode('.OQhead { background-color: $opts{color}; }');
113             d.type = 'text/css';
114             if (d.styleSheet)
115             d.styleSheet.cssText = r.nodeValue;
116             else d.appendChild(r);
117             document.getElementsByTagName('head')[0].appendChild(d);\n";
118             }
119              
120 0           $buf = $opts{httpHeader}.$opts{htmlHeader};
121 0 0         $buf .= "" unless $opts{jquery_already_sent};
122 0           $buf .= "
123            
124             ";
129 0           $buf .= "
130            
$opts{OQdocTop}
";
131              
132             # ouput tools panel
133 0           my @tools = sort keys %{$$o{schema}{tools}};
  0            
134 0 0         if ($#tools > -1) {
135 0           $buf .= "
    ";
136 0           my $opened_tool_key = $$o{q}->param('tool');
137 0           foreach my $key (sort keys %{$$o{schema}{tools}}) {
  0            
138 0           my $tool = $$o{schema}{tools}{$key};
139              
140 0           my $openedClass = '';
141 0           my $toolContent = '';
142 0 0         if ($opened_tool_key eq $key) {
143 0           $openedClass = ' opened';
144 0           $toolContent = "
".$$tool{handler}->($o)."
";
145             }
146 0           $buf .= "
  • ".escapeHTML($$tool{title})."

    $toolContent
  • ";
    147             }
    148 0           $buf .= "";
    149             }
    150             }
    151             $buf .= "
    152            
    153 0          
    154            
    155            
    156            
    157            
    158            
    159            
    160 0   0       \n";
    161 0 0         if (ref($$o{schema}{state_params}) eq 'ARRAY') {
    162             $buf .= "\n" for @{$$o{schema}{state_params}};
      0            
    164             }
    165             $buf .=
    166 0           "
    167            
    $opts{OQformTop}
    168              
    169            
    170            
    ".escapeHTML($o->get_title)."
    171            
    Result(s) (".$o->commify($o->get_lo_rec)." - "
    172             .$o->commify($o->get_hi_rec).") of ".$o->commify($o->get_count)."
    173            
    174             $newBut
    175            
    176            
    177            
    178            
    179            
    180              
    181             "; " if $$o{queryDescr}; "; ";
    182 0 0         $buf .= "
    Query:".escapeHTML($$o{queryDescr})."
    183              
    184 0           my $filter = $o->get_filter();
    185 0 0         if ($filter) {
    186 0           $buf .= "
    187 0 0         $buf .= " data-nofilter" if $opts{disable_filter};
    188 0           $buf .= ">Filter:".escapeHTML($filter)."
    189             }
    190              
    191 0           my @sort = $o->sth->sort_descr;
    192 0 0         if ($#sort > -1) {
    193 0           $buf .= "
    Sort:";
    194 0           my $comma = '';
    195 0           foreach my $c (@sort) {
    196 0           $buf .= $comma;
    197 0           $comma = ', ';
    198 0 0         $buf .= "" unless $opts{disable_sort};
    199 0           $buf .= escapeHTML($c);
    200 0 0         $buf .= "" unless $opts{disable_sort};
    201             }
    202 0           $buf .= "
    203             }
    204             $buf .=
    205 0           "
    206             "; "; \n"; "; "; \n";
    207            
    208            
    209            
    210 0           foreach my $colAlias (@{ $o->get_usersel_cols }) {
      0            
    211 0           my $colOpts = $$o{schema}{select}{$colAlias}[3];
    212 0           $buf .= "
    213 0 0 0       $buf .= " data-noselect" if $$colOpts{disable_select} || $opts{disable_select};
    214 0 0 0       $buf .= " data-nosort" if $$colOpts{disable_sort} || $opts{disable_sort};
    215 0 0 0       $buf .= " data-nofilter" if $$colOpts{disable_filter} || $opts{disable_filter};
    216 0           $buf .= ">".escapeHTML($o->get_nice_name($colAlias))."
    217             }
    218 0           $buf .= "
    219            
    220            
    221            
    222            
    223              
    224 0           my $recs_in_buffer = 0;
    225 0           my $typeMap = $o->{oq}->get_col_types('select');
    226 0           while (my $r = $o->fetch()) {
    227 0           $buf .= "
    ";
    228 0 0 0       if (ref($opts{OQdataLCol}) eq 'CODE') {
        0          
        0          
    229 0           $buf .= $opts{OQdataLCol}->($r);
    230             } elsif (ref($opts{buildEditLink}) eq 'CODE') {
    231 0           my $link = $opts{buildEditLink}->($o, $r, \%opts);
    232 0 0         if ($link ne '') {
    233 0           $buf .= "".$opts{editButtonLabel}."";
    234             }
    235             } elsif ($opts{editLink} ne '' && $$r{U_ID} ne '') {
    236 0 0         my $link = $opts{editLink}.(($opts{editLink} =~ /\?/)?'&':'?')."on_update=OQrefresh&act=load&id=$$r{U_ID}";
    237 0           $buf .= "".$opts{editButtonLabel}."";
    238             }
    239 0           $buf .= "
    240 0           foreach my $col (@{ $o->get_usersel_cols }) {
      0            
    241 0           my $val = $o->get_html_val($col);
    242 0   0       my $type = $$typeMap{$col} || 'char';
    243 0 0         $buf .= "$val
    244             }
    245 0           $buf .= "";
    246 0 0         if (ref($opts{OQdataRCol}) eq 'CODE') {
        0          
    247 0           $buf .= $opts{OQdataRCol}->($r);
    248             } elsif ($o->{q}->param('on_select') ne '') {
    249 0           my $on_select = $o->{q}->param('on_select');
    250 0           $on_select =~ s/\~.*//;
    251 0           my ($func,@argfields) = split /\,/, $on_select;
    252 0 0         $argfields[0] = 'U_ID' if $#argfields==-1;
    253             my @argvals = map {
    254 0           my $v=$$r{$_};
      0            
    255 0 0         $v = join(', ', @$v) if ref($v) eq 'ARRAY';
    256 0           $v =~ s/\~\~\~//g;
    257 0           $v;
    258             } @argfields;
    259 0           $buf .= "";
    261             }
    262 0           $buf .= "
    263 0 0         if (++$recs_in_buffer == 10000) {
    264 0           $$o{output_handler}->($buf);
    265 0           $buf = '';
    266 0           $recs_in_buffer = 0;
    267             }
    268             }
    269 0           $o->finish();
    270              
    271 0           $buf .= "
    \n";
    272              
    273 0           my $numpages = $o->get_num_pages();
    274              
    275 0           $buf .= "
    \n";
    276 0 0         if ($numpages != 1) {
    277 0           $buf .= "
    278 0 0         $buf .= " disabled" if $$o{page}==1;
    279 0           $buf .= "><";
    280             }
    281 0           $buf .= "
    282 0           foreach my $p (@{ $$o{schema}{results_per_page_picker_nums} }) {
      0            
    283 0 0         $buf .= "
    284             }
    285 0           $buf .= "";
    286 0 0         if ($numpages != 1) {
    287             $buf .= " "
    289             }
    290 0           $buf .= "
    291            
    292            
    $opts{OQformBottom}
    293            
    294            
    295            
    296            
    297            
    298            
    299            
    300            
    301            
    302            
    303             ";
    304              
    305 0 0         if ($dataonly) {
    306 0           $buf .= "";
    307             } else {
    308              
    309 0           $buf .= "
    $opts{OQdocBottom}
    ";
    310 0           $buf .= $opts{htmlFooter};
    311             }
    312              
    313 0           $$o{output_handler}->($buf);
    314              
    315 0           return undef;
    316             }
    317              
    318              
    319             1;