ajax_autocomplete umgestellt auf get_models und inline JSON (20% schneller als template)
[kivitendo-erp.git] / SL / Controller / Part.pm
1 package SL::Controller::Part;
2
3 use strict;
4 use parent qw(SL::Controller::Base);
5
6 use Clone qw(clone);
7 use SL::DB::Part;
8 use SL::Controller::Helper::GetModels;
9 use SL::Controller::Helper::Filtered;
10 use SL::Controller::Helper::Sorted;
11 use SL::Controller::Helper::Paginated;
12 use SL::Controller::Helper::Filtered;
13 use SL::Locale::String qw(t8);
14 use SL::JSON;
15
16 use Rose::Object::MakeMethods::Generic (
17   'scalar --get_set_init' => [ qw(parts) ],
18 );
19
20 # safety
21 __PACKAGE__->run_before(sub { $::auth->assert('part_service_assembly_edit') });
22
23 __PACKAGE__->make_filtered(
24   ONLY          => [ qw(part_picker_search part_picker_result ajax_autocomplete) ],
25   LAUNDER_TO    => 'filter',
26 );
27 __PACKAGE__->make_paginated(
28   ONLY          => [ qw(part_picker_search part_picker_result ajax_autocomplete) ],
29 );
30
31 __PACKAGE__->make_sorted(
32   ONLY              => [ qw(part_picker_search part_picker_result ajax_autocomplete) ],
33
34   DEFAULT_BY        => 'partnumber',
35   DEFAULT_DIR       => 1,
36
37   partnumber        => t8('Partnumber'),
38 );
39
40 sub action_ajax_autocomplete {
41   my ($self, %params) = @_;
42
43   my $value = $::form->{column} || 'description';
44
45   # if someone types something, and hits enter, assume he entered the full name.
46   # if something matches, treat that as sole match
47   if ($::form->{prefer_exact}) {
48     # TODO!
49   }
50
51   my @hashes = map {
52    +{
53      value       => $_->$value,
54      label       => $_->long_description,
55      id          => $_->id,
56      partnumber  => $_->partnumber,
57      description => $_->description,
58      type        => $_->type,
59     }
60   } @{ $self->parts };
61
62   $self->render(\ SL::JSON::to_json(\@hashes), { layout => 0, type => 'json', process => 0 });
63 }
64
65 sub action_test_page {
66   $::request->{layout}->add_javascripts('autocomplete_part.js');
67
68   $_[0]->render('part/test_page');
69 }
70
71 sub action_part_picker_search {
72   $_[0]->render('part/part_picker_search', { layout => 0 }, parts => $_[0]->parts);
73 }
74
75 sub action_part_picker_result {
76   $_[0]->render('part/_part_picker_result', { layout => 0 });
77 }
78
79 sub init_parts {
80   $_[0]->get_models;
81 }
82
83 1;