1 package SL::Controller::TopQuickSearch;
4 use parent qw(SL::Controller::Base);
8 use SL::Locale::String qw(t8);
9 use SL::Helper::UserPreferences;
11 use Rose::Object::MakeMethods::Generic (
12 'scalar --get_set_init' => [ qw(module js) ],
15 my @available_modules = (
16 'SL::Controller::TopQuickSearch::Article',
17 'SL::Controller::TopQuickSearch::Part',
18 'SL::Controller::TopQuickSearch::Service',
19 'SL::Controller::TopQuickSearch::Assembly',
20 'SL::Controller::TopQuickSearch::Assortment',
21 'SL::Controller::TopQuickSearch::Contact',
22 'SL::Controller::TopQuickSearch::SalesQuotation',
23 'SL::Controller::TopQuickSearch::SalesOrder',
24 'SL::Controller::TopQuickSearch::SalesDeliveryOrder',
25 'SL::Controller::TopQuickSearch::RequestForQuotation',
26 'SL::Controller::TopQuickSearch::PurchaseOrder',
27 'SL::Controller::TopQuickSearch::PurchaseDeliveryOrder',
28 'SL::Controller::TopQuickSearch::GLTransaction',
29 'SL::Controller::TopQuickSearch::Customer',
30 'SL::Controller::TopQuickSearch::Vendor',
34 sub action_query_autocomplete {
37 my $hashes = $self->module->query_autocomplete;
39 $self->render(\ SL::JSON::to_json($hashes), { layout => 0, type => 'json', process => 0 });
42 sub action_select_autocomplete {
45 my $redirect_url = $self->module->select_autocomplete;
47 $self->js->redirect_to($redirect_url)->render;
50 sub action_do_search {
53 my $redirect_url = $self->module->do_search;
56 $self->js->redirect_to($redirect_url)
62 sub available_modules {
65 $self->require_modules;
67 map { $_->new } @available_modules;
71 my $user_prefs = SL::Helper::UserPreferences->new(
72 namespace => 'TopQuickSearch',
75 my @quick_search_modules;
76 if (my $prefs_val = $user_prefs->get('quick_search_modules')) {
77 @quick_search_modules = split ',', $prefs_val;
79 @quick_search_modules = @{ $::instance_conf->get_quick_search_modules };
82 my %enabled_names = map { $_ => 1 } @quick_search_modules;
85 $enabled_names{$_->name}
86 } $_[0]->available_modules
91 !$_->auth || $::auth->assert($_->auth, 1)
92 } $_[0]->enabled_modules
98 $self->require_modules;
100 die 'Need module' unless $::form->{module};
102 die 'Unknown module ' . $::form->{module} unless my $class = $modules_by_name{$::form->{module}};
104 $::auth->assert($class->auth) if $class->auth;
110 SL::ClientJS->new(controller => $_[0])
113 sub require_modules {
116 if (!$self->{__modules_required}) {
117 for my $class (@available_modules) {
118 eval "require $class" or die $@;
119 $modules_by_name{ $class->name } = $class;
121 $self->{__modules_required} = 1;
133 SL::Controller::TopQuickSearch - Framework for pluggable quicksearch fields in the layout top header.
137 use SL::Controller::TopQuickSearch;
138 my $search = SL::Controller::TopQuickSearch->new;
139 $::request->layout->add_javascripts('kivi.QuickSearch.js');
142 [%- FOREACH module = search.enabled_modules %]
143 <input type='text' id='top-search-[% module.name %]'>
148 This controller provides abstraction for different search plugins, and ensures
149 that all follow a common useability scheme.
151 Modules should be configurable per user, but currently are not. Disabling
152 modules can be done by removing them from available_modules or in client_config.
154 =head1 BEHAVIOUR REQUIREMENTS
160 A single text input field with the html5 placeholder containing a small
161 description of the target will be rendered from the plugin information.
165 On typing, the autocompletion must be enabled.
169 On C<Enter>, the search should redirect to an appropriate listing of matching
172 If only one item matches the result, the plugin should instead redirect
173 directly to the matched item.
177 Search terms should accept the broadest possible matching, and if possible with
182 In case nothing is found, a visual indicator should be given, but no actual
183 redirect should occur.
187 Each search must check rights and must not present a backdoor into data that
188 the user should not see.
192 By design the search must not try to guess C<exact matches>.
198 The full interface is described in L<SL::Controller::TopQuickSeach::Base>
210 Sven Schöling E<lt>s.schoeling@linet-services.deE<gt>