X-Git-Url: http://git.freeside.biz/gitweb/?a=blobdiff_plain;f=httemplate%2Fsearch%2Felements%2Fsearch.html;h=d44b454653267f1eeeab1242f85e22b2968466ab;hb=54a357b171aa44f9399b4c146acd2afd3b686075;hp=5afc3dc20961b39cd63ad7dbca118bb4080135e8;hpb=eb4ff7f73c5d4bdf74a3472448b5a195598ff4cd;p=freeside.git diff --git a/httemplate/search/elements/search.html b/httemplate/search/elements/search.html index 5afc3dc20..d44b45465 100644 --- a/httemplate/search/elements/search.html +++ b/httemplate/search/elements/search.html @@ -1,705 +1,456 @@ -% # options example... -% # (everything not commented required is optional) -% # -% # # basic options, required -% # 'title' => 'Page title', -% # -% # 'name_singular' => 'item', #singular name for the records returned -% # #OR# # (preferred, will be pluralized automatically) -% # 'name' => 'items', #plural name for the records returned -% # # (deprecated, will be singularlized -% # # simplisticly) -% # -% # # some HTML callbacks... -% # 'menubar' => '', #menubar arrayref -% # 'html_init' => '', #after the header/menubar and before the pager -% # 'html_form' => '', #after the pager, right before the results -% # # (only shown if there are results) -% # # (use this for any form-opening tag rather than -% # # html_init, to avoid a nested form) -% # 'html_foot' => '', #at the bottom -% # 'html_posttotal' => '', #at the bottom -% # # (these three can be strings or coderefs) -% # -% # -% # #literal SQL query string or qsearch hashref, required -% # 'query' => { -% # 'table' => 'tablename', -% # #everything else is optional... -% # 'hashref' => { 'field' => 'value', -% # 'field' => { 'op' => '<', -% # 'value' => '54', -% # }, -% # }, -% # 'select' => '*', -% # 'addl_from' => '', #'LEFT JOIN othertable USING ( key )', -% # 'extra_sql' => '', #'AND otherstuff', #'WHERE onlystuff', -% # 'order_by' => 'ORDER BY something', -% # -% # }, -% # # "select * from tablename"; -% # -% # #required unless 'query' is an SQL query string (shouldn't be...) -% # 'count_query' => 'SELECT COUNT(*) FROM tablename', -% # -% # 'count_addl' => [], #additional count fields listref of sprintf strings -% # # [ $money_char.'%.2f total paid', ], -% # -% # #listref of column labels,
- - - - | - -% unless ( $opt{'disable_download'} ) { - -
-% $cgi->param('_type', "$xlsname.xls" );
-
- Download full results - as Excel spreadsheet -% $cgi->param('_type', 'csv'); - - as CSV file - |
-% $cgi->param('_type', "html" );
-% }
-
- ||
- - <% my $pager = include ( '/elements/pager.html', - 'offset' => $offset, - 'num_rows' => scalar(@$rows), - 'total' => $total, - 'maxrecords' => $maxrecords, - ) %> - - <% defined($opt{'html_form'}) - ? ( ref($opt{'html_form'}) - ? &{$opt{'html_form'}}() - : $opt{'html_form'} - ) - : '' - %> - - <% include('/elements/table-grid.html') %> - - | |||
<% $header %> | -% } - -|||
---|---|---|---|
{$_}. '"'; -% } -% grep exists($e->{$_}), -% qw( align bgcolor colspan rowspan -% style valign width ) -% ). -% '>'. -% -% ( $e->{'link'} -% ? '' -% : '' -% ). -% ( $e->{'size'} -% ? '' -% : '' -% ). -% ( $e->{'data_style'} -% ? '<'. uc($e->{'data_style'}). '>' -% : '' -% ). -% $e->{'data'}. -% ( $e->{'data_style'} -% ? ''. uc($e->{'data_style'}). '>' -% : '' -% ). -% ( $e->{'size'} ? '' : '' ). -% ( $e->{'link'} ? '' : '' ). -% ' | '; -% -% } @$rowref ). -% -% '
><% $font %><% $a %><% $s %><% $field %><% $es %><% $a ? '' : '' %><% $font ? '' : '' %> | -% } -% } else { -% foreach ( @$row ) { - -<% $_ %> | -% } -% } - - -% } -% if ( $opt{'footer'} ) { - -
<% $footer %> % } +<%init> + +my(%opt) = @_; +#warn join(' / ', map { "$_ => $opt{$_}" } keys %opt ). "\n"; + +my $curuser = $FS::CurrentUser::CurrentUser; + +my $type = $cgi->param('_type') =~ /^(csv|\w*\.xls|xml|select|html(-print)?)$/ + ? $1 : 'html' ; + +if ( !$curuser->access_right('Download report data') ) { + $opt{'disable_download'} = 1; + $type = 'html'; +} + +my %align = ( + 'l' => 'left', + 'r' => 'right', + 'c' => 'center', + ' ' => '', + '.' => '', +); +$opt{align} = [ map $align{$_}, split(//, $opt{align}) ], + unless !$opt{align} || ref($opt{align}); + +if($type =~ /csv|xls/) { + my $h = $opt{'header'}; + my @del; + my $i = 0; + do { + if( ref($h->[$i]) and exists($h->[$i]->{'nodownload'}) ) { + splice(@{$opt{$_}}, $i, 1) foreach + qw(header footer fields links link_onclicks + align color size style cell_style xls_format); + } + else { + $i++; + } + } while ( exists($h->[$i]) ); +} + +# wtf? +$opt{disable_download} = 0 + if $opt{disable_download} && $curuser->access_right('Configuration download'); + +$opt{disable_download} = 1 + if $opt{really_disable_download}; + +my @link_agentnums = (); +my $null_link = ''; +if ( $opt{'agent_virt'} ) { + + @link_agentnums = $curuser->agentnums; + $null_link = $curuser->access_right( $opt{'agent_null_right_link'} + || $opt{'agent_null_right'} ); + + my $agentnums_sql = $curuser->agentnums_sql( + 'null' => $opt{'agent_null'}, + 'null_right' => $opt{'agent_null_right'}, + 'table' => $opt{'query'}{'table'}, + ); + + $opt{'query'}{'extra_sql'} .= + ( $opt{'query'}{'extra_sql'} =~ /WHERE/i || keys %{$opt{'query'}{'hashref'}} + ? ' AND ' + : ' WHERE ' ). $agentnums_sql; + + $opt{'count_query'} .= + ( $opt{'count_query'} =~ /WHERE/i ? ' AND ' : ' WHERE ' ). $agentnums_sql; + + if ( $opt{'agent_pos'} || $opt{'agent_pos'} eq '0' + and scalar($curuser->agentnums) > 1 ) { + #false laziness w/statuspos above + my $pos = $opt{'agent_pos'}; + + foreach my $att (qw( align color size style cell_style xls_format )) { + $opt{$att} ||= [ map '', @{ $opt{'fields'} } ]; + } + + splice @{ $opt{'header'} }, $pos, 0, 'Agent'; + splice @{ $opt{'align'} }, $pos, 0, 'c'; + splice @{ $opt{'style'} }, $pos, 0, ''; + splice @{ $opt{'size'} }, $pos, 0, ''; + splice @{ $opt{'fields'} }, $pos, 0, + sub { $_[0]->agentnum ? $_[0]->agent->agent : '(global)'; }; + splice @{ $opt{'color'} }, $pos, 0, ''; + splice @{ $opt{'links'} }, $pos, 0, '' #[ 'agent link?', 'agentnum' ] + if $opt{'links'}; + splice @{ $opt{'link_onclicks'} }, $pos, 0, '' + if $opt{'link_onclicks'}; + + } + +} + +if ( $opt{'disableable'} ) { + + unless ( $cgi->param('showdisabled') ) { #modify searches + + $opt{'query'}{'hashref'}{'disabled'} = ''; + $opt{'query'}{'extra_sql'} =~ s/^\s*WHERE/ AND/i; + + $opt{'count_query'} .= + ( $opt{'count_query'} =~ /WHERE/i ? ' AND ' : ' WHERE ' ). + "( disabled = '' OR disabled IS NULL )"; + + } elsif ( $opt{'disabled_statuspos'} + || $opt{'disabled_statuspos'} eq '0' ) { #add status column + + my $pos = $opt{'disabled_statuspos'}; + + foreach my $att (qw( align style color size )) { + $opt{$att} ||= [ map '', @{ $opt{'fields'} } ]; + } + + splice @{ $opt{'header'} }, $pos, 0, 'Status'; + splice @{ $opt{'align'} }, $pos, 0, 'c'; + splice @{ $opt{'style'} }, $pos, 0, 'b'; + splice @{ $opt{'size'} }, $pos, 0, ''; + splice @{ $opt{'fields'} }, $pos, 0, + sub { shift->disabled ? 'DISABLED' : 'Active'; }; + splice @{ $opt{'color'} }, $pos, 0, + sub { shift->disabled ? 'FF0000' : '00CC00'; }; + splice @{ $opt{'links'} }, $pos, 0, '' + if $opt{'links'}; + splice @{ $opt{'link_onlicks'} }, $pos, 0, '' + if $opt{'link_onlicks'}; + } + + #add show/hide disabled links + my $items = $opt{'name'} || PL($opt{'name_singular'}); + if ( $cgi->param('showdisabled') ) { + $cgi->param('showdisabled', 0); + $opt{'html_posttotal'} .= + '( hide disabled $items )!; #" + $cgi->param('showdisabled', 1); + } else { + $cgi->param('showdisabled', 1); + $opt{'html_posttotal'} .= + '( show disabled $items )!; #" + $cgi->param('showdisabled', 0); + } + +} + +my $limit = ''; +my($confmax, $maxrecords, $offset ); + +unless ( $type =~ /^(csv|xml|\w*.xls)$/) { +# html mode + unless (exists($opt{count_query}) && length($opt{count_query})) { + ( $opt{count_query} = $opt{query} ) =~ + s/^\s*SELECT\s*(.*?)\s+FROM\s/SELECT COUNT(*) FROM /i; #silly vim:/ + } + + if ( $opt{disableable} && ! $cgi->param('showdisabled') ) { + $opt{count_query} .= + ( ( $opt{count_query} =~ /WHERE/i ) ? ' AND ' : ' WHERE ' ). + "( disabled = '' OR disabled IS NULL )"; + } + + unless ( $type eq 'html-print' ) { + + #setup some pagination things if we're in html mode + + my $conf = new FS::Conf; + $confmax = $conf->config('maxsearchrecordsperpage'); + if ( $cgi->param('maxrecords') =~ /^(\d+)$/ ) { + $maxrecords = $1; + } else { + $maxrecords ||= $confmax; + } + + $opt{'disable_maxselect'} ||= $conf->exists('disable_maxselect'); + + $limit = $maxrecords ? "LIMIT $maxrecords" : ''; + + $offset = $cgi->param('offset') =~ /^(\d+)$/ ? $1 : 0; + $limit .= " OFFSET $offset" if $offset; + + } + +} + +#order by override +my $order_by = ''; +#if ( $cgi->param('order_by') =~ /^([\w\, ]+)$/ ) { +# $order_by = $1; +#} +$order_by = $cgi->param('order_by') if $cgi->param('order_by'); + +# run the query + +my $header = [ map { ref($_) ? $_->{'label'} : $_ } @{$opt{header}} ]; +my $rows; +if ( ref($opt{query}) ) { + + my @query; + if (ref($opt{query}) eq 'HASH') { + @query = ( $opt{query} ); + + if ( $order_by ) { + if ( $opt{query}->{'order_by'} ) { + if ( $opt{query}->{'order_by'} =~ /^(\s*ORDER\s+BY\s+)?(\S.*)$/is ) { + $opt{query}->{'order_by'} = "ORDER BY $order_by, $2"; + } else { + warn "unparsable query order_by: ". $opt{query}->{'order_by'}; + die "unparsable query order_by: ". $opt{query}->{'order_by'}; + } + } else { + $opt{query}->{'order_by'} = "ORDER BY $order_by"; + } + } + + } elsif (ref($opt{query}) eq 'ARRAY') { + @query = @{ $opt{query} }; + } else { + die "invalid query reference"; + } + + if ( $opt{disableable} && ! $cgi->param('showdisabled') ) { + #%search = ( 'disabled' => '' ); + $opt{'query'}->{'hashref'}->{'disabled'} = ''; + $opt{'query'}->{'extra_sql'} =~ s/^\s*WHERE/ AND/i; + } + + #eval "use FS::$opt{'query'};"; + my @param = qw( select table addl_from hashref extra_sql order_by ); + $rows = [ qsearch( [ map { my $query = $_; + ({ map { $_ => $query->{$_} } @param }); + } + @query + ], + 'order_by' => $opt{order_by}. " ". $limit, + ) + ]; +} else { + my $sth = dbh->prepare("$opt{'query'} $limit") + or die "Error preparing $opt{'query'}: ". dbh->errstr; + $sth->execute + or die "Error executing $opt{'query'}: ". $sth->errstr; - |