2 my $conf = FS::Conf->new;
6 $opt{'name'} ||= PL($opt{'name_singular'});
8 my $group_info = $m->comp('core', %opt);
12 if ( $group_info->{num} == 0 ) {
13 $redirect = $opt{'redirect_empty'};
14 $redirect = &$redirect($cgi) if $redirect && ref($redirect) eq 'CODE';
16 redirect( $redirect );
17 } else { # just print this stuff and exit
18 $m->comp('/elements/header.html', $opt{'title'});
19 $m->print('<BR><BR>No matching ' . $opt{'name'} . ' found.<BR>');
20 $m->comp('/elements/footer.html');
25 # this mode has a concept of "current group"
27 if ($cgi->param('group') =~ /^(\d+)$/) {
31 my $group = $group_info->{groups}[$curr_group];
32 my $query = $group_info->{queries}[$curr_group];
33 my $footer = $group_info->{group_footers}[$curr_group];
34 my $total_footer = $group_info->{total_footer} || [];
37 my $maxrecords = $conf->config('maxsearchrecordsperpage') || 100;
38 if ( $cgi->param('maxrecords') =~ /^(\d+)$/ ) {
42 $limit = "LIMIT $maxrecords";
43 if ( $cgi->param('offset') =~ /^(\d+)$/ ) {
45 $limit .= " OFFSET $offset";
48 $query->{order_by} .= $limit if $limit;
50 #warn Dumper($query); #DEBUG
53 my @rows = $query->qsearch;
55 #warn Dumper(\@rows); #DEBUG
58 # show pager if needed
59 if ( $group->num_rows > scalar(@rows) ) {
60 $pager = include( '/elements/pager.html',
62 'num_rows' => scalar(@rows),
63 'total' => $group->num_rows,
64 'maxrecords' => $maxrecords,
70 if ($group_info->{num} > 1) {
71 for (my $i = 0; $i < $group_info->{num}; $i++) {
72 push @menubar, $group_info->{group_labels}[$i], ";group=$i";
76 # not enabled yet; if we need this at some point, enable it on a per-report
77 # basis and then disable it for search/cust_pay.html, because it's redundant
78 # to see "Check Check #130108", "Credit card Card #401...", etc.
80 ## if this is the combined view, add a column for the group key
81 #if ( $curr_group == 0 and $opt{'show_combined'} ) {
82 # unshift @{$opt{'header'}}, '';
83 # unshift @{$opt{'fields'}}, $opt{group_label};
84 # unshift @{$opt{'sort_fields'}}, $opt{group_column} if $opt{'sort_fields'};
85 # $opt{'align'} = 'c'.$opt{'align'};
86 # foreach (qw(header2 links link_onclicks color size style cell_style xls_format)) {
88 # unshift @{$opt{$_}}, '';
95 <& /elements/header.html, $opt{title} &>
98 % $cgi->delete('group');
99 % $cgi->delete('offset');
100 % $cgi->delete('type');
101 <& /elements/menubar.html,
103 url_base => $cgi->self_url,
104 selected => $group_info->{group_labels}[$curr_group] },
108 <DIV CLASS="fstabcontainer">
109 % if ( $group->num_rows > 0 ) {
110 <P><% emt('[quant,_1,_2]', $group->num_rows, $opt{name_singular}) %>
113 <P><% emt('Download results:') %>
114 % $cgi->param('type', 'xls');
115 <A HREF="<% $cgi->self_url %>"><% emt('Spreadsheet') %></A> |
116 % $cgi->param('type', 'html-print');
117 <A HREF="<% $cgi->self_url %>"><% emt('webpage') %></A>
118 % $cgi->delete('type');
131 <& /search/elements/search-html.html:header_row,
132 'header' => $opt{'header'},
133 'header2' => $opt{'header2'},
134 'sort_fields' => ($opt{'sort_fields'} || $opt{'fields'}),
138 <& /search/elements/search-html.html:data_rows,
144 <& /search/elements/search-html.html:footer_row, row => $footer, opt => \%opt &>
145 % if ( scalar @$total_footer ) {
146 <& /search/elements/search-html.html:footer_row, row => $total_footer, opt => \%opt &>
154 <& /elements/footer.html &>