<& /Admin/Elements/Header, Title => $title &>
<& /Elements/Tabs &>
<& /Elements/ListActions, actions => \@results &>

<form action="<%RT->Config->Get('WebPath')%>/Admin/Lifecycles/Mappings.html" name="ModifyMappings" method="post" enctype="multipart/form-data">
<input type="hidden" class="hidden" name="Name" value="<% $LifecycleObj->Name %>" />
<input type="hidden" class="hidden" name="Type" value="<% $LifecycleObj->Type %>" />

% for my $Other (@lifecycles) {
% my $FromMapping = $Other->MoveMap($LifecycleObj);
% my $ToMapping = $LifecycleObj->MoveMap($Other);
% my @OtherStatuses = $Other->Valid;

    <&| /Widgets/TitleBox, title => $Other->Name &>

<h3><&|/l, $Other->Name, $LifecycleObj->Name &>Changing from [_1] to [_2]:</&></h3>
<table>
% for my $OtherStatus (@OtherStatuses) {
  <tr>
    <td><% $OtherStatus %>:</td>
    <td><& /Elements/SelectStatus, Statuses => \@MyStatuses, Default => $FromMapping->{$OtherStatus}, Name => 'map-' . $Other->Name . '-' . $OtherStatus . '--' . $LifecycleObj->Name&></td>
  </tr>
% }
</table>

<h3><&|/l, $LifecycleObj->Name, $Other->Name &>Changing from [_1] to [_2]:</&></h3>
<table>
% for my $MyStatus (@MyStatuses) {
  <tr>
    <td><% $MyStatus %>:</td>
    <td><& /Elements/SelectStatus, Statuses => \@OtherStatuses, Default => $ToMapping->{$MyStatus}, Name => 'map-' . $LifecycleObj->Name . '-' . $MyStatus . '--' . $Other->Name &></td>
  </tr>
% }
</table>

    </&>
% }

<& /Elements/Submit, Name => 'Update', Label => loc('Save Changes') &>

</form>
<%INIT>
my ($title, @results);
my $LifecycleObj = RT::Lifecycle->new();
$LifecycleObj->Load(Name => $Name, Type => $Type);

Abort("Invalid lifecycle") unless $LifecycleObj->Name
                               && $LifecycleObj->{data}{type} eq $Type;

my @MyStatuses = $LifecycleObj->Valid;

$title = loc("Lifecycle [_1] Mappings", $LifecycleObj->Name);

# This code does automatic redirection if any updates happen.
MaybeRedirectForResults(
    Actions   => \@results,
    Arguments => { Name => $LifecycleObj->Name, Type => $LifecycleObj->Type },
);

my @lifecycle_names = grep { $_ ne 'approvals' } RT::Lifecycle->ListAll($Type);

if ($Update) {
    my %maps;
    my $lifecycle_re = join '|', map { quotemeta($_) } @lifecycle_names;
    for my $key (keys %ARGS) {
        my ($from_lifecycle, $from_status, $to_lifecycle) = $key =~ /^map-($lifecycle_re)-(.*)--($lifecycle_re)$/ or next;
        if (my $to_status = $ARGS{$key}) {
            $maps{"$from_lifecycle -> $to_lifecycle"}{$from_status} = $to_status;
        }
    }

    my ($ok, $msg) = RT::Extension::LifecycleUI->UpdateMaps(
        CurrentUser  => $session{CurrentUser},
        Maps         => \%maps,
    );
    push @results, $msg;
}

my @lifecycles = map { RT::Lifecycle->Load(Name => $_, Type => $Type) }
                 sort { loc($a) cmp loc($b) }
                 grep { $_ ne $Name }
                 @lifecycle_names;
</%INIT>
<%ARGS>
$Name => undef
$Type => undef
$Update => undef
</%ARGS>
