Merge branch 'test' of ../kivitendo-erp_20220811
[kivitendo-erp.git] / SL / Controller / TopQuickSearch.pm
index 63d9b5b..4d0aa94 100644 (file)
@@ -6,15 +6,29 @@ use parent qw(SL::Controller::Base);
 use SL::ClientJS;
 use SL::JSON;
 use SL::Locale::String qw(t8);
+use SL::Helper::UserPreferences;
 
 use Rose::Object::MakeMethods::Generic (
  'scalar --get_set_init' => [ qw(module js) ],
 );
 
-my @available_modules = qw(
-  SL::Controller::TopQuickSearch::Assembly
-  SL::Controller::TopQuickSearch::Contact
-  SL::Controller::TopQuickSearch::GLTransaction
+my @available_modules = (
+  'SL::Controller::TopQuickSearch::Article',
+  'SL::Controller::TopQuickSearch::Part',
+  'SL::Controller::TopQuickSearch::Service',
+  'SL::Controller::TopQuickSearch::Assembly',
+  'SL::Controller::TopQuickSearch::Assortment',
+  'SL::Controller::TopQuickSearch::Contact',
+  'SL::Controller::TopQuickSearch::SalesQuotation',
+  'SL::Controller::TopQuickSearch::SalesOrder',
+  'SL::Controller::TopQuickSearch::SalesDeliveryOrder',
+  'SL::Controller::TopQuickSearch::RequestForQuotation',
+  'SL::Controller::TopQuickSearch::PurchaseOrder',
+  'SL::Controller::TopQuickSearch::PurchaseDeliveryOrder',
+  'SL::Controller::TopQuickSearch::GLTransaction',
+  'SL::Controller::TopQuickSearch::Customer',
+  'SL::Controller::TopQuickSearch::Vendor',
+  'SL::Controller::TopQuickSearch::PhoneNumber',
 );
 my %modules_by_name;
 
@@ -54,26 +68,41 @@ sub available_modules {
   map { $_->new } @available_modules;
 }
 
-sub active_modules {
+sub enabled_modules {
+  my $user_prefs = SL::Helper::UserPreferences->new(
+    namespace         => 'TopQuickSearch',
+  );
+
+  my @quick_search_modules;
+  if (my $prefs_val = $user_prefs->get('quick_search_modules')) {
+    @quick_search_modules = split ',', $prefs_val;
+  } else {
+    @quick_search_modules = @{ $::instance_conf->get_quick_search_modules };
+  }
+
+  my %enabled_names = map { $_ => 1 } @quick_search_modules;
+
   grep {
-    $::auth->assert($_->auth, 1)
+    $enabled_names{$_->name}
   } $_[0]->available_modules
 }
 
+sub active_modules {
+  grep {
+    !$_->auth || $::auth->assert($_->auth, 1)
+  } $_[0]->enabled_modules
+}
+
 sub init_module {
   my ($self) = @_;
 
   $self->require_modules;
 
-  die t8('Need module') unless $::form->{module};
-
-  $::lxdebug->dump(0,  "modules", \%modules_by_name);
+  die 'Need module' unless $::form->{module};
 
-  die t8('Unknown module #1', $::form->{module}) unless my $class = $modules_by_name{$::form->{module}};
+  die 'Unknown module ' . $::form->{module} unless my $class = $modules_by_name{$::form->{module}};
 
-  $::lxdebug->dump(0,  "auth:", $class->auth);
-
-  $::auth->assert($class->auth);
+  $::auth->assert($class->auth) if $class->auth;
 
   return $class->new;
 }
@@ -106,21 +135,22 @@ SL::Controller::TopQuickSearch - Framework for pluggable quicksearch fields in t
 
 =head1 SYNOPSIS
 
-use SL::Controller::TopQuickSearch;
-my $search = SL::Controller::TopQuickSearch->new;
+  use SL::Controller::TopQuickSearch;
+  my $search = SL::Controller::TopQuickSearch->new;
+  $::request->layout->add_javascripts('kivi.QuickSearch.js');
 
-# in layout
-[%- FOREACH module = search.available_modules %]
-<input type='text' id='top-search-[% module.name %]'>
-[%- END %]
+  # in template
+  [%- FOREACH module = search.enabled_modules %]
+  <input type='text' id='top-search-[% module.name %]'>
+  [%- END %]
 
 =head1 DESCRIPTION
 
 This controller provides abstraction for different search plugins, and ensures
 that all follow a common useability scheme.
 
-Modules should be configurable, but currently are not. Diabling modules can be
-done by removing them from available_modules.
+Modules should be configurable per user, but currently are not. Disabling
+modules can be done by removing them from available_modules or in client_config.
 
 =head1 BEHAVIOUR REQUIREMENTS
 
@@ -158,26 +188,19 @@ redirect should occur.
 Each search must check rights and must not present a backdoor into data that
 the user should not see.
 
-=back
+=item *
 
-=head1 INTERFACE
+By design the search must not try to guess C<exact matches>.
 
-Plugins need to provide:
+=back
 
- - name
- - localized description for config
- - localized description for textfield
- - autocomplete callback
- - redirect callback
+=head1 INTERFACE
 
-the frontend will only generate urls of the forms:
-  action=TopQuickSearch/autocomplete&module=<module>&term=<term>
-  action=TopQuickSearch/search&module=<module>&term=<term>
+The full interface is described in L<SL::Controller::TopQuickSeach::Base>
 
 =head1 TODO
 
- - filter available searches with auth
- - toggling with cofiguration doesn't work yet
+  * user configuration
 
 =head1 BUGS