X-Git-Url: http://wagnertech.de/git?a=blobdiff_plain;f=SL%2FController%2FProject.pm;h=b32fb8d2340d639dbe7f5f18776a7155f39121de;hb=2e16031bfdf0e7225c83d4253a7caeee3b1e6905;hp=604978591f6a0f3a80c0a5dfb8ed26c7973d04f4;hpb=3624b119556731da41e4ad395491ebb067f26565;p=kivitendo-erp.git diff --git a/SL/Controller/Project.pm b/SL/Controller/Project.pm index 604978591..b32fb8d23 100644 --- a/SL/Controller/Project.pm +++ b/SL/Controller/Project.pm @@ -23,15 +23,17 @@ use SL::Helper::Flash; use SL::Locale::String; use Data::Dumper; +use JSON; +use Rose::DB::Object::Helpers qw(as_tree); use Rose::Object::MakeMethods::Generic ( scalar => [ qw(project linked_records) ], - 'scalar --get_set_init' => [ qw(models customers project_types project_statuses) ], + 'scalar --get_set_init' => [ qw(models customers project_types project_statuses projects) ], ); -__PACKAGE__->run_before('check_auth'); -__PACKAGE__->run_before('load_project', only => [ qw(edit update destroy) ]); +__PACKAGE__->run_before('check_auth', except => [ qw(ajax_autocomplete) ]); +__PACKAGE__->run_before('load_project', only => [ qw(edit update destroy) ]); # # actions @@ -102,6 +104,51 @@ sub action_destroy { $self->redirect_to(action => 'search'); } +sub action_ajax_autocomplete { + my ($self, %params) = @_; + + $::form->{filter}{'all:substr:multi::ilike'} =~ s{[\(\)]+}{}g; + + # 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}) { + my $exact_matches; + if (1 == scalar @{ $exact_matches = SL::DB::Manager::Project->get_all( + query => [ + valid => 1, + or => [ + description => { ilike => $::form->{filter}{'all:substr:multi::ilike'} }, + projectnumber => { ilike => $::form->{filter}{'all:substr:multi::ilike'} }, + ] + ], + limit => 2, + ) }) { + $self->projects($exact_matches); + } + } + + $::form->{sort_by} = 'customer_and_description'; + + my @hashes = map { + +{ + value => $_->full_description(style => 'full'), + label => $_->full_description(style => 'full'), + id => $_->id, + projectnumber => $_->projectnumber, + description => $_->description, + cvars => { map { ($_->config->name => { value => $_->value_as_text, is_valid => $_->is_valid }) } @{ $_->cvars_by_config } }, + } + } @{ $self->projects }; # neato: if exact match triggers we don't even need the init_projects + + $self->render(\ SL::JSON::to_json(\@hashes), { layout => 0, type => 'json', process => 0 }); +} + +sub action_test_page { + $_[0]->render('project/test_page'); +} + # # filters # @@ -117,6 +164,14 @@ sub check_auth { sub init_project_statuses { SL::DB::Manager::ProjectStatus->get_all_sorted } sub init_project_types { SL::DB::Manager::ProjectType->get_all_sorted } +sub init_projects { + if ($::form->{no_paginate}) { + $_[0]->models->disable_plugin('paginated'); + } + + $_[0]->models->get; +} + sub init_customers { my ($self) = @_; my @customer_id = $self->project && $self->project->customer_id ? (id => $self->project->customer_id) : (); @@ -207,7 +262,8 @@ sub prepare_report { description => { obj_link => sub { $self->url_for(action => 'edit', id => $_[0]->id, callback => $callback) } }, project_type => { sub => sub { $_[0]->project_type->description } }, project_status => { sub => sub { $_[0]->project_status->description }, text => t8('Status') }, - customer => { raw_data => sub { $_[0]->customer_id ? $self->presenter->customer($_[0]->customer, display => 'table-cell', callback => $callback) : '' } }, + customer => { sub => sub { !$_[0]->customer_id ? '' : $_[0]->customer->name }, + raw_data => sub { !$_[0]->customer_id ? '' : $self->presenter->customer($_[0]->customer, display => 'table-cell', callback => $callback) } }, active => { sub => sub { $_[0]->active ? $::locale->text('Active') : $::locale->text('Inactive') }, text => $::locale->text('Active') }, valid => { sub => sub { $_[0]->valid ? $::locale->text('Valid') : $::locale->text('Invalid') }, @@ -246,12 +302,14 @@ sub init_models { by => 'projectnumber', dir => 1, }, - customer => t8('Customer'), - description => t8('Description'), - projectnumber => t8('Project Number'), - project_type => t8('Project Type'), + customer => t8('Customer'), + description => t8('Description'), + projectnumber => t8('Project Number'), + project_type => t8('Project Type'), + project_status => t8('Project Status'), + customer_and_description => 1, }, - with_objects => [ 'customer' ], + with_objects => [ 'customer', 'project_status', 'project_type' ], ); }