/usr/local/CPAN/RT-Client-Console/RT/Client/Console/Session/Ticket/Links.pm
package RT::Client::Console::Session::Ticket::Links;
use strict;
use warnings;
use parent qw(RT::Client::Console::Session);
use Curses::Forms;
use Params::Validate qw(:all);
use POE;
use relative -to => "RT::Client::Console",
-aliased => qw(Connection Session Session::Ticket Session::Progress);
# class method
# links session creation
sub create {
my ($class, $id) = @_;
$class->SUPER::create(
"ticket_links_$id",
inline_states => {
init => sub {
my ($kernel, $heap) = @_[ KERNEL, HEAP ];
$heap->{pos_y } = 1; # tabs-bar
},
window_resize => sub {
my ($kernel, $heap, $old_screen_h, $old_screen_w) = @_[ KERNEL, HEAP, ARG0, ARG1 ];
$heap->{pos_x } = $heap->{screen_w} * 2 / 3 + 1;
$heap->{width } = $heap->{screen_w} - $heap->{pos_x} - 2; # - border
$heap->{height} = $heap->{screen_h} - $heap->{pos_y} - 2 - 2; # - status - border
},
available_keys => sub {
return (['l', 'change links', 'change_links']);
},
change_links => sub {
my ( $kernel, $heap ) = @_[ KERNEL, HEAP ];
$class->create_choice_modal(
title => 'Change tickets links',
text => '',
keys => {
p => { text => 'change parents',
code => sub {
if (my $new_parents = $class->input_ok_cancel('Change parents', join(', ', map {$_->id() } @{$heap->{parents}}), 500)) {
return 1; # stop modal mode
}
}
},
c => { text => 'change children',
code => sub {
if (my $new_children = $class->input_ok_cancel('Change children', join(', ', map {$_->id() } @{$heap->{children}}), 500)) {
return 1; # stop modal mode
}
}
},
d => { text => 'change depends',
code => sub {
if (my $new_children = $class->input_ok_cancel('Change depends', join(', ', map {$_->id() } @{$heap->{depends}}), 500)) {
return 1; # stop modal mode
}
}
},
D => { text => 'change depended',
code => sub {
if (my $new_children = $class->input_ok_cancel('Change depended', join(', ', map {$_->id() } @{$heap->{depended}}), 500)) {
return 1; # stop modal mode
}
}
},
r => { text => 'change refers',
code => sub {
if (my $new_children = $class->input_ok_cancel('Change refers', join(', ', map {$_->id() } @{$heap->{refers}}), 500)) {
return 1; # stop modal mode
}
}
},
R => { text => 'change referred',
code => sub {
if (my $new_children = $class->input_ok_cancel('Change referred', join(', ', map {$_->id() } @{$heap->{refered}}), 500)) {
return 1; # stop modal mode
}
}
},
}
);
},
draw => sub {
my ( $kernel, $heap) = @_[ KERNEL, HEAP ];
my $label;
my $ticket = Ticket->get_current_ticket();
if (!defined($heap->{parents})) {
$class->_generate_job($kernel, $heap, 'parents', q(HasMember=') . $ticket->id() . q('))
}
if (!defined($heap->{children})) {
$class->_generate_job($kernel, $heap, 'children', q(MemberOf=') . $ticket->id() . q('))
}
if (!defined($heap->{depends})) {
$class->_generate_job($kernel, $heap, 'depends', q(DependedOnBy=') . $ticket->id() . q('))
}
if (!defined($heap->{depended})) {
$class->_generate_job($kernel, $heap, 'depended', q(DependsOn=') . $ticket->id() . q('))
}
if (!defined($heap->{refers})) {
$class->_generate_job($kernel, $heap, 'refers', q(ReferredToBy=') . $ticket->id() . q('))
}
if (!defined($heap->{refered})) {
$class->_generate_job($kernel, $heap, 'refered', q(RefersTo=') . $ticket->id() . q('))
}
my $_ticket_to_label = sub {
my ($t) = @_;
defined $t && ref($t) or return '';
return $t->id() . ' ' . $t->subject()
};
my @d = @{$heap->{depends}};
my @depends_on = (
[ 'Depends on:' => $_ticket_to_label->($d[0]) ],
map { [ '' => $_ticket_to_label->($_) ] } @d[1..$#d]
);
my @d2 = @{$heap->{depended}};
my @depended_on_by = (
[ 'Depended on by:' => $_ticket_to_label->($d2[0]) ],
map { [ '' => $_ticket_to_label->($_) ] } @d2[1..$#d2]
);
my @p = @{$heap->{parents}};
my @parents = (
[ 'Parents:' => $_ticket_to_label->($p[0]) ],
map { [ '' => $_ticket_to_label->($_) ] } @p[1..$#p]
);
my @c = @{$heap->{children}};
my @children = (
[ 'Children:' => $_ticket_to_label->($c[0]) ],
map { [ '' => $_ticket_to_label->($_) ] } @c[1..$#c]
);
my @r = @{$heap->{refers}};
my @refers_to = (
[ 'Refers to:' => $_ticket_to_label->($r[0]) ],
map { [ '' => $_ticket_to_label->($_) ] } @r[1..$#r]
);
my @r2 = @{$heap->{refered}};
my @referred_to_by = (
[ 'Refered to by:' => $_ticket_to_label->($r2[0]) ],
map { [ '' => $_ticket_to_label->($_) ] } @r2[1..$#r2]
);
my @links_labels = (
# first column
[ @depends_on,
@depended_on_by,
@parents,
@children,
@refers_to,
@referred_to_by,
],
);
my %links_widgets = $class->struct_to_widgets(\@links_labels, $heap->{height}-2, $heap->{width}-2);
my $form = Curses::Forms->new({
X => $heap->{'pos_x'},
Y => $heap->{'pos_y'},
COLUMNS => $heap->{width},
LINES => $heap->{height},
BORDER => 1,
BORDERCOL => 'yellow',
CAPTION => '[ Relations ]',
CAPTIONCOL => 'yellow',
FOREGROUND => 'white',
BACKGROUND => 'blue',
DERIVED => 1,
# AUTOCENTER => 1,
TABORDER => [],
FOCUSED => 'label1',
WIDGETS => \%links_widgets,
},
);
use Data::Dumper;
$form->draw($class->get_curses_handler());
# refresh($mwh);
# draw keys
my @keys = $kernel->call("ticket_links_$id" => 'available_keys');
$class->draw_keys_label( Y => $heap->{'pos_y'} + $heap->{height} + 1,
X => $heap->{'pos_x'} + 5,
COLUMNS => $heap->{width},
VALUE => \@keys,
);
},
},
heap => { 'pos_x' => 0,
'pos_y' => 0,
'width' => 0,
'height' => 0,
change_custfields_mode => 0,
},
);
}
sub _generate_job {
my ($class, $kernel, $heap, $element, $query) = @_;
$heap->{$element} = [];
my @ids;
my $idx = 0;
my $rt_handler = Connection->get_cnx_data()->{handler};
Progress->add_progress(
steps_nb => sub { scalar(@ids) },
caption => sub { $element },
initially => sub {
@ids = $rt_handler->search( type => 'ticket',
query => $query,
);
},
code => sub { my $id = $ids[$idx++];
defined $id or return;
print STDERR "->>>>>> got id : [$id]\n";
push @{$heap->{$element}},
Ticket->open_from_id($id);
# $kernel->post('ticket_links', 'draw');
return 1;
},
finally => sub {
$kernel->post('ticket_links', 'draw'),
},
);
}
1;