1 <& elements/search.html,
2 'title' => 'System Log',
3 'name_singular' => 'event',
4 'html_init' => include('.head'),
6 'count_query' => $count_query,
7 'header' => [ #'#', # lognum, probably not useful
14 'fields' => [ #'lognum',
50 'download_label' => 'Download this log',
53 <STYLE type="text/css">
54 a:link {text-decoration: none}
55 a:visited {text-decoration: none}
57 background-color: #ffffff;
62 <FORM ACTION="<%$p%>search/log.html" METHOD="GET">
63 <TABLE CELLSPACING="10">
66 <& /elements/input-date-field.html, {
68 value => $cgi->param('beginning'),
72 <& /elements/input-date-field.html, {
74 value => $cgi->param('ending') || '',
81 <& /elements/select.html,
84 labels => { map {$_ => $FS::Log::LEVELS[$_]} 0..7 },
85 curr_value => $cgi->param('min_level'),
88 <& /elements/select.html,
91 labels => { map {$_ => $FS::Log::LEVELS[$_]} 0..7 },
92 curr_value => $cgi->param('max_level'),
97 <& /elements/select.html,
99 options => \@contexts,
100 labels => { map {$_, $_} @contexts },
101 curr_value => ($cgi->param('context') || ''),
108 <& /elements/input-text.html,
112 curr_value => ($cgi->param('message') || ''),
114 <DIV STYLE="display:inline; float:right">
115 <INPUT TYPE="submit" VALUE="Refresh">
122 my $date_sub = sub { time2str('%Y-%m-%d %T', $_[0]->_date) };
124 my $level_sub = sub { $FS::Log::LEVELS[$_[0]->level] };
126 my $context_sub = sub {
128 ($log->context)[-1] . (scalar($log->context) > 1 ? '...' : '') ;
129 # XXX find a way to make this use less space (dropdown?)
134 my @context = $log->context;
135 # don't create a tooltip if there's only one context entry and the
136 # message isn't cut off
137 return '' if @context == 1 and length($log->message) <= 60;
138 my $html = '<DIV CLASS="tooltip">'.(shift @context).'</DIV>';
140 foreach (@context, $log->message) {
141 $html .= "<DIV>$pre$_</DIV>";
142 $pre = ' '.$pre;
147 my $object_sub = sub {
149 return '' unless $log->tablename;
150 # this is a sysadmin log; anyone reading it should be able to understand
151 # 'cust_main #2319' with no trouble.
152 $log->tablename . ' #' . $log->tablenum;
155 my $message_sub = sub {
157 my $message = $log->message;
158 if ( length($message) > 60 ) { # pretty arbitrary
159 $message = substr($message, 0, 57) . '...';
164 my $object_link_sub = sub {
166 my $table = $log->tablename or return;
168 if ( grep {$_ eq $table} (qw( cust_bill cust_main cust_pkg cust_svc ))
169 or $table =~ /^svc_/ )
172 return [ $fsurl.'view/'.$table.'.cgi?'. $log->tablenum ];
174 } elsif ( grep {$_ eq $table} (qw( cust_msg cust_pay cust_pay_void
175 cust_refund cust_statement )) )
178 return [ $fsurl.'view/'.$table.'.html?', $log->tablenum ];
180 } else { # you're on your own
198 my $color_sub = sub { $colors[ $_[0]->level ]; };
200 my @contexts = ('', sort FS::log_context->contexts);
203 my $curuser = $FS::CurrentUser::CurrentUser;
205 unless $curuser->access_right([ 'View system logs', 'Configuration' ]);
207 $cgi->param('min_level', 0) unless defined($cgi->param('min_level'));
208 $cgi->param('max_level', 7) unless defined($cgi->param('max_level'));
211 $search{'date'} = [ FS::UI::Web::parse_beginning_ending($cgi) ];
212 $search{'level'} = [ $cgi->param('min_level'), $cgi->param('max_level') ];
213 foreach my $param (qw(agentnum context tablename tablenum custnum message)) {
214 if ( $cgi->param($param) ) {
215 $search{$param} = $cgi->param($param);
218 my $query = FS::log->search(\%search); # validates everything
219 my $count_query = delete $query->{'count_query'};