File Coverage

lib/CGI/OptimalQuery/InteractiveQuery2.pm
Criterion Covered Total %
statement 15 16 93.7
branch 0 2 0.0
condition n/a
subroutine 5 6 83.3
pod 0 1 0.0
total 20 25 80.0


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

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