Merge branch 'f-project-search-custom-variables'
authorMoritz Bunkus <m.bunkus@linet-services.de>
Tue, 26 Mar 2019 10:07:07 +0000 (11:07 +0100)
committerMoritz Bunkus <m.bunkus@linet-services.de>
Tue, 26 Mar 2019 10:07:07 +0000 (11:07 +0100)
SL/Controller/Project.pm
SL/Controller/RequirementSpec.pm
locale/de/all
templates/webpages/project/_filter.html
templates/webpages/project/search.html [deleted file]
templates/webpages/requirement_spec/_filter.html

index 11cdd9c..14f27dc 100644 (file)
@@ -30,7 +30,8 @@ use Rose::DB::Object::Helpers qw(as_tree);
 use Rose::Object::MakeMethods::Generic
 (
  scalar => [ qw(project) ],
- 'scalar --get_set_init' => [ qw(models customers project_types project_statuses projects linked_records employees may_edit_invoice_permissions) ],
+ 'scalar --get_set_init' => [ qw(models customers project_types project_statuses projects linked_records employees may_edit_invoice_permissions
+                                 cvar_configs includeable_cvar_configs include_cvars) ],
 );
 
 __PACKAGE__->run_before('check_auth',   except => [ qw(ajax_autocomplete) ]);
@@ -41,27 +42,10 @@ __PACKAGE__->run_before('use_multiselect_js', only => [ qw(new create edit updat
 # actions
 #
 
-sub action_search {
-  my ($self) = @_;
-
-  my %params;
-
-  $params{CUSTOM_VARIABLES}  = CVar->get_configs(module => 'Projects');
-
-  ($params{CUSTOM_VARIABLES_FILTER_CODE}, $params{CUSTOM_VARIABLES_INCLUSION_CODE})
-    = CVar->render_search_options(variables      => $params{CUSTOM_VARIABLES},
-                                  include_prefix => 'l_',
-                                  include_value  => 'Y');
-
-  $self->setup_search_action_bar;
-
-  $self->render('project/search', %params);
-}
-
 sub action_list {
   my ($self) = @_;
 
-  $self->setup_search_action_bar;
+  $self->setup_list_action_bar;
 
   $self->make_filter_summary;
 
@@ -170,6 +154,14 @@ sub init_project_statuses { SL::DB::Manager::ProjectStatus->get_all_sorted }
 sub init_project_types    { SL::DB::Manager::ProjectType->get_all_sorted   }
 sub init_employees        { SL::DB::Manager::Employee->get_all_sorted   }
 sub init_may_edit_invoice_permissions { $::auth->assert('project_edit_view_invoices_permission', 1) }
+sub init_cvar_configs                 { SL::DB::Manager::CustomVariableConfig->get_all_sorted(where => [ module => 'Projects' ]) }
+sub init_includeable_cvar_configs     { [ grep { $_->includeable } @{ $_[0]->cvar_configs } ] };
+
+sub init_include_cvars {
+  my ($self) = @_;
+  return { map { ($_->name => $::form->{"include_cvars_" . $_->name}) }       @{ $self->cvar_configs } } if $::form->{_include_cvars_from_form};
+  return { map { ($_->name => ($_->includeable && $_->included_by_default)) } @{ $self->cvar_configs } };
+}
 
 sub init_linked_records {
   my ($self) = @_;
@@ -320,6 +312,21 @@ sub prepare_report {
 
   map { $column_defs{$_}->{text} ||= $::locale->text( $self->models->get_sort_spec->{$_}->{title} ) } keys %column_defs;
 
+  # Custom variables
+  my %cvar_column_defs = map {
+    my $cfg = $_;
+    (('cvar_' . $cfg->name) => {
+      sub     => sub { my $var = $_[0]->cvar_by_name($cfg->name); $var ? $var->value_as_text : '' },
+      text    => $cfg->description,
+      visible => $self->include_cvars->{ $cfg->name } ? 1 : 0,
+    })
+  } @{ $self->includeable_cvar_configs };
+
+  push @columns, map { 'cvar_' . $_->name } @{ $self->includeable_cvar_configs };
+  %column_defs = (%column_defs, %cvar_column_defs);
+
+  my @cvar_column_form_names = ('_include_cvars_from_form', map { "include_cvars_" . $_->name } @{ $self->includeable_cvar_configs });
+
   $report->set_options(
     std_column_visibility => 1,
     controller_class      => 'Project',
@@ -330,7 +337,7 @@ sub prepare_report {
   );
   $report->set_columns(%column_defs);
   $report->set_column_order(@columns);
-  $report->set_export_options(qw(list filter));
+  $report->set_export_options(qw(list filter), @cvar_column_form_names);
   $report->set_options_from_form;
   $self->models->disable_plugin('paginated') if $report->{options}{output_format} =~ /^(pdf|csv)$/i;
   $self->models->set_report_generator_sort_options(report => $report, sortable_columns => \@sortable);
@@ -430,7 +437,7 @@ sub setup_edit_action_bar {
   }
 }
 
-sub setup_search_action_bar {
+sub setup_list_action_bar {
   my ($self, %params) = @_;
 
   for my $bar ($::request->layout->get('actionbar')) {
index b22e15f..875f170 100644 (file)
@@ -374,7 +374,7 @@ sub init_includeable_cvar_configs {
 
 sub init_include_cvars {
   my ($self) = @_;
-  return $::form->{include_cvars} if $::form->{include_cvars} && (ref($::form->{include_cvars}) eq 'HASH');
+  return { map { ($_->name => $::form->{"include_cvars_" . $_->name}) }       @{ $self->cvar_configs } } if $::form->{_include_cvars_from_form};
   return { map { ($_->name => ($_->includeable && $_->included_by_default)) } @{ $self->cvar_configs } };
 }
 
@@ -516,6 +516,8 @@ sub prepare_report {
     %column_defs = (%column_defs, %cvar_column_defs);
   }
 
+  my @cvar_column_form_names = ('_include_cvars_from_form', map { "include_cvars_" . $_->name } @{ $self->includeable_cvar_configs });
+
   $report->set_options(
     std_column_visibility => 1,
     controller_class      => 'RequirementSpec',
@@ -528,7 +530,7 @@ sub prepare_report {
   );
   $report->set_columns(%column_defs);
   $report->set_column_order(@columns);
-  $report->set_export_options(qw(list filter));
+  $report->set_export_options(qw(list filter), @cvar_column_form_names);
   $report->set_options_from_form;
   $self->models->set_report_generator_sort_options(report => $report, sortable_columns => \@sortable);
 }
index f1dd92b..4aa7b9a 100755 (executable)
@@ -408,7 +408,6 @@ $self->{texts} = {
   'Bank collection via SEPA'    => 'Bankeinzug via SEPA',
   'Bank collections via SEPA'   => 'Bankeinzüge via SEPA',
   'Bank transaction'            => 'Bankbuchung',
-  'Bank transaction with id #1 has already been linked to one or more record and/or some amount is already assigned.' => 'Die Bankbewegung mit der ID #1 ist schon mit einem Beleg verknüpft und/oder es wurden schon Teilbeträge von dieser Bankbewegung zugewiesen. Kontaktieren Sie Ihren kivitendo-Admin.',
   'Bank transactions'           => 'Bankbewegungen',
   'Bank transactions MT940'     => 'Kontoauszug verbuchen',
   'Bank transactions that either only have warnings or no message at all have been posted.' => 'Banktransaktionen, die entweder nur Warnungen oder gar keine Nachricht haben, wurden hingegen verbucht.',
@@ -1684,7 +1683,6 @@ $self->{texts} = {
   'Invnumber'                   => 'Rechnungsnummer',
   'Invnumber missing!'          => 'Rechnungsnummer fehlt!',
   'Invoice'                     => 'Rechnung',
-  'Invoice #1 was overpaid by #2.' => 'Rechnung #1 wurde um #2 überzahlt.',
   'Invoice (one letter abbreviation)' => 'R',
   'Invoice Date'                => 'Rechnungsdatum',
   'Invoice Date missing!'       => 'Rechnungsdatum fehlt!',
@@ -2772,7 +2770,6 @@ $self->{texts} = {
   'Search AR Aging'             => 'Offene Forderungen',
   'Search bank transactions'    => 'Filter für Bankbuchungen',
   'Search contacts'             => 'Personensuche',
-  'Search projects'             => 'Projektsuche',
   'Search term'                 => 'Suchbegriff',
   'Searchable'                  => 'Durchsuchbar',
   'Secondary sorting'           => 'Untersortierung',
index 5a52226..924ca95 100644 (file)
@@ -3,6 +3,8 @@
 [%- USE L %]
 [%- USE LxERP %]
 
+[% L.hidden_tag("_include_cvars_from_form", 1) %]
+
 <table id="filter_table">
  <tr>
   <th align="right">[% 'Number' | $T8 %]</th>
   <td>[% L.select_tag('filter.project_status_id', SELF.project_statuses, default=filter.project_status_id, title_key='description', with_empty=1, style="width: 200px") %]</td>
  </tr>
 
- [% CUSTOM_VARIABLES_FILTER_CODE %]
+ [% FOREACH cvar_cfg = SELF.cvar_configs %]
+  [%- IF cvar_cfg.searchable %]
+   <tr>
+    <th align="right">[% HTML.escape(cvar_cfg.description) %]</th>
+    <td>[% INCLUDE 'common/render_cvar_filter_input.html' cvar_cfg=cvar_cfg cvar_class="rs_input_field" %]</td>
+   </tr>
+  [% END %]
+ [% END %]
 
  <tr>
   <th>[% 'Include in Report' | $T8 %]</th>
      <td>[% L.select_tag('filter.status', [ [ 'all', LxERP.t8('All') ], [ 'orphaned', LxERP.t8('Orphaned') ] ], default=filter.status, style="width: 200px") %]</td>
     </tr>
 
-    [% CUSTOM_VARIABLES_INCLUSION_CODE %]
+    [% FOREACH cvar_cfg = SELF.includeable_cvar_configs %]
+     <tr>
+      <td>
+       [% name__ = cvar_cfg.name;
+          L.checkbox_tag("include_cvars_" _ name__, value="1", checked=(SELF.include_cvars.$name__ ? 1 : ''), label=cvar_cfg.description) %]
+      </td>
+     </tr>
+    [% END %]
 
    </table>
   </td>
diff --git a/templates/webpages/project/search.html b/templates/webpages/project/search.html
deleted file mode 100644 (file)
index d2adb58..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
-[%- USE T8 %]
-[%- USE HTML %]
-[%- USE L %]
-[%- USE LxERP %]
-<h1>[% 'Search projects' | $T8 %]</h1>
-
-[%- INCLUDE 'common/flash.html' %]
-
- <form method="post" action="controller.pl" id="search_form">
-
-  <p>
-[%- INCLUDE 'project/_filter.html' %]
-  </p>
- </form>
index 0fd06bd..2e4209a 100644 (file)
@@ -9,6 +9,7 @@
 
  <form method="post" action="controller.pl" id="search_form">
   [%- L.hidden_tag("is_template", is_template) %]
+  [%- L.hidden_tag("_include_cvars_from_form", 1) %]
 
   <p>
    <table>
@@ -56,7 +57,6 @@
      [% END %]
     [% END %]
 
-    [% L.hidden_tag("include_cvars.dummy__", 1) %]
     [% IF SELF.includeable_cvar_configs.size %]
      <tr>
       <th align="right">[% LxERP.t8("Include in Report") %]</th>
@@ -66,7 +66,7 @@
          [% FOREACH cvar_cfg = SELF.includeable_cvar_configs %]
           <td>
            [% name__ = cvar_cfg.name;
-              L.checkbox_tag("include_cvars." _ name__, value="1", checked=(SELF.include_cvars.$name__ ? 1 : ''), label=cvar_cfg.description) %]
+              L.checkbox_tag("include_cvars_" _ name__, value="1", checked=(SELF.include_cvars.$name__ ? 1 : ''), label=cvar_cfg.description) %]
           </td>
           [%- IF !loop.last && ((loop.count % 3) == 0) %]
            </tr><tr>