X-Git-Url: http://wagnertech.de/gitweb/gitweb.cgi/mfinanz.git/blobdiff_plain/b2e1809f6b6d8852ab0086dcc61ae9540c18b83f..bf1c1594a3120dbaaa4cf20cbedf5a2c72d14f58:/SL/Controller/RequirementSpec.pm diff --git a/SL/Controller/RequirementSpec.pm b/SL/Controller/RequirementSpec.pm index b865d2924..5d581f4fb 100644 --- a/SL/Controller/RequirementSpec.pm +++ b/SL/Controller/RequirementSpec.pm @@ -4,6 +4,7 @@ use strict; use parent qw(SL::Controller::Base); +use SL::ClientJS; use SL::Controller::Helper::GetModels; use SL::Controller::Helper::Paginated; use SL::Controller::Helper::Sorted; @@ -19,13 +20,13 @@ use SL::Locale::String; use Rose::Object::MakeMethods::Generic ( - scalar => [ qw(requirement_spec customers projects types statuses db_args flat_filter is_template) ], + scalar => [ qw(requirement_spec requirement_spec_item customers projects types statuses db_args flat_filter is_template) ], ); __PACKAGE__->run_before('setup'); -__PACKAGE__->run_before('load_requirement_spec', only => [ qw( edit update destroy) ]); -__PACKAGE__->run_before('load_select_options', only => [ qw(new edit create update list) ]); -__PACKAGE__->run_before('load_search_select_options', only => [ qw( list) ]); +__PACKAGE__->run_before('load_requirement_spec', only => [ qw( ajax_edit update show destroy) ]); +__PACKAGE__->run_before('load_select_options', only => [ qw(new ajax_edit create update list) ]); +__PACKAGE__->run_before('load_search_select_options', only => [ qw( list) ]); __PACKAGE__->get_models_url_params('flat_filter'); __PACKAGE__->make_paginated( @@ -68,19 +69,29 @@ sub action_list { sub action_new { my ($self) = @_; - $self->{requirement_spec} = SL::DB::RequirementSpec->new; - $self->render('requirement_spec/form', title => t8('Create a new requirement spec')); + $self->requirement_spec(SL::DB::RequirementSpec->new); + $self->render('requirement_spec/new', title => t8('Create a new requirement spec')); } -sub action_edit { +sub action_ajax_edit { my ($self) = @_; - $self->render('requirement_spec/form', title => t8('Edit requirement spec')); + + $self->render('requirement_spec/_form', { layout => 0 }, submit_as => 'ajax'); +} + +sub action_show { + my ($self) = @_; + + my $item = $::form->{requirement_spec_item_id} ? SL::DB::RequirementSpecItem->new(id => $::form->{requirement_spec_item_id})->load : @{ $self->requirement_spec->sections }[0]; + $self->requirement_spec_item($item); + + $self->render('requirement_spec/show', title => t8('Show requirement spec')); } sub action_create { my ($self) = @_; - $self->{requirement_spec} = SL::DB::RequirementSpec->new; + $self->requirement_spec(SL::DB::RequirementSpec->new); $self->create_or_update; } @@ -92,7 +103,7 @@ sub action_update { sub action_destroy { my ($self) = @_; - if (eval { $self->{requirement_spec}->delete; 1; }) { + if (eval { $self->requirement_spec->delete; 1; }) { flash_later('info', t8('The requirement spec has been deleted.')); } else { flash_later('error', t8('The requirement spec is in use and cannot be deleted.')); @@ -117,41 +128,16 @@ sub setup { my ($self) = @_; $::auth->assert('config'); - $::request->{layout}->use_stylesheet("requirement_spec.css"); + $::request->{layout}->use_stylesheet("${_}.css") for qw(jquery.contextMenu requirement_spec); + $::request->{layout}->use_javascript("${_}.js") for qw(jquery.jstree jquery/jquery.contextMenu client_js requirement_spec); $self->is_template($::form->{is_template} ? 1 : 0); return 1; } -# -# helpers -# - -sub create_or_update { - my $self = shift; - my $is_new = !$self->{requirement_spec}->id; - my $params = delete($::form->{requirement_spec}) || { }; - my $title = $is_new ? t8('Create a new requirement spec') : t8('Edit requirement spec'); - - $self->{requirement_spec}->assign_attributes(%{ $params }); - - my @errors = $self->{requirement_spec}->validate; - - if (@errors) { - flash('error', @errors); - $self->render('requirement_spec/form', title => $title); - return; - } - - $self->{requirement_spec}->save; - - flash_later('info', $is_new ? t8('The requirement spec has been created.') : t8('The requirement spec has been saved.')); - $self->redirect_to(action => 'list'); -} - sub load_requirement_spec { my ($self) = @_; - $self->{requirement_spec} = SL::DB::RequirementSpec->new(id => $::form->{id})->load; + $self->requirement_spec(SL::DB::RequirementSpec->new(id => $::form->{id})->load || die "No such requirement spec"); } sub load_select_options { @@ -173,6 +159,42 @@ sub load_search_select_options { $self->projects(SL::DB::Manager::Project->get_all_sorted); } +# +# helpers +# + +sub create_or_update { + my $self = shift; + my $is_new = !$self->requirement_spec->id; + my $params = delete($::form->{requirement_spec}) || { }; + my $title = $is_new ? t8('Create a new requirement spec') : t8('Edit requirement spec'); + + $self->requirement_spec->assign_attributes(%{ $params }); + + my @errors = $self->requirement_spec->validate; + + if (@errors) { + return SL::ClientJS->new->error(@errors)->render($self) if $::request->is_ajax; + + flash('error', @errors); + $self->render('requirement_spec/new', title => $title); + return; + } + + $self->requirement_spec->save; + + if ($::request->is_ajax) { + my $html = $self->render('requirement_spec/_header', { output => 0 }); + return SL::ClientJS->new + ->replaceWith('#requirement-spec-header', $html) + ->flash('info', t8('The requirement spec has been saved.')) + ->render($self); + } + + flash_later('info', $is_new ? t8('The requirement spec has been created.') : t8('The requirement spec has been saved.')); + $self->redirect_to(action => 'show', id => $self->requirement_spec->id); +} + sub setup_db_args_from_filter { my ($self) = @_; @@ -204,7 +226,7 @@ sub prepare_report { my @sortable = qw(title customer status type projectnumber); my %column_defs = ( - title => { obj_link => sub { $self->url_for(action => 'edit', id => $_[0]->id, callback => $callback) } }, + title => { obj_link => sub { $self->url_for(action => 'show', id => $_[0]->id, callback => $callback) } }, customer => { raw_data => sub { $self->presenter->customer($_[0]->customer, display => 'table-cell', callback => $callback) }, sub => sub { $_[0]->customer->name } }, projectnumber => { raw_data => sub { $self->presenter->project($_[0]->project, display => 'table-cell', callback => $callback) },