1 package SL::Controller::TopQuickSearch;
4 use parent qw(SL::Controller::Base);
8 use SL::Locale::String qw(t8);
10 use Rose::Object::MakeMethods::Generic (
11 'scalar --get_set_init' => [ qw(module js) ],
14 my @available_modules = (
15 'SL::Controller::TopQuickSearch::Article',
16 'SL::Controller::TopQuickSearch::Part',
17 'SL::Controller::TopQuickSearch::Service',
18 'SL::Controller::TopQuickSearch::Assembly',
19 'SL::Controller::TopQuickSearch::Contact',
20 'SL::Controller::TopQuickSearch::GLTransaction',
24 sub action_query_autocomplete {
27 my $hashes = $self->module->query_autocomplete;
29 $self->render(\ SL::JSON::to_json($hashes), { layout => 0, type => 'json', process => 0 });
32 sub action_select_autocomplete {
35 my $redirect_url = $self->module->select_autocomplete;
37 $self->js->redirect_to($redirect_url)->render;
40 sub action_do_search {
43 my $redirect_url = $self->module->do_search;
46 $self->js->redirect_to($redirect_url)
52 sub available_modules {
55 $self->require_modules;
57 map { $_->new } @available_modules;
61 my %enabled_names = map {
63 } @{ $::instance_conf->get_quick_search_modules };
66 $enabled_names{$_->name}
67 } $_[0]->available_modules
72 $::auth->assert($_->auth, 1)
73 } $_[0]->enabled_modules
79 $self->require_modules;
81 die 'Need module' unless $::form->{module};
83 die 'Unknown module ' . $::form->{module} unless my $class = $modules_by_name{$::form->{module}};
85 $::auth->assert($class->auth);
91 SL::ClientJS->new(controller => $_[0])
97 if (!$self->{__modules_required}) {
98 for my $class (@available_modules) {
99 eval "require $class" or die $@;
100 $modules_by_name{ $class->name } = $class;
102 $self->{__modules_required} = 1;
114 SL::Controller::TopQuickSearch - Framework for pluggable quicksearch fields in the layout top header.
118 use SL::Controller::TopQuickSearch;
119 my $search = SL::Controller::TopQuickSearch->new;
122 [%- FOREACH module = search.available_modules %]
123 <input type='text' id='top-search-[% module.name %]'>
128 This controller provides abstraction for different search plugins, and ensures
129 that all follow a common useability scheme.
131 Modules should be configurable per user, but currently are not. Disabling
132 modules can be done by removing them from available_modules or in client_config.
134 =head1 BEHAVIOUR REQUIREMENTS
140 A single text input field with the html5 placeholder containing a small
141 description of the target will be rendered from the plugin information.
145 On typing, the autocompletion must be enabled.
149 On C<Enter>, the search should redirect to an appropriate listing of matching
152 If only one item matches the result, the plugin should instead redirect
153 directly to the matched item.
157 Search terms should accept the broadest possible matching, and if possible with
162 In case nothing is found, a visual indicator should be given, but no actual
163 redirect should occur.
167 Each search must check rights and must not present a backdoor into data that
168 the user should not see.
174 The full interface is described in L<SL::Controller::TopQuickSeach::Base>
178 - toggling with cofiguration doesn't work yet
186 Sven Schöling E<lt>s.schoeling@linet-services.deE<gt>