File Coverage

lib/CGI/OptimalQuery/RecView.pm
Criterion Covered Total %
statement 12 180 6.6
branch 0 102 0.0
condition 0 42 0.0
subroutine 4 6 66.6
pod 0 2 0.0
total 16 332 4.8


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

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