Revision 6d4090f7
Von Tamino Steinert vor mehr als 1 Jahr hinzugefügt
SL/Controller/EmailJournal.pm | ||
---|---|---|
back_to => $back_to);
|
||
}
|
||
|
||
sub action_show_attachment {
|
||
my ($self) = @_;
|
||
|
||
$::auth->assert('email_journal');
|
||
|
||
my $attachment_id = $::form->{attachment_id};
|
||
my $attachment = SL::DB::EmailJournalAttachment->new(id => $attachment_id)->load;
|
||
|
||
return $self->send_file(
|
||
\$attachment->content,
|
||
name => $attachment->name,
|
||
type => $attachment->mime_type,
|
||
content_disposition => 'inline',
|
||
);
|
||
}
|
||
|
||
sub action_download_attachment {
|
||
my ($self) = @_;
|
||
|
||
... | ... | |
->replaceWith('#attachment_preview',
|
||
SL::Presenter::EmailJournal::attachment_preview(
|
||
$attachment,
|
||
style => "width:655px;border:1px solid black;margin:9px"
|
||
style => "height:1800px"
|
||
)
|
||
)
|
||
->render();
|
SL/Presenter/EmailJournal.pm | ||
---|---|---|
use strict;
|
||
|
||
use SL::Presenter::EscapedText qw(escape is_escaped);
|
||
use SL::Presenter::Tag qw(link_tag img_tag html_tag);
|
||
use SL::Presenter::Tag qw(link_tag html_tag div_tag);
|
||
use SL::Locale::String qw(t8);
|
||
use SL::SessionFile::Random;
|
||
use SL::DB::EmailJournalAttachment;
|
||
... | ... | |
my ($attachment_or_id, %params) = @_;
|
||
|
||
if (! $attachment_or_id) {
|
||
return is_escaped(html_tag('div', '', id => 'attachment_preview'));
|
||
}
|
||
my $attachment = ref $attachment_or_id ? $attachment_or_id
|
||
: SL::DB::EmailJournalAttachment->new(id => $attachment_or_id)->load;
|
||
|
||
# clean up mime_type
|
||
my $mime_type = $attachment->mime_type;
|
||
$mime_type =~ s/;.*//;
|
||
|
||
# parse to img tag
|
||
my $image_tags = '';
|
||
if ($mime_type =~ m{^image/}) {
|
||
my $image_content = $attachment->content;
|
||
my $img_base64 = "data:$mime_type;base64," . MIME::Base64::encode_base64($image_content);
|
||
my $image_tag = img_tag(
|
||
src => $img_base64,
|
||
alt => escape($attachment->name),
|
||
%params);
|
||
$image_tags .= $image_tag;
|
||
} elsif ($mime_type =~ m{^application/pdf}) {
|
||
my $pdf_content = $attachment->content;
|
||
my $session_file = SL::SessionFile::Random->new(mode => 'w');
|
||
$session_file->fh->print($pdf_content);
|
||
$session_file->fh->close;
|
||
my $image_size = 2048;
|
||
|
||
my $file_name = $session_file->file_name;
|
||
|
||
# files are created in session_files folder
|
||
my $command = 'pdftoppm -forcenum -scale-to '
|
||
. $image_size . ' -png' . ' '
|
||
. $file_name . ' ' . $file_name;
|
||
my $ans = system($command);
|
||
if ($ans != 0) {
|
||
return;
|
||
}
|
||
|
||
|
||
my @image_file_names = glob($file_name . '-*.png');
|
||
unlink($file_name);
|
||
|
||
my $image_count = scalar @image_file_names;
|
||
my $counter = 1;
|
||
foreach my $image_file_name (@image_file_names) {
|
||
my $image_file = SL::SessionFile->new($image_file_name, mode => 'r');
|
||
my $file_size = -s $image_file->file_name;
|
||
my $image_content;
|
||
read($image_file->fh, $image_content, $file_size);
|
||
my $img_base64 = 'data:image/png;base64,' . MIME::Base64::encode_base64($image_content);
|
||
my $name_ending = $image_count > 1 ? "-($counter/$image_count)" : '';
|
||
my $image_tag = img_tag(
|
||
src => $img_base64,
|
||
alt => escape($attachment->name) . $name_ending,
|
||
%params);
|
||
unlink($image_file->file_name);
|
||
$image_tags .= $image_tag;
|
||
}
|
||
return is_escaped(div_tag('', id => 'attachment_preview'));
|
||
}
|
||
my $attachment_id = ref $attachment_or_id ? $attachment_or_id->id
|
||
: $attachment_or_id;
|
||
|
||
my $attachment_preview = html_tag('div', $image_tags, id => 'attachment_preview');
|
||
require SL::Controller::EmailJournal;
|
||
my $src_url = SL::Controller::EmailJournal->new->url_for(
|
||
action => 'show_attachment',
|
||
attachment_id => $attachment_id
|
||
);
|
||
|
||
$params{style} .= "; display:flex; resize:both; overflow:hidden; padding-bottom:5px";
|
||
my $attachment_preview = div_tag(
|
||
html_tag('iframe', '', src => $src_url,
|
||
width => "100%", height => '100%',
|
||
"flex-grow" => '1',
|
||
),
|
||
id => 'attachment_preview',
|
||
%params
|
||
);
|
||
return is_escaped($attachment_preview);
|
||
}
|
||
|
templates/design40_webpages/email_journal/show.html | ||
---|---|---|
|
||
[% SET attachments = SELF.entry.attachments_sorted %]
|
||
|
||
<div class="input-panel" style="vertical-align:top;" id="wrapper-2">
|
||
<div class="wrapper input-panel" style="vertical-align:top;" id="wrapper-2">
|
||
|
||
[% IF attachments.size %]
|
||
<table id="email_journal_details" class="tbl-list">
|
||
... | ... | |
[% L.select_tag('record_action',
|
||
# id has to start with customer_ or vendor_ for picker selection
|
||
[
|
||
[ LxERP.t8("Hard linking"), [
|
||
[ LxERP.t8("Linking"), [
|
||
{id => "link_sales_quotation", name => LxERP.t8("Link to sales quotation")},
|
||
{id => "link_sales_order_intake", name => LxERP.t8("Link to sales order intake")},
|
||
{id => "link_sales_order", name => LxERP.t8("Link to sales order")},
|
templates/design40_webpages/order/form.html | ||
---|---|---|
<div class="wrapper" id="email_attachment_wrapper">
|
||
[% P.email_journal.attachment_preview(
|
||
SELF.email_attachment_id,
|
||
style="border:1px solid black;margin:9px"
|
||
style="height: 1800px"
|
||
);
|
||
%]
|
||
</div><!-- /.wrapper -->
|
templates/design40_webpages/order/tabs/basic_data.html | ||
---|---|---|
BLOCK panel_1;
|
||
P.email_journal.attachment_preview(
|
||
SELF.email_attachment_id,
|
||
style="width:520px;border:1px solid black;margin:9px"
|
||
style="height:600px"
|
||
);
|
||
END;
|
||
INCLUDE 'common/toggle_panel.html'
|
templates/webpages/email_journal/show.html | ||
---|---|---|
[% L.select_tag('record_action',
|
||
# id has to start with customer_ or vendor_ for picker selection
|
||
[
|
||
[ LxERP.t8("Hard linking"), [
|
||
[ LxERP.t8("Linking"), [
|
||
{id => "link_sales_quotation", name => LxERP.t8("Link to sales quotation")},
|
||
{id => "link_sales_order_intake", name => LxERP.t8("Link to sales order intake")},
|
||
{id => "link_sales_order", name => LxERP.t8("Link to sales order")},
|
templates/webpages/order/form.html | ||
---|---|---|
<div class="tabwidget" id="order_tabs">
|
||
<ul>
|
||
<li><a href="#ui-tabs-basic-data">[% 'Basic Data' | $T8 %]</a></li>
|
||
[% IF SELF.email_attachment_id %]
|
||
<li><a href="#ui-tabs-email-attachment-preview">[% 'Email Attachment Preview' | $T8 %]</a></li>
|
||
[% END %]
|
||
[%- IF INSTANCE_CONF.get_webdav %]
|
||
<li><a href="#ui-tabs-webdav">[% 'WebDAV' | $T8 %]</a></li>
|
||
[%- END %]
|
||
... | ... | |
cvars=SELF.order.custom_shipto.cvars_by_config
|
||
id_selector='#order_shipto_id' %]
|
||
</div>
|
||
[% IF SELF.email_attachment_id %]
|
||
<div id="ui-tabs-email-attachment-preview">
|
||
<div class="wrapper" id="email_attachment_wrapper">
|
||
[% P.email_journal.attachment_preview(
|
||
SELF.email_attachment_id,
|
||
style="height: 1800px"
|
||
);
|
||
%]
|
||
</div><!-- /.wrapper -->
|
||
</div><!-- /#ui-tabs-attachment-preview -->
|
||
[% END %]
|
||
|
||
</div>
|
||
</form>
|
Auch abrufbar als: Unified diff
EmailJournal: Anhangsvorschau mit kopierbaren Text