X-Git-Url: http://wagnertech.de/git?a=blobdiff_plain;f=SL%2FController%2FProject.pm;h=fc72036ee050b9ddf70120e0269283e658cfc757;hb=a8b18c65bfd47c845e641fb0fff9587f4122bf9d;hp=2c2498b048e09305af7371a39cd75037ba69bcdb;hpb=6a12a968761127af91e9da8db7579be2836bcaaa;p=kivitendo-erp.git diff --git a/SL/Controller/Project.pm b/SL/Controller/Project.pm index 2c2498b04..fc72036ee 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 @@ -57,11 +59,9 @@ sub action_list { $self->make_filter_summary; - my $projects = $self->models->get; - $self->prepare_report; - $self->report_generator_list_objects(report => $self->{report}, objects => $projects); + $self->report_generator_list_objects(report => $self->{report}, objects => $self->models->get); } sub action_new { @@ -104,6 +104,52 @@ 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 => [ + obsolete => 0, + SL::DB::Manager::Project->type_filter($::form->{filter}{type}), + 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 # @@ -119,6 +165,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) : (); @@ -218,15 +272,10 @@ sub prepare_report { map { $column_defs{$_}->{text} ||= $::locale->text( $self->models->get_sort_spec->{$_}->{title} ) } keys %column_defs; - if ( $report->{options}{output_format} =~ /^(pdf|csv)$/i ) { - $self->models->disable_plugin('paginated'); - } $report->set_options( std_column_visibility => 1, controller_class => 'Project', output_format => 'HTML', - raw_top_info_text => $self->render('project/report_top', { output => 0 }), - raw_bottom_info_text => $self->render('project/report_bottom', { output => 0 }), title => $::locale->text('Projects'), allow_pdf_export => 1, allow_csv_export => 1, @@ -235,8 +284,10 @@ sub prepare_report { $report->set_column_order(@columns); $report->set_export_options(qw(list filter)); $report->set_options_from_form; + $self->models->disable_plugin('paginated') if $report->{options}{output_format} =~ /^(pdf|csv)$/i; $self->models->set_report_generator_sort_options(report => $report, sortable_columns => \@sortable); $report->set_options( + raw_top_info_text => $self->render('project/report_top', { output => 0 }), raw_bottom_info_text => $self->render('project/report_bottom', { output => 0 }), ); } @@ -251,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' ], ); }