Merge branch 'master' of github.com:kivitendo/kivitendo-erp
[kivitendo-erp.git] / SL / Dispatcher.pm
index 5282369..01b6aff 100644 (file)
@@ -16,6 +16,7 @@ BEGIN {
   unshift @INC, $exe_dir;
 }
 
+use Carp;
 use CGI qw( -no_xhtml);
 use Config::Std;
 use DateTime;
@@ -30,6 +31,7 @@ use SL::Dispatcher::AuthHandler;
 use SL::LXDebug;
 use SL::LxOfficeConf;
 use SL::Locale;
+use SL::ClientJS;
 use SL::Common;
 use SL::Form;
 use SL::Helper::DateTime;
@@ -74,6 +76,14 @@ sub pre_request_checks {
   }
 }
 
+sub render_error_ajax {
+  my ($error) = @_;
+
+  SL::ClientJS->new
+    ->error($error)
+    ->render(SL::Controller::Base->new);
+}
+
 sub show_error {
   $::lxdebug->enter_sub;
   my $template             = shift;
@@ -85,6 +95,8 @@ sub show_error {
   $::form->{error}         = $::locale->text('The session is invalid or has expired.') if ($error_type eq 'session');
   $::form->{error}         = $::locale->text('Incorrect password!')                    if ($error_type eq 'password');
 
+  return render_error_ajax($::form->{error}) if $::request->is_ajax;
+
   $::form->header;
   print $::form->parse_html_template($template, \%params);
   $::lxdebug->leave_sub;
@@ -117,6 +129,8 @@ sub pre_startup_setup {
     $::lxdebug->warn(@_);
   };
 
+  $SIG{__DIE__} = sub { Carp::confess( @_ ) } if $::lx_office_conf{debug}->{backtrace_on_die};
+
   $self->_cache_file_modification_times;
 }
 
@@ -198,6 +212,7 @@ sub handle_request {
   my %routing;
   eval { %routing = _route_request($ENV{SCRIPT_NAME}); 1; } or return;
   ($routing_type, $script_name, $action) = @routing{qw(type controller action)};
+  $::lxdebug->log_request($routing_type, $script_name, $action);
 
   $::request->type(lc($routing{request_type} || 'html'));
 
@@ -271,11 +286,17 @@ sub handle_request {
 
     1;
   } or do {
-    if ($EVAL_ERROR ne END_OF_REQUEST) {
-      print STDERR $EVAL_ERROR;
-      $::form->{label_error} = $::request->{cgi}->pre($EVAL_ERROR);
-      chdir SL::System::Process::exe_dir;
-      eval { show_error('generic/error') };
+    if (substr($EVAL_ERROR, 0, length(END_OF_REQUEST())) ne END_OF_REQUEST()) {
+      my $error = $EVAL_ERROR;
+      print STDERR $error;
+
+      if ($::request->is_ajax) {
+        eval { render_error_ajax($error) };
+      } else {
+        $::form->{label_error} = $::request->{cgi}->pre($error);
+        chdir SL::System::Process::exe_dir;
+        eval { show_error('generic/error') };
+      }
     }
   };