X-Git-Url: http://wagnertech.de/git?a=blobdiff_plain;f=SL%2FController%2FPart.pm;h=d5a7f2a5f139464f4aaffedaf19e147d7f6b2e76;hb=fa7fc7eeb3ca718914affee06c0629a08d571288;hp=4d8da25f854a57e0b2e675f622d24497d20e3bd2;hpb=7a6466811399cba50ab3a55f18665b5663f6d3a5;p=kivitendo-erp.git diff --git a/SL/Controller/Part.pm b/SL/Controller/Part.pm index 4d8da25f8..d5a7f2a5f 100644 --- a/SL/Controller/Part.pm +++ b/SL/Controller/Part.pm @@ -6,36 +6,16 @@ use parent qw(SL::Controller::Base); use Clone qw(clone); use SL::DB::Part; use SL::Controller::Helper::GetModels; -use SL::Controller::Helper::Filtered; -use SL::Controller::Helper::Sorted; -use SL::Controller::Helper::Paginated; -use SL::Controller::Helper::Filtered; use SL::Locale::String qw(t8); use SL::JSON; use Rose::Object::MakeMethods::Generic ( - 'scalar --get_set_init' => [ qw(parts) ], + 'scalar --get_set_init' => [ qw(parts models part) ], ); # safety -__PACKAGE__->run_before(sub { $::auth->assert('part_service_assembly_edit') }); - -__PACKAGE__->make_filtered( - ONLY => [ qw(part_picker_search part_picker_result ajax_autocomplete) ], - LAUNDER_TO => 'filter', -); -__PACKAGE__->make_paginated( - ONLY => [ qw(part_picker_search part_picker_result ajax_autocomplete) ], -); - -__PACKAGE__->make_sorted( - ONLY => [ qw(part_picker_search part_picker_result ajax_autocomplete) ], - - DEFAULT_BY => 'partnumber', - DEFAULT_DIR => 1, - - partnumber => t8('Partnumber'), -); +__PACKAGE__->run_before(sub { $::auth->assert('part_service_assembly_edit') }, + except => [ qw(ajax_autocomplete part_picker_search part_picker_result) ]); sub action_ajax_autocomplete { my ($self, %params) = @_; @@ -44,8 +24,23 @@ sub action_ajax_autocomplete { # if someone types something, and hits enter, assume he entered the full name. # if something matches, treat that as sole match + # unfortunately get_models can't do more than one per package atm, so we d it + # the oldfashioned way. if ($::form->{prefer_exact}) { - # TODO! + my $exact_matches; + if (1 == scalar @{ $exact_matches = SL::DB::Manager::Part->get_all( + query => [ + obsolete => 0, + SL::DB::Manager::Part->type_filter($::form->{filter}{type}), + or => [ + description => { ilike => $::form->{filter}{'all:substr:multi::ilike'} }, + partnumber => { ilike => $::form->{filter}{'all:substr:multi::ilike'} }, + ] + ], + limit => 2, + ) }) { + $self->parts($exact_matches); + } } my @hashes = map { @@ -56,8 +51,10 @@ sub action_ajax_autocomplete { partnumber => $_->partnumber, description => $_->description, type => $_->type, + unit => $_->unit, + cvars => { map { ($_->config->name => { value => $_->value_as_text, is_valid => $_->is_valid }) } @{ $_->cvars_by_config } }, } - } @{ $self->parts }; + } @{ $self->parts }; # neato: if exact match triggers we don't even need the init_parts $self->render(\ SL::JSON::to_json(\@hashes), { layout => 0, type => 'json', process => 0 }); } @@ -76,8 +73,50 @@ sub action_part_picker_result { $_[0]->render('part/_part_picker_result', { layout => 0 }); } +sub action_show { + my ($self) = @_; + + if ($::request->type eq 'json') { + my $part_hash; + if (!$self->part) { + # TODO error + } else { + require Rose::DB::Object::Helpers; + $part_hash = $self->part->as_tree; + $part_hash->{cvars} = $self->part->cvar_as_hashref; + } + + $self->render(\ SL::JSON::to_json($part_hash), { layout => 0, type => 'json', process => 0 }); + } +} + sub init_parts { - $_[0]->get_models; + if ($::form->{no_paginate}) { + $_[0]->models->disable_plugin('paginated'); + } + + $_[0]->models->get; +} + +sub init_part { + SL::DB::Part->new(id => $::form->{id} || $::form->{part}{id})->load; +} + +sub init_models { + my ($self) = @_; + + SL::Controller::Helper::GetModels->new( + controller => $self, + sorted => { + _default => { + by => 'description', + dir => 1, + }, + partnumber => t8('Partnumber'), + description => t8('Description'), + }, + with_objects => [ qw(unit_obj) ], + ); } 1;