]> wagnertech.de Git - mfinanz.git/blobdiff - SL/Controller/Base.pm
kivitendo 3.9.2-0.2
[mfinanz.git] / SL / Controller / Base.pm
index 8b02ce0d494516c1c7e6f55e2fe2a94678b1d2f6..3c5f919de85266eab27b2f4859947444eae5a525 100644 (file)
@@ -7,6 +7,7 @@ use parent qw(Rose::Object);
 use Carp;
 use IO::File;
 use List::Util qw(first);
+use MIME::Base64;
 use SL::Request qw(flatten);
 use SL::MoreCommon qw(uri_encode);
 use SL::Presenter;
@@ -14,7 +15,7 @@ use SL::Presenter;
 use Rose::Object::MakeMethods::Generic
 (
   scalar                  => [ qw(action_name) ],
-  'scalar --get_set_init' => [ qw(js) ],
+  'scalar --get_set_init' => [ qw(js p) ],
 );
 
 #
@@ -74,6 +75,7 @@ sub render {
     header     => 1,
     layout     => 1,
     process    => 1,
+    status     => '200 ok',
   );
   $options->{$_} //= $defaults{$_} for keys %defaults;
   $options->{type} = lc $options->{type};
@@ -130,7 +132,8 @@ sub render {
                         :                              'application/json';
 
       print $::form->create_http_response(content_type => $content_type,
-                                          charset      => 'UTF-8');
+                                          charset      => 'UTF-8',
+                                          (status      => $options->{status}) x !!$options->{status});
     }
   }
 
@@ -153,19 +156,26 @@ sub send_file {
   }
 
   my $content_type    =  $params{type} || 'application/octet_stream';
+  my $content_disposition = $params{content_disposition} || 'attachment';
   my $attachment_name =  $params{name} || (!ref($file_name_or_content) ? $file_name_or_content : '');
   $attachment_name    =~ s:.*//::g;
 
-  print $::form->create_http_response(content_type        => $content_type,
-                                      content_disposition => 'attachment; filename="' . $attachment_name . '"',
-                                      content_length      => $size);
-
-  if (!ref $file_name_or_content) {
-    $::locale->with_raw_io(\*STDOUT, sub { print while <$file> });
-    $file->close;
-    unlink $file_name_or_content if $params{unlink};
+  if ($::request->is_ajax || $params{ajax}) {
+    my $octets = ref $file_name_or_content ? $file_name_or_content : \ do { local $/ = undef; <$file> };
+    $self->js->save_file(MIME::Base64::encode_base64($$octets), $content_type, $size, $attachment_name);
+    $self->js->render unless $params{js_no_render};
   } else {
-    $::locale->with_raw_io(\*STDOUT, sub { print $$file_name_or_content });
+    print $::form->create_http_response(content_type        => $content_type,
+                                        content_disposition => $content_disposition . '; filename="' . $attachment_name . '"',
+                                        content_length      => $size);
+
+    if (!ref $file_name_or_content) {
+      $::locale->with_raw_io(\*STDOUT, sub { print while <$file> });
+      $file->close;
+      unlink $file_name_or_content if $params{unlink};
+    } else {
+      $::locale->with_raw_io(\*STDOUT, sub { print $$file_name_or_content });
+    }
   }
 
   return 1;
@@ -175,6 +185,10 @@ sub presenter {
   return SL::Presenter->get;
 }
 
+sub init_p {
+  return SL::Presenter->get;
+}
+
 sub controller_name {
   my $class = ref($_[0]) || $_[0];
   $class    =~ s/^SL::Controller:://;