ActionBar: Unterstützung in ReportGenerator
authorMoritz Bunkus <m.bunkus@linet-services.de>
Fri, 11 Nov 2016 10:46:09 +0000 (11:46 +0100)
committerMoritz Bunkus <m.bunkus@linet-services.de>
Tue, 28 Feb 2017 09:43:57 +0000 (10:43 +0100)
SL/Controller/Helper/ReportGenerator.pm
SL/ReportGenerator.pm
bin/mozilla/reportgenerator.pl
locale/de/all
templates/webpages/report_generator/csv_export_options.html
templates/webpages/report_generator/html_report.html
templates/webpages/report_generator/pdf_export_options.html

index e84f9ca..20ab8c3 100644 (file)
@@ -16,6 +16,24 @@ our @EXPORT = qw(
   report_generator_list_objects
 );
 
+sub _setup_action_bar {
+  my ($self, $type) = @_;
+
+  my $key   = $::form->{CONTROLLER_DISPATCH} ? 'action'                             : 'report_generator_form.report_generator_dispatch_to';
+  my $value = $::form->{CONTROLLER_DISPATCH} ? $::form->{CONTROLLER_DISPATCH} . "/" : '';
+
+  $::request->layout->get('actionbar')->add(
+    action => [
+      $type eq 'pdf' ? $::locale->text('PDF export') : $::locale->text('CSV export'),
+      submit => [ '#report_generator_form', { $key => "${value}report_generator_export_as_${type}" } ],
+    ],
+    action => [
+      $::locale->text('Back'),
+      submit => [ '#report_generator_form', { $key => "${value}report_generator_back" } ],
+    ],
+  );
+}
+
 sub action_report_generator_export_as_pdf {
   my ($self) = @_;
 
@@ -42,6 +60,9 @@ sub action_report_generator_export_as_pdf {
 
   $::form->{copies} = max $::myconfig{copies} * 1, 1;
   $::form->{title} = $::locale->text('PDF export -- options');
+
+  _setup_action_bar($self, 'pdf'); # Sub not exported, therefore don't call via object.
+
   $::form->header;
   print $::form->parse_html_template('report_generator/pdf_export_options', {
     'HIDDEN'               => \@form_values,
@@ -61,6 +82,9 @@ sub action_report_generator_export_as_csv {
   my @form_values = $::form->flatten_variables(grep { ($_ ne 'login') && ($_ ne 'password') } keys %{ $::form });
 
   $::form->{title} = $::locale->text('CSV export -- options');
+
+  _setup_action_bar($self, 'csv'); # Sub not exported, therefore don't call via object.
+
   $::form->header;
   print $::form->parse_html_template('report_generator/csv_export_options', { 'HIDDEN' => \@form_values });
 }
@@ -116,10 +140,13 @@ sub report_generator_list_objects {
     $params{report}->add_data(\%data);
   }
 
+  my %options            = %{ $params{options} || {} };
+  $options{action_bar} //= $params{action_bar};
+
   if ($params{layout}) {
-    return $params{report}->generate_with_headers(%{ $params{options} || {}});
+    return $params{report}->generate_with_headers(%options);
   } else {
-    my $html = $params{report}->generate_html_content(%{ $params{options} || {}});
+    my $html = $params{report}->generate_html_content(%options);
     $self->render(\$html , { layout => 0, process => 0 });
   }
 }
@@ -235,6 +262,15 @@ L<SL::ReportGenrator/add_data>.
 An optional hash reference that's passed verbatim to the function
 L<SL::ReportGenerator/generate_with_headers>.
 
+=item C<action_bar>
+
+If the buttons for exporting PDF and/or CSV variants are included in
+the action bar. Otherwise they're rendered at the bottom of the page.
+
+The value can be either a specific action bar instance or simply 1 in
+which case the default action bar is used:
+C<$::request-E<gt>layout-E<gt>get('actionbar')>.
+
 =back
 
 =back
index 0a61195..36a81f3 100644 (file)
@@ -2,6 +2,7 @@ package SL::ReportGenerator;
 
 use Data::Dumper;
 use List::Util qw(max);
+use Scalar::Util qw(blessed);
 use Text::CSV_XS;
 #use PDF::API2;    # these two eat up to .75s on startup. only load them if we actually need them
 #use PDF::Table;
@@ -232,12 +233,13 @@ sub generate_with_headers {
   }
 
   if ($format eq 'html') {
+    my $content    = $self->generate_html_content(%params);
     my $title      = $form->{title};
     $form->{title} = $self->{title} if ($self->{title});
     $form->header(no_layout => $params{no_layout});
     $form->{title} = $title;
 
-    print $self->generate_html_content();
+    print $content;
 
   } elsif ($format eq 'csv') {
     # FIXME: don't do mini http in here
@@ -275,7 +277,7 @@ sub html_format {
 }
 
 sub prepare_html_content {
-  my $self = shift;
+  my ($self, %params) = @_;
 
   my ($column, $name, @column_headers);
 
@@ -407,14 +409,47 @@ sub prepare_html_content {
     'DATA_PRESENT'         => $self->{data_present},
     'CONTROLLER_DISPATCH'  => $opts->{controller_class},
     'TABLE_CLASS'          => $opts->{table_class},
+    'SKIP_BUTTONS'         => !!$params{action_bar},
   };
 
   return $variables;
 }
 
+sub setup_action_bar {
+  my ($self, $action_bar, $variables) = @_;
+
+  my @actions;
+  foreach my $type (qw(pdf csv)) {
+    next unless $variables->{"ALLOW_" . uc($type) . "_EXPORT"};
+
+    my $key   = $variables->{CONTROLLER_DISPATCH} ? 'action' : 'report_generator_dispatch_to';
+    my $value = "report_generator_export_as_${type}";
+    $value    = $variables->{CONTROLLER_DISPATCH} . "/${value}" if $variables->{CONTROLLER_DISPATCH};
+
+    push @actions, action => [
+      $type eq 'pdf' ? $::locale->text('PDF export') : $::locale->text('CSV export'),
+      submit => [ '#report_generator_form', { $key => $value } ],
+    ];
+  }
+
+  if (scalar(@actions) > 1) {
+    @actions = (
+      combobox => [
+        action => [ $::locale->text('Export') ],
+        @actions,
+      ],
+    );
+  }
+
+  $action_bar = ($::request->layout->get('actionbar'))[0] unless blessed($action_bar);
+  $action_bar->add(@actions) if @actions;
+}
+
 sub generate_html_content {
-  my $self      = shift;
-  my $variables = $self->prepare_html_content();
+  my ($self, %params) = @_;
+  my $variables = $self->prepare_html_content(%params);
+
+  $self->setup_action_bar($params{action_bar}, $variables) if $params{action_bar};
 
   my $stuff  = $self->{form}->parse_html_template($self->{options}->{html_template}, $variables);
   return $stuff;
@@ -661,7 +696,7 @@ sub generate_pdf_content {
   my $content = $pdf->stringify();
 
   $main::lxdebug->message(LXDebug->DEBUG2(),"addattachments ?? =".$form->{report_generator_addattachments}." GL=".$form->{GL});
-  if ( $form->{report_generator_addattachments} eq 'yes' && $form->{GL}) {
+  if ($form->{report_generator_addattachments} && $form->{GL}) {
     $content = $self->append_gl_pdf_attachments($form,$content);
   }
 
index 2304e49..5ba261f 100644 (file)
@@ -34,6 +34,28 @@ sub report_generator_set_default_sort {
 }
 
 
+sub report_generator_setup_action_bar {
+  my ($type, %params) = @_;
+
+  $::request->layout->get('actionbar')->add(
+    combobox => [
+      action => [
+        $type eq 'pdf' ? $::locale->text('PDF export') : $::locale->text('CSV export'),
+        submit => [ '#report_generator_form', { 'report_generator_dispatch_to' => "report_generator_export_as_${type}" } ],
+      ],
+      action => [
+        $::locale->text('PDF export with attachments'),
+        submit  => [ '#report_generator_form', { report_generator_dispatch_to => "report_generator_export_as_pdf", report_generator_addattachments => 1 } ],
+        only_if => $params{allow_attachments},
+      ],
+    ],
+    action => [
+      $::locale->text('Back'),
+      submit => [ '#report_generator_form', { 'report_generator_dispatch_to' => "report_generator_back" } ],
+    ],
+  );
+}
+
 sub report_generator_export_as_pdf {
   $main::lxdebug->enter_sub();
 
@@ -64,15 +86,15 @@ sub report_generator_export_as_pdf {
   $form->{copies} = max $myconfig{copies} * 1, 1;
 
   my $allow_font_selection = 1;
-  my $allow_attachments    = 0;
   eval { require PDF::API2; };
   $allow_font_selection = 0 if ($@);
-  $allow_attachments    = 1 if $form->{report_generator_hidden_l_attachments};
 
   $form->{title} = $locale->text('PDF export -- options');
+
+  report_generator_setup_action_bar('pdf', allow_attachments => !!$form->{report_generator_hidden_l_attachments});
+
   $form->header();
   print $form->parse_html_template('report_generator/pdf_export_options', { 'HIDDEN'               => \@form_values,
-                                                                            'ALLOW_ATTACHMENTS'    => $allow_attachments,
                                                                             'ALLOW_FONT_SELECTION' => $allow_font_selection, });
 
   $main::lxdebug->leave_sub();
@@ -93,6 +115,9 @@ sub report_generator_export_as_csv {
   my @form_values = $form->flatten_variables(grep { ($_ ne 'login') && ($_ ne 'password') } keys %{ $form });
 
   $form->{title} = $locale->text('CSV export -- options');
+
+  report_generator_setup_action_bar('csv');
+
   $form->header();
   print $form->parse_html_template('report_generator/csv_export_options', { 'HIDDEN' => \@form_values });
 
index 30e63fc..f0785c8 100755 (executable)
@@ -482,6 +482,7 @@ $self->{texts} = {
   'CN'                          => 'Kd-Nr.',
   'CR'                          => 'H',
   'CSS style for pictures'      => 'CSS Style für Bilder',
+  'CSV export'                  => 'CSV-Export',
   'CSV export -- options'       => 'CSV-Export -- Optionen',
   'CSV import: ar transactions' => 'CSV Import: Debitorenbuchungen',
   'CSV import: bank transactions' => 'CSV Import: Bankbewegungen',
@@ -2030,7 +2031,9 @@ $self->{texts} = {
   'PAYMENT POSTED'              => 'Rechnung gebucht',
   'PDF'                         => 'PDF',
   'PDF (OpenDocument/OASIS)'    => 'PDF (OpenDocument/OASIS)',
+  'PDF export'                  => 'PDF-Export',
   'PDF export -- options'       => 'PDF-Export -- Optionen',
+  'PDF export with attachments' => 'Als PDF mit Anhängen exportieren',
   'PLZ Grosskunden'             => 'PLZ Grosskunden',
   'POSTED'                      => 'Gebucht',
   'POSTED AS NEW'               => 'Als neu gebucht',
index 45a1fce..0857151 100644 (file)
@@ -3,7 +3,7 @@
 
  <h1>[% HTML.escape(title) %]</h1>
 
- <form action="[% HTML.escape(script) %]" method="post" name="report_generator_form">
+ <form action="[% HTML.escape(script) %]" method="post" name="report_generator_form" id="report_generator_form">
 
   [%- FOREACH var = HIDDEN %]
   <input type="hidden" name="[% HTML.escape(var.key) %]" value="[% HTML.escape(var.value) %]">
   </table>
 
 [%- IF CONTROLLER_DISPATCH %]
-   <p>
-    <input type="hidden" name="action" value="[% CONTROLLER_DISPATCH | html %]/dispatch">
-    <input type="submit" name="action_report_generator_export_as_csv" value="[% 'Export as CSV' | $T8 %]">
-    <input type="submit" name="action_report_generator_back" value="[% 'Back' | $T8 %]">
     <input type="hidden" name="CONTROLLER_DISPATCH" value="[% CONTROLLER_DISPATCH | html %]">
-   </p>
 [%- ELSE %]
-  <p>
    <input type="hidden" name="action" value="report_generator_dispatcher">
-   <input type="submit" class="submit" onclick="submit_report_generator_form('report_generator_export_as_csv')" value="[% 'Export as CSV' | $T8 %]">
-   <input type="submit" class="submit" onclick="submit_report_generator_form('report_generator_back')" value="[% 'Back' | $T8 %]">
-  </p>
- <script type="text/javascript"><!--
-      function submit_report_generator_form(nextsub) {
-        document.report_generator_form.report_generator_dispatch_to.value = nextsub;
-        document.report_generator_form.submit();
-      } // -->
- </script>
 [%- END %]
 
 
index 2dfc871..bd9ac7a 100644 (file)
@@ -30,6 +30,7 @@
  [% IF DATA_PRESENT %]
  <p>
   <table [% IF TABLE_CLASS %]class="[% TABLE_CLASS %]"[% END %] id="report_table_id" width="100%">
+   <thead>
    [%- FOREACH row = HEADER_ROWS %]
    <tr>
     [% FOREACH col = row %]
@@ -49,7 +50,9 @@
     [% END %]
    </tr>
    [%- END %]
+   </thead>
 
+   <tbody>
    [% FOREACH row = ROWS %]
     [% IF row.IS_CONTROL %]
      [% IF row.IS_COLSPAN_DATA %]<tr><td colspan="[% row.NUM_COLUMNS %]">[% row.data %]</td></tr>[% END %]
@@ -82,6 +85,7 @@
     [% END %]
    [% END %]
 
+   </tbody>
   </table>
   <hr size="3" noshade>
  </p>
  [% END %]
 
  [% IF SHOW_EXPORT_BUTTONS %]
-  <form action="[% HTML.escape(script) %]" name="report_generator_form" method="post">
+  <form action="[% HTML.escape(script) %]" name="report_generator_form" id="report_generator_form" method="post">
    [% FOREACH var = EXPORT_VARIABLES %]<input type="hidden" name="report_generator_hidden_[% var.key %]" value="[% HTML.escape(var.value) %]">
    [% END %]
 
 [%- IF CONTROLLER_DISPATCH %]
+[% IF !SKIP_BUTTONS %]
    <input type="hidden" name="action" value="[% CONTROLLER_DISPATCH %]/dispatch">
+[%- END %][%# !SKIP_BUTTONS %]
    <input type="hidden" name="report_generator_nextsub" value="[% HTML.escape(EXPORT_NEXTSUB) %]">
    <input type="hidden" name="report_generator_variable_list" value="[% HTML.escape(EXPORT_VARIABLE_LIST) %]">
    <input type="hidden" name="CONTROLLER_DISPATCH" value="[% CONTROLLER_DISPATCH | html %]">
 
+[% IF !SKIP_BUTTONS %]
    <p>
     [% 'List export' | $T8 %]<br>
     [% IF ALLOW_PDF_EXPORT %]<input type="submit" name="action_report_generator_export_as_pdf" value="[% 'Export as PDF' | $T8 %]">[% END %]
     [% IF ALLOW_CSV_EXPORT %]<input type="submit" name="action_report_generator_export_as_csv" value="[% 'Export as CSV' | $T8 %]">[% END %]
    </p>
+[%- END %][%# !SKIP_BUTTONS %]
 [%- ELSE %]
    <input type="hidden" name="report_generator_nextsub" value="[% HTML.escape(EXPORT_NEXTSUB) %]">
    <input type="hidden" name="report_generator_variable_list" value="[% HTML.escape(EXPORT_VARIABLE_LIST) %]">
    <input type="hidden" name="report_generator_dispatch_to" value="">
    <input type="hidden" name="action" value="report_generator_dispatcher">
 
+[% IF !SKIP_BUTTONS %]
    <p>
     [% 'List export' | $T8 %]<br>
     [% IF ALLOW_PDF_EXPORT %]<input type="submit" class="submit" onclick="submit_report_generator_form('report_generator_export_as_pdf')" value="[% 'Export as PDF' | $T8 %]">[% END %]
         document.report_generator_form.submit();
       } // -->
  </script>
+[%- END %][%# !SKIP_BUTTONS %]
 [%- END %]
 
   </form>
index 5b2f68f..86594b5 100644 (file)
@@ -6,7 +6,7 @@
 
  <h1>[% HTML.escape(title) %]</h1>
 
- <form action="[% HTML.escape(script) %]" method="post" name="report_generator_form">
+ <form action="[% HTML.escape(script) %]" method="post" name="report_generator_form" id="report_generator_form">
 
   [%- FOREACH var = HIDDEN %]
   <input type="hidden" name="[% HTML.escape(var.key) %]" value="[% HTML.escape(var.value) %]">
@@ -14,7 +14,6 @@
 
   <input type="hidden" name="report_generator_pdf_options_set" value="1">
   <input type="hidden" name="report_generator_dispatch_to" value="">
-  <input type="hidden" name="report_generator_addattachments" value="">
 
   <table>
    <tr>
   </table>
 
 [%- IF CONTROLLER_DISPATCH %]
-   <p>
-    <input type="hidden" name="action" value="[% CONTROLLER_DISPATCH | html %]/dispatch">
-    <input type="submit" name="action_report_generator_export_as_pdf" value="[% 'Export as PDF' | $T8 %]">
-    <input type="submit" name="action_report_generator_back" value="[% 'Back' | $T8 %]">
     <input type="hidden" name="CONTROLLER_DISPATCH" value="[% CONTROLLER_DISPATCH | html %]">
-   </p>
 [%- ELSE %]
-  <p>
    <input type="hidden" name="action" value="report_generator_dispatcher">
-   <input type="submit" class="submit" onclick="submit_report_generator_form('report_generator_export_as_pdf','')" value="[% 'Export as PDF' | $T8 %]">
-[%- IF ALLOW_ATTACHMENTS %]
-   <input type="submit" class="submit"
-      onclick="submit_report_generator_form('report_generator_export_as_pdf','yes')"
-      value="[% 'Export as PDF with attachments' | $T8 %]">
-[%- END %]
-   <input type="submit" class="submit" onclick="submit_report_generator_form('report_generator_back')" value="[% 'Back' | $T8 %]">
-  </p>
- <script type="text/javascript"><!--
-      function submit_report_generator_form(nextsub,att) {
-        document.report_generator_form.report_generator_dispatch_to.value = nextsub;
-        document.report_generator_form.report_generator_addattachments.value = att;
-        document.report_generator_form.submit();
-      } // -->
- </script>
 [%- END %]
 
  </form>