/usr/local/CPAN/RT-Client-Console/RT/Client/Console/Session/Ticket/CustFields.pm


package RT::Client::Console::Session::Ticket::CustFields;

use strict;
use warnings;

use parent qw(RT::Client::Console::Session);

use Curses::Forms;
use Params::Validate qw(:all);
use POE;
use POSIX qw(floor);
use relative -to => "RT::Client::Console", 
        -aliased => qw(Connection Session Session::Ticket);


# class method

# custfields session creation
sub create {
    my ($class, $id) = @_;
    $class->SUPER::create(
    "ticket_custfields_$id",
    inline_states => {
        init => sub {
            my ($kernel, $heap) = @_[ KERNEL, HEAP ];
            $heap->{pos_x } = 0;
            $heap->{pos_y } = 1 + 7;  # tabs-bar + headers
            $heap->{height} = 4;
        },
        window_resize => sub { 
            my ($kernel, $heap, $old_screen_h, $old_screen_w) = @_[ KERNEL, HEAP, ARG0, ARG1 ];
            $heap->{width} = $heap->{screen_w} * 2 / 3 - 2;  # - border
        },
        available_keys => sub {
            return (['u', 'change custom fields', 'change_custfields']);
        },
        change_custfields => sub {
            my ( $kernel, $heap ) = @_[ KERNEL, HEAP ];
            $class->create_choice_modal(
                                  title => 'Change Custom fields',
                                  text => '',
                                  keys => {
                                           n => { text => 'new custom field',
                                                  code => sub {
                                                      if (my $field_name = $class->input_ok_cancel('New custom field name',
                                                                                                   '', 500)) {
                                                          if (my $field_value = $class->input_ok_cancel("$field_name value",
                                                                                                        '', 500)) {
                                                              my $ticket = Ticket->get_current_ticket();
                                                              $ticket->cf($field_name, $field_value);
                                                              $ticket->set_changed(1);
                                                              return 1; # stop modal mode
                                                          }
                                                      }
                                                  },
                                                },
                                           e => { text => 'edit custom field',
                                                  code => sub {
                                                      my $ticket = Ticket->get_current_ticket();
                                                      my @custom_fields = sort $ticket->cf();
                                                      my $field_name = $class->input_list(title => ' Edit custom fields ',
                                                                                          items => [ @custom_fields ],
                                                                                          value => $custom_fields[0],
                                                                                         );
                                                      if (my $field_value = $class->input_ok_cancel("$field_name value",
                                                                                                    '', 500)) {
                                                          $ticket->cf($field_name, $field_value);
                                                          $ticket->set_changed(1);
                                                          return 1; # stop modal mode
                                                      }
                                                  }
                                                },
                                           d => { text => 'delete custom field',
                                                  code => sub {
                                                      my $ticket = Ticket->get_current_ticket();
                                                      my @custom_fields = sort $ticket->cf();
                                                      my $field_name = $class->input_list(title => ' Delete custom fields ',
                                                                                          items => [ @custom_fields ],
                                                                                          value => $custom_fields[0],
                                                                                         );
                                                      $ticket->cf($field_name, undef);
                                                      $ticket->set_changed(1);
                                                      return 1; # stop modal mode
                                                  }
                                                },
                                          },
                                );
        },
        draw => sub { 
            my ( $kernel, $heap) = @_[ KERNEL, HEAP ];
            my $label;

            my $ticket = Ticket->get_current_ticket();
            my @custom_fields = sort $ticket->cf();
            my $per_col = POSIX::floor(@custom_fields/3);
            my @custom_fields_labels;

            # first 2 column
            foreach (1..2) {
                push @custom_fields_labels, 
                  [
                   map {
                       [ "$_:", (defined $ticket->cf($_) ? $ticket->cf($_) : '') ],
                   } splice @custom_fields, 0, $per_col
                  ];
                
            }
            # third column
            push @custom_fields_labels, 
              [
               map {
                   [ "$_:", $ticket->cf($_) ],
               } @custom_fields
              ];
            
            my %custom_fields_widgets = $class->struct_to_widgets(\@custom_fields_labels, $heap->{height}-1, $heap->{width});
            
            my $form = Curses::Forms->new({
                                           X           => $heap->{'pos_x'},
                                           Y           => $heap->{'pos_y'},
                                           COLUMNS     => $heap->{width},
                                           LINES       => $heap->{height},
                                           
                                           BORDER      => 1,
                                           BORDERCOL   => 'yellow',
                                           CAPTION     => '[ Custom fields ]',
                                           CAPTIONCOL  => 'yellow',
                                           FOREGROUND  => 'white',
                                           BACKGROUND  => 'blue',
                                           DERIVED     => 1,
                                           #        AUTOCENTER  => 1,
                                           TABORDER    => [],
                                           FOCUSED     => 'label1',
                                           WIDGETS     => \%custom_fields_widgets,
                                          },
                                         );
            $form->draw($class->get_curses_handler());
            #                        refresh($mwh);

            # draw keys
            my @keys = $kernel->call("ticket_custfields_$id" => 'available_keys');
            $class->draw_keys_label( Y => $heap->{'pos_y'} + $heap->{height} + 1,
                                     X => $heap->{'pos_x'} + 5,
                                     COLUMNS => $heap->{width} - 2,
                                     VALUE => \@keys,
                                   );

    },
    },
    heap => { 'pos_x' => 0,
              'pos_y' => 0,
              'width' => 0,
              'height' => 0,
            },
    );      
}

1;