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 = qw(
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;
62 $::auth->assert($_->auth, 1)
63 } $_[0]->available_modules
69 $self->require_modules;
71 die t8('Need module') unless $::form->{module};
73 $::lxdebug->dump(0, "modules", \%modules_by_name);
75 die t8('Unknown module #1', $::form->{module}) unless my $class = $modules_by_name{$::form->{module}};
77 $::lxdebug->dump(0, "auth:", $class->auth);
79 $::auth->assert($class->auth);
85 SL::ClientJS->new(controller => $_[0])
91 if (!$self->{__modules_required}) {
92 for my $class (@available_modules) {
93 eval "require $class" or die $@;
94 $modules_by_name{ $class->name } = $class;
96 $self->{__modules_required} = 1;
108 SL::Controller::TopQuickSearch - Framework for pluggable quicksearch fields in the layout top header.
112 use SL::Controller::TopQuickSearch;
113 my $search = SL::Controller::TopQuickSearch->new;
116 [%- FOREACH module = search.available_modules %]
117 <input type='text' id='top-search-[% module.name %]'>
122 This controller provides abstraction for different search plugins, and ensures
123 that all follow a common useability scheme.
125 Modules should be configurable, but currently are not. Diabling modules can be
126 done by removing them from available_modules.
128 =head1 BEHAVIOUR REQUIREMENTS
134 A single text input field with the html5 placeholder containing a small
135 description of the target will be rendered from the plugin information.
139 On typing, the autocompletion must be enabled.
143 On C<Enter>, the search should redirect to an appropriate listing of matching
146 If only one item matches the result, the plugin should instead redirect
147 directly to the matched item.
151 Search terms should accept the broadest possible matching, and if possible with
156 In case nothing is found, a visual indicator should be given, but no actual
157 redirect should occur.
161 Each search must check rights and must not present a backdoor into data that
162 the user should not see.
168 Plugins need to provide:
171 - localized description for config
172 - localized description for textfield
173 - autocomplete callback
176 the frontend will only generate urls of the forms:
177 action=TopQuickSearch/autocomplete&module=<module>&term=<term>
178 action=TopQuickSearch/search&module=<module>&term=<term>
182 - filter available searches with auth
183 - toggling with cofiguration doesn't work yet
191 Sven Schöling E<lt>s.schoeling@linet-services.deE<gt>