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::Assembly
16 SL::Controller::TopQuickSearch::Contact
17 SL::Controller::TopQuickSearch::GLTransaction
21 sub action_query_autocomplete {
24 my $hashes = $self->module->query_autocomplete;
26 $self->render(\ SL::JSON::to_json($hashes), { layout => 0, type => 'json', process => 0 });
29 sub action_select_autocomplete {
32 my $redirect_url = $self->module->select_autocomplete;
34 $self->js->redirect_to($redirect_url)->render;
37 sub action_do_search {
40 my $redirect_url = $self->module->do_search;
43 $self->js->redirect_to($redirect_url)
49 sub available_modules {
52 $self->require_modules;
54 map { $_->new } @available_modules;
59 $::auth->assert($_->auth, 1)
60 } $_[0]->available_modules
66 $self->require_modules;
68 die t8('Need module') unless $::form->{module};
70 $::lxdebug->dump(0, "modules", \%modules_by_name);
72 die t8('Unknown module #1', $::form->{module}) unless my $class = $modules_by_name{$::form->{module}};
74 $::lxdebug->dump(0, "auth:", $class->auth);
76 $::auth->assert($class->auth);
82 SL::ClientJS->new(controller => $_[0])
88 if (!$self->{__modules_required}) {
89 for my $class (@available_modules) {
90 eval "require $class" or die $@;
91 $modules_by_name{ $class->name } = $class;
93 $self->{__modules_required} = 1;
105 SL::Controller::TopQuickSearch - Framework for pluggable quicksearch fields in the layout top header.
109 use SL::Controller::TopQuickSearch;
110 my $search = SL::Controller::TopQuickSearch->new;
113 [%- FOREACH module = search.available_modules %]
114 <input type='text' id='top-search-[% module.name %]'>
119 This controller provides abstraction for different search plugins, and ensures
120 that all follow a common useability scheme.
122 Modules should be configurable, but currently are not. Diabling modules can be
123 done by removing them from available_modules.
125 =head1 BEHAVIOUR REQUIREMENTS
131 A single text input field with the html5 placeholder containing a small
132 description of the target will be rendered from the plugin information.
136 On typing, the autocompletion must be enabled.
140 On C<Enter>, the search should redirect to an appropriate listing of matching
143 If only one item matches the result, the plugin should instead redirect
144 directly to the matched item.
148 Search terms should accept the broadest possible matching, and if possible with
153 In case nothing is found, a visual indicator should be given, but no actual
154 redirect should occur.
158 Each search must check rights and must not present a backdoor into data that
159 the user should not see.
165 Plugins need to provide:
168 - localized description for config
169 - localized description for textfield
170 - autocomplete callback
173 the frontend will only generate urls of the forms:
174 action=TopQuickSearch/autocomplete&module=<module>&term=<term>
175 action=TopQuickSearch/search&module=<module>&term=<term>
179 - filter available searches with auth
180 - toggling with cofiguration doesn't work yet
188 Sven Schöling E<lt>s.schoeling@linet-services.deE<gt>