use parent qw(SL::Controller::Base);
+use SL::ClientJS;
use SL::Controller::Helper::GetModels;
use SL::Controller::Helper::Paginated;
use SL::Controller::Helper::Sorted;
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 tree) ]);
-__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(
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;
}
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.'));
$self->render('1;', { type => 'js', inline => 1 });
}
-sub action_tree {
- my ($self) = @_;
- my $r = $self->render('requirement_spec/tree', now => DateTime->now);
-}
-
#
# filters
#
my ($self) = @_;
$::auth->assert('config');
- $::request->{layout}->use_stylesheet("${_}.css") for qw(requirement_spec yaml/core/base.min);
- $::request->{layout}->use_javascript("${_}.js") for qw(jquery.jstree requirement_spec);
+ $::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;
sub load_requirement_spec {
my ($self) = @_;
- $self->{requirement_spec} = SL::DB::RequirementSpec->new(id => $::form->{id})->load || die "No such requirement spec";
+ $self->requirement_spec(SL::DB::RequirementSpec->new(id => $::form->{id})->load || die "No such requirement spec");
}
sub load_select_options {
sub create_or_update {
my $self = shift;
- my $is_new = !$self->{requirement_spec}->id;
+ 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 });
+ $self->requirement_spec->assign_attributes(%{ $params });
- my @errors = $self->{requirement_spec}->validate;
+ 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/form', title => $title);
+ $self->render('requirement_spec/new', title => $title);
return;
}
- $self->{requirement_spec}->save;
+ $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 => 'list');
+ $self->redirect_to(action => 'show', id => $self->requirement_spec->id);
}
sub setup_db_args_from_filter {
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) },