File Coverage

lib/CGI/OptimalQuery/InteractiveQuery2.pm
Criterion Covered Total %
statement 15 15 100.0
branch n/a
condition n/a
subroutine 5 5 100.0
pod n/a
total 20 20 100.0


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

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