%# BEGIN BPS TAGGED BLOCK {{{
%#
%# COPYRIGHT:
%#
%# This software is Copyright (c) 1996-2026 Best Practical Solutions, LLC
%#                                          <sales@bestpractical.com>
%#
%# (Except where explicitly superseded by other copyright notices)
%#
%#
%# LICENSE:
%#
%# This work is made available to you under the terms of Version 2 of
%# the GNU General Public License. A copy of that license should have
%# been provided with this software, but in any event can be snarfed
%# from www.gnu.org.
%#
%# This work is distributed in the hope that it will be useful, but
%# WITHOUT ANY WARRANTY; without even the implied warranty of
%# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
%# General Public License for more details.
%#
%# You should have received a copy of the GNU General Public License
%# along with this program; if not, write to the Free Software
%# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
%# 02110-1301 or visit their web page on the internet at
%# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html.
%#
%#
%# CONTRIBUTION SUBMISSION POLICY:
%#
%# (The following paragraph is not intended to limit the rights granted
%# to you to modify and distribute this software under the terms of
%# the GNU General Public License and is only of importance to you if
%# you choose to contribute your changes and enhancements to the
%# community by submitting them to Best Practical Solutions, LLC.)
%#
%# By intentionally submitting any modifications, corrections or
%# derivatives to this work, or any other work intended for use with
%# Request Tracker, to Best Practical Solutions, LLC, you confirm that
%# you are the copyright holder for those contributions and you grant
%# Best Practical Solutions,  LLC a nonexclusive, worldwide, irrevocable,
%# royalty-free, perpetual, license to use, copy, create derivative
%# works based on those contributions, and sublicense and distribute
%# those contributions and any derivatives thereof.
%#
%# END BPS TAGGED BLOCK }}}
<& /Admin/Elements/Header, Title => $title &>
<& /Elements/Tabs &>
<& /Elements/ListActions, actions => \@results &>
<div class="row mt-2">
  <div class="col-12">
    <p><&|/l&>Create actions that will appear in the Actions menu for tickets or assets.</&></p>
    <ul>
      <li><&|/l&>From and To define the status transition.</&></li>
      <li><&|/l&>Label is what users will see in the Actions menu.</&></li>
      <li><&|/l&>Update type sets the default message type on the update page. Set to '-' to change status without showing the update page.</&></li>
    </ul>
  </div>
</div>

<form action="<%RT->Config->Get('WebPath')%>/Admin/Lifecycles/Actions.html" name="ModifyLifecycleRights" method="post" enctype="multipart/form-data" class="mx-auto max-width-lg">
  <input type="hidden" class="hidden" name="Name" value="<% $LifecycleObj->Name %>" />
  <input type="hidden" class="hidden" name="Type" value="<% $LifecycleObj->Type %>" />

  <table class="table collection collection-as-table" cellspacing="0">
    <tr class="collection-as-table text-center">
      <th class="collection-as-table"><&|/l&>From</&></th>
      <th class="collection-as-table"><&|/l&>To</&></th>
      <th class="collection-as-table"><&|/l&>Label</&></th>
      <th class="collection-as-table"><&|/l&>Update Type</&></th>
      <th class="collection-as-table text-start">
        <div class="form-check">
          <input type="checkbox" name="DeleteAll" value="1" id="DeleteAll" class="checkbox form-check-input" onclick="setCheckbox(this, /^Delete-\d+$/)" />
          <label class="form-check-label" for="DeleteAll"><&|/l&>Delete</&></label>
        </div>
      </th>
    </tr>
% my $i = 1;
% foreach my $action ( @{$actions} ) {
    <tr class="collection-as-table">
      <td class="collection-as-table">
        <& /Elements/SelectStatus, Statuses => [ @statuses, '*' ], Default => $action->{'from'}, Name => "Action-From-$i" &>
      </td>
      <td class="collection-as-table">
        <& /Elements/SelectStatus, Statuses => \@statuses, Default => $action->{'to'}, Name => "Action-To-$i" &>
      </td>
      <td class="collection-as-table">
        <input type="text" value="<% $action->{'label'} %>" class="form-control" Name="Action-Label-<%$i%>" />
      </td>
      <td class="collection-as-table">
        <select name="Action-Update-<% $i %>" class="form-select selectpicker">
          <option <% !$action->{'update'} ? qq[selected='selected'] : '' %> value="">-</option>
          <option <% $action->{'update'} && $action->{'update'} eq 'Respond' ? qq[selected="selected"] : '' %> value="Respond"><&|/l&>Reply</&></option>
          <option <% $action->{'update'} && $action->{'update'} eq 'Comment' ? qq[selected="selected"] : ''%> value="Comment"><&|/l&>Comment</&></option>
        </select>
      </td>
      <td class="collection-as-table">
        <div class="form-check">
          <input type="checkbox" name="Delete-<% $i %>" id="Delete-<% $i %>" class="checkbox form-check-input" value="1" />
          <label class="form-check-label" for="Delete-<% $i %>"></label>
        </div>
      </td>
    </tr>
% ++$i;
% }

% for my $i ( $i .. $i+2 ) {
    <tr class="collection-as-table">
      <td class="collection-as-table"><& /Elements/SelectStatus, Statuses => [ @statuses, '*' ], Name => "Action-From-$i" &></td>
      <td class="collection-as-table"><& /Elements/SelectStatus, Statuses => \@statuses, Name => "Action-To-$i" &></td>
      <td class="collection-as-table"><input type="text" class="form-control" name='Action-Label-<% $i %>' /></td>
      <td class="collection-as-table">
        <select name="Action-Update-<% $i %>" class="form-select selectpicker">
          <option value="">-</option>
          <option value="Respond"><&|/l&>Reply</&></option>
          <option value="Comment"><&|/l&>Comment</&></option>
        </select>
      </td>
      <td class="collection-as-table"></td>
    </tr>
% }
  </table>

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

<%INIT>
my ($title, @results);
my $LifecycleObj = RT::Lifecycle->new( $session{'CurrentUser'} );
$LifecycleObj->Load(Name => $Name, Type => $Type);

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

$title = loc("Actions for lifecycle [_1]", $LifecycleObj->Name);

my @statuses = $LifecycleObj->Valid;

my $actions;

if ($Update) {
    my %delete_id;
    foreach my $arg ( keys %ARGS ) {
        if ( $arg =~ /Delete-(\d+)/ ){
            $delete_id{$1} = 1;
        }
    }

    my %new_actions;
    foreach my $arg ( keys %ARGS ) {
        my ($field, $count) = $arg =~ /Action-(\w+)-(\d+)/;
        next unless $field && $count && $ARGS{$arg};
        next if $delete_id{$count};

        if ( $new_actions{$count} ) {
            $new_actions{$count}->{lc $field} = $ARGS{$arg};
        }
        else {
            $new_actions{$count}->{lc $field} = $ARGS{$arg};
        }
    }

    my @new_actions;
    foreach my $key ( sort { $a <=> $b } keys %new_actions ) {
        next unless $new_actions{$key}->{from} && $new_actions{$key}->{to} && $new_actions{$key}->{label};

        push @new_actions, "$new_actions{$key}->{from} -> $new_actions{$key}->{to}";
        push @new_actions, {
            label  => $new_actions{$key}->{label},
            $new_actions{$key}->{update} ? ( update => $new_actions{$key}->{update} ) : (),
        };
    }

    my $config = RT->Config->Get('Lifecycles')->{$LifecycleObj->Name};
    $config->{'actions'} = \@new_actions;

    my ($ok, $msg) = RT::Lifecycle->UpdateLifecycle(
        CurrentUser    => $session{CurrentUser},
        LifecycleObj   => $LifecycleObj,
        NewConfig      => $config,
    );
    if ( $ok ) {
        push @results, loc('Lifecycle updated');
    }
    else {
        push @results, $msg;
    }

    MaybeRedirectForResults(
        Actions   => \@results,
        Arguments => { Name => $LifecycleObj->Name, Type => $LifecycleObj->Type },
    );
}
else {
    $actions = $LifecycleObj->{'data'}->{'actions'} || [];
}

</%INIT>
<%ARGS>
$Name   => undef
$Type   => undef
$Update => undef
</%ARGS>
